From d3ae8a938cdea9b6e0d443c91c37ac3dbbd459ab Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 16 May 2020 13:31:15 +0200 Subject: [PATCH] Fix handling of additional data in core config storage (#35660) --- homeassistant/core.py | 25 +++++++++++++++++-------- tests/test_core.py | 17 ++++++++++++++--- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/homeassistant/core.py b/homeassistant/core.py index 929d8c74da4..34df648a4df 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -1454,10 +1454,6 @@ class Config: ) data = await store.async_load() - if data and "external_url" in data: - self._update(source=SOURCE_STORAGE, **data) - return - async def migrate_base_url(_: Event) -> None: """Migrate base_url to internal_url/external_url.""" if self.hass.config.api is None: @@ -1484,11 +1480,24 @@ class Config: external_url=network.normalize_url(str(base_url)) ) - # Try to migrate base_url to internal_url/external_url - self.hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, migrate_base_url) - if data: - self._update(source=SOURCE_STORAGE, **data) + # Try to migrate base_url to internal_url/external_url + if "external_url" not in data: + self.hass.bus.async_listen_once( + EVENT_HOMEASSISTANT_START, migrate_base_url + ) + + self._update( + source=SOURCE_STORAGE, + latitude=data.get("latitude"), + longitude=data.get("longitude"), + elevation=data.get("elevation"), + unit_system=data.get("unit_system"), + location_name=data.get("location_name"), + time_zone=data.get("time_zone"), + external_url=data.get("external_url", _UNDEF), + internal_url=data.get("internal_url", _UNDEF), + ) async def async_store(self) -> None: """Store [homeassistant] core config.""" diff --git a/tests/test_core.py b/tests/test_core.py index ced0b96fbed..3bc001b78b6 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -1294,17 +1294,17 @@ async def test_migration_base_url(hass, hass_storage): with patch.object(hass.bus, "async_listen_once") as mock_listen: # Empty config await config.async_load() - assert len(mock_listen.mock_calls) == 1 + assert len(mock_listen.mock_calls) == 0 # With just a name stored["data"] = {"location_name": "Test Name"} await config.async_load() - assert len(mock_listen.mock_calls) == 2 + assert len(mock_listen.mock_calls) == 1 # With external url stored["data"]["external_url"] = "https://example.com" await config.async_load() - assert len(mock_listen.mock_calls) == 2 + assert len(mock_listen.mock_calls) == 1 # Test that the event listener works assert mock_listen.mock_calls[0][1][0] == EVENT_HOMEASSISTANT_START @@ -1319,3 +1319,14 @@ async def test_migration_base_url(hass, hass_storage): hass.config.api = Mock(deprecated_base_url=internal) await mock_listen.mock_calls[0][1][1](None) assert config.internal_url == internal + + +async def test_additional_data_in_core_config(hass, hass_storage): + """Test that we can handle additional data in core configuration.""" + config = ha.Config(hass) + hass_storage[ha.CORE_STORAGE_KEY] = { + "version": 1, + "data": {"location_name": "Test Name", "additional_valid_key": "value"}, + } + await config.async_load() + assert config.location_name == "Test Name"