"""Basic checks for HomeKitLock.""" from tests.components.homekit_controller.common import FakeService, setup_test_component LOCK_CURRENT_STATE = ("lock-mechanism", "lock-mechanism.current-state") LOCK_TARGET_STATE = ("lock-mechanism", "lock-mechanism.target-state") def create_lock_service(): """Define a lock characteristics as per page 219 of HAP spec.""" service = FakeService("public.hap.service.lock-mechanism") cur_state = service.add_characteristic("lock-mechanism.current-state") cur_state.value = 0 targ_state = service.add_characteristic("lock-mechanism.target-state") targ_state.value = 0 # According to the spec, a battery-level characteristic is normally # part of a seperate service. However as the code was written (which # predates this test) the battery level would have to be part of the lock # service as it is here. targ_state = service.add_characteristic("battery-level") targ_state.value = 50 return service async def test_switch_change_lock_state(hass, utcnow): """Test that we can turn a HomeKit lock on and off again.""" lock = create_lock_service() helper = await setup_test_component(hass, [lock]) await hass.services.async_call( "lock", "lock", {"entity_id": "lock.testdevice"}, blocking=True ) assert helper.characteristics[LOCK_TARGET_STATE].value == 1 await hass.services.async_call( "lock", "unlock", {"entity_id": "lock.testdevice"}, blocking=True ) assert helper.characteristics[LOCK_TARGET_STATE].value == 0 async def test_switch_read_lock_state(hass, utcnow): """Test that we can read the state of a HomeKit lock accessory.""" lock = create_lock_service() helper = await setup_test_component(hass, [lock]) helper.characteristics[LOCK_CURRENT_STATE].value = 0 helper.characteristics[LOCK_TARGET_STATE].value = 0 state = await helper.poll_and_get_state() assert state.state == "unlocked" assert state.attributes["battery_level"] == 50 helper.characteristics[LOCK_CURRENT_STATE].value = 1 helper.characteristics[LOCK_TARGET_STATE].value = 1 state = await helper.poll_and_get_state() assert state.state == "locked"