From be8e432beab9b6f1efe2e8177ceb6b8deca7471a Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Wed, 24 Jul 2024 20:08:06 +0200 Subject: [PATCH] Use snapshot in deCONZ alarm control panel tests (#122551) * Use snapshot in deCONZ alarm control panel tests * Clean up comments --- .../snapshots/test_alarm_control_panel.ambr | 51 ++++++ .../deconz/test_alarm_control_panel.py | 164 ++++++------------ 2 files changed, 105 insertions(+), 110 deletions(-) create mode 100644 tests/components/deconz/snapshots/test_alarm_control_panel.ambr diff --git a/tests/components/deconz/snapshots/test_alarm_control_panel.ambr b/tests/components/deconz/snapshots/test_alarm_control_panel.ambr new file mode 100644 index 00000000000..86b97a62dfe --- /dev/null +++ b/tests/components/deconz/snapshots/test_alarm_control_panel.ambr @@ -0,0 +1,51 @@ +# serializer version: 1 +# name: test_alarm_control_panel[sensor_payload0-alarm_system_payload0][alarm_control_panel.keypad-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'alarm_control_panel', + 'entity_category': None, + 'entity_id': 'alarm_control_panel.keypad', + 'has_entity_name': False, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Keypad', + 'platform': 'deconz', + 'previous_unique_id': None, + 'supported_features': , + 'translation_key': None, + 'unique_id': '00:00:00:00:00:00:00:00-00', + 'unit_of_measurement': None, + }) +# --- +# name: test_alarm_control_panel[sensor_payload0-alarm_system_payload0][alarm_control_panel.keypad-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'changed_by': None, + 'code_arm_required': True, + 'code_format': , + 'friendly_name': 'Keypad', + 'supported_features': , + }), + 'context': , + 'entity_id': 'alarm_control_panel.keypad', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- diff --git a/tests/components/deconz/test_alarm_control_panel.py b/tests/components/deconz/test_alarm_control_panel.py index 3c901d94593..712dddc7225 100644 --- a/tests/components/deconz/test_alarm_control_panel.py +++ b/tests/components/deconz/test_alarm_control_panel.py @@ -1,14 +1,15 @@ """deCONZ alarm control panel platform tests.""" from collections.abc import Callable +from unittest.mock import patch from pydeconz.models.sensor.ancillary_control import AncillaryControlPanel import pytest +from syrupy import SnapshotAssertion from homeassistant.components.alarm_control_panel import ( DOMAIN as ALARM_CONTROL_PANEL_DOMAIN, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( ATTR_CODE, ATTR_ENTITY_ID, @@ -24,12 +25,14 @@ from homeassistant.const import ( STATE_ALARM_PENDING, STATE_ALARM_TRIGGERED, STATE_UNAVAILABLE, - STATE_UNKNOWN, + Platform, ) from homeassistant.core import HomeAssistant +from homeassistant.helpers import entity_registry as er -from .conftest import WebsocketDataType +from .conftest import ConfigEntryFactoryType, WebsocketDataType +from tests.common import snapshot_platform from tests.test_util.aiohttp import AiohttpClientMocker @@ -99,125 +102,66 @@ from tests.test_util.aiohttp import AiohttpClientMocker ) async def test_alarm_control_panel( hass: HomeAssistant, + entity_registry: er.EntityRegistry, aioclient_mock: AiohttpClientMocker, - config_entry_setup: ConfigEntry, + config_entry_factory: ConfigEntryFactoryType, mock_put_request: Callable[[str, str], AiohttpClientMocker], sensor_ws_data: WebsocketDataType, + snapshot: SnapshotAssertion, ) -> None: """Test successful creation of alarm control panel entities.""" - assert len(hass.states.async_all()) == 4 - assert hass.states.get("alarm_control_panel.keypad").state == STATE_UNKNOWN - - # Event signals alarm control panel armed away - - await sensor_ws_data({"state": {"panel": AncillaryControlPanel.ARMED_AWAY}}) - assert hass.states.get("alarm_control_panel.keypad").state == STATE_ALARM_ARMED_AWAY - - # Event signals alarm control panel armed night - - await sensor_ws_data({"state": {"panel": AncillaryControlPanel.ARMED_NIGHT}}) - assert ( - hass.states.get("alarm_control_panel.keypad").state == STATE_ALARM_ARMED_NIGHT - ) - - # Event signals alarm control panel armed home - - await sensor_ws_data({"state": {"panel": AncillaryControlPanel.ARMED_STAY}}) - assert hass.states.get("alarm_control_panel.keypad").state == STATE_ALARM_ARMED_HOME - - # Event signals alarm control panel disarmed - - await sensor_ws_data({"state": {"panel": AncillaryControlPanel.DISARMED}}) - assert hass.states.get("alarm_control_panel.keypad").state == STATE_ALARM_DISARMED - - # Event signals alarm control panel arming - - for arming_event in ( - AncillaryControlPanel.ARMING_AWAY, - AncillaryControlPanel.ARMING_NIGHT, - AncillaryControlPanel.ARMING_STAY, + with patch( + "homeassistant.components.deconz.PLATFORMS", [Platform.ALARM_CONTROL_PANEL] ): - await sensor_ws_data({"state": {"panel": arming_event}}) - assert hass.states.get("alarm_control_panel.keypad").state == STATE_ALARM_ARMING + config_entry = await config_entry_factory() + await snapshot_platform(hass, entity_registry, snapshot, config_entry.entry_id) - # Event signals alarm control panel pending - - for pending_event in ( - AncillaryControlPanel.ENTRY_DELAY, - AncillaryControlPanel.EXIT_DELAY, + for action, state in ( + # Event signals alarm control panel armed state + (AncillaryControlPanel.ARMED_AWAY, STATE_ALARM_ARMED_AWAY), + (AncillaryControlPanel.ARMED_NIGHT, STATE_ALARM_ARMED_NIGHT), + (AncillaryControlPanel.ARMED_STAY, STATE_ALARM_ARMED_HOME), + (AncillaryControlPanel.DISARMED, STATE_ALARM_DISARMED), + # Event signals alarm control panel arming state + (AncillaryControlPanel.ARMING_AWAY, STATE_ALARM_ARMING), + (AncillaryControlPanel.ARMING_NIGHT, STATE_ALARM_ARMING), + (AncillaryControlPanel.ARMING_STAY, STATE_ALARM_ARMING), + # Event signals alarm control panel pending state + (AncillaryControlPanel.ENTRY_DELAY, STATE_ALARM_PENDING), + (AncillaryControlPanel.EXIT_DELAY, STATE_ALARM_PENDING), + # Event signals alarm control panel triggered state + (AncillaryControlPanel.IN_ALARM, STATE_ALARM_TRIGGERED), + # Event signals alarm control panel unknown state keeps previous state + (AncillaryControlPanel.NOT_READY, STATE_ALARM_TRIGGERED), ): - await sensor_ws_data({"state": {"panel": pending_event}}) - assert ( - hass.states.get("alarm_control_panel.keypad").state == STATE_ALARM_PENDING - ) - - # Event signals alarm control panel triggered - - await sensor_ws_data({"state": {"panel": AncillaryControlPanel.IN_ALARM}}) - assert hass.states.get("alarm_control_panel.keypad").state == STATE_ALARM_TRIGGERED - - # Event signals alarm control panel unknown state keeps previous state - - await sensor_ws_data({"state": {"panel": AncillaryControlPanel.NOT_READY}}) - assert hass.states.get("alarm_control_panel.keypad").state == STATE_ALARM_TRIGGERED + await sensor_ws_data({"state": {"panel": action}}) + assert hass.states.get("alarm_control_panel.keypad").state == state # Verify service calls - # Service set alarm to away mode + for path, service, code in ( + # Service set alarm to away mode + ("arm_away", SERVICE_ALARM_ARM_AWAY, "1234"), + # Service set alarm to home mode + ("arm_stay", SERVICE_ALARM_ARM_HOME, "2345"), + # Service set alarm to night mode + ("arm_night", SERVICE_ALARM_ARM_NIGHT, "3456"), + # Service set alarm to disarmed + ("disarm", SERVICE_ALARM_DISARM, "4567"), + ): + aioclient_mock.mock_calls.clear() + aioclient_mock = mock_put_request(f"/alarmsystems/0/{path}") + await hass.services.async_call( + ALARM_CONTROL_PANEL_DOMAIN, + service, + {ATTR_ENTITY_ID: "alarm_control_panel.keypad", ATTR_CODE: code}, + blocking=True, + ) + assert aioclient_mock.mock_calls[0][2] == {"code0": code} - aioclient_mock = mock_put_request("/alarmsystems/0/arm_away") + await hass.config_entries.async_unload(config_entry.entry_id) + assert hass.states.get("alarm_control_panel.keypad").state == STATE_UNAVAILABLE - await hass.services.async_call( - ALARM_CONTROL_PANEL_DOMAIN, - SERVICE_ALARM_ARM_AWAY, - {ATTR_ENTITY_ID: "alarm_control_panel.keypad", ATTR_CODE: "1234"}, - blocking=True, - ) - assert aioclient_mock.mock_calls[1][2] == {"code0": "1234"} - - # Service set alarm to home mode - - aioclient_mock = mock_put_request("/alarmsystems/0/arm_stay") - - await hass.services.async_call( - ALARM_CONTROL_PANEL_DOMAIN, - SERVICE_ALARM_ARM_HOME, - {ATTR_ENTITY_ID: "alarm_control_panel.keypad", ATTR_CODE: "2345"}, - blocking=True, - ) - assert aioclient_mock.mock_calls[2][2] == {"code0": "2345"} - - # Service set alarm to night mode - - aioclient_mock = mock_put_request("/alarmsystems/0/arm_night") - - await hass.services.async_call( - ALARM_CONTROL_PANEL_DOMAIN, - SERVICE_ALARM_ARM_NIGHT, - {ATTR_ENTITY_ID: "alarm_control_panel.keypad", ATTR_CODE: "3456"}, - blocking=True, - ) - assert aioclient_mock.mock_calls[3][2] == {"code0": "3456"} - - # Service set alarm to disarmed - - aioclient_mock = mock_put_request("/alarmsystems/0/disarm") - - await hass.services.async_call( - ALARM_CONTROL_PANEL_DOMAIN, - SERVICE_ALARM_DISARM, - {ATTR_ENTITY_ID: "alarm_control_panel.keypad", ATTR_CODE: "4567"}, - blocking=True, - ) - assert aioclient_mock.mock_calls[4][2] == {"code0": "4567"} - - await hass.config_entries.async_unload(config_entry_setup.entry_id) - - states = hass.states.async_all() - assert len(states) == 4 - for state in states: - assert state.state == STATE_UNAVAILABLE - - await hass.config_entries.async_remove(config_entry_setup.entry_id) + await hass.config_entries.async_remove(config_entry.entry_id) await hass.async_block_till_done() assert len(hass.states.async_all()) == 0