From 6769d20f7604789d9ce190a356caa6b91d752850 Mon Sep 17 00:00:00 2001 From: mib1185 Date: Sun, 13 Aug 2023 20:04:34 +0000 Subject: [PATCH] raise ConfigEntryNotReady when unable to connect --- homeassistant/components/fritzbox/__init__.py | 5 +++- .../components/fritzbox/coordinator.py | 6 ++--- .../components/fritzbox/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/fritzbox/test_init.py | 23 ++++++++++++++++++- 6 files changed, 32 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/fritzbox/__init__.py b/homeassistant/components/fritzbox/__init__.py index 54e09f90df7046..d199d2c5a2c219 100644 --- a/homeassistant/components/fritzbox/__init__.py +++ b/homeassistant/components/fritzbox/__init__.py @@ -5,6 +5,7 @@ from pyfritzhome import Fritzhome, FritzhomeDevice, LoginError from pyfritzhome.devicetypes.fritzhomeentitybase import FritzhomeEntityBase +from requests.exceptions import ConnectionError as RequestConnectionError from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN from homeassistant.config_entries import ConfigEntry @@ -16,7 +17,7 @@ UnitOfTemperature, ) from homeassistant.core import Event, HomeAssistant -from homeassistant.exceptions import ConfigEntryAuthFailed +from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.entity import EntityDescription from homeassistant.helpers.entity_registry import RegistryEntry, async_migrate_entries @@ -36,6 +37,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: try: await hass.async_add_executor_job(fritz.login) + except RequestConnectionError as err: + raise ConfigEntryNotReady from err except LoginError as err: raise ConfigEntryAuthFailed from err diff --git a/homeassistant/components/fritzbox/coordinator.py b/homeassistant/components/fritzbox/coordinator.py index 80087adf9ac9ad..194825e602f523 100644 --- a/homeassistant/components/fritzbox/coordinator.py +++ b/homeassistant/components/fritzbox/coordinator.py @@ -6,7 +6,7 @@ from pyfritzhome import Fritzhome, FritzhomeDevice, LoginError from pyfritzhome.devicetypes import FritzhomeTemplate -import requests +from requests.exceptions import ConnectionError as RequestConnectionError, HTTPError from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant @@ -51,9 +51,9 @@ def _update_fritz_devices(self) -> FritzboxCoordinatorData: self.fritz.update_devices() if self.has_templates: self.fritz.update_templates() - except requests.exceptions.ConnectionError as ex: + except RequestConnectionError as ex: raise UpdateFailed from ex - except requests.exceptions.HTTPError: + except HTTPError: # If the device rebooted, login again try: self.fritz.login() diff --git a/homeassistant/components/fritzbox/manifest.json b/homeassistant/components/fritzbox/manifest.json index 29df2f51a34066..35b78e91f81669 100644 --- a/homeassistant/components/fritzbox/manifest.json +++ b/homeassistant/components/fritzbox/manifest.json @@ -7,7 +7,7 @@ "integration_type": "hub", "iot_class": "local_polling", "loggers": ["pyfritzhome"], - "requirements": ["pyfritzhome==0.6.8"], + "requirements": ["pyfritzhome==0.6.9"], "ssdp": [ { "st": "urn:schemas-upnp-org:device:fritzbox:1" diff --git a/requirements_all.txt b/requirements_all.txt index 15c40edc32dfc1..8b3acf700c403f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1704,7 +1704,7 @@ pyforked-daapd==0.1.14 pyfreedompro==1.1.0 # homeassistant.components.fritzbox -pyfritzhome==0.6.8 +pyfritzhome==0.6.9 # homeassistant.components.ifttt pyfttt==0.3 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 2e5e84347c2693..7ab8bfd56e3ef1 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1259,7 +1259,7 @@ pyforked-daapd==0.1.14 pyfreedompro==1.1.0 # homeassistant.components.fritzbox -pyfritzhome==0.6.8 +pyfritzhome==0.6.9 # homeassistant.components.ifttt pyfttt==0.3 diff --git a/tests/components/fritzbox/test_init.py b/tests/components/fritzbox/test_init.py index 28476d882730f0..dd5a8127185b9f 100644 --- a/tests/components/fritzbox/test_init.py +++ b/tests/components/fritzbox/test_init.py @@ -205,7 +205,7 @@ async def test_coordinator_update_when_unreachable( unique_id="any", ) entry.add_to_hass(hass) - fritz().get_devices.side_effect = [ConnectionError(), ""] + fritz().update_devices.side_effect = [ConnectionError(), ""] assert not await hass.config_entries.async_setup(entry.entry_id) assert entry.state is ConfigEntryState.SETUP_RETRY @@ -258,6 +258,27 @@ async def test_raise_config_entry_not_ready_when_offline(hass: HomeAssistant) -> unique_id="any", ) entry.add_to_hass(hass) + with patch( + "homeassistant.components.fritzbox.Fritzhome.login", + side_effect=ConnectionError(), + ) as mock_login: + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + mock_login.assert_called_once() + + entries = hass.config_entries.async_entries() + config_entry = entries[0] + assert config_entry.state is ConfigEntryState.SETUP_RETRY + + +async def test_raise_config_entry_error_when_login_fail(hass: HomeAssistant) -> None: + """Config entry state is SETUP_ERROR when login to fritzbox fail.""" + entry = MockConfigEntry( + domain=FB_DOMAIN, + data={CONF_HOST: "any", **MOCK_CONFIG[FB_DOMAIN][CONF_DEVICES][0]}, + unique_id="any", + ) + entry.add_to_hass(hass) with patch( "homeassistant.components.fritzbox.Fritzhome.login", side_effect=LoginError("user"),