diff --git a/homeassistant/components/iotty/__init__.py b/homeassistant/components/iotty/__init__.py index c9eb2639348..02e69126492 100644 --- a/homeassistant/components/iotty/__init__.py +++ b/homeassistant/components/iotty/__init__.py @@ -6,11 +6,14 @@ import logging from homeassistant.const import Platform from homeassistant.core import HomeAssistant +from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers.config_entry_oauth2_flow import ( + ImplementationUnavailableError, OAuth2Session, async_get_config_entry_implementation, ) +from .const import DOMAIN from .coordinator import ( IottyConfigEntry, IottyConfigEntryData, @@ -26,7 +29,13 @@ async def async_setup_entry(hass: HomeAssistant, entry: IottyConfigEntry) -> boo """Set up iotty from a config entry.""" _LOGGER.debug("async_setup_entry entry_id=%s", entry.entry_id) - implementation = await async_get_config_entry_implementation(hass, entry) + try: + implementation = await async_get_config_entry_implementation(hass, entry) + except ImplementationUnavailableError as err: + raise ConfigEntryNotReady( + translation_domain=DOMAIN, + translation_key="oauth2_implementation_unavailable", + ) from err session = OAuth2Session(hass, entry, implementation) data_update_coordinator = IottyDataUpdateCoordinator(hass, entry, session) diff --git a/homeassistant/components/iotty/strings.json b/homeassistant/components/iotty/strings.json index 33176be1235..2e37d0c99f0 100644 --- a/homeassistant/components/iotty/strings.json +++ b/homeassistant/components/iotty/strings.json @@ -25,5 +25,10 @@ "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" } } + }, + "exceptions": { + "oauth2_implementation_unavailable": { + "message": "[%key:common::exceptions::oauth2_implementation_unavailable::message%]" + } } } diff --git a/tests/components/iotty/test_init.py b/tests/components/iotty/test_init.py index ee8168fdf2f..5616438e2d4 100644 --- a/tests/components/iotty/test_init.py +++ b/tests/components/iotty/test_init.py @@ -1,11 +1,14 @@ """Tests for the iotty integration.""" -from unittest.mock import MagicMock +from unittest.mock import MagicMock, patch from homeassistant.components.iotty.const import DOMAIN from homeassistant.config_entries import ConfigEntryState from homeassistant.core import HomeAssistant from homeassistant.helpers import config_entry_oauth2_flow +from homeassistant.helpers.config_entry_oauth2_flow import ( + ImplementationUnavailableError, +) from tests.common import MockConfigEntry @@ -41,6 +44,23 @@ async def test_load_unload_coordinator_called( assert mock_config_entry.state is ConfigEntryState.NOT_LOADED +async def test_oauth_implementation_not_available( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, +) -> None: + """Test that unavailable OAuth implementation raises ConfigEntryNotReady.""" + mock_config_entry.add_to_hass(hass) + + with patch( + "homeassistant.components.iotty.async_get_config_entry_implementation", + side_effect=ImplementationUnavailableError, + ): + await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + assert mock_config_entry.state is ConfigEntryState.SETUP_RETRY + + async def test_load_unload_iottyproxy_called( hass: HomeAssistant, mock_config_entry: MockConfigEntry,