def test_homekit_class(self, mock_acc_driver): """Test interaction between the HomeKit class and pyhap.""" with patch(PATH_HOMEKIT + '.accessories.HomeBridge') as mock_bridge: homekit = HomeKit(self.hass, 51826) homekit.setup_bridge(b'123-45-678') mock_bridge.reset_mock() self.hass.states.set('demo.demo1', 'on') self.hass.states.set('demo.demo2', 'off') 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 homekit.start_driver(Event(EVENT_HOMEASSISTANT_START)) path = self.hass.config.path(HOMEKIT_FILE) self.assertEqual(mock_import_types.call_count, 1) self.assertEqual(mock_get_acc.call_count, 2) self.assertEqual(mock_bridge.mock_calls, [call().add_accessory('TempSensor'), call().add_accessory('Window')]) self.assertEqual(mock_acc_driver.mock_calls, [call(homekit.bridge, 51826, IP_ADDRESS, path), call().start()]) mock_acc_driver.reset_mock() self.hass.bus.fire(EVENT_HOMEASSISTANT_STOP) self.hass.block_till_done() self.assertEqual(mock_acc_driver.mock_calls, [call().stop()])
async def test_homekit_reset_accessories(hass): """Test adding too many accessories to HomeKit.""" entity_id = "light.demo" homekit = HomeKit(hass, None, None, None, {}, {entity_id: {}}, None) homekit.bridge = Mock() with patch(PATH_HOMEKIT + ".HomeKit", return_value=homekit), patch( PATH_HOMEKIT + ".HomeKit.setup"), patch( "pyhap.accessory.Bridge.add_accessory" ) as mock_add_accessory, patch( "pyhap.accessory_driver.AccessoryDriver.config_changed" ) as hk_driver_config_changed: assert await setup.async_setup_component(hass, DOMAIN, {DOMAIN: {}}) aid = generate_aid(entity_id) homekit.bridge.accessories = {aid: "acc"} homekit.status = STATUS_RUNNING await hass.services.async_call( DOMAIN, SERVICE_HOMEKIT_RESET_ACCESSORY, {ATTR_ENTITY_ID: entity_id}, blocking=True, ) await hass.async_block_till_done() assert 2 == hk_driver_config_changed.call_count assert mock_add_accessory.called homekit.status = STATUS_READY
async def test_homekit_start(hass, hk_driver, debounce_patcher): """Test HomeKit start method.""" pin = b'123-45-678' homekit = HomeKit(hass, None, None, {}, {'cover.demo': {}}) homekit.bridge = 'bridge' homekit.driver = hk_driver hass.states.async_set('light.demo', 'on') state = hass.states.async_all()[0] with patch(PATH_HOMEKIT + '.HomeKit.add_bridge_accessory') as \ mock_add_acc, \ patch(PATH_HOMEKIT + '.show_setup_message') as mock_setup_msg, \ patch('pyhap.accessory_driver.AccessoryDriver.add_accessory') as \ hk_driver_add_acc, \ patch('pyhap.accessory_driver.AccessoryDriver.start') as \ hk_driver_start: await hass.async_add_job(homekit.start) mock_add_acc.assert_called_with(state) mock_setup_msg.assert_called_with(hass, pin) hk_driver_add_acc.assert_called_with('bridge') assert hk_driver_start.called assert homekit.status == STATUS_RUNNING # Test start() if already started hk_driver_start.reset_mock() await hass.async_add_job(homekit.start) assert not hk_driver_start.called
async def test_homekit_start_with_a_broken_accessory(hass, hk_driver, debounce_patcher): """Test HomeKit start method.""" pin = b"123-45-678" entity_filter = generate_filter(["cover", "light"], ["demo.test"], [], []) assert await setup.async_setup_component(hass, DOMAIN, {DOMAIN: {}}) homekit = HomeKit(hass, None, None, None, entity_filter, {}, None, None) homekit.bridge = Mock() homekit.bridge.accessories = [] homekit.driver = hk_driver hass.states.async_set("light.demo", "on") hass.states.async_set("light.broken", "on") with patch( f"{PATH_HOMEKIT}.get_accessory", side_effect=Exception ), patch(f"{PATH_HOMEKIT}.show_setup_message") as mock_setup_msg, patch( "pyhap.accessory_driver.AccessoryDriver.add_accessory", ) as hk_driver_add_acc, patch( "pyhap.accessory_driver.AccessoryDriver.start") as hk_driver_start: await homekit.async_start() mock_setup_msg.assert_called_with(hass, pin, ANY) hk_driver_add_acc.assert_called_with(homekit.bridge) assert hk_driver_start.called assert homekit.status == STATUS_RUNNING # Test start() if already started hk_driver_start.reset_mock() await homekit.async_start() assert not hk_driver_start.called
def test_homekit_setup_ip_address(self): """Test setup with given IP address.""" homekit = HomeKit(self.hass, DEFAULT_PORT, '172.0.0.0', {}, {}) with patch(PATH_HOMEKIT + '.accessories.HomeDriver') as mock_driver: homekit.setup() mock_driver.assert_called_with(ANY, DEFAULT_PORT, '172.0.0.0', ANY)
async def test_homekit_start(hass, hk_driver, debounce_patcher): """Test HomeKit start method.""" pin = b'123-45-678' homekit = HomeKit(hass, None, None, None, {}, {'cover.demo': {}}, None) homekit.bridge = Mock() homekit.bridge.accessories = [] homekit.driver = hk_driver hass.states.async_set('light.demo', 'on') state = hass.states.async_all()[0] with patch(PATH_HOMEKIT + '.HomeKit.add_bridge_accessory') as \ mock_add_acc, \ patch(PATH_HOMEKIT + '.show_setup_message') as mock_setup_msg, \ patch('pyhap.accessory_driver.AccessoryDriver.add_accessory') as \ hk_driver_add_acc, \ patch('pyhap.accessory_driver.AccessoryDriver.start') as \ hk_driver_start: await hass.async_add_job(homekit.start) mock_add_acc.assert_called_with(state) mock_setup_msg.assert_called_with(hass, pin) hk_driver_add_acc.assert_called_with(homekit.bridge) assert hk_driver_start.called assert homekit.status == STATUS_RUNNING # Test start() if already started hk_driver_start.reset_mock() await hass.async_add_job(homekit.start) assert not hk_driver_start.called
async def test_homekit_start(hass, hk_driver, debounce_patcher): """Test HomeKit start method.""" pin = b"123-45-678" homekit = HomeKit(hass, None, None, None, {}, {"cover.demo": {}}, None, None) homekit.bridge = Mock() homekit.bridge.accessories = [] homekit.driver = hk_driver homekit._filter = Mock(return_value=True) hass.states.async_set("light.demo", "on") state = hass.states.async_all()[0] with patch( f"{PATH_HOMEKIT}.HomeKit.add_bridge_accessory" ) as mock_add_acc, patch( f"{PATH_HOMEKIT}.show_setup_message") as mock_setup_msg, patch( "pyhap.accessory_driver.AccessoryDriver.add_accessory" ) as hk_driver_add_acc, patch( "pyhap.accessory_driver.AccessoryDriver.start" ) as hk_driver_start: await homekit.async_start() mock_add_acc.assert_called_with(state) mock_setup_msg.assert_called_with(hass, pin, ANY) hk_driver_add_acc.assert_called_with(homekit.bridge) assert hk_driver_start.called assert homekit.status == STATUS_RUNNING # Test start() if already started hk_driver_start.reset_mock() await homekit.async_start() assert not hk_driver_start.called
async def test_homekit_too_many_accessories(hass, hk_driver): """Test adding too many accessories to HomeKit.""" entry = await async_init_integration(hass) entity_filter = generate_filter(["cover", "light"], ["demo.test"], [], []) homekit = HomeKit( hass, None, None, None, entity_filter, {}, DEFAULT_SAFE_MODE, advertise_ip=None, entry_id=entry.entry_id, ) homekit.bridge = Mock() # The bridge itself counts as an accessory homekit.bridge.accessories = range(MAX_DEVICES) homekit.driver = hk_driver hass.states.async_set("light.demo", "on") with patch("pyhap.accessory_driver.AccessoryDriver.start"), patch( "pyhap.accessory_driver.AccessoryDriver.add_accessory" ), patch("homeassistant.components.homekit._LOGGER.warning") as mock_warn, patch( f"{PATH_HOMEKIT}.show_setup_message" ): await homekit.async_start() await hass.async_block_till_done() assert mock_warn.called is True
async def test_homekit_add_accessory(hass): """Add accessory if config exists and get_acc returns an accessory.""" entry = await async_init_integration(hass) homekit = HomeKit( hass, None, None, None, lambda entity_id: True, {}, DEFAULT_SAFE_MODE, advertise_ip=None, entry_id=entry.entry_id, ) homekit.driver = "driver" homekit.bridge = mock_bridge = Mock() homekit.bridge.accessories = range(10) await async_init_integration(hass) with patch(f"{PATH_HOMEKIT}.get_accessory") as mock_get_acc: mock_get_acc.side_effect = [None, "acc", None] homekit.add_bridge_accessory(State("light.demo", "on")) mock_get_acc.assert_called_with(hass, "driver", ANY, 1403373688, {}) assert not mock_bridge.add_accessory.called homekit.add_bridge_accessory(State("demo.test", "on")) mock_get_acc.assert_called_with(hass, "driver", ANY, 600325356, {}) assert mock_bridge.add_accessory.called homekit.add_bridge_accessory(State("demo.test_2", "on")) mock_get_acc.assert_called_with(hass, "driver", ANY, 1467253281, {}) mock_bridge.add_accessory.assert_called_with("acc")
async def test_homekit_entity_filter(hass): """Test the entity filter.""" entry = await async_init_integration(hass) entity_filter = generate_filter(["cover"], ["demo.test"], [], []) homekit = HomeKit( hass, None, None, None, entity_filter, {}, DEFAULT_SAFE_MODE, advertise_ip=None, entry_id=entry.entry_id, ) homekit.bridge = Mock() homekit.bridge.accessories = {} with patch(f"{PATH_HOMEKIT}.get_accessory") as mock_get_acc: mock_get_acc.return_value = None homekit.add_bridge_accessory(State("cover.test", "open")) assert mock_get_acc.called is True mock_get_acc.reset_mock() homekit.add_bridge_accessory(State("demo.test", "on")) assert mock_get_acc.called is True mock_get_acc.reset_mock() homekit.add_bridge_accessory(State("light.demo", "light")) assert mock_get_acc.called is False
async def test_homekit_remove_accessory(): """Remove accessory from bridge.""" homekit = HomeKit("hass", None, None, None, lambda entity_id: True, {}, None) homekit.driver = "driver" homekit.bridge = mock_bridge = Mock() mock_bridge.accessories = {"light.demo": "acc"} acc = homekit.remove_bridge_accessory("light.demo") assert acc == "acc" assert len(mock_bridge.accessories) == 0
async def test_homekit_too_many_accessories(hass, hk_driver): """Test adding too many accessories to HomeKit.""" homekit = HomeKit(hass, None, None, None, None, None, None) homekit.bridge = Mock() homekit.bridge.accessories = range(MAX_DEVICES + 1) homekit.driver = hk_driver with patch("pyhap.accessory_driver.AccessoryDriver.start"), patch( "pyhap.accessory_driver.AccessoryDriver.add_accessory" ), patch("homeassistant.components.homekit._LOGGER.warning") as mock_warn: await hass.async_add_job(homekit.start) assert mock_warn.called is True
async def test_homekit_start_with_a_broken_accessory(hass, hk_driver, debounce_patcher): """Test HomeKit start method.""" pin = b"123-45-678" entry = MockConfigEntry(domain=DOMAIN, data={ CONF_NAME: "mock_name", CONF_PORT: 12345 }) entity_filter = generate_filter(["cover", "light"], ["demo.test"], [], []) await async_init_entry(hass, entry) homekit = HomeKit( hass, None, None, None, entity_filter, {}, DEFAULT_SAFE_MODE, HOMEKIT_MODE_BRIDGE, advertise_ip=None, entry_id=entry.entry_id, ) homekit.bridge = Mock() homekit.bridge.accessories = [] homekit.driver = hk_driver homekit.driver.accessory = Accessory(hk_driver, "any") hass.states.async_set("light.demo", "on") hass.states.async_set("light.broken", "on") with patch(f"{PATH_HOMEKIT}.get_accessory", side_effect=Exception), patch( f"{PATH_HOMEKIT}.show_setup_message") as mock_setup_msg, patch( "pyhap.accessory_driver.AccessoryDriver.add_accessory", ) as hk_driver_add_acc, patch( "pyhap.accessory_driver.AccessoryDriver.start_service" ) as hk_driver_start: await homekit.async_start() await hass.async_block_till_done() mock_setup_msg.assert_called_with(hass, entry.entry_id, None, pin, ANY) hk_driver_add_acc.assert_called_with(homekit.bridge) assert hk_driver_start.called assert homekit.status == STATUS_RUNNING # Test start() if already started hk_driver_start.reset_mock() await homekit.async_start() await hass.async_block_till_done() assert not hk_driver_start.called
async def test_homekit_too_many_accessories(hass, hk_driver): """Test adding too many accessories to HomeKit.""" homekit = HomeKit(hass, None, None, None, None, None, None) homekit.bridge = Mock() homekit.bridge.accessories = range(MAX_DEVICES + 1) homekit.driver = hk_driver with patch('pyhap.accessory_driver.AccessoryDriver.start'), \ patch('pyhap.accessory_driver.AccessoryDriver.add_accessory'), \ patch('homeassistant.components.homekit._LOGGER.warning') \ as mock_warn: await hass.async_add_job(homekit.start) assert mock_warn.called is True
async def test_homekit_reset_accessories(hass): """Test adding too many accessories to HomeKit.""" entry = MockConfigEntry(domain=DOMAIN, data={ CONF_NAME: "mock_name", CONF_PORT: 12345 }) entity_id = "light.demo" homekit = HomeKit( hass, None, None, None, {}, {entity_id: {}}, DEFAULT_SAFE_MODE, advertise_ip=None, interface_choice=None, entry_id=entry.entry_id, ) homekit.bridge = Mock() homekit.bridge.accessories = {} with patch(f"{PATH_HOMEKIT}.HomeKit", return_value=homekit), patch( f"{PATH_HOMEKIT}.HomeKit.setup"), patch( "pyhap.accessory.Bridge.add_accessory" ) as mock_add_accessory, patch( "pyhap.accessory_driver.AccessoryDriver.config_changed" ) as hk_driver_config_changed, patch( "pyhap.accessory_driver.AccessoryDriver.start"): await async_init_entry(hass, entry) aid = hass.data[DOMAIN][entry.entry_id][ AID_STORAGE].get_or_allocate_aid_for_entity_id(entity_id) homekit.bridge.accessories = {aid: "acc"} homekit.status = STATUS_RUNNING await hass.services.async_call( DOMAIN, SERVICE_HOMEKIT_RESET_ACCESSORY, {ATTR_ENTITY_ID: entity_id}, blocking=True, ) await hass.async_block_till_done() assert 2 == hk_driver_config_changed.call_count assert mock_add_accessory.called homekit.status = STATUS_READY
async def test_homekit_setup_interface_choice(hass, hk_driver): """Test setup with interface choice of Default.""" entry = MockConfigEntry( domain=DOMAIN, data={CONF_NAME: "mock_name", CONF_PORT: 12345}, source=SOURCE_IMPORT, ) homekit = HomeKit( hass, BRIDGE_NAME, DEFAULT_PORT, "0.0.0.0", {}, {}, None, None, InterfaceChoice.Default, entry_id=entry.entry_id, ) path = get_persist_fullpath_for_entry_id(hass, entry.entry_id) with patch( f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver ) as mock_driver: await hass.async_add_executor_job(homekit.setup) mock_driver.assert_called_with( hass, entry.entry_id, BRIDGE_NAME, address="0.0.0.0", port=DEFAULT_PORT, persist_file=path, advertised_address=None, interface_choice=InterfaceChoice.Default, )
async def test_homekit_setup_interface_choice(hass, hk_driver): """Test setup with interface choice of Default.""" homekit = HomeKit( hass, BRIDGE_NAME, DEFAULT_PORT, "0.0.0.0", {}, {}, None, None, InterfaceChoice.Default, ) with patch(f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver) as mock_driver: await hass.async_add_executor_job(homekit.setup) mock_driver.assert_called_with( hass, address="0.0.0.0", port=DEFAULT_PORT, persist_file=ANY, advertised_address=None, interface_choice=InterfaceChoice.Default, )
async def test_homekit_setup(hass, hk_driver): """Test setup of bridge and driver.""" homekit = HomeKit(hass, BRIDGE_NAME, DEFAULT_PORT, None, {}, {}, DEFAULT_SAFE_MODE) with patch(f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver) as mock_driver, patch( "homeassistant.util.get_local_ip") as mock_ip: mock_ip.return_value = IP_ADDRESS await hass.async_add_executor_job(homekit.setup) path = hass.config.path(HOMEKIT_FILE) assert isinstance(homekit.bridge, HomeBridge) mock_driver.assert_called_with( hass, address=IP_ADDRESS, port=DEFAULT_PORT, persist_file=path, advertised_address=None, interface_choice=None, ) assert homekit.driver.safe_mode is False # Test if stop listener is setup assert hass.bus.async_listeners().get(EVENT_HOMEASSISTANT_STOP) == 1
async def test_homekit_setup_safe_mode(hass, hk_driver): """Test if safe_mode flag is set.""" homekit = HomeKit(hass, BRIDGE_NAME, DEFAULT_PORT, None, {}, {}, True) with patch(PATH_HOMEKIT + ".HomeDriver", return_value=hk_driver): await hass.async_add_job(homekit.setup) assert homekit.driver.safe_mode is True
async def test_homekit_setup_safe_mode(hass, hk_driver): """Test if safe_mode flag is set.""" entry = MockConfigEntry( domain=DOMAIN, data={ CONF_NAME: "mock_name", CONF_PORT: 12345 }, source=SOURCE_IMPORT, ) homekit = HomeKit( hass, BRIDGE_NAME, DEFAULT_PORT, None, {}, {}, True, advertise_ip=None, entry_id=entry.entry_id, ) with patch(f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver): await hass.async_add_executor_job(homekit.setup, MagicMock()) assert homekit.driver.safe_mode is True
async def test_homekit_setup_advertise_ip(hass, hk_driver): """Test setup with given IP address to advertise.""" entry = MockConfigEntry( domain=DOMAIN, data={CONF_NAME: "mock_name", CONF_PORT: 12345}, source=SOURCE_IMPORT, ) homekit = HomeKit( hass, BRIDGE_NAME, DEFAULT_PORT, "0.0.0.0", {}, {}, None, "192.168.1.100", entry_id=entry.entry_id, ) zeroconf_instance = MagicMock() path = get_persist_fullpath_for_entry_id(hass, entry.entry_id) with patch( f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver ) as mock_driver: await hass.async_add_executor_job(homekit.setup, zeroconf_instance) mock_driver.assert_called_with( hass, entry.entry_id, BRIDGE_NAME, address="0.0.0.0", port=DEFAULT_PORT, persist_file=path, advertised_address="192.168.1.100", zeroconf_instance=zeroconf_instance, )
async def test_homekit_start(hass, hk_driver, debounce_patcher): """Test HomeKit start method.""" entry = await async_init_integration(hass) pin = b"123-45-678" homekit = HomeKit( hass, None, None, None, {}, {}, DEFAULT_SAFE_MODE, advertise_ip=None, interface_choice=None, entry_id=entry.entry_id, ) homekit.bridge = Mock() homekit.bridge.accessories = [] homekit.driver = hk_driver homekit._filter = Mock(return_value=True) hass.states.async_set("light.demo", "on") state = hass.states.async_all()[0] with patch( f"{PATH_HOMEKIT}.HomeKit.add_bridge_accessory" ) as mock_add_acc, patch( f"{PATH_HOMEKIT}.show_setup_message") as mock_setup_msg, patch( "pyhap.accessory_driver.AccessoryDriver.add_accessory" ) as hk_driver_add_acc, patch( "pyhap.accessory_driver.AccessoryDriver.start" ) as hk_driver_start: await homekit.async_start() await hass.async_block_till_done() mock_add_acc.assert_called_with(state) mock_setup_msg.assert_called_with(hass, entry.entry_id, None, pin, ANY) hk_driver_add_acc.assert_called_with(homekit.bridge) assert hk_driver_start.called assert homekit.status == STATUS_RUNNING # Test start() if already started hk_driver_start.reset_mock() await homekit.async_start() await hass.async_block_till_done() assert not hk_driver_start.called
def test_homekit_setup(self): """Test setup of bridge and driver.""" homekit = HomeKit(self.hass, DEFAULT_PORT, {}, {}) with patch(PATH_HOMEKIT + '.accessories.HomeDriver') as mock_driver, \ patch('homeassistant.util.get_local_ip') as mock_ip: mock_ip.return_value = IP_ADDRESS homekit.setup() path = self.hass.config.path(HOMEKIT_FILE) self.assertTrue(isinstance(homekit.bridge, HomeBridge)) self.assertEqual(mock_driver.mock_calls, [ call(homekit.bridge, DEFAULT_PORT, IP_ADDRESS, path)]) # Test if stop listener is setup self.assertEqual( self.hass.bus.listeners.get(EVENT_HOMEASSISTANT_STOP), 1)
async def test_homekit_stop(hass): """Test HomeKit stop method.""" homekit = HomeKit(hass, None, None, None, None) homekit.driver = Mock() assert homekit.status == STATUS_READY await hass.async_add_job(homekit.stop) homekit.status = STATUS_WAIT await hass.async_add_job(homekit.stop) homekit.status = STATUS_STOPPED await hass.async_add_job(homekit.stop) assert homekit.driver.stop.called is False # Test if driver is started homekit.status = STATUS_RUNNING await hass.async_add_job(homekit.stop) assert homekit.driver.stop.called is True
async def test_homekit_warn_add_accessory_bridge(hass, acc_category, mock_zeroconf, caplog): """Test we warn when adding cameras or tvs to a bridge.""" entry = await async_init_integration(hass) homekit = HomeKit( hass, None, None, None, lambda entity_id: True, {}, HOMEKIT_MODE_BRIDGE, advertise_ip=None, entry_id=entry.entry_id, ) homekit.driver = "driver" homekit.bridge = mock_bridge = Mock() homekit.bridge.accessories = range(10) mock_camera_acc = Mock(category=acc_category) await async_init_integration(hass) with patch(f"{PATH_HOMEKIT}.get_accessory") as mock_get_acc: mock_get_acc.side_effect = [None, mock_camera_acc, None] homekit.add_bridge_accessory(State("light.demo", "on")) mock_get_acc.assert_called_with(hass, "driver", ANY, 1403373688, {}) assert not mock_bridge.add_accessory.called homekit.add_bridge_accessory(State("camera.test", "on")) mock_get_acc.assert_called_with(hass, "driver", ANY, 1508819236, {}) assert mock_bridge.add_accessory.called assert "accessory mode" in caplog.text
async def test_homekit_setup_ip_address(hass, hk_driver): """Test setup with given IP address.""" homekit = HomeKit(hass, BRIDGE_NAME, DEFAULT_PORT, '172.0.0.0', {}, {}) with patch(PATH_HOMEKIT + '.accessories.HomeDriver', return_value=hk_driver) as mock_driver: await hass.async_add_job(homekit.setup) mock_driver.assert_called_with( hass, address='172.0.0.0', port=DEFAULT_PORT, persist_file=ANY)
def test_homekit_stop(self): """Test HomeKit stop method.""" homekit = HomeKit(None, None, None, None, None) homekit.driver = Mock() # Test if started = False homekit.stop() self.assertFalse(homekit.driver.stop.called) # Test if driver not started homekit.started = True homekit.driver.configure_mock(**{'run_sentinel': None}) homekit.stop() self.assertFalse(homekit.driver.stop.called) # Test if driver is started homekit.driver.configure_mock(**{'run_sentinel': 'sentinel'}) homekit.stop() self.assertTrue(homekit.driver.stop.called)
async def test_homekit_start_in_accessory_mode(hass, hk_driver, device_reg, debounce_patcher): """Test HomeKit start method in accessory mode.""" entry = await async_init_integration(hass) pin = b"123-45-678" homekit = HomeKit( hass, None, None, None, {}, {}, DEFAULT_SAFE_MODE, HOMEKIT_MODE_ACCESSORY, advertise_ip=None, entry_id=entry.entry_id, ) homekit.bridge = Mock() homekit.bridge.accessories = [] homekit.driver = hk_driver # pylint: disable=protected-access homekit._filter = Mock(return_value=True) homekit.driver.accessory = Accessory(hk_driver, "any") hass.states.async_set("light.demo", "on") with patch( f"{PATH_HOMEKIT}.HomeKit.add_bridge_accessory" ) as mock_add_acc, patch( "pyhap.accessory_driver.AccessoryDriver.add_accessory"), patch( f"{PATH_HOMEKIT}.show_setup_message") as mock_setup_msg, patch( "pyhap.accessory_driver.AccessoryDriver.start_service" ) as hk_driver_start: await homekit.async_start() await hass.async_block_till_done() mock_add_acc.assert_not_called() mock_setup_msg.assert_called_with(hass, entry.entry_id, None, pin, ANY) assert hk_driver_start.called assert homekit.status == STATUS_RUNNING
async def test_homekit_stop(hass): """Test HomeKit stop method.""" entry = await async_init_integration(hass) homekit = HomeKit( hass, None, None, None, {}, {}, DEFAULT_SAFE_MODE, advertise_ip=None, entry_id=entry.entry_id, ) homekit.driver = Mock() await async_init_integration(hass) assert homekit.status == STATUS_READY await homekit.async_stop() await hass.async_block_till_done() homekit.status = STATUS_WAIT await homekit.async_stop() await hass.async_block_till_done() homekit.status = STATUS_STOPPED await homekit.async_stop() await hass.async_block_till_done() assert homekit.driver.stop.called is False # Test if driver is started homekit.status = STATUS_RUNNING await homekit.async_stop() await hass.async_block_till_done() assert homekit.driver.stop.called is True
async def test_homekit_too_many_accessories(hass, hk_driver, caplog): """Test adding too many accessories to HomeKit.""" entry = await async_init_integration(hass) entity_filter = generate_filter(["cover", "light"], ["demo.test"], [], []) homekit = HomeKit( hass, None, None, None, entity_filter, {}, DEFAULT_SAFE_MODE, HOMEKIT_MODE_BRIDGE, advertise_ip=None, entry_id=entry.entry_id, ) def _mock_bridge(*_): mock_bridge = HomeBridge(hass, hk_driver, "mock_bridge") # The bridge itself counts as an accessory mock_bridge.accessories = range(MAX_DEVICES) return mock_bridge homekit.driver = hk_driver homekit.driver.accessory = Accessory(hk_driver, "any") hass.states.async_set("light.demo", "on") hass.states.async_set("light.demo2", "on") hass.states.async_set("light.demo3", "on") with patch("pyhap.accessory_driver.AccessoryDriver.start_service"), patch( "pyhap.accessory_driver.AccessoryDriver.add_accessory" ), patch(f"{PATH_HOMEKIT}.show_setup_message"), patch( f"{PATH_HOMEKIT}.accessories.HomeBridge", _mock_bridge ): await homekit.async_start() await hass.async_block_till_done() assert "would exceeded" in caplog.text
def test_homekit_class(self, mock_acc_driver): """Test interaction between the HomeKit class and pyhap.""" with patch(PATH_HOMEKIT + '.accessories.HomeBridge') as mock_bridge: homekit = HomeKit(self.hass, 51826) homekit.setup_bridge(b'123-45-678') mock_bridge.reset_mock() self.hass.states.set('demo.demo1', 'on') self.hass.states.set('demo.demo2', 'off') 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 homekit.start_driver(Event(EVENT_HOMEASSISTANT_START)) path = self.hass.config.path(HOMEKIT_FILE) self.assertEqual(mock_import_types.call_count, 1) self.assertEqual(mock_get_acc.call_count, 2) self.assertEqual(mock_bridge.mock_calls, [ call().add_accessory('TempSensor'), call().add_accessory('Window') ]) self.assertEqual( mock_acc_driver.mock_calls, [call(homekit.bridge, 51826, IP_ADDRESS, path), call().start()]) mock_acc_driver.reset_mock() self.hass.bus.fire(EVENT_HOMEASSISTANT_STOP) self.hass.block_till_done() self.assertEqual(mock_acc_driver.mock_calls, [call().stop()])
async def test_homekit_remove_accessory(hass): """Remove accessory from bridge.""" entry = await async_init_integration(hass) homekit = HomeKit( hass, None, None, None, lambda entity_id: True, {}, DEFAULT_SAFE_MODE, advertise_ip=None, entry_id=entry.entry_id, ) homekit.driver = "driver" homekit.bridge = mock_bridge = Mock() mock_bridge.accessories = {"light.demo": "acc"} acc = homekit.remove_bridge_accessory("light.demo") assert acc == "acc" assert len(mock_bridge.accessories) == 0
def test_homekit_stop(self): """Test HomeKit stop method.""" homekit = HomeKit(None, None, None, None) homekit.driver = Mock() # Test if started = False homekit.stop() self.assertFalse(homekit.driver.stop.called) # Test if driver not started homekit.started = True homekit.driver.configure_mock(**{'run_sentinel': None}) homekit.stop() self.assertFalse(homekit.driver.stop.called) # Test if driver is started homekit.driver.configure_mock(**{'run_sentinel': 'sentinel'}) homekit.stop() self.assertTrue(homekit.driver.stop.called)
def _mock_homekit(hass, entry, homekit_mode, entity_filter=None): return HomeKit( hass=hass, name=BRIDGE_NAME, port=DEFAULT_PORT, ip_address=None, entity_filter=entity_filter or generate_filter([], [], [], []), exclude_accessory_mode=False, entity_config={}, homekit_mode=homekit_mode, advertise_ip=None, entry_id=entry.entry_id, entry_title=entry.title, )
async def test_homekit_add_accessory(): """Add accessory if config exists and get_acc returns an accessory.""" homekit = HomeKit('hass', None, None, None, lambda entity_id: True, {}) homekit.driver = 'driver' homekit.bridge = mock_bridge = Mock() with patch(PATH_HOMEKIT + '.get_accessory') as mock_get_acc: mock_get_acc.side_effect = [None, 'acc', None] homekit.add_bridge_accessory(State('light.demo', 'on')) mock_get_acc.assert_called_with('hass', 'driver', ANY, 363398124, {}) assert not mock_bridge.add_accessory.called homekit.add_bridge_accessory(State('demo.test', 'on')) mock_get_acc.assert_called_with('hass', 'driver', ANY, 294192020, {}) assert mock_bridge.add_accessory.called homekit.add_bridge_accessory(State('demo.test_2', 'on')) mock_get_acc.assert_called_with('hass', 'driver', ANY, 429982757, {}) mock_bridge.add_accessory.assert_called_with('acc')
async def test_homekit_add_accessory(): """Add accessory if config exists and get_acc returns an accessory.""" homekit = HomeKit('hass', None, None, lambda entity_id: True, {}) homekit.driver = 'driver' homekit.bridge = mock_bridge = Mock() with patch(PATH_HOMEKIT + '.get_accessory') as mock_get_acc: mock_get_acc.side_effect = [None, 'acc', None] homekit.add_bridge_accessory(State('light.demo', 'on')) mock_get_acc.assert_called_with('hass', 'driver', ANY, 363398124, {}) assert not mock_bridge.add_accessory.called homekit.add_bridge_accessory(State('demo.test', 'on')) mock_get_acc.assert_called_with('hass', 'driver', ANY, 294192020, {}) assert mock_bridge.add_accessory.called homekit.add_bridge_accessory(State('demo.test_2', 'on')) mock_get_acc.assert_called_with('hass', 'driver', ANY, 429982757, {}) mock_bridge.add_accessory.assert_called_with('acc')
def test_homekit_add_accessory(self): """Add accessory if config exists and get_acc returns an accessory.""" homekit = HomeKit(self.hass, None, lambda entity_id: True, {}) homekit.bridge = HomeBridge(self.hass) with patch(PATH_HOMEKIT + '.accessories.HomeBridge.add_accessory') \ as mock_add_acc, \ patch(PATH_HOMEKIT + '.get_accessory') as mock_get_acc: mock_get_acc.side_effect = [None, 'acc', None] homekit.add_bridge_accessory(State('light.demo', 'on')) self.assertEqual(mock_get_acc.call_args, call(self.hass, ANY, 363398124, {})) self.assertFalse(mock_add_acc.called) homekit.add_bridge_accessory(State('demo.test', 'on')) self.assertEqual(mock_get_acc.call_args, call(self.hass, ANY, 294192020, {})) self.assertTrue(mock_add_acc.called) homekit.add_bridge_accessory(State('demo.test_2', 'on')) self.assertEqual(mock_get_acc.call_args, call(self.hass, ANY, 429982757, {})) self.assertEqual(mock_add_acc.mock_calls, [call('acc')])
def test_homekit_entity_filter(self): """Test the entity filter.""" entity_filter = generate_filter(['cover'], ['demo.test'], [], []) homekit = HomeKit(self.hass, None, entity_filter, {}) with patch(PATH_HOMEKIT + '.get_accessory') as mock_get_acc: mock_get_acc.return_value = None homekit.add_bridge_accessory(State('cover.test', 'open')) self.assertTrue(mock_get_acc.called) mock_get_acc.reset_mock() homekit.add_bridge_accessory(State('demo.test', 'on')) self.assertTrue(mock_get_acc.called) mock_get_acc.reset_mock() homekit.add_bridge_accessory(State('light.demo', 'light')) self.assertFalse(mock_get_acc.called)
def test_homekit_start(self, mock_add_bridge_acc, mock_show_setup_msg): """Test HomeKit start method.""" homekit = HomeKit(self.hass, None, {}, {'cover.demo': {}}) homekit.bridge = HomeBridge(self.hass) homekit.driver = Mock() self.hass.states.set('light.demo', 'on') state = self.hass.states.all()[0] homekit.start() self.assertEqual(mock_add_bridge_acc.mock_calls, [call(state)]) self.assertEqual(mock_show_setup_msg.mock_calls, [ call(self.hass, homekit.bridge)]) self.assertEqual(homekit.driver.mock_calls, [call.start()]) self.assertTrue(homekit.started) # Test start() if already started homekit.driver.reset_mock() homekit.start() self.assertEqual(homekit.driver.mock_calls, [])