Fix Duco diagnostics crash on connection error (#169322)

This commit is contained in:
Ronald van der Meer
2026-04-28 10:25:18 +02:00
committed by GitHub
parent fa6c6ee4fc
commit fa0cf37e2c
3 changed files with 45 additions and 6 deletions
+13 -6
View File
@@ -2,14 +2,17 @@
from __future__ import annotations
import asyncio
from dataclasses import asdict
from typing import Any
from duco.exceptions import DucoConnectionError
from homeassistant.components.diagnostics import async_redact_data
from homeassistant.const import CONF_HOST
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from .const import DOMAIN
from .coordinator import DucoConfigEntry
TO_REDACT = {
@@ -32,11 +35,15 @@ async def async_get_config_entry_diagnostics(
board = asdict(coordinator.board_info)
board.pop("time")
lan_info, duco_diags, write_remaining = await asyncio.gather(
coordinator.client.async_get_lan_info(),
coordinator.client.async_get_diagnostics(),
coordinator.client.async_get_write_req_remaining(),
)
try:
lan_info = await coordinator.client.async_get_lan_info()
duco_diags = await coordinator.client.async_get_diagnostics()
write_remaining = await coordinator.client.async_get_write_req_remaining()
except DucoConnectionError as err:
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="connection_error",
) from err
return async_redact_data(
{
@@ -87,6 +87,9 @@
"cannot_connect": {
"message": "An error occurred while trying to connect to the Duco instance: {error}"
},
"connection_error": {
"message": "Could not connect to the Duco device."
},
"failed_to_set_state": {
"message": "Failed to set ventilation state: {error}"
},
+29
View File
@@ -2,12 +2,16 @@
from __future__ import annotations
from http import HTTPStatus
from unittest.mock import AsyncMock
from duco.exceptions import DucoConnectionError
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant.components.diagnostics import DOMAIN as DIAGNOSTICS_DOMAIN
from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component
from tests.common import MockConfigEntry
from tests.components.diagnostics import get_diagnostics_for_config_entry
@@ -27,3 +31,28 @@ async def test_diagnostics(
await get_diagnostics_for_config_entry(hass, hass_client, mock_config_entry)
== snapshot
)
@pytest.mark.usefixtures("init_integration")
@pytest.mark.parametrize(
"failing_method",
["async_get_lan_info", "async_get_diagnostics", "async_get_write_req_remaining"],
)
async def test_diagnostics_connection_error(
hass: HomeAssistant,
hass_client: ClientSessionGenerator,
mock_config_entry: MockConfigEntry,
mock_duco_client: AsyncMock,
failing_method: str,
) -> None:
"""Test that a connection error during diagnostics returns a 500 response."""
getattr(mock_duco_client, failing_method).side_effect = DucoConnectionError(
"Server disconnected"
)
assert await async_setup_component(hass, DIAGNOSTICS_DOMAIN, {})
await hass.async_block_till_done()
client = await hass_client()
response = await client.get(
f"/api/diagnostics/config_entry/{mock_config_entry.entry_id}"
)
assert response.status == HTTPStatus.INTERNAL_SERVER_ERROR