test(media_player): MAC-collision pre-check migration branches — occupied MAC falls back to the entry id, free MAC taken (t26 F4)
This commit is contained in:
1 parent
6c925c5241
commit
27715f6932
1 file changed
+76
@@ -532,6 +532,82 @@ class TestLegacyUniqueIdMigration:
|
|||||||
|
|
||||||
assert entry.unique_id == "aa:bb:cc:dd:ee:ff" # MAC preferred
|
assert entry.unique_id == "aa:bb:cc:dd:ee:ff" # MAC preferred
|
||||||
|
|
||||||
|
async def test_mac_collision_falls_back_to_entry_id(self, tmp_path):
|
||||||
|
"""t26 F4: an existing entry owning the target MAC blocks the move."""
|
||||||
|
from types import SimpleNamespace as MigrationEntry
|
||||||
|
|
||||||
|
import entity_stublib
|
||||||
|
|
||||||
|
entity_stublib.load_entity_modules()
|
||||||
|
modules = sys.modules["nsh.media_player"]
|
||||||
|
entry = MigrationEntry(
|
||||||
|
entry_id="cfgid123",
|
||||||
|
data={CONF_ANDROIDTV_ENTITY: "media_player.shield"},
|
||||||
|
options={},
|
||||||
|
title="Shield",
|
||||||
|
unique_id="media_player.shield",
|
||||||
|
runtime_data=None,
|
||||||
|
)
|
||||||
|
|
||||||
|
class _Manager:
|
||||||
|
async def async_protocol_device_info(self):
|
||||||
|
return "Shield TV", "aa:bb:cc:dd:ee:ff"
|
||||||
|
|
||||||
|
entry.runtime_data = _Manager()
|
||||||
|
|
||||||
|
class _Entries:
|
||||||
|
entries = [
|
||||||
|
SimpleNamespace(entry_id="cfgid999", unique_id="aa:bb:cc:dd:ee:ff")
|
||||||
|
]
|
||||||
|
updating_entry_calls: list = []
|
||||||
|
|
||||||
|
def async_update_entry(self, entry, **kwargs):
|
||||||
|
self.updating_entry_calls.append((entry, kwargs))
|
||||||
|
for key, value in kwargs.items():
|
||||||
|
if key in ("options", "data", "unique_id"):
|
||||||
|
setattr(entry, key, value)
|
||||||
|
|
||||||
|
entries = _Entries()
|
||||||
|
entries.hass = FakeHass(str(tmp_path))
|
||||||
|
hass = entries.hass
|
||||||
|
hass.config_entries = entries
|
||||||
|
|
||||||
|
await modules._migrate_legacy_unique_id(hass, entry)
|
||||||
|
|
||||||
|
# collision → the config-entry id is used instead
|
||||||
|
assert entry.unique_id == "cfgid123"
|
||||||
|
|
||||||
|
async def test_free_mac_is_taken_without_collision(self, tmp_path):
|
||||||
|
"""t26 F4: no other entry holds the MAC → the MAC is used."""
|
||||||
|
from types import SimpleNamespace as MigrationEntry
|
||||||
|
|
||||||
|
import entity_stublib
|
||||||
|
|
||||||
|
entity_stublib.load_entity_modules()
|
||||||
|
modules = sys.modules["nsh.media_player"]
|
||||||
|
entry = MigrationEntry(
|
||||||
|
entry_id="cfgid123",
|
||||||
|
data={CONF_ANDROIDTV_ENTITY: "media_player.shield"},
|
||||||
|
options={},
|
||||||
|
title="Shield",
|
||||||
|
unique_id="media_player.shield",
|
||||||
|
runtime_data=None,
|
||||||
|
)
|
||||||
|
|
||||||
|
class _Manager:
|
||||||
|
async def async_protocol_device_info(self):
|
||||||
|
return "Shield TV", "aa:bb:cc:dd:ee:ff"
|
||||||
|
|
||||||
|
entry.runtime_data = _Manager()
|
||||||
|
hass = FakeHass(str(tmp_path))
|
||||||
|
hass.config_entries.entries = [
|
||||||
|
SimpleNamespace(entry_id="cfgid999", unique_id="other:mac") # different MAC
|
||||||
|
]
|
||||||
|
|
||||||
|
await modules._migrate_legacy_unique_id(hass, entry)
|
||||||
|
|
||||||
|
assert entry.unique_id == "aa:bb:cc:dd:ee:ff" # free MAC taken
|
||||||
|
|
||||||
async def test_never_runs_twice_for_a_migrated_entry(self, tmp_path):
|
async def test_never_runs_twice_for_a_migrated_entry(self, tmp_path):
|
||||||
"""The legacy pattern no longer matches after the one-time move."""
|
"""The legacy pattern no longer matches after the one-time move."""
|
||||||
import entity_stublib
|
import entity_stublib
|
||||||
|
|||||||
Reference in new issue
Block a user