diff --git a/homeassistant/components/qnap_qsw/diagnostics.py b/homeassistant/components/qnap_qsw/diagnostics.py new file mode 100644 index 00000000000..3730bab24a8 --- /dev/null +++ b/homeassistant/components/qnap_qsw/diagnostics.py @@ -0,0 +1,37 @@ +"""Support for the QNAP QSW diagnostics.""" +from __future__ import annotations + +from typing import Any + +from aioqsw.const import QSD_MAC, QSD_SERIAL + +from homeassistant.components.diagnostics.util import async_redact_data +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import CONF_PASSWORD, CONF_UNIQUE_ID, CONF_USERNAME +from homeassistant.core import HomeAssistant + +from .const import DOMAIN +from .coordinator import QswUpdateCoordinator + +TO_REDACT_CONFIG = [ + CONF_USERNAME, + CONF_PASSWORD, + CONF_UNIQUE_ID, +] + +TO_REDACT_DATA = [ + QSD_MAC, + QSD_SERIAL, +] + + +async def async_get_config_entry_diagnostics( + hass: HomeAssistant, config_entry: ConfigEntry +) -> dict[str, Any]: + """Return diagnostics for a config entry.""" + coordinator: QswUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id] + + return { + "config_entry": async_redact_data(config_entry.as_dict(), TO_REDACT_CONFIG), + "coord_data": async_redact_data(coordinator.data, TO_REDACT_DATA), + } diff --git a/tests/components/qnap_qsw/test_diagnostics.py b/tests/components/qnap_qsw/test_diagnostics.py new file mode 100644 index 00000000000..a4b5c1658e1 --- /dev/null +++ b/tests/components/qnap_qsw/test_diagnostics.py @@ -0,0 +1,123 @@ +"""The diagnostics tests for the QNAP QSW platform.""" + +from aiohttp import ClientSession +from aioqsw.const import ( + API_ANOMALY, + API_BUILD_NUMBER, + API_FAN1_SPEED, + API_MAX_SWITCH_TEMP, + API_NUMBER, + API_PRODUCT, + API_RESULT, + API_SWITCH_TEMP, + API_UPTIME, + API_VERSION, + QSD_ANOMALY, + QSD_BUILD_NUMBER, + QSD_FAN1_SPEED, + QSD_FIRMWARE_CONDITION, + QSD_FIRMWARE_INFO, + QSD_MAC, + QSD_NUMBER, + QSD_PRODUCT, + QSD_SERIAL, + QSD_SYSTEM_BOARD, + QSD_SYSTEM_SENSOR, + QSD_SYSTEM_TIME, + QSD_TEMP, + QSD_TEMP_MAX, + QSD_UPTIME, + QSD_VERSION, +) + +from homeassistant.components.diagnostics.const import REDACTED +from homeassistant.components.qnap_qsw.const import DOMAIN +from homeassistant.const import CONF_PASSWORD, CONF_URL, CONF_USERNAME +from homeassistant.core import HomeAssistant + +from .util import ( + CONFIG, + FIRMWARE_CONDITION_MOCK, + FIRMWARE_INFO_MOCK, + SYSTEM_BOARD_MOCK, + SYSTEM_SENSOR_MOCK, + SYSTEM_TIME_MOCK, + async_init_integration, +) + +from tests.components.diagnostics import get_diagnostics_for_config_entry + + +async def test_config_entry_diagnostics( + hass: HomeAssistant, hass_client: ClientSession +) -> None: + """Test config entry diagnostics.""" + await async_init_integration(hass) + assert hass.data[DOMAIN] + + config_entry = hass.config_entries.async_entries(DOMAIN)[0] + diag = await get_diagnostics_for_config_entry(hass, hass_client, config_entry) + + assert ( + diag["config_entry"].items() + >= { + "data": { + CONF_PASSWORD: REDACTED, + CONF_URL: CONFIG[CONF_URL], + CONF_USERNAME: REDACTED, + }, + "domain": DOMAIN, + "unique_id": REDACTED, + }.items() + ) + + fw_cond_diag = diag["coord_data"][QSD_FIRMWARE_CONDITION] + fw_cond_mock = FIRMWARE_CONDITION_MOCK[API_RESULT] + assert ( + fw_cond_diag.items() + >= { + QSD_ANOMALY: fw_cond_mock[API_ANOMALY], + }.items() + ) + + fw_info_diag = diag["coord_data"][QSD_FIRMWARE_INFO] + fw_info_mock = FIRMWARE_INFO_MOCK[API_RESULT] + assert ( + fw_info_diag.items() + >= { + QSD_BUILD_NUMBER: fw_info_mock[API_BUILD_NUMBER], + QSD_NUMBER: fw_info_mock[API_NUMBER], + QSD_VERSION: fw_info_mock[API_VERSION], + }.items() + ) + + sys_board_diag = diag["coord_data"][QSD_SYSTEM_BOARD] + sys_board_mock = SYSTEM_BOARD_MOCK[API_RESULT] + assert ( + sys_board_diag.items() + >= { + QSD_MAC: REDACTED, + QSD_PRODUCT: sys_board_mock[API_PRODUCT], + QSD_SERIAL: REDACTED, + }.items() + ) + + sys_sensor_diag = diag["coord_data"][QSD_SYSTEM_SENSOR] + sys_sensor_mock = SYSTEM_SENSOR_MOCK[API_RESULT] + assert ( + sys_sensor_diag.items() + >= { + QSD_FAN1_SPEED: sys_sensor_mock[API_FAN1_SPEED], + QSD_TEMP: sys_sensor_mock[API_SWITCH_TEMP], + QSD_TEMP_MAX: sys_sensor_mock[API_MAX_SWITCH_TEMP], + }.items() + ) + + sys_time_diag = diag["coord_data"][QSD_SYSTEM_TIME] + sys_time_mock = SYSTEM_TIME_MOCK[API_RESULT] + assert ( + sys_time_diag.items() + >= { + QSD_UPTIME: sys_time_mock[API_UPTIME], + }.items() + ) diff --git a/tests/components/qnap_qsw/util.py b/tests/components/qnap_qsw/util.py index 501c31f55e9..57b7b61a59d 100644 --- a/tests/components/qnap_qsw/util.py +++ b/tests/components/qnap_qsw/util.py @@ -127,8 +127,12 @@ async def async_init_integration( ) -> None: """Set up the QNAP QSW integration in Home Assistant.""" - entry = MockConfigEntry(domain=DOMAIN, data=CONFIG) - entry.add_to_hass(hass) + config_entry = MockConfigEntry( + data=CONFIG, + domain=DOMAIN, + unique_id="qsw_unique_id", + ) + config_entry.add_to_hass(hass) with patch( "homeassistant.components.qnap_qsw.QnapQswApi.get_firmware_condition", @@ -149,5 +153,5 @@ async def async_init_integration( "homeassistant.components.qnap_qsw.QnapQswApi.post_users_login", return_value=USERS_LOGIN_MOCK, ): - await hass.config_entries.async_setup(entry.entry_id) + await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done()