core/tests/components/lcn/test_events.py

155 lines
4.9 KiB
Python

"""Tests for LCN events."""
from pypck.inputs import Input, ModSendKeysHost, ModStatusAccessControl
from pypck.lcn_addr import LcnAddr
from pypck.lcn_defs import AccessControlPeriphery, KeyAction, SendKeyCommand
import pytest
from homeassistant.core import HomeAssistant
from tests.common import async_capture_events
LCN_TRANSPONDER = "lcn_transponder"
LCN_FINGERPRINT = "lcn_fingerprint"
LCN_TRANSMITTER = "lcn_transmitter"
LCN_SEND_KEYS = "lcn_send_keys"
async def test_fire_transponder_event(hass: HomeAssistant, lcn_connection) -> None:
"""Test the transponder event is fired."""
events = async_capture_events(hass, LCN_TRANSPONDER)
inp = ModStatusAccessControl(
LcnAddr(0, 7, False),
periphery=AccessControlPeriphery.TRANSPONDER,
code="aabbcc",
)
await lcn_connection.async_process_input(inp)
await hass.async_block_till_done()
assert len(events) == 1
assert events[0].event_type == LCN_TRANSPONDER
assert events[0].data["code"] == "aabbcc"
async def test_fire_fingerprint_event(hass: HomeAssistant, lcn_connection) -> None:
"""Test the fingerprint event is fired."""
events = async_capture_events(hass, LCN_FINGERPRINT)
inp = ModStatusAccessControl(
LcnAddr(0, 7, False),
periphery=AccessControlPeriphery.FINGERPRINT,
code="aabbcc",
)
await lcn_connection.async_process_input(inp)
await hass.async_block_till_done()
assert len(events) == 1
assert events[0].event_type == LCN_FINGERPRINT
assert events[0].data["code"] == "aabbcc"
async def test_fire_codelock_event(hass: HomeAssistant, lcn_connection) -> None:
"""Test the codelock event is fired."""
events = async_capture_events(hass, "lcn_codelock")
inp = ModStatusAccessControl(
LcnAddr(0, 7, False),
periphery=AccessControlPeriphery.CODELOCK,
code="aabbcc",
)
await lcn_connection.async_process_input(inp)
await hass.async_block_till_done()
assert len(events) == 1
assert events[0].event_type == "lcn_codelock"
assert events[0].data["code"] == "aabbcc"
async def test_fire_transmitter_event(hass: HomeAssistant, lcn_connection) -> None:
"""Test the transmitter event is fired."""
events = async_capture_events(hass, LCN_TRANSMITTER)
inp = ModStatusAccessControl(
LcnAddr(0, 7, False),
periphery=AccessControlPeriphery.TRANSMITTER,
code="aabbcc",
level=0,
key=0,
action=KeyAction.HIT,
)
await lcn_connection.async_process_input(inp)
await hass.async_block_till_done()
assert len(events) == 1
assert events[0].event_type == LCN_TRANSMITTER
assert events[0].data["code"] == "aabbcc"
assert events[0].data["level"] == 0
assert events[0].data["key"] == 0
assert events[0].data["action"] == "hit"
async def test_fire_sendkeys_event(hass: HomeAssistant, lcn_connection) -> None:
"""Test the send_keys event is fired."""
events = async_capture_events(hass, LCN_SEND_KEYS)
inp = ModSendKeysHost(
LcnAddr(0, 7, False),
actions=[SendKeyCommand.HIT, SendKeyCommand.MAKE, SendKeyCommand.DONTSEND],
keys=[True, True, False, False, False, False, False, False],
)
await lcn_connection.async_process_input(inp)
await hass.async_block_till_done()
assert len(events) == 4
assert events[0].event_type == LCN_SEND_KEYS
assert events[0].data["key"] == "a1"
assert events[0].data["action"] == "hit"
assert events[1].event_type == LCN_SEND_KEYS
assert events[1].data["key"] == "a2"
assert events[1].data["action"] == "hit"
assert events[2].event_type == LCN_SEND_KEYS
assert events[2].data["key"] == "b1"
assert events[2].data["action"] == "make"
assert events[3].event_type == LCN_SEND_KEYS
assert events[3].data["key"] == "b2"
assert events[3].data["action"] == "make"
async def test_dont_fire_on_non_module_input(
hass: HomeAssistant, lcn_connection
) -> None:
"""Test for no event is fired if a non-module input is received."""
inp = Input()
for event_name in (
LCN_TRANSPONDER,
LCN_FINGERPRINT,
LCN_TRANSMITTER,
LCN_SEND_KEYS,
):
events = async_capture_events(hass, event_name)
await lcn_connection.async_process_input(inp)
await hass.async_block_till_done()
assert len(events) == 0
# This tests needs to be adjusted to remove lingering tasks
@pytest.mark.parametrize("expected_lingering_tasks", [True])
async def test_dont_fire_on_unknown_module(hass: HomeAssistant, lcn_connection) -> None:
"""Test for no event is fired if an input from an unknown module is received."""
inp = ModStatusAccessControl(
LcnAddr(0, 10, False), # unknown module
periphery=AccessControlPeriphery.FINGERPRINT,
code="aabbcc",
)
events = async_capture_events(hass, LCN_FINGERPRINT)
await lcn_connection.async_process_input(inp)
await hass.async_block_till_done()
assert len(events) == 0