PageRenderTime 37ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/helpers/test_event.py

https://gitlab.com/mkerfoot/home-assistant
Python | 336 lines | 229 code | 73 blank | 34 comment | 4 complexity | 65de2d59c29913898f296ce1aca3b356 MD5 | raw file
  1. """
  2. tests.helpers.event_test
  3. ~~~~~~~~~~~~~~~~~~~~~~~~
  4. Tests event helpers.
  5. """
  6. # pylint: disable=protected-access,too-many-public-methods
  7. # pylint: disable=too-few-public-methods
  8. import unittest
  9. from datetime import datetime, timedelta
  10. from astral import Astral
  11. import homeassistant.core as ha
  12. from homeassistant.helpers.event import (
  13. track_point_in_utc_time,
  14. track_point_in_time,
  15. track_utc_time_change,
  16. track_time_change,
  17. track_state_change,
  18. track_sunrise,
  19. track_sunset,
  20. )
  21. from homeassistant.components import sun
  22. import homeassistant.util.dt as dt_util
  23. from tests.common import get_test_home_assistant
  24. class TestEventHelpers(unittest.TestCase):
  25. """
  26. Tests the Home Assistant event helpers.
  27. """
  28. def setUp(self): # pylint: disable=invalid-name
  29. """ things to be run when tests are started. """
  30. self.hass = get_test_home_assistant()
  31. def tearDown(self): # pylint: disable=invalid-name
  32. """ Stop down stuff we started. """
  33. self.hass.stop()
  34. def test_track_point_in_time(self):
  35. """ Test track point in time. """
  36. before_birthday = datetime(1985, 7, 9, 12, 0, 0, tzinfo=dt_util.UTC)
  37. birthday_paulus = datetime(1986, 7, 9, 12, 0, 0, tzinfo=dt_util.UTC)
  38. after_birthday = datetime(1987, 7, 9, 12, 0, 0, tzinfo=dt_util.UTC)
  39. runs = []
  40. track_point_in_utc_time(
  41. self.hass, lambda x: runs.append(1), birthday_paulus)
  42. self._send_time_changed(before_birthday)
  43. self.hass.pool.block_till_done()
  44. self.assertEqual(0, len(runs))
  45. self._send_time_changed(birthday_paulus)
  46. self.hass.pool.block_till_done()
  47. self.assertEqual(1, len(runs))
  48. # A point in time tracker will only fire once, this should do nothing
  49. self._send_time_changed(birthday_paulus)
  50. self.hass.pool.block_till_done()
  51. self.assertEqual(1, len(runs))
  52. track_point_in_time(
  53. self.hass, lambda x: runs.append(1), birthday_paulus)
  54. self._send_time_changed(after_birthday)
  55. self.hass.pool.block_till_done()
  56. self.assertEqual(2, len(runs))
  57. def test_track_time_change(self):
  58. """ Test tracking time change. """
  59. wildcard_runs = []
  60. specific_runs = []
  61. track_time_change(self.hass, lambda x: wildcard_runs.append(1))
  62. track_utc_time_change(
  63. self.hass, lambda x: specific_runs.append(1), second=[0, 30])
  64. self._send_time_changed(datetime(2014, 5, 24, 12, 0, 0))
  65. self.hass.pool.block_till_done()
  66. self.assertEqual(1, len(specific_runs))
  67. self.assertEqual(1, len(wildcard_runs))
  68. self._send_time_changed(datetime(2014, 5, 24, 12, 0, 15))
  69. self.hass.pool.block_till_done()
  70. self.assertEqual(1, len(specific_runs))
  71. self.assertEqual(2, len(wildcard_runs))
  72. self._send_time_changed(datetime(2014, 5, 24, 12, 0, 30))
  73. self.hass.pool.block_till_done()
  74. self.assertEqual(2, len(specific_runs))
  75. self.assertEqual(3, len(wildcard_runs))
  76. def test_track_state_change(self):
  77. """Test track_state_change."""
  78. # 2 lists to track how often our callbacks get called
  79. specific_runs = []
  80. wildcard_runs = []
  81. track_state_change(
  82. self.hass, 'light.Bowl', lambda a, b, c: specific_runs.append(1),
  83. 'on', 'off')
  84. track_state_change(
  85. self.hass, 'light.Bowl',
  86. lambda _, old_s, new_s: wildcard_runs.append((old_s, new_s)),
  87. ha.MATCH_ALL, ha.MATCH_ALL)
  88. # Adding state to state machine
  89. self.hass.states.set("light.Bowl", "on")
  90. self.hass.pool.block_till_done()
  91. self.assertEqual(0, len(specific_runs))
  92. self.assertEqual(1, len(wildcard_runs))
  93. self.assertIsNone(wildcard_runs[-1][0])
  94. self.assertIsNotNone(wildcard_runs[-1][1])
  95. # Set same state should not trigger a state change/listener
  96. self.hass.states.set('light.Bowl', 'on')
  97. self.hass.pool.block_till_done()
  98. self.assertEqual(0, len(specific_runs))
  99. self.assertEqual(1, len(wildcard_runs))
  100. # State change off -> on
  101. self.hass.states.set('light.Bowl', 'off')
  102. self.hass.pool.block_till_done()
  103. self.assertEqual(1, len(specific_runs))
  104. self.assertEqual(2, len(wildcard_runs))
  105. # State change off -> off
  106. self.hass.states.set('light.Bowl', 'off', {"some_attr": 1})
  107. self.hass.pool.block_till_done()
  108. self.assertEqual(1, len(specific_runs))
  109. self.assertEqual(3, len(wildcard_runs))
  110. # State change off -> on
  111. self.hass.states.set('light.Bowl', 'on')
  112. self.hass.pool.block_till_done()
  113. self.assertEqual(1, len(specific_runs))
  114. self.assertEqual(4, len(wildcard_runs))
  115. self.hass.states.remove('light.bowl')
  116. self.hass.pool.block_till_done()
  117. self.assertEqual(1, len(specific_runs))
  118. self.assertEqual(5, len(wildcard_runs))
  119. self.assertIsNotNone(wildcard_runs[-1][0])
  120. self.assertIsNone(wildcard_runs[-1][1])
  121. def test_track_sunrise(self):
  122. """ Test track sunrise """
  123. latitude = 32.87336
  124. longitude = 117.22743
  125. # setup sun component
  126. self.hass.config.latitude = latitude
  127. self.hass.config.longitude = longitude
  128. sun.setup(self.hass, {sun.DOMAIN: {sun.CONF_ELEVATION: 0}})
  129. # get next sunrise/sunset
  130. astral = Astral()
  131. utc_now = dt_util.utcnow()
  132. mod = -1
  133. while True:
  134. next_rising = (astral.sunrise_utc(utc_now +
  135. timedelta(days=mod), latitude, longitude))
  136. if next_rising > utc_now:
  137. break
  138. mod += 1
  139. # track sunrise
  140. runs = []
  141. track_sunrise(self.hass, lambda: runs.append(1))
  142. offset_runs = []
  143. offset = timedelta(minutes=30)
  144. track_sunrise(self.hass, lambda: offset_runs.append(1), offset)
  145. # run tests
  146. self._send_time_changed(next_rising - offset)
  147. self.hass.pool.block_till_done()
  148. self.assertEqual(0, len(runs))
  149. self.assertEqual(0, len(offset_runs))
  150. self._send_time_changed(next_rising)
  151. self.hass.pool.block_till_done()
  152. self.assertEqual(1, len(runs))
  153. self.assertEqual(0, len(offset_runs))
  154. self._send_time_changed(next_rising + offset)
  155. self.hass.pool.block_till_done()
  156. self.assertEqual(2, len(runs))
  157. self.assertEqual(1, len(offset_runs))
  158. def test_track_sunset(self):
  159. """ Test track sunset """
  160. latitude = 32.87336
  161. longitude = 117.22743
  162. # setup sun component
  163. self.hass.config.latitude = latitude
  164. self.hass.config.longitude = longitude
  165. sun.setup(self.hass, {sun.DOMAIN: {sun.CONF_ELEVATION: 0}})
  166. # get next sunrise/sunset
  167. astral = Astral()
  168. utc_now = dt_util.utcnow()
  169. mod = -1
  170. while True:
  171. next_setting = (astral.sunset_utc(utc_now +
  172. timedelta(days=mod), latitude, longitude))
  173. if next_setting > utc_now:
  174. break
  175. mod += 1
  176. # track sunset
  177. runs = []
  178. track_sunset(self.hass, lambda: runs.append(1))
  179. offset_runs = []
  180. offset = timedelta(minutes=30)
  181. track_sunset(self.hass, lambda: offset_runs.append(1), offset)
  182. # run tests
  183. self._send_time_changed(next_setting - offset)
  184. self.hass.pool.block_till_done()
  185. self.assertEqual(0, len(runs))
  186. self.assertEqual(0, len(offset_runs))
  187. self._send_time_changed(next_setting)
  188. self.hass.pool.block_till_done()
  189. self.assertEqual(1, len(runs))
  190. self.assertEqual(0, len(offset_runs))
  191. self._send_time_changed(next_setting + offset)
  192. self.hass.pool.block_till_done()
  193. self.assertEqual(2, len(runs))
  194. self.assertEqual(1, len(offset_runs))
  195. def _send_time_changed(self, now):
  196. """ Send a time changed event. """
  197. self.hass.bus.fire(ha.EVENT_TIME_CHANGED, {ha.ATTR_NOW: now})
  198. def test_periodic_task_minute(self):
  199. specific_runs = []
  200. track_utc_time_change(
  201. self.hass, lambda x: specific_runs.append(1), minute='/5')
  202. self._send_time_changed(datetime(2014, 5, 24, 12, 0, 0))
  203. self.hass.pool.block_till_done()
  204. self.assertEqual(1, len(specific_runs))
  205. self._send_time_changed(datetime(2014, 5, 24, 12, 3, 0))
  206. self.hass.pool.block_till_done()
  207. self.assertEqual(1, len(specific_runs))
  208. self._send_time_changed(datetime(2014, 5, 24, 12, 5, 0))
  209. self.hass.pool.block_till_done()
  210. self.assertEqual(2, len(specific_runs))
  211. def test_periodic_task_hour(self):
  212. specific_runs = []
  213. track_utc_time_change(
  214. self.hass, lambda x: specific_runs.append(1), hour='/2')
  215. self._send_time_changed(datetime(2014, 5, 24, 22, 0, 0))
  216. self.hass.pool.block_till_done()
  217. self.assertEqual(1, len(specific_runs))
  218. self._send_time_changed(datetime(2014, 5, 24, 23, 0, 0))
  219. self.hass.pool.block_till_done()
  220. self.assertEqual(1, len(specific_runs))
  221. self._send_time_changed(datetime(2014, 5, 24, 0, 0, 0))
  222. self.hass.pool.block_till_done()
  223. self.assertEqual(2, len(specific_runs))
  224. self._send_time_changed(datetime(2014, 5, 25, 1, 0, 0))
  225. self.hass.pool.block_till_done()
  226. self.assertEqual(2, len(specific_runs))
  227. self._send_time_changed(datetime(2014, 5, 25, 2, 0, 0))
  228. self.hass.pool.block_till_done()
  229. self.assertEqual(3, len(specific_runs))
  230. def test_periodic_task_day(self):
  231. specific_runs = []
  232. track_utc_time_change(
  233. self.hass, lambda x: specific_runs.append(1), day='/2')
  234. self._send_time_changed(datetime(2014, 5, 2, 0, 0, 0))
  235. self.hass.pool.block_till_done()
  236. self.assertEqual(1, len(specific_runs))
  237. self._send_time_changed(datetime(2014, 5, 3, 12, 0, 0))
  238. self.hass.pool.block_till_done()
  239. self.assertEqual(1, len(specific_runs))
  240. self._send_time_changed(datetime(2014, 5, 4, 0, 0, 0))
  241. self.hass.pool.block_till_done()
  242. self.assertEqual(2, len(specific_runs))
  243. def test_periodic_task_year(self):
  244. specific_runs = []
  245. track_utc_time_change(
  246. self.hass, lambda x: specific_runs.append(1), year='/2')
  247. self._send_time_changed(datetime(2014, 5, 2, 0, 0, 0))
  248. self.hass.pool.block_till_done()
  249. self.assertEqual(1, len(specific_runs))
  250. self._send_time_changed(datetime(2015, 5, 2, 0, 0, 0))
  251. self.hass.pool.block_till_done()
  252. self.assertEqual(1, len(specific_runs))
  253. self._send_time_changed(datetime(2016, 5, 2, 0, 0, 0))
  254. self.hass.pool.block_till_done()
  255. self.assertEqual(2, len(specific_runs))
  256. def test_periodic_task_wrong_input(self):
  257. specific_runs = []
  258. track_utc_time_change(
  259. self.hass, lambda x: specific_runs.append(1), year='/two')
  260. self._send_time_changed(datetime(2014, 5, 2, 0, 0, 0))
  261. self.hass.pool.block_till_done()
  262. self.assertEqual(0, len(specific_runs))