PageRenderTime 60ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/components/device_tracker/test_init.py

https://gitlab.com/mkerfoot/home-assistant
Python | 245 lines | 219 code | 15 blank | 11 comment | 2 complexity | 364fd70caf8a9fd0d4c3f53f9de31e83 MD5 | raw file
  1. """
  2. tests.components.device_tracker.test_init
  3. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  4. Tests the device tracker compoments.
  5. """
  6. # pylint: disable=protected-access,too-many-public-methods
  7. import unittest
  8. from unittest.mock import patch
  9. from datetime import datetime, timedelta
  10. import os
  11. from homeassistant.config import load_yaml_config_file
  12. from homeassistant.loader import get_component
  13. import homeassistant.util.dt as dt_util
  14. from homeassistant.const import (
  15. ATTR_ENTITY_ID, ATTR_ENTITY_PICTURE, ATTR_FRIENDLY_NAME, ATTR_HIDDEN,
  16. STATE_HOME, STATE_NOT_HOME, CONF_PLATFORM, DEVICE_DEFAULT_NAME)
  17. import homeassistant.components.device_tracker as device_tracker
  18. from tests.common import (
  19. get_test_home_assistant, fire_time_changed, fire_service_discovered)
  20. class TestComponentsDeviceTracker(unittest.TestCase):
  21. """ Tests homeassistant.components.device_tracker module. """
  22. def setUp(self): # pylint: disable=invalid-name
  23. """ Init needed objects. """
  24. self.hass = get_test_home_assistant()
  25. self.yaml_devices = self.hass.config.path(device_tracker.YAML_DEVICES)
  26. def tearDown(self): # pylint: disable=invalid-name
  27. """ Stop down stuff we started. """
  28. try:
  29. os.remove(self.yaml_devices)
  30. except FileNotFoundError:
  31. pass
  32. self.hass.stop()
  33. def test_is_on(self):
  34. """ Test is_on method. """
  35. entity_id = device_tracker.ENTITY_ID_FORMAT.format('test')
  36. self.hass.states.set(entity_id, STATE_HOME)
  37. self.assertTrue(device_tracker.is_on(self.hass, entity_id))
  38. self.hass.states.set(entity_id, STATE_NOT_HOME)
  39. self.assertFalse(device_tracker.is_on(self.hass, entity_id))
  40. def test_migrating_config(self):
  41. csv_devices = self.hass.config.path(device_tracker.CSV_DEVICES)
  42. self.assertFalse(os.path.isfile(csv_devices))
  43. self.assertFalse(os.path.isfile(self.yaml_devices))
  44. person1 = {
  45. 'mac': 'AB:CD:EF:GH:IJ:KL',
  46. 'name': 'Paulus',
  47. 'track': True,
  48. 'picture': 'http://placehold.it/200x200',
  49. }
  50. person2 = {
  51. 'mac': 'MN:OP:QR:ST:UV:WX:YZ',
  52. 'name': '',
  53. 'track': False,
  54. 'picture': None,
  55. }
  56. try:
  57. with open(csv_devices, 'w') as fil:
  58. fil.write('device,name,track,picture\n')
  59. for pers in (person1, person2):
  60. fil.write('{},{},{},{}\n'.format(
  61. pers['mac'], pers['name'],
  62. '1' if pers['track'] else '0', pers['picture'] or ''))
  63. self.assertTrue(device_tracker.setup(self.hass, {}))
  64. self.assertFalse(os.path.isfile(csv_devices))
  65. self.assertTrue(os.path.isfile(self.yaml_devices))
  66. yaml_config = load_yaml_config_file(self.yaml_devices)
  67. self.assertEqual(2, len(yaml_config))
  68. for pers, yaml_pers in zip(
  69. (person1, person2), sorted(yaml_config.values(),
  70. key=lambda pers: pers['mac'])):
  71. for key, value in pers.items():
  72. if key == 'name' and value == '':
  73. value = DEVICE_DEFAULT_NAME
  74. self.assertEqual(value, yaml_pers.get(key))
  75. finally:
  76. try:
  77. os.remove(csv_devices)
  78. except FileNotFoundError:
  79. pass
  80. def test_reading_yaml_config(self):
  81. dev_id = 'test'
  82. device = device_tracker.Device(
  83. self.hass, timedelta(seconds=180), 0, True, dev_id,
  84. 'AB:CD:EF:GH:IJ', 'Test name', 'http://test.picture', True)
  85. device_tracker.update_config(self.yaml_devices, dev_id, device)
  86. self.assertTrue(device_tracker.setup(self.hass, {}))
  87. config = device_tracker.load_config(self.yaml_devices, self.hass,
  88. device.consider_home, 0)[0]
  89. self.assertEqual(device.dev_id, config.dev_id)
  90. self.assertEqual(device.track, config.track)
  91. self.assertEqual(device.mac, config.mac)
  92. self.assertEqual(device.config_picture, config.config_picture)
  93. self.assertEqual(device.away_hide, config.away_hide)
  94. self.assertEqual(device.consider_home, config.consider_home)
  95. def test_setup_without_yaml_file(self):
  96. self.assertTrue(device_tracker.setup(self.hass, {}))
  97. def test_adding_unknown_device_to_config(self):
  98. scanner = get_component('device_tracker.test').SCANNER
  99. scanner.reset()
  100. scanner.come_home('DEV1')
  101. self.assertTrue(device_tracker.setup(self.hass, {
  102. device_tracker.DOMAIN: {CONF_PLATFORM: 'test'}}))
  103. config = device_tracker.load_config(self.yaml_devices, self.hass,
  104. timedelta(seconds=0), 0)
  105. assert len(config) == 1
  106. assert config[0].dev_id == 'dev1'
  107. assert config[0].track
  108. def test_discovery(self):
  109. scanner = get_component('device_tracker.test').SCANNER
  110. with patch.dict(device_tracker.DISCOVERY_PLATFORMS, {'test': 'test'}):
  111. with patch.object(scanner, 'scan_devices') as mock_scan:
  112. self.assertTrue(device_tracker.setup(self.hass, {
  113. device_tracker.DOMAIN: {CONF_PLATFORM: 'test'}}))
  114. fire_service_discovered(self.hass, 'test', {})
  115. self.assertTrue(mock_scan.called)
  116. def test_update_stale(self):
  117. scanner = get_component('device_tracker.test').SCANNER
  118. scanner.reset()
  119. scanner.come_home('DEV1')
  120. register_time = datetime(2015, 9, 15, 23, tzinfo=dt_util.UTC)
  121. scan_time = datetime(2015, 9, 15, 23, 1, tzinfo=dt_util.UTC)
  122. with patch('homeassistant.components.device_tracker.dt_util.utcnow',
  123. return_value=register_time):
  124. self.assertTrue(device_tracker.setup(self.hass, {
  125. 'device_tracker': {
  126. 'platform': 'test',
  127. 'consider_home': 59,
  128. }}))
  129. self.assertEqual(STATE_HOME,
  130. self.hass.states.get('device_tracker.dev1').state)
  131. scanner.leave_home('DEV1')
  132. with patch('homeassistant.components.device_tracker.dt_util.utcnow',
  133. return_value=scan_time):
  134. fire_time_changed(self.hass, scan_time)
  135. self.hass.pool.block_till_done()
  136. self.assertEqual(STATE_NOT_HOME,
  137. self.hass.states.get('device_tracker.dev1').state)
  138. def test_entity_attributes(self):
  139. dev_id = 'test_entity'
  140. entity_id = device_tracker.ENTITY_ID_FORMAT.format(dev_id)
  141. friendly_name = 'Paulus'
  142. picture = 'http://placehold.it/200x200'
  143. device = device_tracker.Device(
  144. self.hass, timedelta(seconds=180), 0, True, dev_id, None,
  145. friendly_name, picture, away_hide=True)
  146. device_tracker.update_config(self.yaml_devices, dev_id, device)
  147. self.assertTrue(device_tracker.setup(self.hass, {}))
  148. attrs = self.hass.states.get(entity_id).attributes
  149. self.assertEqual(friendly_name, attrs.get(ATTR_FRIENDLY_NAME))
  150. self.assertEqual(picture, attrs.get(ATTR_ENTITY_PICTURE))
  151. def test_device_hidden(self):
  152. dev_id = 'test_entity'
  153. entity_id = device_tracker.ENTITY_ID_FORMAT.format(dev_id)
  154. device = device_tracker.Device(
  155. self.hass, timedelta(seconds=180), 0, True, dev_id, None,
  156. away_hide=True)
  157. device_tracker.update_config(self.yaml_devices, dev_id, device)
  158. scanner = get_component('device_tracker.test').SCANNER
  159. scanner.reset()
  160. self.assertTrue(device_tracker.setup(self.hass, {
  161. device_tracker.DOMAIN: {CONF_PLATFORM: 'test'}}))
  162. self.assertTrue(self.hass.states.get(entity_id)
  163. .attributes.get(ATTR_HIDDEN))
  164. def test_group_all_devices(self):
  165. dev_id = 'test_entity'
  166. entity_id = device_tracker.ENTITY_ID_FORMAT.format(dev_id)
  167. device = device_tracker.Device(
  168. self.hass, timedelta(seconds=180), 0, True, dev_id, None,
  169. away_hide=True)
  170. device_tracker.update_config(self.yaml_devices, dev_id, device)
  171. scanner = get_component('device_tracker.test').SCANNER
  172. scanner.reset()
  173. self.assertTrue(device_tracker.setup(self.hass, {
  174. device_tracker.DOMAIN: {CONF_PLATFORM: 'test'}}))
  175. state = self.hass.states.get(device_tracker.ENTITY_ID_ALL_DEVICES)
  176. self.assertIsNotNone(state)
  177. self.assertEqual(STATE_NOT_HOME, state.state)
  178. self.assertSequenceEqual((entity_id,),
  179. state.attributes.get(ATTR_ENTITY_ID))
  180. @patch('homeassistant.components.device_tracker.DeviceTracker.see')
  181. def test_see_service(self, mock_see):
  182. self.assertTrue(device_tracker.setup(self.hass, {}))
  183. mac = 'AB:CD:EF:GH'
  184. dev_id = 'some_device'
  185. host_name = 'example.com'
  186. location_name = 'Work'
  187. gps = [.3, .8]
  188. device_tracker.see(self.hass, mac, dev_id, host_name, location_name,
  189. gps)
  190. self.hass.pool.block_till_done()
  191. mock_see.assert_called_once_with(
  192. mac=mac, dev_id=dev_id, host_name=host_name,
  193. location_name=location_name, gps=gps)