diff --git a/homeassistant/components/data_grand_lyon/diagnostics.py b/homeassistant/components/data_grand_lyon/diagnostics.py new file mode 100644 index 0000000000000..87379d38b6e45 --- /dev/null +++ b/homeassistant/components/data_grand_lyon/diagnostics.py @@ -0,0 +1,27 @@ +"""Diagnostics support for the Data Grand Lyon integration.""" + +from dataclasses import asdict +from typing import Any + +from homeassistant.components.diagnostics import async_redact_data +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.core import HomeAssistant + +from .coordinator import DataGrandLyonConfigEntry + +TO_REDACT = {CONF_USERNAME, CONF_PASSWORD} + + +async def async_get_config_entry_diagnostics( + hass: HomeAssistant, entry: DataGrandLyonConfigEntry +) -> dict[str, Any]: + """Return diagnostics for a config entry.""" + coordinator = entry.runtime_data + + return { + "config_entry": async_redact_data(entry.as_dict(), TO_REDACT), + "coordinator_data": { + subentry_id: [asdict(passage) for passage in passages] + for subentry_id, passages in coordinator.data.items() + }, + } diff --git a/homeassistant/components/data_grand_lyon/quality_scale.yaml b/homeassistant/components/data_grand_lyon/quality_scale.yaml index 2e2522901f0e3..fa9357574073b 100644 --- a/homeassistant/components/data_grand_lyon/quality_scale.yaml +++ b/homeassistant/components/data_grand_lyon/quality_scale.yaml @@ -41,7 +41,7 @@ rules: # Gold devices: done - diagnostics: todo + diagnostics: done discovery-update-info: status: exempt comment: This is a service integration; there are no discoverable devices. diff --git a/tests/components/data_grand_lyon/snapshots/test_diagnostics.ambr b/tests/components/data_grand_lyon/snapshots/test_diagnostics.ambr new file mode 100644 index 0000000000000..8d1acdc6e5a60 --- /dev/null +++ b/tests/components/data_grand_lyon/snapshots/test_diagnostics.ambr @@ -0,0 +1,59 @@ +# serializer version: 1 +# name: test_config_entry_diagnostics + dict({ + 'config_entry': dict({ + 'data': dict({ + 'password': '**REDACTED**', + 'username': '**REDACTED**', + }), + 'disabled_by': None, + 'discovery_keys': dict({ + }), + 'domain': 'data_grand_lyon', + 'minor_version': 1, + 'options': dict({ + }), + 'pref_disable_new_entities': False, + 'pref_disable_polling': False, + 'source': 'user', + 'subentries': list([ + dict({ + 'data': dict({ + 'line': 'C3', + 'stop_id': 100, + }), + 'subentry_type': 'stop', + 'title': 'C3 - Stop 100', + 'unique_id': 'C3_100', + }), + ]), + 'title': 'Data Grand Lyon', + 'unique_id': None, + 'version': 1, + }), + 'coordinator_data': dict({ + 'stop_1': list([ + dict({ + 'course_theorique': 'A', + 'delai_passage': '3 min', + 'direction': 'Gare Part-Dieu', + 'heure_passage': '2026-04-10T14:03:00', + 'id': 100, + 'id_tarret_destination': 0, + 'ligne': 'C3', + 'type': 'E', + }), + dict({ + 'course_theorique': 'B', + 'delai_passage': '8 min', + 'direction': 'Gare St-Paul', + 'heure_passage': '2026-04-10T14:08:00', + 'id': 100, + 'id_tarret_destination': 0, + 'ligne': 'C3', + 'type': 'T', + }), + ]), + }), + }) +# --- diff --git a/tests/components/data_grand_lyon/test_diagnostics.py b/tests/components/data_grand_lyon/test_diagnostics.py new file mode 100644 index 0000000000000..c5c412d739133 --- /dev/null +++ b/tests/components/data_grand_lyon/test_diagnostics.py @@ -0,0 +1,29 @@ +"""Tests for the Data Grand Lyon diagnostics.""" + +from unittest.mock import AsyncMock + +from syrupy.assertion import SnapshotAssertion +from syrupy.filters import props + +from homeassistant.core import HomeAssistant + +from tests.common import MockConfigEntry +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, + mock_config_entry: MockConfigEntry, + mock_tcl_client: AsyncMock, + snapshot: SnapshotAssertion, +) -> None: + """Test config entry diagnostics.""" + mock_config_entry.add_to_hass(hass) + await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + assert await get_diagnostics_for_config_entry( + hass, hass_client, mock_config_entry + ) == snapshot(exclude=props("created_at", "modified_at", "entry_id", "subentry_id"))