277 lines
9.2 KiB
Python
277 lines
9.2 KiB
Python
|
"""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()
|