Improve integration_entities template function (#111943)

This commit is contained in:
Erik Montnemery 2024-03-06 11:05:06 +01:00 committed by GitHub
parent 09b1b40833
commit 8c2c3e0839
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 44 additions and 13 deletions

View File

@ -1286,19 +1286,23 @@ def integration_entities(hass: HomeAssistant, entry_name: str) -> Iterable[str]:
or provide a config entry title for filtering between instances of the same
integration.
"""
# first try if this is a config entry match
conf_entry = next(
(
entry.entry_id
for entry in hass.config_entries.async_entries()
if entry.title == entry_name
),
None,
)
if conf_entry is not None:
ent_reg = entity_registry.async_get(hass)
entries = entity_registry.async_entries_for_config_entry(ent_reg, conf_entry)
return [entry.entity_id for entry in entries]
# Don't allow searching for config entries without title
if not entry_name:
return []
# first try if there are any config entries with a matching title
entities: list[str] = []
ent_reg = entity_registry.async_get(hass)
for entry in hass.config_entries.async_entries():
if entry.title != entry_name:
continue
entries = entity_registry.async_entries_for_config_entry(
ent_reg, entry.entry_id
)
entities.extend(entry.entity_id for entry in entries)
if entities:
return entities
# fallback to just returning all entities for a domain
# pylint: disable-next=import-outside-toplevel

View File

@ -3280,6 +3280,16 @@ async def test_integration_entities(
hass: HomeAssistant, entity_registry: er.EntityRegistry
) -> None:
"""Test integration_entities function."""
# test entities for untitled config entry
config_entry = MockConfigEntry(domain="mock", title="")
config_entry.add_to_hass(hass)
entity_registry.async_get_or_create(
"sensor", "mock", "untitled", config_entry=config_entry
)
info = render_to_info(hass, "{{ integration_entities('') }}")
assert_result_info(info, [])
assert info.rate_limit is None
# test entities for given config entry title
config_entry = MockConfigEntry(domain="mock", title="Mock bridge 2")
config_entry.add_to_hass(hass)
@ -3290,6 +3300,23 @@ async def test_integration_entities(
assert_result_info(info, [entity_entry.entity_id])
assert info.rate_limit is None
# test entities for given non unique config entry title
config_entry = MockConfigEntry(domain="mock", title="Not unique")
config_entry.add_to_hass(hass)
entity_entry_not_unique_1 = entity_registry.async_get_or_create(
"sensor", "mock", "not_unique_1", config_entry=config_entry
)
config_entry = MockConfigEntry(domain="mock", title="Not unique")
config_entry.add_to_hass(hass)
entity_entry_not_unique_2 = entity_registry.async_get_or_create(
"sensor", "mock", "not_unique_2", config_entry=config_entry
)
info = render_to_info(hass, "{{ integration_entities('Not unique') }}")
assert_result_info(
info, [entity_entry_not_unique_1.entity_id, entity_entry_not_unique_2.entity_id]
)
assert info.rate_limit is None
# test integration entities not in entity registry
mock_entity = entity.Entity()
mock_entity.hass = hass