From 1f8fd52103d6563f264e0f643a9a31e9ae736bb3 Mon Sep 17 00:00:00 2001 From: Duco Sebel <74970928+DCSBL@users.noreply.github.com> Date: Fri, 18 Oct 2024 14:48:41 +0200 Subject: [PATCH] Fix reload not triggered on DisabledError in HomeWizard (#128636) * Fix reload not triggered on DisabledError in HomeWizard * Update homeassistant/components/homewizard/coordinator.py Co-authored-by: epenet <6771947+epenet@users.noreply.github.com> * Use helper and fix merge issue * Add test to detect reload on DisabledError * Wait until next update instead of a direct call to update * Add doc why we reload --------- Co-authored-by: epenet <6771947+epenet@users.noreply.github.com> --- .../components/homewizard/coordinator.py | 3 +- tests/components/homewizard/test_init.py | 39 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/homewizard/coordinator.py b/homeassistant/components/homewizard/coordinator.py index db41d1dd128..61b304eb39c 100644 --- a/homeassistant/components/homewizard/coordinator.py +++ b/homeassistant/components/homewizard/coordinator.py @@ -74,7 +74,8 @@ class HWEnergyDeviceUpdateCoordinator(DataUpdateCoordinator[DeviceResponseEntry] # Do not reload when performing first refresh if self.data is not None: - await self.hass.config_entries.async_reload( + # Reload config entry to let init flow handle retrying and trigger repair flow + self.hass.config_entries.async_schedule_reload( self.config_entry.entry_id ) diff --git a/tests/components/homewizard/test_init.py b/tests/components/homewizard/test_init.py index 77275276cc9..a01f075ee61 100644 --- a/tests/components/homewizard/test_init.py +++ b/tests/components/homewizard/test_init.py @@ -1,7 +1,9 @@ """Tests for the homewizard component.""" +from datetime import timedelta from unittest.mock import MagicMock +from freezegun.api import FrozenDateTimeFactory from homewizard_energy.errors import DisabledError import pytest @@ -9,7 +11,7 @@ from homeassistant.components.homewizard.const import DOMAIN from homeassistant.config_entries import SOURCE_REAUTH, ConfigEntryState from homeassistant.core import HomeAssistant -from tests.common import MockConfigEntry +from tests.common import MockConfigEntry, async_fire_time_changed async def test_load_unload( @@ -93,3 +95,38 @@ async def test_load_removes_reauth_flow( # Flow should be removed flows = hass.config_entries.flow.async_progress_by_handler(DOMAIN) assert len(flows) == 0 + + +@pytest.mark.usefixtures("mock_homewizardenergy") +async def test_disablederror_reloads_integration( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mock_homewizardenergy: MagicMock, + freezer: FrozenDateTimeFactory, +) -> None: + """Test DisabledError reloads integration.""" + mock_config_entry.add_to_hass(hass) + await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + # Make sure current state is loaded and not reauth flow is active + assert mock_config_entry.state is ConfigEntryState.LOADED + flows = hass.config_entries.flow.async_progress_by_handler(DOMAIN) + assert len(flows) == 0 + + # Simulate DisabledError and wait for next update + mock_homewizardenergy.device.side_effect = DisabledError() + + freezer.tick(timedelta(seconds=5)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + + # State should be setup retry and reauth flow should be active + assert mock_config_entry.state is ConfigEntryState.SETUP_RETRY + + flows = hass.config_entries.flow.async_progress_by_handler(DOMAIN) + assert len(flows) == 1 + + flow = flows[0] + assert flow.get("step_id") == "reauth_confirm" + assert flow.get("handler") == DOMAIN