From cb36905ce593b192731b8898e3a5fcb5049776f5 Mon Sep 17 00:00:00 2001 From: Guido Schmitz Date: Tue, 17 Jan 2023 12:59:02 +0100 Subject: [PATCH] Add diagnostics to devolo Home Network (#86022) --- .../devolo_home_network/diagnostics.py | 38 ++++++++++++++++ .../devolo_home_network/__init__.py | 2 +- tests/components/devolo_home_network/mock.py | 6 +++ .../devolo_home_network/test_diagnostics.py | 45 +++++++++++++++++++ 4 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 homeassistant/components/devolo_home_network/diagnostics.py create mode 100644 tests/components/devolo_home_network/test_diagnostics.py diff --git a/homeassistant/components/devolo_home_network/diagnostics.py b/homeassistant/components/devolo_home_network/diagnostics.py new file mode 100644 index 00000000000..bd4393d73dd --- /dev/null +++ b/homeassistant/components/devolo_home_network/diagnostics.py @@ -0,0 +1,38 @@ +"""Diagnostics support for devolo Home Network.""" +from __future__ import annotations + +from typing import Any + +from devolo_plc_api import Device + +from homeassistant.components.diagnostics import async_redact_data +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import CONF_PASSWORD +from homeassistant.core import HomeAssistant + +from .const import DOMAIN + +TO_REDACT = {CONF_PASSWORD} + + +async def async_get_config_entry_diagnostics( + hass: HomeAssistant, entry: ConfigEntry +) -> dict[str, Any]: + """Return diagnostics for a config entry.""" + device: Device = hass.data[DOMAIN][entry.entry_id]["device"] + + diag_data = { + "entry": async_redact_data(entry.as_dict(), TO_REDACT), + "device_info": { + "mt_number": device.mt_number, + "product": device.product, + "firmware": device.firmware_version, + "device_api": device.device is not None, + "plcnet_api": device.plcnet is not None, + }, + } + + if device.device: + diag_data["device_info"]["features"] = device.device.features + + return diag_data diff --git a/tests/components/devolo_home_network/__init__.py b/tests/components/devolo_home_network/__init__.py index f42abef20ec..9340f7d2283 100644 --- a/tests/components/devolo_home_network/__init__.py +++ b/tests/components/devolo_home_network/__init__.py @@ -12,7 +12,7 @@ def configure_integration(hass: HomeAssistant) -> MockConfigEntry: """Configure the integration.""" config = { CONF_IP_ADDRESS: IP, - CONF_PASSWORD: "", + CONF_PASSWORD: "test", } entry = MockConfigEntry(domain=DOMAIN, data=config) entry.add_to_hass(hass) diff --git a/tests/components/devolo_home_network/mock.py b/tests/components/devolo_home_network/mock.py index 8dcb785aaea..0ea985a48c7 100644 --- a/tests/components/devolo_home_network/mock.py +++ b/tests/components/devolo_home_network/mock.py @@ -32,11 +32,17 @@ class MockDevice(Device): super().__init__(ip, zeroconf_instance) self.reset() + @property + def firmware_version(self) -> str: + """Mock firmware version currently installed.""" + return DISCOVERY_INFO.properties["FirmwareVersion"] + async def async_connect( self, session_instance: httpx.AsyncClient | None = None ) -> None: """Give a mocked device the needed properties.""" self.mac = DISCOVERY_INFO.properties["PlcMacAddress"] + self.mt_number = DISCOVERY_INFO.properties["MT"] self.product = DISCOVERY_INFO.properties["Product"] self.serial_number = DISCOVERY_INFO.properties["SN"] diff --git a/tests/components/devolo_home_network/test_diagnostics.py b/tests/components/devolo_home_network/test_diagnostics.py new file mode 100644 index 00000000000..fe9c6c1f106 --- /dev/null +++ b/tests/components/devolo_home_network/test_diagnostics.py @@ -0,0 +1,45 @@ +"""Tests for the devolo Home Network diagnostics.""" +from __future__ import annotations + +from aiohttp import ClientSession +import pytest + +from homeassistant.components.devolo_home_network.diagnostics import TO_REDACT +from homeassistant.components.diagnostics import REDACTED +from homeassistant.config_entries import ConfigEntryState +from homeassistant.core import HomeAssistant + +from . import configure_integration +from .const import DISCOVERY_INFO + +from tests.components.diagnostics import get_diagnostics_for_config_entry + + +@pytest.mark.usefixtures("mock_device") +async def test_entry_diagnostics( + hass: HomeAssistant, + hass_client: ClientSession, +): + """Test config entry diagnostics.""" + entry = configure_integration(hass) + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + assert entry.state == ConfigEntryState.LOADED + + entry_dict = entry.as_dict() + for key in TO_REDACT: + entry_dict["data"][key] = REDACTED + + result = await get_diagnostics_for_config_entry(hass, hass_client, entry) + assert result == { + "entry": entry_dict, + "device_info": { + "mt_number": DISCOVERY_INFO.properties["MT"], + "product": DISCOVERY_INFO.properties["Product"], + "firmware": DISCOVERY_INFO.properties["FirmwareVersion"], + "device_api": True, + "plcnet_api": True, + "features": DISCOVERY_INFO.properties["Features"].split(","), + }, + }