diff --git a/homeassistant/components/monzo/__init__.py b/homeassistant/components/monzo/__init__.py index e0aa3f3a847..b0a516ae8ad 100644 --- a/homeassistant/components/monzo/__init__.py +++ b/homeassistant/components/monzo/__init__.py @@ -6,13 +6,16 @@ import logging from homeassistant.const import Platform from homeassistant.core import HomeAssistant +from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.config_entry_oauth2_flow import ( + ImplementationUnavailableError, OAuth2Session, async_get_config_entry_implementation, ) from .api import AuthenticatedMonzoAPI +from .const import DOMAIN from .coordinator import MonzoConfigEntry, MonzoCoordinator _LOGGER = logging.getLogger(__name__) @@ -39,7 +42,13 @@ async def async_migrate_entry(hass: HomeAssistant, entry: MonzoConfigEntry) -> b async def async_setup_entry(hass: HomeAssistant, entry: MonzoConfigEntry) -> bool: """Set up Monzo from a config entry.""" - 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) diff --git a/homeassistant/components/monzo/strings.json b/homeassistant/components/monzo/strings.json index edb1cd513f6..8f727194ab6 100644 --- a/homeassistant/components/monzo/strings.json +++ b/homeassistant/components/monzo/strings.json @@ -50,5 +50,10 @@ "name": "Total balance" } } + }, + "exceptions": { + "oauth2_implementation_unavailable": { + "message": "[%key:common::exceptions::oauth2_implementation_unavailable::message%]" + } } } diff --git a/tests/components/monzo/test_init.py b/tests/components/monzo/test_init.py index f255160f1ed..11fe55f3cf1 100644 --- a/tests/components/monzo/test_init.py +++ b/tests/components/monzo/test_init.py @@ -7,8 +7,11 @@ from freezegun.api import FrozenDateTimeFactory from monzopy import AuthorisationExpiredError from homeassistant.components.monzo.const import DOMAIN -from homeassistant.config_entries import SOURCE_REAUTH +from homeassistant.config_entries import SOURCE_REAUTH, ConfigEntryState from homeassistant.core import HomeAssistant +from homeassistant.helpers.config_entry_oauth2_flow import ( + ImplementationUnavailableError, +) from . import setup_integration @@ -61,3 +64,20 @@ async def test_migrate_entry_minor_version_1_2(hass: HomeAssistant) -> None: assert entry.version == 1 assert entry.minor_version == 2 assert entry.unique_id == "600" + + +async def test_oauth_implementation_not_available( + hass: HomeAssistant, + polling_config_entry: MockConfigEntry, +) -> None: + """Test that unavailable OAuth implementation raises ConfigEntryNotReady.""" + polling_config_entry.add_to_hass(hass) + + with patch( + "homeassistant.components.monzo.async_get_config_entry_implementation", + side_effect=ImplementationUnavailableError, + ): + await hass.config_entries.async_setup(polling_config_entry.entry_id) + await hass.async_block_till_done() + + assert polling_config_entry.state is ConfigEntryState.SETUP_RETRY