From e0e6853968f959ef332061c812d3053fcbcb19c9 Mon Sep 17 00:00:00 2001 From: Michael <35783820+mib1185@users.noreply.github.com> Date: Fri, 21 Jan 2022 20:25:19 +0100 Subject: [PATCH] Add diagnostics platform to AVM Fritz!Smarthome (#64657) Co-authored-by: Paulus Schoutsen --- .../components/fritzbox/diagnostics.py | 33 +++++++++++++++++++ tests/components/fritzbox/test_diagnostics.py | 33 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 homeassistant/components/fritzbox/diagnostics.py create mode 100644 tests/components/fritzbox/test_diagnostics.py diff --git a/homeassistant/components/fritzbox/diagnostics.py b/homeassistant/components/fritzbox/diagnostics.py new file mode 100644 index 00000000000..581fe4c6f01 --- /dev/null +++ b/homeassistant/components/fritzbox/diagnostics.py @@ -0,0 +1,33 @@ +"""Diagnostics support for AVM Fritz!Smarthome.""" +from __future__ import annotations + +from homeassistant.components.diagnostics import async_redact_data +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.core import HomeAssistant + +from .const import CONF_COORDINATOR, DOMAIN +from .coordinator import FritzboxDataUpdateCoordinator + +TO_REDACT = {CONF_USERNAME, CONF_PASSWORD} + + +async def async_get_config_entry_diagnostics( + hass: HomeAssistant, entry: ConfigEntry +) -> dict: + """Return diagnostics for a config entry.""" + data: dict = hass.data[DOMAIN][entry.entry_id] + coordinator: FritzboxDataUpdateCoordinator = data[CONF_COORDINATOR] + + diag_data = { + "entry": async_redact_data(entry.as_dict(), TO_REDACT), + "data": {}, + } + if not isinstance(coordinator.data, dict): + return diag_data + + diag_data["data"] = { + ain: {k: v for k, v in vars(dev).items() if not k.startswith("_")} + for ain, dev in coordinator.data.items() + } + return diag_data diff --git a/tests/components/fritzbox/test_diagnostics.py b/tests/components/fritzbox/test_diagnostics.py new file mode 100644 index 00000000000..9efe6c23902 --- /dev/null +++ b/tests/components/fritzbox/test_diagnostics.py @@ -0,0 +1,33 @@ +"""Tests for the AVM Fritz!Box integration.""" +from __future__ import annotations + +from unittest.mock import Mock + +from aiohttp import ClientSession + +from homeassistant.components.diagnostics import REDACTED +from homeassistant.components.fritzbox.const import DOMAIN as FB_DOMAIN +from homeassistant.components.fritzbox.diagnostics import TO_REDACT +from homeassistant.const import CONF_DEVICES +from homeassistant.core import HomeAssistant + +from . import setup_config_entry +from .const import MOCK_CONFIG + +from tests.components.diagnostics import get_diagnostics_for_config_entry + + +async def test_entry_diagnostics( + hass: HomeAssistant, hass_client: ClientSession, fritz: Mock +): + """Test config entry diagnostics.""" + assert await setup_config_entry(hass, MOCK_CONFIG[FB_DOMAIN][CONF_DEVICES][0]) + + entries = hass.config_entries.async_entries(FB_DOMAIN) + entry_dict = entries[0].as_dict() + for key in TO_REDACT: + entry_dict["data"][key] = REDACTED + + result = await get_diagnostics_for_config_entry(hass, hass_client, entries[0]) + + assert result == {"entry": entry_dict, "data": {}}