Handle Home Connect error at diagnostics (#131644)

This commit is contained in:
J. Diego Rodríguez Royo 2024-12-18 10:52:45 +01:00 committed by GitHub
parent 8b8c409916
commit a6520d2627
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 66 additions and 5 deletions

View File

@ -4,7 +4,7 @@ from __future__ import annotations
from typing import Any from typing import Any
from homeconnect.api import HomeConnectAppliance from homeconnect.api import HomeConnectAppliance, HomeConnectError
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceEntry from homeassistant.helpers.device_registry import DeviceEntry
@ -14,9 +14,14 @@ from .api import HomeConnectDevice
def _generate_appliance_diagnostics(appliance: HomeConnectAppliance) -> dict[str, Any]: def _generate_appliance_diagnostics(appliance: HomeConnectAppliance) -> dict[str, Any]:
try:
programs = appliance.get_programs_available()
except HomeConnectError:
programs = None
return { return {
"connected": appliance.connected,
"status": appliance.status, "status": appliance.status,
"programs": appliance.get_programs_available(), "programs": programs,
} }

View File

@ -2,6 +2,7 @@
# name: test_async_get_config_entry_diagnostics # name: test_async_get_config_entry_diagnostics
dict({ dict({
'BOSCH-000000000-000000000000': dict({ 'BOSCH-000000000-000000000000': dict({
'connected': True,
'programs': list([ 'programs': list([
]), ]),
'status': dict({ 'status': dict({
@ -23,6 +24,7 @@
}), }),
}), }),
'BOSCH-HCS000000-D00000000001': dict({ 'BOSCH-HCS000000-D00000000001': dict({
'connected': True,
'programs': list([ 'programs': list([
'LaundryCare.WasherDryer.Program.Mix', 'LaundryCare.WasherDryer.Program.Mix',
'LaundryCare.Washer.Option.Temperature', 'LaundryCare.Washer.Option.Temperature',
@ -46,6 +48,7 @@
}), }),
}), }),
'BOSCH-HCS000000-D00000000002': dict({ 'BOSCH-HCS000000-D00000000002': dict({
'connected': True,
'programs': list([ 'programs': list([
]), ]),
'status': dict({ 'status': dict({
@ -67,6 +70,7 @@
}), }),
}), }),
'BOSCH-HCS000000-D00000000003': dict({ 'BOSCH-HCS000000-D00000000003': dict({
'connected': True,
'programs': list([ 'programs': list([
]), ]),
'status': dict({ 'status': dict({
@ -88,6 +92,7 @@
}), }),
}), }),
'BOSCH-HCS000000-D00000000004': dict({ 'BOSCH-HCS000000-D00000000004': dict({
'connected': True,
'programs': list([ 'programs': list([
]), ]),
'status': dict({ 'status': dict({
@ -144,6 +149,7 @@
}), }),
}), }),
'BOSCH-HCS000000-D00000000005': dict({ 'BOSCH-HCS000000-D00000000005': dict({
'connected': True,
'programs': list([ 'programs': list([
]), ]),
'status': dict({ 'status': dict({
@ -165,6 +171,7 @@
}), }),
}), }),
'BOSCH-HCS000000-D00000000006': dict({ 'BOSCH-HCS000000-D00000000006': dict({
'connected': True,
'programs': list([ 'programs': list([
]), ]),
'status': dict({ 'status': dict({
@ -186,6 +193,7 @@
}), }),
}), }),
'BOSCH-HCS01OVN1-43E0065FE245': dict({ 'BOSCH-HCS01OVN1-43E0065FE245': dict({
'connected': True,
'programs': list([ 'programs': list([
'Cooking.Oven.Program.HeatingMode.HotAir', 'Cooking.Oven.Program.HeatingMode.HotAir',
'Cooking.Oven.Program.HeatingMode.TopBottomHeating', 'Cooking.Oven.Program.HeatingMode.TopBottomHeating',
@ -217,6 +225,7 @@
}), }),
}), }),
'BOSCH-HCS04DYR1-831694AE3C5A': dict({ 'BOSCH-HCS04DYR1-831694AE3C5A': dict({
'connected': True,
'programs': list([ 'programs': list([
'LaundryCare.Dryer.Program.Cotton', 'LaundryCare.Dryer.Program.Cotton',
'LaundryCare.Dryer.Program.Synthetic', 'LaundryCare.Dryer.Program.Synthetic',
@ -241,6 +250,7 @@
}), }),
}), }),
'BOSCH-HCS06COM1-D70390681C2C': dict({ 'BOSCH-HCS06COM1-D70390681C2C': dict({
'connected': True,
'programs': list([ 'programs': list([
'ConsumerProducts.CoffeeMaker.Program.Beverage.Espresso', 'ConsumerProducts.CoffeeMaker.Program.Beverage.Espresso',
'ConsumerProducts.CoffeeMaker.Program.Beverage.EspressoMacchiato', 'ConsumerProducts.CoffeeMaker.Program.Beverage.EspressoMacchiato',
@ -268,6 +278,7 @@
}), }),
}), }),
'SIEMENS-HCS02DWH1-6BE58C26DCC1': dict({ 'SIEMENS-HCS02DWH1-6BE58C26DCC1': dict({
'connected': True,
'programs': list([ 'programs': list([
'Dishcare.Dishwasher.Program.Auto1', 'Dishcare.Dishwasher.Program.Auto1',
'Dishcare.Dishwasher.Program.Auto2', 'Dishcare.Dishwasher.Program.Auto2',
@ -319,6 +330,7 @@
}), }),
}), }),
'SIEMENS-HCS03WCH1-7BC6383CF794': dict({ 'SIEMENS-HCS03WCH1-7BC6383CF794': dict({
'connected': True,
'programs': list([ 'programs': list([
'LaundryCare.Washer.Program.Cotton', 'LaundryCare.Washer.Program.Cotton',
'LaundryCare.Washer.Program.EasyCare', 'LaundryCare.Washer.Program.EasyCare',
@ -356,6 +368,7 @@
}), }),
}), }),
'SIEMENS-HCS05FRF1-304F4F9E541D': dict({ 'SIEMENS-HCS05FRF1-304F4F9E541D': dict({
'connected': True,
'programs': list([ 'programs': list([
]), ]),
'status': dict({ 'status': dict({
@ -415,6 +428,7 @@
# --- # ---
# name: test_async_get_device_diagnostics # name: test_async_get_device_diagnostics
dict({ dict({
'connected': True,
'programs': list([ 'programs': list([
'Dishcare.Dishwasher.Program.Auto1', 'Dishcare.Dishwasher.Program.Auto1',
'Dishcare.Dishwasher.Program.Auto2', 'Dishcare.Dishwasher.Program.Auto2',

View File

@ -1,8 +1,9 @@
"""Test diagnostics for Home Connect.""" """Test diagnostics for Home Connect."""
from collections.abc import Awaitable, Callable from collections.abc import Awaitable, Callable
from unittest.mock import MagicMock from unittest.mock import MagicMock, Mock
from homeconnect.api import HomeConnectError
import pytest import pytest
from syrupy import SnapshotAssertion from syrupy import SnapshotAssertion
@ -63,14 +64,13 @@ async def test_async_get_device_diagnostics(
@pytest.mark.usefixtures("bypass_throttle") @pytest.mark.usefixtures("bypass_throttle")
async def test_async_device_diagnostics_exceptions( async def test_async_device_diagnostics_not_found(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: MockConfigEntry, config_entry: MockConfigEntry,
integration_setup: Callable[[], Awaitable[bool]], integration_setup: Callable[[], Awaitable[bool]],
setup_credentials: None, setup_credentials: None,
get_appliances: MagicMock, get_appliances: MagicMock,
device_registry: dr.DeviceRegistry, device_registry: dr.DeviceRegistry,
snapshot: SnapshotAssertion,
) -> None: ) -> None:
"""Test device config entry diagnostics.""" """Test device config entry diagnostics."""
get_appliances.side_effect = get_all_appliances get_appliances.side_effect = get_all_appliances
@ -85,3 +85,45 @@ async def test_async_device_diagnostics_exceptions(
with pytest.raises(ValueError): with pytest.raises(ValueError):
await async_get_device_diagnostics(hass, config_entry, device) await async_get_device_diagnostics(hass, config_entry, device)
@pytest.mark.parametrize(
("api_error", "expected_connection_status"),
[
(HomeConnectError(), "unknown"),
(
HomeConnectError(
{
"key": "SDK.Error.HomeAppliance.Connection.Initialization.Failed",
}
),
"offline",
),
],
)
@pytest.mark.usefixtures("bypass_throttle")
async def test_async_device_diagnostics_api_error(
api_error: HomeConnectError,
expected_connection_status: str,
hass: HomeAssistant,
config_entry: MockConfigEntry,
integration_setup: Callable[[], Awaitable[bool]],
setup_credentials: None,
get_appliances: MagicMock,
appliance: Mock,
device_registry: dr.DeviceRegistry,
) -> None:
"""Test device config entry diagnostics."""
appliance.get_programs_available.side_effect = api_error
get_appliances.return_value = [appliance]
assert config_entry.state == ConfigEntryState.NOT_LOADED
assert await integration_setup()
assert config_entry.state == ConfigEntryState.LOADED
device = device_registry.async_get_or_create(
config_entry_id=config_entry.entry_id,
identifiers={(DOMAIN, appliance.haId)},
)
diagnostics = await async_get_device_diagnostics(hass, config_entry, device)
assert diagnostics["programs"] is None