Skip to content

Commit 422862a

Browse files
emontnemeryfrenck
authored andcommitted
Handle colliding aliases for floors (home-assistant#151614)
1 parent 5be2e4e commit 422862a

File tree

2 files changed

+43
-16
lines changed

2 files changed

+43
-16
lines changed

homeassistant/helpers/floor_registry.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,7 @@ def __init__(self) -> None:
105105
def _index_entry(self, key: str, entry: FloorEntry) -> None:
106106
"""Index an entry."""
107107
super()._index_entry(key, entry)
108-
for alias in entry.aliases:
109-
normalized_alias = normalize_name(alias)
108+
for normalized_alias in {normalize_name(alias) for alias in entry.aliases}:
110109
self._aliases_index[normalized_alias][key] = True
111110

112111
def _unindex_entry(
@@ -116,8 +115,7 @@ def _unindex_entry(
116115
super()._unindex_entry(key, replacement_entry)
117116
entry = self.data[key]
118117
if aliases := entry.aliases:
119-
for alias in aliases:
120-
normalized_alias = normalize_name(alias)
118+
for normalized_alias in {normalize_name(alias) for alias in aliases}:
121119
self._unindex_entry_value(key, normalized_alias, self._aliases_index)
122120

123121
def get_floors_for_alias(self, alias: str) -> list[FloorEntry]:

tests/helpers/test_floor_registry.py

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -348,18 +348,47 @@ async def test_async_get_floors_by_alias(
348348
floor1 = floor_registry.async_create("First floor", aliases=("alias_1", "alias_2"))
349349
floor2 = floor_registry.async_create("Second floor", aliases=("alias_1", "alias_3"))
350350

351-
alias1_list = floor_registry.async_get_floors_by_alias("A l i a s_1")
352-
alias2_list = floor_registry.async_get_floors_by_alias("A l i a s_2")
353-
alias3_list = floor_registry.async_get_floors_by_alias("A l i a s_3")
354-
355-
assert len(alias1_list) == 2
356-
assert len(alias2_list) == 1
357-
assert len(alias3_list) == 1
358-
359-
assert floor1 in alias1_list
360-
assert floor1 in alias2_list
361-
assert floor2 in alias1_list
362-
assert floor2 in alias3_list
351+
assert floor_registry.async_get_floors_by_alias("A l i a s_1") == [floor1, floor2]
352+
assert floor_registry.async_get_floors_by_alias("A l i a s_2") == [floor1]
353+
assert floor_registry.async_get_floors_by_alias("A l i a s_3") == [floor2]
354+
355+
356+
async def test_async_get_floors_by_alias_collisions(
357+
floor_registry: fr.FloorRegistry,
358+
) -> None:
359+
"""Make sure we can get the floors by alias when the aliases have collisions."""
360+
floor = floor_registry.async_create("First floor")
361+
assert floor_registry.async_get_floors_by_alias("A l i a s 1") == []
362+
363+
# Add an alias
364+
updated_floor = floor_registry.async_update(floor.floor_id, aliases={"alias1"})
365+
assert floor_registry.async_get_floors_by_alias("A l i a s 1") == [updated_floor]
366+
367+
# Add a colliding alias
368+
updated_floor = floor_registry.async_update(
369+
floor.floor_id, aliases={"alias1", "alias 1"}
370+
)
371+
assert floor_registry.async_get_floors_by_alias("A l i a s 1") == [updated_floor]
372+
373+
# Add a colliding alias
374+
updated_floor = floor_registry.async_update(
375+
floor.floor_id, aliases={"alias1", "alias 1", "alias 1"}
376+
)
377+
assert floor_registry.async_get_floors_by_alias("A l i a s 1") == [updated_floor]
378+
379+
# Remove a colliding alias
380+
updated_floor = floor_registry.async_update(
381+
floor.floor_id, aliases={"alias1", "alias 1"}
382+
)
383+
assert floor_registry.async_get_floors_by_alias("A l i a s 1") == [updated_floor]
384+
385+
# Remove a colliding alias
386+
updated_floor = floor_registry.async_update(floor.floor_id, aliases={"alias1"})
387+
assert floor_registry.async_get_floors_by_alias("A l i a s 1") == [updated_floor]
388+
389+
# Remove all aliases
390+
updated_floor = floor_registry.async_update(floor.floor_id, aliases={})
391+
assert floor_registry.async_get_floors_by_alias("A l i a s 1") == []
363392

364393

365394
async def test_async_get_floor_by_name_not_found(

0 commit comments

Comments
 (0)