1
0
mirror of https://github.com/home-assistant/core.git synced 2025-12-26 22:18:40 +00:00

Migrate device connections to a normalized form (#140383)

* Normalize device connections migration

* Update version

* Slightly improve tests

* Update homeassistant/helpers/device_registry.py

* Add validators

* Fix validator

* Move format mac function too

* Add validator test

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
This commit is contained in:
Artur Pragacz
2025-06-26 15:33:34 +02:00
committed by GitHub
parent bc46894b74
commit 40f553a007
2 changed files with 201 additions and 33 deletions

View File

@@ -1432,6 +1432,141 @@ async def test_migration_from_1_7(
}
@pytest.mark.parametrize("load_registries", [False])
@pytest.mark.usefixtures("freezer")
async def test_migration_from_1_10(
hass: HomeAssistant,
hass_storage: dict[str, Any],
mock_config_entry: MockConfigEntry,
) -> None:
"""Test migration from version 1.10."""
hass_storage[dr.STORAGE_KEY] = {
"version": 1,
"minor_version": 10,
"key": dr.STORAGE_KEY,
"data": {
"devices": [
{
"area_id": None,
"config_entries": [mock_config_entry.entry_id],
"config_entries_subentries": {mock_config_entry.entry_id: [None]},
"configuration_url": None,
"connections": [["mac", "123456ABCDEF"]],
"created_at": "1970-01-01T00:00:00+00:00",
"disabled_by": None,
"entry_type": "service",
"hw_version": "hw_version",
"id": "abcdefghijklm",
"identifiers": [["serial", "123456ABCDEF"]],
"labels": ["blah"],
"manufacturer": "manufacturer",
"model": "model",
"name": "name",
"model_id": None,
"modified_at": "1970-01-01T00:00:00+00:00",
"name_by_user": None,
"primary_config_entry": mock_config_entry.entry_id,
"serial_number": None,
"sw_version": "new_version",
"via_device_id": None,
},
],
"deleted_devices": [
{
"area_id": None,
"config_entries": ["234567"],
"config_entries_subentries": {"234567": [None]},
"connections": [["mac", "123456ABCDAB"]],
"created_at": "1970-01-01T00:00:00+00:00",
"disabled_by": None,
"id": "abcdefghijklm2",
"identifiers": [["serial", "123456ABCDAB"]],
"labels": [],
"modified_at": "1970-01-01T00:00:00+00:00",
"name_by_user": None,
"orphaned_timestamp": "1970-01-01T00:00:00+00:00",
},
],
},
}
await dr.async_load(hass)
registry = dr.async_get(hass)
# Test data was loaded
entry = registry.async_get_or_create(
config_entry_id=mock_config_entry.entry_id,
identifiers={("serial", "123456ABCDEF")},
)
assert entry.id == "abcdefghijklm"
deleted_entry = registry.deleted_devices.get_entry(
connections=set(),
identifiers={("serial", "123456ABCDAB")},
)
assert deleted_entry.id == "abcdefghijklm2"
# Update to trigger a store
entry = registry.async_get_or_create(
config_entry_id=mock_config_entry.entry_id,
identifiers={("serial", "123456ABCDEF")},
sw_version="new_version",
)
assert entry.id == "abcdefghijklm"
# Check we store migrated data
await flush_store(registry._store)
assert hass_storage[dr.STORAGE_KEY] == {
"version": dr.STORAGE_VERSION_MAJOR,
"minor_version": dr.STORAGE_VERSION_MINOR,
"key": dr.STORAGE_KEY,
"data": {
"devices": [
{
"area_id": None,
"config_entries": [mock_config_entry.entry_id],
"config_entries_subentries": {mock_config_entry.entry_id: [None]},
"configuration_url": None,
"connections": [["mac", "12:34:56:ab:cd:ef"]],
"created_at": "1970-01-01T00:00:00+00:00",
"disabled_by": None,
"entry_type": "service",
"hw_version": "hw_version",
"id": "abcdefghijklm",
"identifiers": [["serial", "123456ABCDEF"]],
"labels": ["blah"],
"manufacturer": "manufacturer",
"model": "model",
"name": "name",
"model_id": None,
"modified_at": "1970-01-01T00:00:00+00:00",
"name_by_user": None,
"primary_config_entry": mock_config_entry.entry_id,
"serial_number": None,
"sw_version": "new_version",
"via_device_id": None,
},
],
"deleted_devices": [
{
"area_id": None,
"config_entries": ["234567"],
"config_entries_subentries": {"234567": [None]},
"connections": [["mac", "12:34:56:ab:cd:ab"]],
"created_at": "1970-01-01T00:00:00+00:00",
"disabled_by": None,
"id": "abcdefghijklm2",
"identifiers": [["serial", "123456ABCDAB"]],
"labels": [],
"modified_at": "1970-01-01T00:00:00+00:00",
"name_by_user": None,
"orphaned_timestamp": "1970-01-01T00:00:00+00:00",
},
],
},
}
async def test_removing_config_entries(
hass: HomeAssistant, device_registry: dr.DeviceRegistry
) -> None:
@@ -4753,3 +4888,9 @@ async def test_update_device_no_connections_or_identifiers(
device_registry.async_update_device(
device.id, new_connections=set(), new_identifiers=set()
)
async def test_connections_validator() -> None:
"""Test checking connections validator."""
with pytest.raises(ValueError, match="Invalid mac address format"):
dr.DeviceEntry(connections={(dr.CONNECTION_NETWORK_MAC, "123456ABCDEF")})