Skip to content

Commit

Permalink
Clean up events and properties (#20)
Browse files Browse the repository at this point in the history
* to_json -> info_object and dataclasses

* Make state a property

* cached properties
  • Loading branch information
dmulcahey committed Mar 30, 2024
1 parent b5f068a commit db12f68
Show file tree
Hide file tree
Showing 40 changed files with 1,961 additions and 1,420 deletions.
6 changes: 6 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,12 @@ disable_error_code = [
"var-annotated",
]

[[tool.mypy.overrides]]
module = [
"tests.*",
]
warn_unreachable = false

[tool.pylint]
max-line-length = 120
disable = ["C0103", "W0212"]
Expand Down
39 changes: 20 additions & 19 deletions tests/test_alarm_control_panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

from zha.application.gateway import Gateway
from zha.application.platforms.alarm_control_panel import AlarmControlPanel
from zha.application.platforms.alarm_control_panel.const import AlarmState
from zha.zigbee.device import Device

from .conftest import SIG_EP_INPUT, SIG_EP_OUTPUT, SIG_EP_PROFILE, SIG_EP_TYPE
Expand Down Expand Up @@ -54,7 +55,7 @@ async def test_alarm_control_panel(
assert isinstance(alarm_entity, AlarmControlPanel)

# test that the state is STATE_ALARM_DISARMED
assert alarm_entity.state == "disarmed"
assert alarm_entity.state["state"] == AlarmState.DISARMED

# arm_away
cluster.client_command.reset_mock()
Expand All @@ -69,7 +70,7 @@ async def test_alarm_control_panel(
security.IasAce.AudibleNotification.Default_Sound,
security.IasAce.AlarmStatus.No_Alarm,
)
assert alarm_entity.state == "armed_away"
assert alarm_entity.state["state"] == AlarmState.ARMED_AWAY

# disarm
await reset_alarm_panel(zha_gateway, cluster, alarm_entity)
Expand All @@ -78,7 +79,7 @@ async def test_alarm_control_panel(
cluster.client_command.reset_mock()
await alarm_entity.async_alarm_arm_away("4321")
await zha_gateway.async_block_till_done()
assert alarm_entity.state == "armed_away"
assert alarm_entity.state["state"] == AlarmState.ARMED_AWAY
cluster.client_command.reset_mock()

# now simulate a faulty code entry sequence
Expand All @@ -87,7 +88,7 @@ async def test_alarm_control_panel(
await alarm_entity.async_alarm_disarm("0000")
await zha_gateway.async_block_till_done()

assert alarm_entity.state == "triggered"
assert alarm_entity.state["state"] == AlarmState.TRIGGERED
assert cluster.client_command.call_count == 6
assert cluster.client_command.await_count == 6
assert cluster.client_command.call_args == call(
Expand All @@ -104,7 +105,7 @@ async def test_alarm_control_panel(
# arm_home
await alarm_entity.async_alarm_arm_home("4321")
await zha_gateway.async_block_till_done()
assert alarm_entity.state == "armed_home"
assert alarm_entity.state["state"] == AlarmState.ARMED_HOME
assert cluster.client_command.call_count == 2
assert cluster.client_command.await_count == 2
assert cluster.client_command.call_args == call(
Expand All @@ -121,7 +122,7 @@ async def test_alarm_control_panel(
# arm_night
await alarm_entity.async_alarm_arm_night("4321")
await zha_gateway.async_block_till_done()
assert alarm_entity.state == "armed_night"
assert alarm_entity.state["state"] == AlarmState.ARMED_NIGHT
assert cluster.client_command.call_count == 2
assert cluster.client_command.await_count == 2
assert cluster.client_command.call_args == call(
Expand All @@ -140,7 +141,7 @@ async def test_alarm_control_panel(
"cluster_command", 1, 0, [security.IasAce.ArmMode.Arm_All_Zones, "", 0]
)
await zha_gateway.async_block_till_done()
assert alarm_entity.state == "armed_away"
assert alarm_entity.state["state"] == AlarmState.ARMED_AWAY

# reset the panel
await reset_alarm_panel(zha_gateway, cluster, alarm_entity)
Expand All @@ -150,7 +151,7 @@ async def test_alarm_control_panel(
"cluster_command", 1, 0, [security.IasAce.ArmMode.Arm_Day_Home_Only, "", 0]
)
await zha_gateway.async_block_till_done()
assert alarm_entity.state == "armed_home"
assert alarm_entity.state["state"] == AlarmState.ARMED_HOME

# reset the panel
await reset_alarm_panel(zha_gateway, cluster, alarm_entity)
Expand All @@ -160,61 +161,61 @@ async def test_alarm_control_panel(
"cluster_command", 1, 0, [security.IasAce.ArmMode.Arm_Night_Sleep_Only, "", 0]
)
await zha_gateway.async_block_till_done()
assert alarm_entity.state == "armed_night"
assert alarm_entity.state["state"] == AlarmState.ARMED_NIGHT

# disarm from panel with bad code
cluster.listener_event(
"cluster_command", 1, 0, [security.IasAce.ArmMode.Disarm, "", 0]
)
await zha_gateway.async_block_till_done()
assert alarm_entity.state == "armed_night"
assert alarm_entity.state["state"] == AlarmState.ARMED_NIGHT

# disarm from panel with bad code for 2nd time still armed
cluster.listener_event(
"cluster_command", 1, 0, [security.IasAce.ArmMode.Disarm, "", 0]
)
await zha_gateway.async_block_till_done()
assert alarm_entity.state == "triggered"
assert alarm_entity.state["state"] == AlarmState.TRIGGERED

# disarm from panel with good code
cluster.listener_event(
"cluster_command", 1, 0, [security.IasAce.ArmMode.Disarm, "4321", 0]
)
await zha_gateway.async_block_till_done()
assert alarm_entity.state == "disarmed"
assert alarm_entity.state["state"] == AlarmState.DISARMED

# panic from panel
cluster.listener_event("cluster_command", 1, 4, [])
await zha_gateway.async_block_till_done()
assert alarm_entity.state == "triggered"
assert alarm_entity.state["state"] == AlarmState.TRIGGERED

# reset the panel
await reset_alarm_panel(zha_gateway, cluster, alarm_entity)

# fire from panel
cluster.listener_event("cluster_command", 1, 3, [])
await zha_gateway.async_block_till_done()
assert alarm_entity.state == "triggered"
assert alarm_entity.state["state"] == AlarmState.TRIGGERED

# reset the panel
await reset_alarm_panel(zha_gateway, cluster, alarm_entity)

# emergency from panel
cluster.listener_event("cluster_command", 1, 2, [])
await zha_gateway.async_block_till_done()
assert alarm_entity.state == "triggered"
assert alarm_entity.state["state"] == AlarmState.TRIGGERED

# reset the panel
await reset_alarm_panel(zha_gateway, cluster, alarm_entity)
assert alarm_entity.state == "disarmed"
assert alarm_entity.state["state"] == AlarmState.DISARMED

await alarm_entity.async_alarm_trigger()
await zha_gateway.async_block_till_done()
assert alarm_entity.state == "triggered"
assert alarm_entity.state["state"] == AlarmState.TRIGGERED

# reset the panel
await reset_alarm_panel(zha_gateway, cluster, alarm_entity)
assert alarm_entity.state == "disarmed"
assert alarm_entity.state["state"] == AlarmState.DISARMED


async def reset_alarm_panel(
Expand All @@ -226,7 +227,7 @@ async def reset_alarm_panel(
cluster.client_command.reset_mock()
await entity.async_alarm_disarm("4321")
await zha_gateway.async_block_till_done()
assert entity.state == "disarmed"
assert entity.state["state"] == AlarmState.DISARMED
assert cluster.client_command.call_count == 2
assert cluster.client_command.await_count == 2
assert cluster.client_command.call_args == call(
Expand Down
4 changes: 2 additions & 2 deletions tests/test_binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ async def async_test_binary_sensor_occupancy(
assert entity.is_on is False

# test refresh
cluster.read_attributes.reset_mock() # type: ignore[unreachable]
cluster.read_attributes.reset_mock()
assert entity.is_on is False
cluster.PLUGGED_ATTR_READS = plugs
update_attribute_cache(cluster)
Expand Down Expand Up @@ -84,7 +84,7 @@ async def async_test_iaszone_on_off(
assert entity.is_on is False

# check that binary sensor remains off when non-alarm bits change
cluster.listener_event("cluster_command", 1, 0, [0b1111111100]) # type: ignore[unreachable]
cluster.listener_event("cluster_command", 1, 0, [0b1111111100])
await zha_gateway.async_block_till_done()
assert entity.is_on is False

Expand Down

0 comments on commit db12f68

Please sign in to comment.