1
0
mirror of https://github.com/home-assistant/core.git synced 2025-12-24 21:06:19 +00:00

Validate device id when adding or updating entity registry entry (#134982)

This commit is contained in:
Erik Montnemery
2025-01-07 17:10:51 +01:00
committed by GitHub
parent 471f77fea4
commit 5888b83f22
8 changed files with 122 additions and 64 deletions

View File

@@ -72,11 +72,18 @@ def test_get_or_create_suggested_object_id(entity_registry: er.EntityRegistry) -
def test_get_or_create_updates_data(
hass: HomeAssistant,
device_registry: dr.DeviceRegistry,
entity_registry: er.EntityRegistry,
freezer: FrozenDateTimeFactory,
) -> None:
"""Test that we update data in get_or_create."""
orig_config_entry = MockConfigEntry(domain="light")
orig_config_entry.add_to_hass(hass)
orig_device_entry = device_registry.async_get_or_create(
config_entry_id=orig_config_entry.entry_id,
connections={(dr.CONNECTION_NETWORK_MAC, "12:34:56:AB:CD:EF")},
)
created = datetime.fromisoformat("2024-02-14T12:00:00.0+00:00")
freezer.move_to(created)
@@ -86,7 +93,7 @@ def test_get_or_create_updates_data(
"5678",
capabilities={"max": 100},
config_entry=orig_config_entry,
device_id="mock-dev-id",
device_id=orig_device_entry.id,
disabled_by=er.RegistryEntryDisabler.HASS,
entity_category=EntityCategory.CONFIG,
has_entity_name=True,
@@ -99,7 +106,7 @@ def test_get_or_create_updates_data(
unit_of_measurement="initial-unit_of_measurement",
)
assert set(entity_registry.async_device_ids()) == {"mock-dev-id"}
assert set(entity_registry.async_device_ids()) == {orig_device_entry.id}
assert orig_entry == er.RegistryEntry(
"light.hue_5678",
@@ -109,7 +116,7 @@ def test_get_or_create_updates_data(
config_entry_id=orig_config_entry.entry_id,
created_at=created,
device_class=None,
device_id="mock-dev-id",
device_id=orig_device_entry.id,
disabled_by=er.RegistryEntryDisabler.HASS,
entity_category=EntityCategory.CONFIG,
has_entity_name=True,
@@ -127,6 +134,11 @@ def test_get_or_create_updates_data(
)
new_config_entry = MockConfigEntry(domain="light")
new_config_entry.add_to_hass(hass)
new_device_entry = device_registry.async_get_or_create(
config_entry_id=new_config_entry.entry_id,
connections={(dr.CONNECTION_NETWORK_MAC, "34:56:AB:CD:EF:12")},
)
modified = created + timedelta(minutes=5)
freezer.move_to(modified)
@@ -136,7 +148,7 @@ def test_get_or_create_updates_data(
"5678",
capabilities={"new-max": 150},
config_entry=new_config_entry,
device_id="new-mock-dev-id",
device_id=new_device_entry.id,
disabled_by=er.RegistryEntryDisabler.USER,
entity_category=EntityCategory.DIAGNOSTIC,
has_entity_name=False,
@@ -159,7 +171,7 @@ def test_get_or_create_updates_data(
config_entry_id=new_config_entry.entry_id,
created_at=created,
device_class=None,
device_id="new-mock-dev-id",
device_id=new_device_entry.id,
disabled_by=er.RegistryEntryDisabler.HASS, # Should not be updated
entity_category=EntityCategory.DIAGNOSTIC,
has_entity_name=False,
@@ -176,7 +188,7 @@ def test_get_or_create_updates_data(
unit_of_measurement="updated-unit_of_measurement",
)
assert set(entity_registry.async_device_ids()) == {"new-mock-dev-id"}
assert set(entity_registry.async_device_ids()) == {new_device_entry.id}
modified = created + timedelta(minutes=5)
freezer.move_to(modified)
@@ -262,10 +274,18 @@ def test_create_triggers_save(entity_registry: er.EntityRegistry) -> None:
async def test_loading_saving_data(
hass: HomeAssistant, entity_registry: er.EntityRegistry
hass: HomeAssistant,
device_registry: dr.DeviceRegistry,
entity_registry: er.EntityRegistry,
) -> None:
"""Test that we load/save data correctly."""
mock_config = MockConfigEntry(domain="light")
mock_config.add_to_hass(hass)
device_entry = device_registry.async_get_or_create(
config_entry_id=mock_config.entry_id,
connections={(dr.CONNECTION_NETWORK_MAC, "12:34:56:AB:CD:EF")},
)
orig_entry1 = entity_registry.async_get_or_create("light", "hue", "1234")
orig_entry2 = entity_registry.async_get_or_create(
@@ -274,7 +294,7 @@ async def test_loading_saving_data(
"5678",
capabilities={"max": 100},
config_entry=mock_config,
device_id="mock-dev-id",
device_id=device_entry.id,
disabled_by=er.RegistryEntryDisabler.HASS,
entity_category=EntityCategory.CONFIG,
hidden_by=er.RegistryEntryHider.INTEGRATION,
@@ -338,7 +358,7 @@ async def test_loading_saving_data(
assert new_entry2.capabilities == {"max": 100}
assert new_entry2.config_entry_id == mock_config.entry_id
assert new_entry2.device_class == "user-class"
assert new_entry2.device_id == "mock-dev-id"
assert new_entry2.device_id == device_entry.id
assert new_entry2.disabled_by is er.RegistryEntryDisabler.HASS
assert new_entry2.entity_category == "config"
assert new_entry2.icon == "hass:user-icon"
@@ -1741,6 +1761,16 @@ def test_entity_registry_items() -> None:
assert entities.get_entry(entry2.id) is None
async def test_device_does_not_exist(entity_registry: er.EntityRegistry) -> None:
"""Test adding an entity linked to an unknown device."""
with pytest.raises(ValueError):
entity_registry.async_get_or_create("light", "hue", "1234", device_id="blah")
entity_id = entity_registry.async_get_or_create("light", "hue", "1234").entity_id
with pytest.raises(ValueError):
entity_registry.async_update_entity(entity_id, device_id="blah")
async def test_disabled_by_str_not_allowed(entity_registry: er.EntityRegistry) -> None:
"""Test we need to pass disabled by type."""
with pytest.raises(ValueError):