test_sensor.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. """Tests for sensor entities: native_value and extra_state_attributes."""
  2. import pytest
  3. from unittest.mock import patch
  4. from custom_components.zlock_slots.coordinator import ZLockCoordinator, LockState, SlotInfo
  5. from custom_components.zlock_slots.sensor import (
  6. ZLockLastActionSensor,
  7. ZLockLastUserSensor,
  8. ZLockSlotsSensor,
  9. ZLockGroupLastActionSensor,
  10. ZLockGroupLastUserSensor,
  11. )
  12. from custom_components.zlock_slots.const import CONF_GROUPS, CONF_GROUP_NAME, CONF_LOCK_ENTITY_IDS
  13. from tests.conftest import LOCK_ENTITY_ID, ALARM_TYPE_ENTITY, ALARM_LEVEL_ENTITY
  14. _ZWAVE_HELPER = "homeassistant.components.zwave_js.helpers.async_get_node_from_entity_id"
  15. @pytest.fixture
  16. async def coord(hass, config_entry, mock_node):
  17. config_entry.add_to_hass(hass)
  18. with patch(_ZWAVE_HELPER, return_value=mock_node):
  19. c = ZLockCoordinator(hass, config_entry)
  20. await c.async_setup()
  21. await hass.async_block_till_done()
  22. yield c
  23. c.async_teardown()
  24. # ---------------------------------------------------------------------------
  25. # ZLockLastActionSensor
  26. # ---------------------------------------------------------------------------
  27. async def test_last_action_none_initially(coord, config_entry):
  28. sensor = ZLockLastActionSensor(coord, config_entry, LOCK_ENTITY_ID)
  29. assert sensor.native_value is None
  30. async def test_last_action_after_event(hass, coord, config_entry):
  31. hass.states.async_set(ALARM_LEVEL_ENTITY, "1")
  32. hass.states.async_set(ALARM_TYPE_ENTITY, "18")
  33. await hass.async_block_till_done()
  34. sensor = ZLockLastActionSensor(coord, config_entry, LOCK_ENTITY_ID)
  35. assert sensor.native_value == "locked"
  36. # ---------------------------------------------------------------------------
  37. # ZLockLastUserSensor
  38. # ---------------------------------------------------------------------------
  39. async def test_last_user_none_initially(coord, config_entry):
  40. sensor = ZLockLastUserSensor(coord, config_entry, LOCK_ENTITY_ID)
  41. assert sensor.native_value is None
  42. async def test_last_user_slot_number_when_unnamed(hass, coord, config_entry):
  43. hass.states.async_set(ALARM_LEVEL_ENTITY, "2")
  44. hass.states.async_set(ALARM_TYPE_ENTITY, "19")
  45. await hass.async_block_till_done()
  46. sensor = ZLockLastUserSensor(coord, config_entry, LOCK_ENTITY_ID)
  47. assert sensor.native_value == "2"
  48. async def test_last_user_name_when_named(hass, coord, config_entry):
  49. await coord.async_set_name(LOCK_ENTITY_ID, 1, "Eve")
  50. hass.states.async_set(ALARM_LEVEL_ENTITY, "1")
  51. hass.states.async_set(ALARM_TYPE_ENTITY, "18")
  52. await hass.async_block_till_done()
  53. sensor = ZLockLastUserSensor(coord, config_entry, LOCK_ENTITY_ID)
  54. assert sensor.native_value == "Eve"
  55. async def test_last_user_manual(hass, coord, config_entry):
  56. hass.states.async_set(ALARM_TYPE_ENTITY, "21")
  57. await hass.async_block_till_done()
  58. sensor = ZLockLastUserSensor(coord, config_entry, LOCK_ENTITY_ID)
  59. assert sensor.native_value == "<Manual>"
  60. async def test_last_user_radio(hass, coord, config_entry):
  61. hass.states.async_set(ALARM_TYPE_ENTITY, "25")
  62. await hass.async_block_till_done()
  63. sensor = ZLockLastUserSensor(coord, config_entry, LOCK_ENTITY_ID)
  64. assert sensor.native_value == "<Radio>"
  65. # ---------------------------------------------------------------------------
  66. # ZLockSlotsSensor
  67. # ---------------------------------------------------------------------------
  68. async def test_slots_sensor_count(coord, config_entry):
  69. sensor = ZLockSlotsSensor(coord, config_entry, LOCK_ENTITY_ID)
  70. assert sensor.native_value == 2
  71. async def test_slots_sensor_zero_when_empty(hass, config_entry):
  72. from tests.conftest import FakeNode
  73. config_entry.add_to_hass(hass)
  74. with patch(_ZWAVE_HELPER, return_value=FakeNode(users=[])):
  75. c = ZLockCoordinator(hass, config_entry)
  76. await c.async_setup()
  77. sensor = ZLockSlotsSensor(c, config_entry, LOCK_ENTITY_ID)
  78. assert sensor.native_value == 0
  79. assert sensor.extra_state_attributes == {"slots": []}
  80. c.async_teardown()
  81. async def test_slots_sensor_attributes_structure(coord, config_entry):
  82. sensor = ZLockSlotsSensor(coord, config_entry, LOCK_ENTITY_ID)
  83. attrs = sensor.extra_state_attributes
  84. assert "slots" in attrs
  85. slots = attrs["slots"]
  86. assert len(slots) == 2
  87. assert slots[0] == {"slot_num": 1, "status": "enabled", "name": None}
  88. assert slots[1] == {"slot_num": 2, "status": "disabled", "name": None}
  89. async def test_slots_sensor_attributes_sorted(hass, config_entry):
  90. from tests.conftest import FakeNode, FakeUserData
  91. node = FakeNode(users=[FakeUserData(5), FakeUserData(1), FakeUserData(3)])
  92. config_entry.add_to_hass(hass)
  93. with patch(_ZWAVE_HELPER, return_value=node):
  94. c = ZLockCoordinator(hass, config_entry)
  95. await c.async_setup()
  96. sensor = ZLockSlotsSensor(c, config_entry, LOCK_ENTITY_ID)
  97. slot_nums = [s["slot_num"] for s in sensor.extra_state_attributes["slots"]]
  98. assert slot_nums == [1, 3, 5]
  99. c.async_teardown()
  100. async def test_slots_sensor_attributes_include_names(hass, config_entry, mock_node):
  101. config_entry.add_to_hass(hass)
  102. with patch(_ZWAVE_HELPER, return_value=mock_node):
  103. c = ZLockCoordinator(hass, config_entry)
  104. c._names[f"{LOCK_ENTITY_ID}:1"] = "Frank"
  105. await c.async_setup()
  106. sensor = ZLockSlotsSensor(c, config_entry, LOCK_ENTITY_ID)
  107. slot1 = sensor.extra_state_attributes["slots"][0]
  108. assert slot1["name"] == "Frank"
  109. c.async_teardown()
  110. # ---------------------------------------------------------------------------
  111. # Group sensors
  112. # ---------------------------------------------------------------------------
  113. @pytest.fixture
  114. def group_config_entry():
  115. from pytest_homeassistant_custom_component.common import MockConfigEntry
  116. from custom_components.zlock_slots.const import DOMAIN
  117. return MockConfigEntry(
  118. domain=DOMAIN,
  119. data={CONF_LOCK_ENTITY_IDS: [LOCK_ENTITY_ID]},
  120. options={
  121. CONF_GROUPS: [{
  122. CONF_GROUP_NAME: "All Locks",
  123. CONF_LOCK_ENTITY_IDS: [LOCK_ENTITY_ID],
  124. }]
  125. },
  126. entry_id="test_group_entry",
  127. )
  128. async def test_group_last_action_initially_none(hass, group_config_entry, mock_node):
  129. group_config_entry.add_to_hass(hass)
  130. with patch(_ZWAVE_HELPER, return_value=mock_node):
  131. c = ZLockCoordinator(hass, group_config_entry)
  132. await c.async_setup()
  133. sensor = ZLockGroupLastActionSensor(c, group_config_entry, "All Locks")
  134. assert sensor.native_value is None
  135. c.async_teardown()
  136. async def test_group_last_action_after_alarm(hass, group_config_entry, mock_node):
  137. group_config_entry.add_to_hass(hass)
  138. with patch(_ZWAVE_HELPER, return_value=mock_node):
  139. c = ZLockCoordinator(hass, group_config_entry)
  140. await c.async_setup()
  141. hass.states.async_set(ALARM_TYPE_ENTITY, "24")
  142. await hass.async_block_till_done()
  143. sensor = ZLockGroupLastActionSensor(c, group_config_entry, "All Locks")
  144. assert sensor.native_value == "locked"
  145. c.async_teardown()
  146. async def test_group_last_user_after_alarm(hass, group_config_entry, mock_node):
  147. group_config_entry.add_to_hass(hass)
  148. with patch(_ZWAVE_HELPER, return_value=mock_node):
  149. c = ZLockCoordinator(hass, group_config_entry)
  150. await c.async_setup()
  151. hass.states.async_set(ALARM_TYPE_ENTITY, "22")
  152. await hass.async_block_till_done()
  153. sensor = ZLockGroupLastUserSensor(c, group_config_entry, "All Locks")
  154. assert sensor.native_value == "<Manual>"
  155. c.async_teardown()