Skip to content

Commit 5be2e4e

Browse files
emontnemeryfrenck
authored andcommitted
Handle colliding aliases for areas (home-assistant#151613)
1 parent 75ebbe6 commit 5be2e4e

File tree

2 files changed

+39
-16
lines changed

2 files changed

+39
-16
lines changed

homeassistant/helpers/area_registry.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,7 @@ def _index_entry(self, key: str, entry: AreaEntry) -> None:
179179
self._floors_index[entry.floor_id][key] = True
180180
for label in entry.labels:
181181
self._labels_index[label][key] = True
182-
for alias in entry.aliases:
183-
normalized_alias = normalize_name(alias)
182+
for normalized_alias in {normalize_name(alias) for alias in entry.aliases}:
184183
self._aliases_index[normalized_alias][key] = True
185184

186185
def _unindex_entry(
@@ -190,8 +189,7 @@ def _unindex_entry(
190189
super()._unindex_entry(key, replacement_entry)
191190
entry = self.data[key]
192191
if aliases := entry.aliases:
193-
for alias in aliases:
194-
normalized_alias = normalize_name(alias)
192+
for normalized_alias in {normalize_name(alias) for alias in aliases}:
195193
self._unindex_entry_value(key, normalized_alias, self._aliases_index)
196194
if labels := entry.labels:
197195
for label in labels:

tests/helpers/test_area_registry.py

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -503,18 +503,43 @@ async def test_async_get_areas_by_alias(
503503

504504
assert len(area_registry.areas) == 2
505505

506-
alias1_list = area_registry.async_get_areas_by_alias("A l i a s_1")
507-
alias2_list = area_registry.async_get_areas_by_alias("A l i a s_2")
508-
alias3_list = area_registry.async_get_areas_by_alias("A l i a s_3")
509-
510-
assert len(alias1_list) == 2
511-
assert len(alias2_list) == 1
512-
assert len(alias3_list) == 1
513-
514-
assert area1 in alias1_list
515-
assert area1 in alias2_list
516-
assert area2 in alias1_list
517-
assert area2 in alias3_list
506+
assert area_registry.async_get_areas_by_alias("A l i a s_1") == [area1, area2]
507+
assert area_registry.async_get_areas_by_alias("A l i a s_2") == [area1]
508+
assert area_registry.async_get_areas_by_alias("A l i a s_3")
509+
510+
511+
async def test_async_get_areas_by_alias_collisions(
512+
area_registry: ar.AreaRegistry,
513+
) -> None:
514+
"""Make sure we can get the areas by alias when the aliases have collisions."""
515+
area = area_registry.async_create("Mock1")
516+
assert area_registry.async_get_areas_by_alias("A l i a s 1") == []
517+
518+
# Add an alias
519+
updated_area = area_registry.async_update(area.id, aliases={"alias1"})
520+
assert area_registry.async_get_areas_by_alias("A l i a s 1") == [updated_area]
521+
522+
# Add a colliding alias
523+
updated_area = area_registry.async_update(area.id, aliases={"alias1", "alias 1"})
524+
assert area_registry.async_get_areas_by_alias("A l i a s 1") == [updated_area]
525+
526+
# Add a colliding alias
527+
updated_area = area_registry.async_update(
528+
area.id, aliases={"alias1", "alias 1", "alias 1"}
529+
)
530+
assert area_registry.async_get_areas_by_alias("A l i a s 1") == [updated_area]
531+
532+
# Remove a colliding alias
533+
updated_area = area_registry.async_update(area.id, aliases={"alias1", "alias 1"})
534+
assert area_registry.async_get_areas_by_alias("A l i a s 1") == [updated_area]
535+
536+
# Remove a colliding alias
537+
updated_area = area_registry.async_update(area.id, aliases={"alias1"})
538+
assert area_registry.async_get_areas_by_alias("A l i a s 1") == [updated_area]
539+
540+
# Remove all aliases
541+
updated_area = area_registry.async_update(area.id, aliases={})
542+
assert area_registry.async_get_areas_by_alias("A l i a s 1") == []
518543

519544

520545
async def test_async_get_area_by_name_not_found(area_registry: ar.AreaRegistry) -> None:

0 commit comments

Comments
 (0)