core/tests/components/verisure/test_lock.py

142 lines
4.5 KiB
Python

"""Tests for the Verisure platform."""
from contextlib import contextmanager
from unittest.mock import patch, call
from homeassistant.const import STATE_UNLOCKED
from homeassistant.setup import async_setup_component
from homeassistant.components.lock import (
DOMAIN as LOCK_DOMAIN, SERVICE_LOCK, SERVICE_UNLOCK)
from homeassistant.components.verisure import DOMAIN as VERISURE_DOMAIN
NO_DEFAULT_LOCK_CODE_CONFIG = {
'verisure': {
'username': 'test',
'password': 'test',
'locks': True,
'alarm': False,
'door_window': False,
'hygrometers': False,
'mouse': False,
'smartplugs': False,
'thermometers': False,
'smartcam': False,
}
}
DEFAULT_LOCK_CODE_CONFIG = {
'verisure': {
'username': 'test',
'password': 'test',
'locks': True,
'default_lock_code': '9999',
'alarm': False,
'door_window': False,
'hygrometers': False,
'mouse': False,
'smartplugs': False,
'thermometers': False,
'smartcam': False,
}
}
LOCKS = ['door_lock']
@contextmanager
def mock_hub(config, get_response=LOCKS[0]):
"""Extensively mock out a verisure hub."""
hub_prefix = 'homeassistant.components.verisure.lock.hub'
verisure_prefix = 'verisure.Session'
with patch(verisure_prefix) as session, \
patch(hub_prefix) as hub:
session.login.return_value = True
hub.config = config['verisure']
hub.get.return_value = LOCKS
hub.get_first.return_value = get_response.upper()
hub.session.set_lock_state.return_value = {
'doorLockStateChangeTransactionId': 'test',
}
hub.session.get_lock_state_transaction.return_value = {
'result': 'OK',
}
yield hub
async def setup_verisure_locks(hass, config):
"""Set up mock verisure locks."""
with mock_hub(config):
await async_setup_component(hass, VERISURE_DOMAIN, config)
await hass.async_block_till_done()
# lock.door_lock, group.all_locks
assert len(hass.states.async_all()) == 2
async def test_verisure_no_default_code(hass):
"""Test configs without a default lock code."""
await setup_verisure_locks(hass, NO_DEFAULT_LOCK_CODE_CONFIG)
with mock_hub(NO_DEFAULT_LOCK_CODE_CONFIG,
STATE_UNLOCKED) as hub:
mock = hub.session.set_lock_state
await hass.services.async_call(LOCK_DOMAIN, SERVICE_LOCK, {
'entity_id': 'lock.door_lock',
})
await hass.async_block_till_done()
assert mock.call_count == 0
await hass.services.async_call(LOCK_DOMAIN, SERVICE_LOCK, {
'entity_id': 'lock.door_lock',
'code': '12345',
})
await hass.async_block_till_done()
assert mock.call_args == call('12345', LOCKS[0], 'lock')
mock.reset_mock()
await hass.services.async_call(LOCK_DOMAIN, SERVICE_UNLOCK, {
'entity_id': 'lock.door_lock',
})
await hass.async_block_till_done()
assert mock.call_count == 0
await hass.services.async_call(LOCK_DOMAIN, SERVICE_UNLOCK, {
'entity_id': 'lock.door_lock',
'code': '12345',
})
await hass.async_block_till_done()
assert mock.call_args == call('12345', LOCKS[0], 'unlock')
async def test_verisure_default_code(hass):
"""Test configs with a default lock code."""
await setup_verisure_locks(hass, DEFAULT_LOCK_CODE_CONFIG)
with mock_hub(DEFAULT_LOCK_CODE_CONFIG, STATE_UNLOCKED) as hub:
mock = hub.session.set_lock_state
await hass.services.async_call(LOCK_DOMAIN, SERVICE_LOCK, {
'entity_id': 'lock.door_lock',
})
await hass.async_block_till_done()
assert mock.call_args == call('9999', LOCKS[0], 'lock')
await hass.services.async_call(LOCK_DOMAIN, SERVICE_UNLOCK, {
'entity_id': 'lock.door_lock',
})
await hass.async_block_till_done()
assert mock.call_args == call('9999', LOCKS[0], 'unlock')
await hass.services.async_call(LOCK_DOMAIN, SERVICE_LOCK, {
'entity_id': 'lock.door_lock',
'code': '12345',
})
await hass.async_block_till_done()
assert mock.call_args == call('12345', LOCKS[0], 'lock')
await hass.services.async_call(LOCK_DOMAIN, SERVICE_UNLOCK, {
'entity_id': 'lock.door_lock',
'code': '12345',
})
await hass.async_block_till_done()
assert mock.call_args == call('12345', LOCKS[0], 'unlock')