diff --git a/homeassistant/components/nexia/__init__.py b/homeassistant/components/nexia/__init__.py index b221f440ff8..0644de58ee7 100644 --- a/homeassistant/components/nexia/__init__.py +++ b/homeassistant/components/nexia/__init__.py @@ -56,6 +56,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: ) return False raise ConfigEntryNotReady(f"Error from Nexia service: {http_ex}") from http_ex + except aiohttp.ClientOSError as os_error: + raise ConfigEntryNotReady( + f"Error connecting to Nexia service: {os_error}" + ) from os_error coordinator = NexiaDataUpdateCoordinator(hass, nexia_home) await coordinator.async_config_entry_first_refresh() diff --git a/tests/components/nexia/test_init.py b/tests/components/nexia/test_init.py index dd147c4cb21..5409181f00e 100644 --- a/tests/components/nexia/test_init.py +++ b/tests/components/nexia/test_init.py @@ -1,5 +1,8 @@ """The init tests for the nexia platform.""" +import aiohttp + from homeassistant.components.nexia.const import DOMAIN +from homeassistant.config_entries import ConfigEntryState from homeassistant.core import HomeAssistant from homeassistant.helpers import device_registry as dr, entity_registry as er from homeassistant.helpers.entity_registry import EntityRegistry @@ -10,6 +13,12 @@ from .util import async_init_integration from tests.typing import WebSocketGenerator +async def test_setup_retry_client_os_error(hass: HomeAssistant) -> None: + """Verify we retry setup on aiohttp.ClientOSError.""" + config_entry = await async_init_integration(hass, exception=aiohttp.ClientOSError) + assert config_entry.state == ConfigEntryState.SETUP_RETRY + + async def remove_device(ws_client, device_id, config_entry_id): """Remove config entry from a device.""" await ws_client.send_json( diff --git a/tests/components/nexia/util.py b/tests/components/nexia/util.py index d564ccc351c..318a317fae4 100644 --- a/tests/components/nexia/util.py +++ b/tests/components/nexia/util.py @@ -15,6 +15,7 @@ from tests.test_util.aiohttp import mock_aiohttp_client async def async_init_integration( hass: HomeAssistant, skip_setup: bool = False, + exception: Exception | None = None, ) -> MockConfigEntry: """Set up the nexia integration in Home Assistant.""" @@ -25,9 +26,18 @@ async def async_init_integration( "nexia.home.load_or_create_uuid", return_value=uuid.uuid4() ): nexia = NexiaHome(mock_session) - mock_session.post( - nexia.API_MOBILE_SESSION_URL, text=load_fixture(session_fixture) - ) + if exception: + + async def _raise_exception(*args, **kwargs): + raise exception + + mock_session.post( + nexia.API_MOBILE_SESSION_URL, side_effect=_raise_exception + ) + else: + mock_session.post( + nexia.API_MOBILE_SESSION_URL, text=load_fixture(session_fixture) + ) mock_session.get( nexia.API_MOBILE_HOUSES_URL.format(house_id=123456), text=load_fixture(house_fixture),