diff --git a/homeassistant/components/evil_genius_labs/config_flow.py b/homeassistant/components/evil_genius_labs/config_flow.py index f4f7b464904..744e0194ded 100644 --- a/homeassistant/components/evil_genius_labs/config_flow.py +++ b/homeassistant/components/evil_genius_labs/config_flow.py @@ -1,10 +1,12 @@ """Config flow for Evil Genius Labs integration.""" from __future__ import annotations +import asyncio import logging from typing import Any import aiohttp +import async_timeout import pyevilgenius import voluptuous as vol @@ -29,9 +31,11 @@ async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str, ) try: - data = await hub.get_data() - info = await hub.get_info() + async with async_timeout.timeout(10): + data = await hub.get_data() + info = await hub.get_info() except aiohttp.ClientError as err: + _LOGGER.debug("Unable to connect: %s", err) raise CannotConnect from err return {"title": data["name"]["value"], "unique_id": info["wiFiChipId"]} @@ -60,6 +64,8 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): try: info = await validate_input(self.hass, user_input) + except asyncio.TimeoutError: + errors["base"] = "timeout" except CannotConnect: errors["base"] = "cannot_connect" except Exception: # pylint: disable=broad-except diff --git a/homeassistant/components/evil_genius_labs/strings.json b/homeassistant/components/evil_genius_labs/strings.json index 16c5de158a9..790e9a69c7f 100644 --- a/homeassistant/components/evil_genius_labs/strings.json +++ b/homeassistant/components/evil_genius_labs/strings.json @@ -9,6 +9,7 @@ }, "error": { "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", + "timeout": "[%key:common::config_flow::error::timeout_connect%]", "unknown": "[%key:common::config_flow::error::unknown%]" } } diff --git a/homeassistant/strings.json b/homeassistant/strings.json index 31693c5bba1..39c041bb464 100644 --- a/homeassistant/strings.json +++ b/homeassistant/strings.json @@ -56,7 +56,8 @@ "invalid_api_key": "Invalid API key", "invalid_auth": "Invalid authentication", "invalid_host": "Invalid hostname or IP address", - "unknown": "Unexpected error" + "unknown": "Unexpected error", + "timeout_connect": "Timeout establishing connection" }, "abort": { "single_instance_allowed": "Already configured. Only a single configuration possible.", diff --git a/tests/components/evil_genius_labs/test_config_flow.py b/tests/components/evil_genius_labs/test_config_flow.py index 55e207ba7e0..6a5d4ea816a 100644 --- a/tests/components/evil_genius_labs/test_config_flow.py +++ b/tests/components/evil_genius_labs/test_config_flow.py @@ -1,4 +1,5 @@ """Test the Evil Genius Labs config flow.""" +import asyncio from unittest.mock import patch import aiohttp @@ -43,7 +44,7 @@ async def test_form(hass: HomeAssistant, data_fixture, info_fixture) -> None: assert len(mock_setup_entry.mock_calls) == 1 -async def test_form_cannot_connect(hass: HomeAssistant) -> None: +async def test_form_cannot_connect(hass: HomeAssistant, caplog) -> None: """Test we handle cannot connect error.""" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_USER} @@ -62,6 +63,28 @@ async def test_form_cannot_connect(hass: HomeAssistant) -> None: assert result2["type"] == RESULT_TYPE_FORM assert result2["errors"] == {"base": "cannot_connect"} + assert "Unable to connect" in caplog.text + + +async def test_form_timeout(hass: HomeAssistant) -> None: + """Test we handle timeout error.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + with patch( + "pyevilgenius.EvilGeniusDevice.get_data", + side_effect=asyncio.TimeoutError, + ): + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], + { + "host": "1.1.1.1", + }, + ) + + assert result2["type"] == RESULT_TYPE_FORM + assert result2["errors"] == {"base": "timeout"} async def test_form_unknown(hass: HomeAssistant) -> None: