Improve exceptions in Alexa Devices (#148260)

This commit is contained in:
Simone Chemelli 2025-07-08 18:58:48 +03:00 committed by GitHub
parent a35299d94c
commit 6e63c17b39
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 37 additions and 10 deletions

View File

@ -6,7 +6,12 @@ from collections.abc import Mapping
from typing import Any from typing import Any
from aioamazondevices.api import AmazonEchoApi from aioamazondevices.api import AmazonEchoApi
from aioamazondevices.exceptions import CannotAuthenticate, CannotConnect, WrongCountry from aioamazondevices.exceptions import (
CannotAuthenticate,
CannotConnect,
CannotRetrieveData,
WrongCountry,
)
import voluptuous as vol import voluptuous as vol
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
@ -57,6 +62,8 @@ class AmazonDevicesConfigFlow(ConfigFlow, domain=DOMAIN):
errors["base"] = "cannot_connect" errors["base"] = "cannot_connect"
except CannotAuthenticate: except CannotAuthenticate:
errors["base"] = "invalid_auth" errors["base"] = "invalid_auth"
except CannotRetrieveData:
errors["base"] = "cannot_retrieve_data"
except WrongCountry: except WrongCountry:
errors["base"] = "wrong_country" errors["base"] = "wrong_country"
else: else:
@ -106,6 +113,8 @@ class AmazonDevicesConfigFlow(ConfigFlow, domain=DOMAIN):
errors["base"] = "cannot_connect" errors["base"] = "cannot_connect"
except CannotAuthenticate: except CannotAuthenticate:
errors["base"] = "invalid_auth" errors["base"] = "invalid_auth"
except CannotRetrieveData:
errors["base"] = "cannot_retrieve_data"
else: else:
return self.async_update_reload_and_abort( return self.async_update_reload_and_abort(
reauth_entry, reauth_entry,

View File

@ -52,8 +52,18 @@ class AmazonDevicesCoordinator(DataUpdateCoordinator[dict[str, AmazonDevice]]):
try: try:
await self.api.login_mode_stored_data() await self.api.login_mode_stored_data()
return await self.api.get_devices_data() return await self.api.get_devices_data()
except (CannotConnect, CannotRetrieveData) as err: except CannotConnect as err:
raise UpdateFailed(f"Error occurred while updating {self.name}") from err raise UpdateFailed(
translation_domain=DOMAIN,
translation_key="cannot_connect_with_error",
translation_placeholders={"error": repr(err)},
) from err
except CannotRetrieveData as err:
raise UpdateFailed(
translation_domain=DOMAIN,
translation_key="cannot_retrieve_data_with_error",
translation_placeholders={"error": repr(err)},
) from err
except CannotAuthenticate as err: except CannotAuthenticate as err:
raise ConfigEntryAuthFailed( raise ConfigEntryAuthFailed(
translation_domain=DOMAIN, translation_domain=DOMAIN,

View File

@ -43,6 +43,7 @@
}, },
"error": { "error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"cannot_retrieve_data": "Unable to retrieve data from Amazon. Please try again later.",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"wrong_country": "Wrong country selected. Please select the country where your Amazon account is registered.", "wrong_country": "Wrong country selected. Please select the country where your Amazon account is registered.",
"unknown": "[%key:common::config_flow::error::unknown%]" "unknown": "[%key:common::config_flow::error::unknown%]"
@ -84,10 +85,10 @@
} }
}, },
"exceptions": { "exceptions": {
"cannot_connect": { "cannot_connect_with_error": {
"message": "Error connecting: {error}" "message": "Error connecting: {error}"
}, },
"cannot_retrieve_data": { "cannot_retrieve_data_with_error": {
"message": "Error retrieving data: {error}" "message": "Error retrieving data: {error}"
} }
} }

View File

@ -26,14 +26,14 @@ def alexa_api_call[_T: AmazonEntity, **_P](
self.coordinator.last_update_success = False self.coordinator.last_update_success = False
raise HomeAssistantError( raise HomeAssistantError(
translation_domain=DOMAIN, translation_domain=DOMAIN,
translation_key="cannot_connect", translation_key="cannot_connect_with_error",
translation_placeholders={"error": repr(err)}, translation_placeholders={"error": repr(err)},
) from err ) from err
except CannotRetrieveData as err: except CannotRetrieveData as err:
self.coordinator.last_update_success = False self.coordinator.last_update_success = False
raise HomeAssistantError( raise HomeAssistantError(
translation_domain=DOMAIN, translation_domain=DOMAIN,
translation_key="cannot_retrieve_data", translation_key="cannot_retrieve_data_with_error",
translation_placeholders={"error": repr(err)}, translation_placeholders={"error": repr(err)},
) from err ) from err

View File

@ -2,7 +2,12 @@
from unittest.mock import AsyncMock from unittest.mock import AsyncMock
from aioamazondevices.exceptions import CannotAuthenticate, CannotConnect, WrongCountry from aioamazondevices.exceptions import (
CannotAuthenticate,
CannotConnect,
CannotRetrieveData,
WrongCountry,
)
import pytest import pytest
from homeassistant.components.alexa_devices.const import CONF_LOGIN_DATA, DOMAIN from homeassistant.components.alexa_devices.const import CONF_LOGIN_DATA, DOMAIN
@ -57,6 +62,7 @@ async def test_full_flow(
[ [
(CannotConnect, "cannot_connect"), (CannotConnect, "cannot_connect"),
(CannotAuthenticate, "invalid_auth"), (CannotAuthenticate, "invalid_auth"),
(CannotRetrieveData, "cannot_retrieve_data"),
(WrongCountry, "wrong_country"), (WrongCountry, "wrong_country"),
], ],
) )
@ -165,6 +171,7 @@ async def test_reauth_successful(
[ [
(CannotConnect, "cannot_connect"), (CannotConnect, "cannot_connect"),
(CannotAuthenticate, "invalid_auth"), (CannotAuthenticate, "invalid_auth"),
(CannotRetrieveData, "cannot_retrieve_data"),
], ],
) )
async def test_reauth_not_successful( async def test_reauth_not_successful(

View File

@ -21,8 +21,8 @@ ENTITY_ID = "switch.echo_test_do_not_disturb"
@pytest.mark.parametrize( @pytest.mark.parametrize(
("side_effect", "key", "error"), ("side_effect", "key", "error"),
[ [
(CannotConnect, "cannot_connect", "CannotConnect()"), (CannotConnect, "cannot_connect_with_error", "CannotConnect()"),
(CannotRetrieveData, "cannot_retrieve_data", "CannotRetrieveData()"), (CannotRetrieveData, "cannot_retrieve_data_with_error", "CannotRetrieveData()"),
], ],
) )
async def test_alexa_api_call_exceptions( async def test_alexa_api_call_exceptions(