Fix logic of entity id extraction (#49164)

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
pull/49208/head
Tobias Sauerwein 2021-04-14 14:12:26 +02:00 committed by GitHub
parent fe1e57e76f
commit 9d4ad1821e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 3 deletions

View File

@ -362,8 +362,16 @@ async def async_extract_referenced_entity_ids(
return selected
for ent_entry in ent_reg.entities.values():
if ent_entry.area_id in selector.area_ids or (
not ent_entry.area_id and ent_entry.device_id in selected.referenced_devices
if (
# when area matches the target area
ent_entry.area_id in selector.area_ids
# when device matches a referenced devices with no explicitly set area
or (
not ent_entry.area_id
and ent_entry.device_id in selected.referenced_devices
)
# when device matches target device
or ent_entry.device_id in selector.device_ids
):
selected.indirectly_referenced.add(ent_entry.entity_id)

View File

@ -95,6 +95,7 @@ def area_mock(hass):
device_in_area = dev_reg.DeviceEntry(area_id="test-area")
device_no_area = dev_reg.DeviceEntry(id="device-no-area-id")
device_diff_area = dev_reg.DeviceEntry(area_id="diff-area")
device_area_a = dev_reg.DeviceEntry(id="device-area-a-id", area_id="area-a")
mock_device_registry(
hass,
@ -102,6 +103,7 @@ def area_mock(hass):
device_in_area.id: device_in_area,
device_no_area.id: device_no_area,
device_diff_area.id: device_diff_area,
device_area_a.id: device_area_a,
},
)
@ -119,7 +121,7 @@ def area_mock(hass):
)
entity_in_other_area = ent_reg.RegistryEntry(
entity_id="light.in_other_area",
unique_id="in-other-area-id",
unique_id="in-area-a-id",
platform="test",
device_id=device_in_area.id,
area_id="other-area",
@ -143,6 +145,20 @@ def area_mock(hass):
platform="test",
device_id=device_diff_area.id,
)
entity_in_area_a = ent_reg.RegistryEntry(
entity_id="light.in_area_a",
unique_id="in-area-a-id",
platform="test",
device_id=device_area_a.id,
area_id="area-a",
)
entity_in_area_b = ent_reg.RegistryEntry(
entity_id="light.in_area_b",
unique_id="in-area-b-id",
platform="test",
device_id=device_area_a.id,
area_id="area-b",
)
mock_registry(
hass,
{
@ -152,6 +168,8 @@ def area_mock(hass):
entity_assigned_to_area.entity_id: entity_assigned_to_area,
entity_no_area.entity_id: entity_no_area,
entity_diff_area.entity_id: entity_diff_area,
entity_in_area_a.entity_id: entity_in_area_a,
entity_in_area_b.entity_id: entity_in_area_b,
},
)
@ -399,6 +417,29 @@ async def test_extract_entity_ids_from_area(hass, area_mock):
)
async def test_extract_entity_ids_from_devices(hass, area_mock):
"""Test extract_entity_ids method with devices."""
assert await service.async_extract_entity_ids(
hass, ha.ServiceCall("light", "turn_on", {"device_id": "device-no-area-id"})
) == {
"light.no_area",
}
assert await service.async_extract_entity_ids(
hass, ha.ServiceCall("light", "turn_on", {"device_id": "device-area-a-id"})
) == {
"light.in_area_a",
"light.in_area_b",
}
assert (
await service.async_extract_entity_ids(
hass, ha.ServiceCall("light", "turn_on", {"device_id": "non-existing-id"})
)
== set()
)
async def test_async_get_all_descriptions(hass):
"""Test async_get_all_descriptions."""
group = hass.components.group