diff --git a/homeassistant/components/google/config_flow.py b/homeassistant/components/google/config_flow.py index 22b62094e76..e320212ca1b 100644 --- a/homeassistant/components/google/config_flow.py +++ b/homeassistant/components/google/config_flow.py @@ -91,6 +91,9 @@ class OAuth2FlowHandler( self.flow_impl.client_secret, calendar_access, ) + except TimeoutError as err: + _LOGGER.error("Timeout initializing device flow: %s", str(err)) + return self.async_abort(reason="timeout_connect") except OAuthError as err: _LOGGER.error("Error initializing device flow: %s", str(err)) return self.async_abort(reason="oauth_error") diff --git a/homeassistant/components/google/strings.json b/homeassistant/components/google/strings.json index 3ff75047f70..b4c5270e003 100644 --- a/homeassistant/components/google/strings.json +++ b/homeassistant/components/google/strings.json @@ -16,6 +16,7 @@ "already_configured": "[%key:common::config_flow::abort::already_configured_account%]", "already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]", "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", + "timeout_connect": "[%key:common::config_flow::error::timeout_connect%]", "oauth_error": "[%key:common::config_flow::abort::oauth2_error%]", "missing_configuration": "[%key:common::config_flow::abort::oauth2_missing_configuration%]", "code_expired": "Authentication code expired or credential setup is invalid, please try again.", diff --git a/tests/components/google/test_config_flow.py b/tests/components/google/test_config_flow.py index 24ad8a7b769..5c373fb2219 100644 --- a/tests/components/google/test_config_flow.py +++ b/tests/components/google/test_config_flow.py @@ -242,7 +242,7 @@ async def test_code_error( mock_code_flow: Mock, component_setup: ComponentSetup, ) -> None: - """Test successful creds setup.""" + """Test server error setting up the oauth flow.""" assert await component_setup() with patch( @@ -256,6 +256,25 @@ async def test_code_error( assert result.get("reason") == "oauth_error" +async def test_timeout_error( + hass: HomeAssistant, + mock_code_flow: Mock, + component_setup: ComponentSetup, +) -> None: + """Test timeout error setting up the oauth flow.""" + assert await component_setup() + + with patch( + "homeassistant.components.google.api.OAuth2WebServerFlow.step1_get_device_and_user_codes", + side_effect=TimeoutError(), + ): + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + assert result.get("type") == "abort" + assert result.get("reason") == "timeout_connect" + + @pytest.mark.parametrize("code_expiration_delta", [datetime.timedelta(seconds=50)]) async def test_expired_after_exchange( hass: HomeAssistant,