core/tests/components/homekit/test_homekit.py

125 lines
4.3 KiB
Python

"""Tests for the homekit component."""
import unittest
from unittest.mock import patch
import voluptuous as vol
from homeassistant import setup
from homeassistant.core import Event
from homeassistant.components.homekit import (
CONF_PIN_CODE, BRIDGE_NAME, Homekit, valid_pin)
from homeassistant.components.homekit.covers import Window
from homeassistant.components.homekit.sensors import TemperatureSensor
from homeassistant.const import (
CONF_PORT, EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP)
from tests.common import get_test_home_assistant
HOMEKIT_PATH = 'homeassistant.components.homekit'
CONFIG_MIN = {'homekit': {}}
CONFIG = {
'homekit': {
CONF_PORT: 11111,
CONF_PIN_CODE: '987-65-432',
}
}
class TestHomekit(unittest.TestCase):
"""Test the Multicover component."""
def setUp(self):
"""Setup things to be run when tests are started."""
self.hass = get_test_home_assistant()
def tearDown(self):
"""Stop down everthing that was started."""
self.hass.stop()
@patch(HOMEKIT_PATH + '.Homekit.start_driver')
@patch(HOMEKIT_PATH + '.Homekit.setup_bridge')
@patch(HOMEKIT_PATH + '.Homekit.__init__')
def test_setup_min(self, mock_homekit, mock_setup_bridge,
mock_start_driver):
"""Test async_setup with minimal config option."""
mock_homekit.return_value = None
self.assertTrue(setup.setup_component(
self.hass, 'homekit', CONFIG_MIN))
mock_homekit.assert_called_once_with(self.hass, 51826)
mock_setup_bridge.assert_called_with(b'123-45-678')
mock_start_driver.assert_not_called()
self.hass.start()
self.hass.block_till_done()
self.assertEqual(mock_start_driver.call_count, 1)
@patch(HOMEKIT_PATH + '.Homekit.start_driver')
@patch(HOMEKIT_PATH + '.Homekit.setup_bridge')
@patch(HOMEKIT_PATH + '.Homekit.__init__')
def test_setup_parameters(self, mock_homekit, mock_setup_bridge,
mock_start_driver):
"""Test async_setup with full config option."""
mock_homekit.return_value = None
self.assertTrue(setup.setup_component(
self.hass, 'homekit', CONFIG))
mock_homekit.assert_called_once_with(self.hass, 11111)
mock_setup_bridge.assert_called_with(b'987-65-432')
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'):
with self.assertRaises(vol.MultipleInvalid):
schema(value)
for value in ('123-45-678', '234-56-789'):
self.assertTrue(schema(value))
@patch('pyhap.accessory_driver.AccessoryDriver.persist')
@patch('pyhap.accessory_driver.AccessoryDriver.stop')
@patch('pyhap.accessory_driver.AccessoryDriver.start')
@patch(HOMEKIT_PATH + '.import_types')
@patch(HOMEKIT_PATH + '.get_accessory')
def test_homekit_pyhap_interaction(
self, mock_get_accessory, mock_import_types,
mock_driver_start, mock_driver_stop, mock_file_persist):
"""Test the interaction between the homekit class and pyhap."""
acc1 = TemperatureSensor(self.hass, 'sensor.temp', 'Temperature')
acc2 = Window(self.hass, 'cover.hall_window', 'Cover')
mock_get_accessory.side_effect = [acc1, acc2]
homekit = Homekit(self.hass, 51826)
homekit.setup_bridge(b'123-45-678')
self.assertEqual(homekit.bridge.display_name, BRIDGE_NAME)
self.hass.states.set('demo.demo1', 'on')
self.hass.states.set('demo.demo2', 'off')
self.hass.start()
self.hass.block_till_done()
homekit.start_driver(Event(EVENT_HOMEASSISTANT_START))
self.assertEqual(mock_get_accessory.call_count, 2)
self.assertEqual(mock_import_types.call_count, 1)
self.assertEqual(mock_driver_start.call_count, 1)
accessories = homekit.bridge.accessories
self.assertEqual(accessories[2], acc1)
self.assertEqual(accessories[3], acc2)
mock_driver_stop.assert_not_called()
self.hass.bus.fire(EVENT_HOMEASSISTANT_STOP)
self.hass.block_till_done()
self.assertEqual(mock_driver_stop.call_count, 1)