From a4a36b5cbd4713e59dd07bf57dff70a1bf3ab387 Mon Sep 17 00:00:00 2001 From: Will Moss Date: Sat, 28 Mar 2026 09:18:05 -0700 Subject: [PATCH] Handle Oauth2 ImplementationUnavailableError in microbees (#166654) Co-authored-by: Claude Sonnet 4.6 --- .../components/microbees/__init__.py | 16 +++++++++----- .../components/microbees/strings.json | 5 +++++ tests/components/microbees/test_init.py | 21 +++++++++++++++++++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/microbees/__init__.py b/homeassistant/components/microbees/__init__.py index af5d4aa32c78..f0a39dc0352b 100644 --- a/homeassistant/components/microbees/__init__.py +++ b/homeassistant/components/microbees/__init__.py @@ -13,7 +13,7 @@ from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady from homeassistant.helpers import config_entry_oauth2_flow -from .const import PLATFORMS +from .const import DOMAIN, PLATFORMS from .coordinator import MicroBeesUpdateCoordinator _LOGGER = logging.getLogger(__name__) @@ -50,11 +50,17 @@ async def async_migrate_entry(hass: HomeAssistant, entry: MicroBeesConfigEntry) async def async_setup_entry(hass: HomeAssistant, entry: MicroBeesConfigEntry) -> bool: """Set up microBees from a config entry.""" - implementation = ( - await config_entry_oauth2_flow.async_get_config_entry_implementation( - hass, entry + try: + implementation = ( + await config_entry_oauth2_flow.async_get_config_entry_implementation( + hass, entry + ) ) - ) + except config_entry_oauth2_flow.ImplementationUnavailableError as err: + raise ConfigEntryNotReady( + translation_domain=DOMAIN, + translation_key="oauth2_implementation_unavailable", + ) from err session = config_entry_oauth2_flow.OAuth2Session(hass, entry, implementation) try: diff --git a/homeassistant/components/microbees/strings.json b/homeassistant/components/microbees/strings.json index 87c91b8c9ad1..1ad8adbd63df 100644 --- a/homeassistant/components/microbees/strings.json +++ b/homeassistant/components/microbees/strings.json @@ -35,5 +35,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/microbees/test_init.py b/tests/components/microbees/test_init.py index f70c83875724..83228d8babfb 100644 --- a/tests/components/microbees/test_init.py +++ b/tests/components/microbees/test_init.py @@ -3,7 +3,11 @@ from unittest.mock import patch from homeassistant.components.microbees.const import DOMAIN +from homeassistant.config_entries import ConfigEntryState from homeassistant.core import HomeAssistant +from homeassistant.helpers.config_entry_oauth2_flow import ( + ImplementationUnavailableError, +) from tests.common import MockConfigEntry @@ -33,3 +37,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 == "54321" + + +async def test_oauth_implementation_not_available( + hass: HomeAssistant, + config_entry: MockConfigEntry, +) -> None: + """Test that unavailable OAuth implementation raises ConfigEntryNotReady.""" + config_entry.add_to_hass(hass) + + with patch( + "homeassistant.helpers.config_entry_oauth2_flow.async_get_config_entry_implementation", + side_effect=ImplementationUnavailableError, + ): + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + assert config_entry.state is ConfigEntryState.SETUP_RETRY