Raise ConfigEntryNotReady when unable to connect during setup of AVM Fritz!Smarthome (#97985)

This commit is contained in:
Michael 2023-08-14 10:42:20 +02:00 committed by GitHub
parent e0d6210bd0
commit 533a8beac2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 32 additions and 8 deletions

View File

@ -5,6 +5,7 @@ from abc import ABC, abstractmethod
from pyfritzhome import Fritzhome, FritzhomeDevice, LoginError from pyfritzhome import Fritzhome, FritzhomeDevice, LoginError
from pyfritzhome.devicetypes.fritzhomeentitybase import FritzhomeEntityBase 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.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
@ -16,7 +17,7 @@ from homeassistant.const import (
UnitOfTemperature, UnitOfTemperature,
) )
from homeassistant.core import Event, HomeAssistant 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.device_registry import DeviceInfo
from homeassistant.helpers.entity import EntityDescription from homeassistant.helpers.entity import EntityDescription
from homeassistant.helpers.entity_registry import RegistryEntry, async_migrate_entries 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: try:
await hass.async_add_executor_job(fritz.login) await hass.async_add_executor_job(fritz.login)
except RequestConnectionError as err:
raise ConfigEntryNotReady from err
except LoginError as err: except LoginError as err:
raise ConfigEntryAuthFailed from err raise ConfigEntryAuthFailed from err

View File

@ -6,7 +6,7 @@ from datetime import timedelta
from pyfritzhome import Fritzhome, FritzhomeDevice, LoginError from pyfritzhome import Fritzhome, FritzhomeDevice, LoginError
from pyfritzhome.devicetypes import FritzhomeTemplate from pyfritzhome.devicetypes import FritzhomeTemplate
import requests from requests.exceptions import ConnectionError as RequestConnectionError, HTTPError
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@ -51,9 +51,9 @@ class FritzboxDataUpdateCoordinator(DataUpdateCoordinator[FritzboxCoordinatorDat
self.fritz.update_devices() self.fritz.update_devices()
if self.has_templates: if self.has_templates:
self.fritz.update_templates() self.fritz.update_templates()
except requests.exceptions.ConnectionError as ex: except RequestConnectionError as ex:
raise UpdateFailed from ex raise UpdateFailed from ex
except requests.exceptions.HTTPError: except HTTPError:
# If the device rebooted, login again # If the device rebooted, login again
try: try:
self.fritz.login() self.fritz.login()

View File

@ -7,7 +7,7 @@
"integration_type": "hub", "integration_type": "hub",
"iot_class": "local_polling", "iot_class": "local_polling",
"loggers": ["pyfritzhome"], "loggers": ["pyfritzhome"],
"requirements": ["pyfritzhome==0.6.8"], "requirements": ["pyfritzhome==0.6.9"],
"ssdp": [ "ssdp": [
{ {
"st": "urn:schemas-upnp-org:device:fritzbox:1" "st": "urn:schemas-upnp-org:device:fritzbox:1"

View File

@ -1701,7 +1701,7 @@ pyforked-daapd==0.1.14
pyfreedompro==1.1.0 pyfreedompro==1.1.0
# homeassistant.components.fritzbox # homeassistant.components.fritzbox
pyfritzhome==0.6.8 pyfritzhome==0.6.9
# homeassistant.components.ifttt # homeassistant.components.ifttt
pyfttt==0.3 pyfttt==0.3

View File

@ -1256,7 +1256,7 @@ pyforked-daapd==0.1.14
pyfreedompro==1.1.0 pyfreedompro==1.1.0
# homeassistant.components.fritzbox # homeassistant.components.fritzbox
pyfritzhome==0.6.8 pyfritzhome==0.6.9
# homeassistant.components.ifttt # homeassistant.components.ifttt
pyfttt==0.3 pyfttt==0.3

View File

@ -205,7 +205,7 @@ async def test_coordinator_update_when_unreachable(
unique_id="any", unique_id="any",
) )
entry.add_to_hass(hass) 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 not await hass.config_entries.async_setup(entry.entry_id)
assert entry.state is ConfigEntryState.SETUP_RETRY 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", unique_id="any",
) )
entry.add_to_hass(hass) 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( with patch(
"homeassistant.components.fritzbox.Fritzhome.login", "homeassistant.components.fritzbox.Fritzhome.login",
side_effect=LoginError("user"), side_effect=LoginError("user"),