Use snapshot in deCONZ alarm control panel tests (#122551)

* Use snapshot in deCONZ alarm control panel tests

* Clean up comments
This commit is contained in:
Robert Svensson 2024-07-24 20:08:06 +02:00 committed by GitHub
parent 943b1afb55
commit be8e432bea
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 105 additions and 110 deletions

View File

@ -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': <ANY>,
'device_class': None,
'device_id': <ANY>,
'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': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Keypad',
'platform': 'deconz',
'previous_unique_id': None,
'supported_features': <AlarmControlPanelEntityFeature: 7>,
'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': <CodeFormat.NUMBER: 'number'>,
'friendly_name': 'Keypad',
'supported_features': <AlarmControlPanelEntityFeature: 7>,
}),
'context': <ANY>,
'entity_id': 'alarm_control_panel.keypad',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---

View File

@ -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