2018-02-25 10:58:13 +01:00
|
|
|
"""Tests for the HomeKit component."""
|
2018-02-19 23:46:22 +01:00
|
|
|
|
|
|
|
import unittest
|
2018-03-02 00:20:02 +01:00
|
|
|
from unittest.mock import call, patch, ANY
|
2018-02-19 23:46:22 +01:00
|
|
|
|
|
|
|
import voluptuous as vol
|
|
|
|
|
2018-03-02 00:20:02 +01:00
|
|
|
# pylint: disable=unused-import
|
|
|
|
from pyhap.accessory_driver import AccessoryDriver # noqa F401
|
|
|
|
|
2018-02-19 23:46:22 +01:00
|
|
|
from homeassistant import setup
|
|
|
|
from homeassistant.core import Event
|
|
|
|
from homeassistant.components.homekit import (
|
2018-03-02 00:20:02 +01:00
|
|
|
CONF_PIN_CODE, HOMEKIT_FILE, HomeKit, valid_pin)
|
2018-02-19 23:46:22 +01:00
|
|
|
from homeassistant.const import (
|
|
|
|
CONF_PORT, EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP)
|
|
|
|
|
|
|
|
from tests.common import get_test_home_assistant
|
2018-03-02 00:20:02 +01:00
|
|
|
from tests.mock.homekit import get_patch_paths, PATH_HOMEKIT
|
2018-02-19 23:46:22 +01:00
|
|
|
|
2018-03-02 00:20:02 +01:00
|
|
|
PATH_ACC, _ = get_patch_paths()
|
|
|
|
IP_ADDRESS = '127.0.0.1'
|
2018-02-19 23:46:22 +01:00
|
|
|
|
|
|
|
CONFIG_MIN = {'homekit': {}}
|
|
|
|
CONFIG = {
|
|
|
|
'homekit': {
|
|
|
|
CONF_PORT: 11111,
|
|
|
|
CONF_PIN_CODE: '987-65-432',
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-02-25 10:58:13 +01:00
|
|
|
class TestHomeKit(unittest.TestCase):
|
|
|
|
"""Test setup of HomeKit component and HomeKit class."""
|
2018-02-19 23:46:22 +01:00
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
"""Setup things to be run when tests are started."""
|
|
|
|
self.hass = get_test_home_assistant()
|
|
|
|
|
|
|
|
def tearDown(self):
|
2018-02-25 10:58:13 +01:00
|
|
|
"""Stop down everything that was started."""
|
2018-02-19 23:46:22 +01:00
|
|
|
self.hass.stop()
|
|
|
|
|
2018-03-02 00:20:02 +01:00
|
|
|
def test_validate_pincode(self):
|
|
|
|
"""Test async_setup with invalid config option."""
|
|
|
|
schema = vol.Schema(valid_pin)
|
|
|
|
|
|
|
|
for value in ('', '123-456-78', 'a23-45-678', '12345678', 1234):
|
|
|
|
with self.assertRaises(vol.MultipleInvalid):
|
|
|
|
schema(value)
|
|
|
|
|
|
|
|
for value in ('123-45-678', '234-56-789'):
|
|
|
|
self.assertTrue(schema(value))
|
2018-02-19 23:46:22 +01:00
|
|
|
|
2018-03-02 00:20:02 +01:00
|
|
|
@patch(PATH_HOMEKIT + '.HomeKit')
|
|
|
|
def test_setup_min(self, mock_homekit):
|
|
|
|
"""Test async_setup with minimal config option."""
|
2018-02-19 23:46:22 +01:00
|
|
|
self.assertTrue(setup.setup_component(
|
|
|
|
self.hass, 'homekit', CONFIG_MIN))
|
|
|
|
|
2018-03-02 00:20:02 +01:00
|
|
|
self.assertEqual(mock_homekit.mock_calls,
|
|
|
|
[call(self.hass, 51826),
|
|
|
|
call().setup_bridge(b'123-45-678')])
|
|
|
|
mock_homekit.reset_mock()
|
2018-02-19 23:46:22 +01:00
|
|
|
|
2018-03-02 00:20:02 +01:00
|
|
|
self.hass.bus.fire(EVENT_HOMEASSISTANT_START)
|
2018-02-19 23:46:22 +01:00
|
|
|
self.hass.block_till_done()
|
|
|
|
|
2018-03-02 00:20:02 +01:00
|
|
|
self.assertEqual(mock_homekit.mock_calls,
|
|
|
|
[call().start_driver(ANY)])
|
2018-02-19 23:46:22 +01:00
|
|
|
|
2018-03-02 00:20:02 +01:00
|
|
|
@patch(PATH_HOMEKIT + '.HomeKit')
|
|
|
|
def test_setup_parameters(self, mock_homekit):
|
|
|
|
"""Test async_setup with full config option."""
|
2018-02-19 23:46:22 +01:00
|
|
|
self.assertTrue(setup.setup_component(
|
|
|
|
self.hass, 'homekit', CONFIG))
|
|
|
|
|
2018-03-02 00:20:02 +01:00
|
|
|
self.assertEqual(mock_homekit.mock_calls,
|
|
|
|
[call(self.hass, 11111),
|
|
|
|
call().setup_bridge(b'987-65-432')])
|
2018-02-19 23:46:22 +01:00
|
|
|
|
2018-02-25 10:58:13 +01:00
|
|
|
@patch('pyhap.accessory_driver.AccessoryDriver')
|
2018-03-02 00:20:02 +01:00
|
|
|
def test_homekit_class(self, mock_acc_driver):
|
2018-02-25 10:58:13 +01:00
|
|
|
"""Test interaction between the HomeKit class and pyhap."""
|
2018-03-02 00:20:02 +01:00
|
|
|
with patch(PATH_HOMEKIT + '.accessories.HomeBridge') as mock_bridge:
|
|
|
|
homekit = HomeKit(self.hass, 51826)
|
|
|
|
homekit.setup_bridge(b'123-45-678')
|
2018-02-19 23:46:22 +01:00
|
|
|
|
2018-03-02 00:20:02 +01:00
|
|
|
mock_bridge.reset_mock()
|
2018-02-19 23:46:22 +01:00
|
|
|
self.hass.states.set('demo.demo1', 'on')
|
|
|
|
self.hass.states.set('demo.demo2', 'off')
|
|
|
|
|
2018-03-02 00:20:02 +01:00
|
|
|
with patch(PATH_HOMEKIT + '.get_accessory') as mock_get_acc, \
|
|
|
|
patch(PATH_HOMEKIT + '.import_types') as mock_import_types, \
|
|
|
|
patch('homeassistant.util.get_local_ip') as mock_ip:
|
|
|
|
mock_get_acc.side_effect = ['TempSensor', 'Window']
|
|
|
|
mock_ip.return_value = IP_ADDRESS
|
2018-02-25 10:58:13 +01:00
|
|
|
homekit.start_driver(Event(EVENT_HOMEASSISTANT_START))
|
|
|
|
|
|
|
|
path = self.hass.config.path(HOMEKIT_FILE)
|
2018-02-19 23:46:22 +01:00
|
|
|
|
2018-02-20 01:40:56 +01:00
|
|
|
self.assertEqual(mock_import_types.call_count, 1)
|
2018-03-02 00:20:02 +01:00
|
|
|
self.assertEqual(mock_get_acc.call_count, 2)
|
|
|
|
self.assertEqual(mock_bridge.mock_calls,
|
|
|
|
[call().add_accessory('TempSensor'),
|
|
|
|
call().add_accessory('Window')])
|
2018-02-25 10:58:13 +01:00
|
|
|
self.assertEqual(mock_acc_driver.mock_calls,
|
2018-03-02 00:20:02 +01:00
|
|
|
[call(homekit.bridge, 51826, IP_ADDRESS, path),
|
2018-02-25 10:58:13 +01:00
|
|
|
call().start()])
|
2018-03-02 00:20:02 +01:00
|
|
|
mock_acc_driver.reset_mock()
|
2018-02-19 23:46:22 +01:00
|
|
|
|
|
|
|
self.hass.bus.fire(EVENT_HOMEASSISTANT_STOP)
|
|
|
|
self.hass.block_till_done()
|
|
|
|
|
2018-03-02 00:20:02 +01:00
|
|
|
self.assertEqual(mock_acc_driver.mock_calls, [call().stop()])
|