From 57d169582d2185cde291aef0ade34c85b1fe8492 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Sat, 24 Feb 2024 20:08:50 +0100 Subject: [PATCH] Add diagnostics support for AEMET (#111218) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit aemet: add diagnostics support Signed-off-by: Álvaro Fernández Rojas --- homeassistant/components/aemet/diagnostics.py | 44 +++++++ .../aemet/snapshots/test_diagnostics.ambr | 113 ++++++++++++++++++ tests/components/aemet/test_diagnostics.py | 32 +++++ tests/components/aemet/util.py | 1 + 4 files changed, 190 insertions(+) create mode 100644 homeassistant/components/aemet/diagnostics.py create mode 100644 tests/components/aemet/snapshots/test_diagnostics.ambr create mode 100644 tests/components/aemet/test_diagnostics.py diff --git a/homeassistant/components/aemet/diagnostics.py b/homeassistant/components/aemet/diagnostics.py new file mode 100644 index 00000000000..f49170d9576 --- /dev/null +++ b/homeassistant/components/aemet/diagnostics.py @@ -0,0 +1,44 @@ +"""Support for the AEMET OpenData diagnostics.""" +from __future__ import annotations + +from typing import Any + +from aemet_opendata.const import AOD_COORDS + +from homeassistant.components.diagnostics.util import async_redact_data +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import ( + CONF_API_KEY, + CONF_LATITUDE, + CONF_LONGITUDE, + CONF_UNIQUE_ID, +) +from homeassistant.core import HomeAssistant + +from .const import DOMAIN, ENTRY_WEATHER_COORDINATOR +from .coordinator import WeatherUpdateCoordinator + +TO_REDACT_CONFIG = [ + CONF_API_KEY, + CONF_LATITUDE, + CONF_LONGITUDE, + CONF_UNIQUE_ID, +] + +TO_REDACT_COORD = [ + AOD_COORDS, +] + + +async def async_get_config_entry_diagnostics( + hass: HomeAssistant, config_entry: ConfigEntry +) -> dict[str, Any]: + """Return diagnostics for a config entry.""" + aemet_entry = hass.data[DOMAIN][config_entry.entry_id] + coordinator: WeatherUpdateCoordinator = aemet_entry[ENTRY_WEATHER_COORDINATOR] + + return { + "api_data": coordinator.aemet.raw_data(), + "config_entry": async_redact_data(config_entry.as_dict(), TO_REDACT_CONFIG), + "coord_data": async_redact_data(coordinator.data, TO_REDACT_COORD), + } diff --git a/tests/components/aemet/snapshots/test_diagnostics.ambr b/tests/components/aemet/snapshots/test_diagnostics.ambr new file mode 100644 index 00000000000..4b678dc1da5 --- /dev/null +++ b/tests/components/aemet/snapshots/test_diagnostics.ambr @@ -0,0 +1,113 @@ +# serializer version: 1 +# name: test_config_entry_diagnostics + dict({ + 'api_data': dict({ + }), + 'config_entry': dict({ + 'data': dict({ + 'api_key': '**REDACTED**', + 'latitude': '**REDACTED**', + 'longitude': '**REDACTED**', + 'name': 'AEMET', + }), + 'disabled_by': None, + 'domain': 'aemet', + 'entry_id': '7442b231f139e813fc1939281123f220', + 'minor_version': 1, + 'options': dict({ + }), + 'pref_disable_new_entities': False, + 'pref_disable_polling': False, + 'source': 'user', + 'title': 'Mock Title', + 'unique_id': None, + 'version': 1, + }), + 'coord_data': dict({ + 'forecast': dict({ + 'forecast-daily': list([ + ]), + 'forecast-hourly': list([ + ]), + }), + 'lib': dict({ + 'station': dict({ + 'altitude': 667.0, + 'coordinates': '**REDACTED**', + 'datetime': '2021-01-09T13:00:00+01:00', + 'dew-point': -0.7, + 'distance': 12.746, + 'humidity': 99.0, + 'id': '3195', + 'name': 'MADRID RETIRO', + 'outdated': True, + 'precipitation': 7.0, + 'pressure': 1004.4, + 'temperature': -0.7, + 'temperature-max': -0.6, + 'temperature-min': -1.0, + 'timestamp-utc': '2021-01-09T13:00:00+01:00', + 'timezone': dict({ + '__type': "", + 'repr': "zoneinfo.ZoneInfo(key='Europe/Madrid')", + }), + 'wind-direction': 122.0, + 'wind-speed': 3.2, + 'wind-speed-max': 12.2, + }), + 'timestamp-utc': '2024-02-23T18:00:00+00:00', + 'town': dict({ + 'altitude': 622, + 'coordinates': '**REDACTED**', + 'distance': 0.0, + 'forecast-daily': dict({ + 'forecast': list([ + ]), + 'timestamp-local': '2021-01-09T11:54:00+00:00', + 'timestamp-utc': '2021-01-09T11:54:00+00:00', + 'timezone': dict({ + '__type': "", + 'repr': "zoneinfo.ZoneInfo(key='Europe/Madrid')", + }), + }), + 'forecast-hourly': dict({ + 'forecast': list([ + ]), + 'timestamp-local': '2021-01-09T11:47:45+00:00', + 'timestamp-utc': '2021-01-09T11:47:45+00:00', + 'timezone': dict({ + '__type': "", + 'repr': "zoneinfo.ZoneInfo(key='Europe/Madrid')", + }), + }), + 'id': 'id28065', + 'name': 'Getafe', + 'residents': 173057, + 'timezone': dict({ + '__type': "", + 'repr': "zoneinfo.ZoneInfo(key='Europe/Madrid')", + }), + }), + 'weather': dict({ + 'condition': None, + 'dew-point': None, + 'feel-temperature': None, + 'humidity': None, + 'precipitation': None, + 'precipitation-probability': None, + 'pressure': None, + 'rain': None, + 'rain-probability': None, + 'snow': None, + 'snow-probability': None, + 'storm-probability': None, + 'temperature': None, + 'uv-index': None, + 'wind-direction': None, + 'wind-speed': None, + 'wind-speed-max': None, + }), + }), + }), + }) +# --- diff --git a/tests/components/aemet/test_diagnostics.py b/tests/components/aemet/test_diagnostics.py new file mode 100644 index 00000000000..8326d996069 --- /dev/null +++ b/tests/components/aemet/test_diagnostics.py @@ -0,0 +1,32 @@ +"""Define tests for the AEMET OpenData diagnostics.""" + +from unittest.mock import patch + +from syrupy import SnapshotAssertion + +from homeassistant.components.aemet.const import DOMAIN +from homeassistant.core import HomeAssistant + +from .util import async_init_integration + +from tests.components.diagnostics import get_diagnostics_for_config_entry +from tests.typing import ClientSessionGenerator + + +async def test_config_entry_diagnostics( + hass: HomeAssistant, + hass_client: ClientSessionGenerator, + snapshot: SnapshotAssertion, +) -> None: + """Test config entry diagnostics.""" + await async_init_integration(hass) + + assert hass.data[DOMAIN] + config_entry = hass.config_entries.async_entries(DOMAIN)[0] + + with patch( + "homeassistant.components.aemet.AEMET.raw_data", + return_value={}, + ): + result = await get_diagnostics_for_config_entry(hass, hass_client, config_entry) + assert result == snapshot diff --git a/tests/components/aemet/util.py b/tests/components/aemet/util.py index 05417563e2f..9714da1c5e7 100644 --- a/tests/components/aemet/util.py +++ b/tests/components/aemet/util.py @@ -63,6 +63,7 @@ async def async_init_integration(hass: HomeAssistant): CONF_LONGITUDE: "-3.72935236", CONF_NAME: "AEMET", }, + entry_id="7442b231f139e813fc1939281123f220", ) config_entry.add_to_hass(hass)