From 48a0eb90a7ec61220bc4c1355f7d2cf1ce0c5c3c Mon Sep 17 00:00:00 2001 From: G Johansson <goran.johansson@shiftit.se> Date: Fri, 25 Oct 2024 12:03:39 +0200 Subject: [PATCH] Migrate config entry in anova to remove devices from entry data (#128934) --- homeassistant/components/anova/__init__.py | 24 ++++++++++++- homeassistant/components/anova/config_flow.py | 5 ++- tests/components/anova/__init__.py | 1 + tests/components/anova/test_config_flow.py | 3 +- tests/components/anova/test_init.py | 36 +++++++++++++++++++ 5 files changed, 63 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/anova/__init__.py b/homeassistant/components/anova/__init__.py index 02c468c1319..4ae4750b9a9 100644 --- a/homeassistant/components/anova/__init__.py +++ b/homeassistant/components/anova/__init__.py @@ -13,7 +13,7 @@ from anova_wifi import ( WebsocketFailure, ) -from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, Platform +from homeassistant.const import CONF_DEVICES, CONF_PASSWORD, CONF_USERNAME, Platform from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import aiohttp_client @@ -71,3 +71,25 @@ async def async_unload_entry(hass: HomeAssistant, entry: AnovaConfigEntry) -> bo # Disconnect from WS await entry.runtime_data.api.disconnect_websocket() return unload_ok + + +async def async_migrate_entry(hass: HomeAssistant, entry: AnovaConfigEntry) -> bool: + """Migrate entry.""" + _LOGGER.debug("Migrating from version %s:%s", entry.version, entry.minor_version) + + if entry.version > 1: + # This means the user has downgraded from a future version + return False + + if entry.version == 1 and entry.minor_version == 1: + new_data = {**entry.data} + if CONF_DEVICES in new_data: + new_data.pop(CONF_DEVICES) + + hass.config_entries.async_update_entry(entry, data=new_data, minor_version=2) + + _LOGGER.debug( + "Migration to version %s:%s successful", entry.version, entry.minor_version + ) + + return True diff --git a/homeassistant/components/anova/config_flow.py b/homeassistant/components/anova/config_flow.py index 6e331ccf4a2..bc4723b1dba 100644 --- a/homeassistant/components/anova/config_flow.py +++ b/homeassistant/components/anova/config_flow.py @@ -6,7 +6,7 @@ from anova_wifi import AnovaApi, InvalidLogin import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult -from homeassistant.const import CONF_DEVICES, CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME from homeassistant.helpers.aiohttp_client import async_get_clientsession from .const import DOMAIN @@ -16,6 +16,7 @@ class AnovaConfligFlow(ConfigFlow, domain=DOMAIN): """Sets up a config flow for Anova.""" VERSION = 1 + MINOR_VERSION = 2 async def async_step_user( self, user_input: dict[str, str] | None = None @@ -42,8 +43,6 @@ class AnovaConfligFlow(ConfigFlow, domain=DOMAIN): data={ CONF_USERNAME: user_input[CONF_USERNAME], CONF_PASSWORD: user_input[CONF_PASSWORD], - # this can be removed in a migration to 1.2 in 2024.11 - CONF_DEVICES: [], }, ) diff --git a/tests/components/anova/__init__.py b/tests/components/anova/__init__.py index 887f5b3b05b..903a1180980 100644 --- a/tests/components/anova/__init__.py +++ b/tests/components/anova/__init__.py @@ -36,6 +36,7 @@ def create_entry(hass: HomeAssistant, device_id: str = DEVICE_UNIQUE_ID) -> Conf }, unique_id="sample@gmail.com", version=1, + minor_version=2, ) entry.add_to_hass(hass) return entry diff --git a/tests/components/anova/test_config_flow.py b/tests/components/anova/test_config_flow.py index 0f93b869296..3b2afaa49c0 100644 --- a/tests/components/anova/test_config_flow.py +++ b/tests/components/anova/test_config_flow.py @@ -6,7 +6,7 @@ from anova_wifi import AnovaApi, InvalidLogin from homeassistant import config_entries from homeassistant.components.anova.const import DOMAIN -from homeassistant.const import CONF_DEVICES, CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME from homeassistant.core import HomeAssistant from homeassistant.data_entry_flow import FlowResultType @@ -27,7 +27,6 @@ async def test_flow_user(hass: HomeAssistant, anova_api: AnovaApi) -> None: assert result["data"] == { CONF_USERNAME: "sample@gmail.com", CONF_PASSWORD: "sample", - CONF_DEVICES: [], } diff --git a/tests/components/anova/test_init.py b/tests/components/anova/test_init.py index 66ea11fdaef..2e3e2920abc 100644 --- a/tests/components/anova/test_init.py +++ b/tests/components/anova/test_init.py @@ -1,13 +1,18 @@ """Test init for Anova.""" +from unittest.mock import patch + from anova_wifi import AnovaApi from homeassistant.components.anova.const import DOMAIN from homeassistant.config_entries import ConfigEntryState +from homeassistant.const import CONF_DEVICES, CONF_PASSWORD, CONF_USERNAME from homeassistant.core import HomeAssistant from . import async_init_integration, create_entry +from tests.common import MockConfigEntry + async def test_async_setup_entry(hass: HomeAssistant, anova_api: AnovaApi) -> None: """Test a successful setup entry.""" @@ -55,3 +60,34 @@ async def test_websocket_failure( """Test that we successfully handle a websocket failure on setup.""" entry = await async_init_integration(hass) assert entry.state is ConfigEntryState.SETUP_RETRY + + +async def test_migration_removing_devices_in_config_entry( + hass: HomeAssistant, anova_api: AnovaApi +) -> None: + """Test a successful setup entry.""" + entry = MockConfigEntry( + domain=DOMAIN, + title="Anova", + data={ + CONF_USERNAME: "sample@gmail.com", + CONF_PASSWORD: "sample", + CONF_DEVICES: [], + }, + unique_id="sample@gmail.com", + version=1, + minor_version=1, + ) + entry.add_to_hass(hass) + + with patch("homeassistant.components.anova.AnovaApi.authenticate"): + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + state = hass.states.get("sensor.anova_precision_cooker_mode") + assert state is not None + assert state.state == "idle" + + assert entry.version == 1 + assert entry.minor_version == 2 + assert CONF_DEVICES not in entry.data -- GitLab