light.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. # Mixins for testing lights
  2. from homeassistant.components.light import ColorMode
  3. from ..helpers import assert_device_properties_set
  4. class BasicLightTests:
  5. def setUpBasicLight(self, dps, subject, testdata=(True, False)):
  6. self.basicLight = subject
  7. self.basicLightDps = dps
  8. self.basicLightOn = testdata[0]
  9. self.basicLightOff = testdata[1]
  10. def test_basic_light_supported_features(self):
  11. self.assertEqual(self.basicLight.supported_features, 0)
  12. def test_basic_light_supported_color_modes(self):
  13. self.assertCountEqual(
  14. self.basicLight.supported_color_modes,
  15. [ColorMode.ONOFF],
  16. )
  17. def test_basic_light_color_mode(self):
  18. self.assertEqual(self.basicLight.color_mode, ColorMode.ONOFF)
  19. def test_basic_light_has_no_brightness(self):
  20. self.assertIsNone(self.basicLight.brightness)
  21. def test_basic_light_has_no_effects(self):
  22. self.assertIsNone(self.basicLight.effect_list)
  23. self.assertIsNone(self.basicLight.effect)
  24. def test_basic_light_is_on(self):
  25. self.dps[self.basicLightDps] = self.basicLightOn
  26. self.assertTrue(self.basicLight.is_on)
  27. self.dps[self.basicLightDps] = self.basicLightOff
  28. self.assertFalse(self.basicLight.is_on)
  29. async def test_basic_light_turn_on(self):
  30. self.dps[self.basicLightDps] = self.basicLightOff
  31. async with assert_device_properties_set(
  32. self.basicLight._device, {self.basicLightDps: self.basicLightOn}
  33. ):
  34. await self.basicLight.async_turn_on()
  35. async def test_basic_light_turn_off(self):
  36. self.dps[self.basicLightDps] = self.basicLightOn
  37. async with assert_device_properties_set(
  38. self.basicLight._device, {self.basicLightDps: self.basicLightOff}
  39. ):
  40. await self.basicLight.async_turn_off()
  41. async def test_basic_light_toggle_turns_on_when_it_was_off(self):
  42. self.dps[self.basicLightDps] = self.basicLightOff
  43. async with assert_device_properties_set(
  44. self.basicLight._device,
  45. {self.basicLightDps: self.basicLightOn},
  46. ):
  47. await self.basicLight.async_toggle()
  48. async def test_basic_light_toggle_turns_off_when_it_was_on(self):
  49. self.dps[self.basicLightDps] = self.basicLightOn
  50. async with assert_device_properties_set(
  51. self.basicLight._device,
  52. {self.basicLightDps: self.basicLightOff},
  53. ):
  54. await self.basicLight.async_toggle()
  55. def test_basic_light_state_attributes(self):
  56. self.assertEqual(self.basicLight.extra_state_attributes, {})
  57. class MultiLightTests:
  58. def setUpMultiLights(self, lights):
  59. self.multiLight = {}
  60. self.multiLightDps = {}
  61. self.multiLightOn = {}
  62. self.multiLightOff = {}
  63. for light in lights:
  64. name = light["name"]
  65. subject = self.entities.get(name)
  66. testdata = light.get("testdata", (True, False))
  67. if subject is None:
  68. raise AttributeError(f"No light for {name} found.")
  69. self.multiLight[name] = subject
  70. self.multiLightDps[name] = light.get("dps")
  71. self.multiLightOn[name] = testdata[0]
  72. self.multiLightOff[name] = testdata[1]
  73. def test_multi_light_supported_features(self):
  74. for light in self.multiLight.values():
  75. self.assertEqual(light.supported_features, 0)
  76. def test_multi_light_supported_color_modes(self):
  77. for light in self.multiLight.values():
  78. self.assertCountEqual(
  79. light.supported_color_modes,
  80. [ColorMode.ONOFF],
  81. )
  82. def test_multi_light_color_mode(self):
  83. for light in self.multiLight.values():
  84. self.assertEqual(light.color_mode, ColorMode.ONOFF)
  85. def test_multi_lights_have_no_brightness(self):
  86. for light in self.multiLight.values():
  87. self.assertIsNone(light.brightness)
  88. def test_multi_lights_have_no_effects(self):
  89. for light in self.multiLight.values():
  90. self.assertIsNone(light.effect_list)
  91. self.assertIsNone(light.effect)
  92. def test_multi_light_is_on(self):
  93. for key, light in self.multiLight.items():
  94. dp_id = self.multiLightDps[key]
  95. self.dps[dp_id] = self.multiLightOn[key]
  96. self.assertTrue(light.is_on, f"{key} fails when ON")
  97. self.dps[dp_id] = self.multiLightOff[key]
  98. self.assertFalse(light.is_on, f"{key} fails when OFF")
  99. async def test_multi_light_turn_on(self):
  100. for key, light in self.multiLight.items():
  101. self.dps[self.multiLightDps[key]] = self.multiLightOff[key]
  102. async with assert_device_properties_set(
  103. light._device,
  104. {self.multiLightDps[key]: self.multiLightOn[key]},
  105. f"{key} failed to turn on",
  106. ):
  107. await light.async_turn_on()
  108. async def test_multi_light_turn_off(self):
  109. for key, light in self.multiLight.items():
  110. async with assert_device_properties_set(
  111. light._device,
  112. {self.multiLightDps[key]: self.multiLightOff[key]},
  113. f"{key} failed to turn off",
  114. ):
  115. await light.async_turn_off()
  116. async def test_multi_light_toggle_turns_on_when_it_was_off(self):
  117. for key, light in self.multiLight.items():
  118. self.dps[self.multiLightDps[key]] = self.multiLightOff[key]
  119. async with assert_device_properties_set(
  120. light._device,
  121. {self.multiLightDps[key]: self.multiLightOn[key]},
  122. f"{key} failed to toggle",
  123. ):
  124. await light.async_toggle()
  125. async def test_multi_light_toggle_turns_off_when_it_was_on(self):
  126. for key, light in self.multiLight.items():
  127. self.dps[self.multiLightDps[key]] = self.multiLightOn[key]
  128. async with assert_device_properties_set(
  129. light._device,
  130. {self.multiLightDps[key]: self.multiLightOff[key]},
  131. f"{key} failed to toggle",
  132. ):
  133. await light.async_toggle()
  134. def test_multi_light_state_attributes(self):
  135. for key, light in self.multiLight.items():
  136. self.assertEqual(
  137. light.extra_state_attributes,
  138. {},
  139. f"{key} extra_state_attributes mismatch",
  140. )
  141. class DimmableLightTests:
  142. def setUpDimmableLight(
  143. self,
  144. dps,
  145. subject,
  146. offval=0,
  147. tests=[(100, 100)],
  148. no_off=False,
  149. ):
  150. self.dimmableLight = subject
  151. self.dimmableLightDps = dps
  152. self.dimmableLightOff = offval
  153. self.dimmableLightTest = tests
  154. self.dimmableLightNoOff = no_off
  155. def test_dimmable_light_brightness(self):
  156. self.dps[self.dimmableLightDps] = self.dimmableLightOff
  157. if not self.dimmableLightNoOff:
  158. self.assertEqual(self.dimmableLight.brightness, 0)
  159. for dps, val in self.dimmableLightTest:
  160. self.dps[self.dimmableLightDps] = dps
  161. self.assertEqual(self.dimmableLight.brightness, val)
  162. def test_dimmable_light_state_attributes(self):
  163. self.assertEqual(self.dimmableLight.extra_state_attributes, {})
  164. async def test_dimmable_light_turn_off(self):
  165. if not self.dimmableLightNoOff:
  166. async with assert_device_properties_set(
  167. self.dimmableLight._device,
  168. {self.dimmableLightDps: self.dimmableLightOff},
  169. ):
  170. await self.dimmableLight.async_turn_off()
  171. async def test_dimmable_light_set_brightness(self):
  172. for dps, val in self.dimmableLightTest:
  173. async with assert_device_properties_set(
  174. self.dimmableLight._device,
  175. {self.dimmableLightDps: dps},
  176. ):
  177. await self.dimmableLight.async_turn_on(brightness=val)
  178. async def test_dimmable_light_set_brightness_to_off(self):
  179. if not self.dimmableLightNoOff:
  180. async with assert_device_properties_set(
  181. self.dimmableLight._device,
  182. {self.dimmableLightDps: self.dimmableLightOff},
  183. ):
  184. await self.dimmableLight.async_turn_on(brightness=0)
  185. async def test_dimmable_light_toggle_turns_off_when_it_was_on(self):
  186. if not self.dimmableLightNoOff:
  187. self.dps[self.dimmableLightDps] = self.dimmableLightTest[0][0]
  188. async with assert_device_properties_set(
  189. self.dimmableLight._device,
  190. {self.dimmableLightDps: self.dimmableLightOff},
  191. ):
  192. await self.dimmableLight.async_toggle()