"""The tests for Z-Wave JS automation triggers.""" from unittest.mock import AsyncMock, patch from zwave_js_server.const import CommandClass from zwave_js_server.event import Event from zwave_js_server.model.node import Node from homeassistant.components import automation from homeassistant.components.zwave_js import DOMAIN from homeassistant.components.zwave_js.trigger import async_validate_trigger_config from homeassistant.const import SERVICE_RELOAD from homeassistant.helpers.device_registry import ( async_entries_for_config_entry, async_get as async_get_dev_reg, ) from homeassistant.setup import async_setup_component from .common import SCHLAGE_BE469_LOCK_ENTITY from tests.common import async_capture_events async def test_zwave_js_value_updated(hass, client, lock_schlage_be469, integration): """Test for zwave_js.value_updated automation trigger.""" trigger_type = f"{DOMAIN}.value_updated" node: Node = lock_schlage_be469 dev_reg = async_get_dev_reg(hass) device = async_entries_for_config_entry(dev_reg, integration.entry_id)[0] no_value_filter = async_capture_events(hass, "no_value_filter") single_from_value_filter = async_capture_events(hass, "single_from_value_filter") multiple_from_value_filters = async_capture_events( hass, "multiple_from_value_filters" ) from_and_to_value_filters = async_capture_events(hass, "from_and_to_value_filters") different_value = async_capture_events(hass, "different_value") def clear_events(): """Clear all events in the event list.""" no_value_filter.clear() single_from_value_filter.clear() multiple_from_value_filters.clear() from_and_to_value_filters.clear() different_value.clear() assert await async_setup_component( hass, automation.DOMAIN, { automation.DOMAIN: [ # no value filter { "trigger": { "platform": trigger_type, "entity_id": SCHLAGE_BE469_LOCK_ENTITY, "command_class": CommandClass.DOOR_LOCK.value, "property": "latchStatus", }, "action": { "event": "no_value_filter", }, }, # single from value filter { "trigger": { "platform": trigger_type, "device_id": device.id, "command_class": CommandClass.DOOR_LOCK.value, "property": "latchStatus", "from": "ajar", }, "action": { "event": "single_from_value_filter", }, }, # multiple from value filters { "trigger": { "platform": trigger_type, "entity_id": SCHLAGE_BE469_LOCK_ENTITY, "command_class": CommandClass.DOOR_LOCK.value, "property": "latchStatus", "from": ["closed", "opened"], }, "action": { "event": "multiple_from_value_filters", }, }, # from and to value filters { "trigger": { "platform": trigger_type, "entity_id": SCHLAGE_BE469_LOCK_ENTITY, "command_class": CommandClass.DOOR_LOCK.value, "property": "latchStatus", "from": ["closed", "opened"], "to": ["opened"], }, "action": { "event": "from_and_to_value_filters", }, }, # different value { "trigger": { "platform": trigger_type, "entity_id": SCHLAGE_BE469_LOCK_ENTITY, "command_class": CommandClass.DOOR_LOCK.value, "property": "boltStatus", }, "action": { "event": "different_value", }, }, ] }, ) # Test that no value filter is triggered event = Event( type="value updated", data={ "source": "node", "event": "value updated", "nodeId": node.node_id, "args": { "commandClassName": "Door Lock", "commandClass": 98, "endpoint": 0, "property": "latchStatus", "newValue": "boo", "prevValue": "hiss", "propertyName": "latchStatus", }, }, ) node.receive_event(event) await hass.async_block_till_done() assert len(no_value_filter) == 1 assert len(single_from_value_filter) == 0 assert len(multiple_from_value_filters) == 0 assert len(from_and_to_value_filters) == 0 assert len(different_value) == 0 clear_events() # Test that a single_from_value_filter is triggered event = Event( type="value updated", data={ "source": "node", "event": "value updated", "nodeId": node.node_id, "args": { "commandClassName": "Door Lock", "commandClass": 98, "endpoint": 0, "property": "latchStatus", "newValue": "boo", "prevValue": "ajar", "propertyName": "latchStatus", }, }, ) node.receive_event(event) await hass.async_block_till_done() assert len(no_value_filter) == 1 assert len(single_from_value_filter) == 1 assert len(multiple_from_value_filters) == 0 assert len(from_and_to_value_filters) == 0 assert len(different_value) == 0 clear_events() # Test that multiple_from_value_filters are triggered event = Event( type="value updated", data={ "source": "node", "event": "value updated", "nodeId": node.node_id, "args": { "commandClassName": "Door Lock", "commandClass": 98, "endpoint": 0, "property": "latchStatus", "newValue": "boo", "prevValue": "closed", "propertyName": "latchStatus", }, }, ) node.receive_event(event) await hass.async_block_till_done() assert len(no_value_filter) == 1 assert len(single_from_value_filter) == 0 assert len(multiple_from_value_filters) == 1 assert len(from_and_to_value_filters) == 0 assert len(different_value) == 0 clear_events() # Test that from_and_to_value_filters is triggered event = Event( type="value updated", data={ "source": "node", "event": "value updated", "nodeId": node.node_id, "args": { "commandClassName": "Door Lock", "commandClass": 98, "endpoint": 0, "property": "latchStatus", "newValue": "opened", "prevValue": "closed", "propertyName": "latchStatus", }, }, ) node.receive_event(event) await hass.async_block_till_done() assert len(no_value_filter) == 1 assert len(single_from_value_filter) == 0 assert len(multiple_from_value_filters) == 1 assert len(from_and_to_value_filters) == 1 assert len(different_value) == 0 clear_events() event = Event( type="value updated", data={ "source": "node", "event": "value updated", "nodeId": node.node_id, "args": { "commandClassName": "Door Lock", "commandClass": 98, "endpoint": 0, "property": "boltStatus", "newValue": "boo", "prevValue": "hiss", "propertyName": "boltStatus", }, }, ) node.receive_event(event) await hass.async_block_till_done() assert len(no_value_filter) == 0 assert len(single_from_value_filter) == 0 assert len(multiple_from_value_filters) == 0 assert len(from_and_to_value_filters) == 0 assert len(different_value) == 1 clear_events() with patch("homeassistant.config.load_yaml", return_value={}): await hass.services.async_call(automation.DOMAIN, SERVICE_RELOAD, blocking=True) async def test_async_validate_trigger_config(hass): """Test async_validate_trigger_config.""" mock_platform = AsyncMock() with patch( "homeassistant.components.zwave_js.trigger._get_trigger_platform", return_value=mock_platform, ): mock_platform.async_validate_trigger_config.return_value = {} await async_validate_trigger_config(hass, {}) mock_platform.async_validate_trigger_config.assert_awaited()