2018-03-15 02:48:21 +01:00
|
|
|
"""Test HomeKit util module."""
|
2018-04-12 21:01:41 +08:00
|
|
|
import pytest
|
2018-05-11 01:21:59 +02:00
|
|
|
import voluptuous as vol
|
2018-03-15 02:48:21 +01:00
|
|
|
|
2018-05-25 05:37:20 -04:00
|
|
|
from homeassistant.core import State
|
|
|
|
from homeassistant.components.homekit.const import (
|
|
|
|
HOMEKIT_NOTIFY_ID, ON_OFF, PLAY_PAUSE, PLAY_STOP, TOGGLE_MUTE)
|
2018-03-15 02:48:21 +01:00
|
|
|
from homeassistant.components.homekit.util import (
|
2018-05-21 04:25:53 +02:00
|
|
|
convert_to_float, density_to_air_quality, dismiss_setup_message,
|
2018-05-25 05:37:20 -04:00
|
|
|
show_setup_message, temperature_to_homekit, temperature_to_states,
|
|
|
|
validate_media_player_modes)
|
2018-03-15 02:48:21 +01:00
|
|
|
from homeassistant.components.homekit.util import validate_entity_config \
|
|
|
|
as vec
|
|
|
|
from homeassistant.components.persistent_notification import (
|
2018-05-21 04:25:53 +02:00
|
|
|
ATTR_MESSAGE, ATTR_NOTIFICATION_ID, DOMAIN)
|
2018-03-15 02:48:21 +01:00
|
|
|
from homeassistant.const import (
|
2018-05-25 05:37:20 -04:00
|
|
|
ATTR_CODE, ATTR_SUPPORTED_FEATURES, CONF_MODE, CONF_NAME, STATE_UNKNOWN,
|
|
|
|
TEMP_CELSIUS, TEMP_FAHRENHEIT)
|
2018-03-15 02:48:21 +01:00
|
|
|
|
2018-05-11 01:21:59 +02:00
|
|
|
from tests.common import async_mock_service
|
2018-03-15 02:48:21 +01:00
|
|
|
|
|
|
|
|
2018-04-12 21:01:41 +08:00
|
|
|
def test_validate_entity_config():
|
|
|
|
"""Test validate entities."""
|
|
|
|
configs = [{'invalid_entity_id': {}}, {'demo.test': 1},
|
|
|
|
{'demo.test': 'test'}, {'demo.test': [1, 2]},
|
2018-05-25 05:37:20 -04:00
|
|
|
{'demo.test': None}, {'demo.test': {CONF_NAME: None}},
|
|
|
|
{'media_player.test': {CONF_MODE: 'invalid_mode'}}]
|
2018-04-12 21:01:41 +08:00
|
|
|
|
|
|
|
for conf in configs:
|
|
|
|
with pytest.raises(vol.Invalid):
|
|
|
|
vec(conf)
|
|
|
|
|
|
|
|
assert vec({}) == {}
|
2018-05-11 08:22:45 -04:00
|
|
|
assert vec({'demo.test': {CONF_NAME: 'Name'}}) == \
|
|
|
|
{'demo.test': {CONF_NAME: 'Name'}}
|
2018-05-18 13:52:52 +02:00
|
|
|
|
|
|
|
assert vec({'alarm_control_panel.demo': {}}) == \
|
|
|
|
{'alarm_control_panel.demo': {ATTR_CODE: None}}
|
2018-04-12 21:01:41 +08:00
|
|
|
assert vec({'alarm_control_panel.demo': {ATTR_CODE: '1234'}}) == \
|
|
|
|
{'alarm_control_panel.demo': {ATTR_CODE: '1234'}}
|
|
|
|
|
2018-05-18 13:52:52 +02:00
|
|
|
assert vec({'lock.demo': {}}) == {'lock.demo': {ATTR_CODE: None}}
|
|
|
|
assert vec({'lock.demo': {ATTR_CODE: '1234'}}) == \
|
|
|
|
{'lock.demo': {ATTR_CODE: '1234'}}
|
|
|
|
|
2018-05-25 05:37:20 -04:00
|
|
|
assert vec({'media_player.demo': {}}) == \
|
|
|
|
{'media_player.demo': {CONF_MODE: []}}
|
|
|
|
assert vec({'media_player.demo': {CONF_MODE: [ON_OFF]}}) == \
|
|
|
|
{'media_player.demo': {CONF_MODE: [ON_OFF]}}
|
|
|
|
|
|
|
|
|
|
|
|
def test_validate_media_player_modes():
|
|
|
|
"""Test validate modes for media players."""
|
|
|
|
config = {}
|
|
|
|
attrs = {ATTR_SUPPORTED_FEATURES: 20873}
|
|
|
|
entity_state = State('media_player.demo', 'on', attrs)
|
|
|
|
validate_media_player_modes(entity_state, config)
|
|
|
|
assert config == {CONF_MODE: [ON_OFF, PLAY_PAUSE, PLAY_STOP, TOGGLE_MUTE]}
|
|
|
|
|
|
|
|
entity_state = State('media_player.demo', 'on')
|
|
|
|
config = {CONF_MODE: [ON_OFF]}
|
|
|
|
with pytest.raises(vol.Invalid):
|
|
|
|
validate_media_player_modes(entity_state, config)
|
|
|
|
|
2018-04-12 21:01:41 +08:00
|
|
|
|
|
|
|
def test_convert_to_float():
|
|
|
|
"""Test convert_to_float method."""
|
|
|
|
assert convert_to_float(12) == 12
|
|
|
|
assert convert_to_float(12.4) == 12.4
|
|
|
|
assert convert_to_float(STATE_UNKNOWN) is None
|
|
|
|
assert convert_to_float(None) is None
|
|
|
|
|
|
|
|
|
|
|
|
def test_temperature_to_homekit():
|
|
|
|
"""Test temperature conversion from HA to HomeKit."""
|
|
|
|
assert temperature_to_homekit(20.46, TEMP_CELSIUS) == 20.5
|
|
|
|
assert temperature_to_homekit(92.1, TEMP_FAHRENHEIT) == 33.4
|
|
|
|
|
|
|
|
|
|
|
|
def test_temperature_to_states():
|
|
|
|
"""Test temperature conversion from HomeKit to HA."""
|
|
|
|
assert temperature_to_states(20, TEMP_CELSIUS) == 20.0
|
|
|
|
assert temperature_to_states(20.2, TEMP_FAHRENHEIT) == 68.4
|
|
|
|
|
|
|
|
|
|
|
|
def test_density_to_air_quality():
|
|
|
|
"""Test map PM2.5 density to HomeKit AirQuality level."""
|
|
|
|
assert density_to_air_quality(0) == 1
|
|
|
|
assert density_to_air_quality(35) == 1
|
|
|
|
assert density_to_air_quality(35.1) == 2
|
|
|
|
assert density_to_air_quality(75) == 2
|
|
|
|
assert density_to_air_quality(115) == 3
|
|
|
|
assert density_to_air_quality(150) == 4
|
|
|
|
assert density_to_air_quality(300) == 5
|
|
|
|
|
|
|
|
|
2018-05-11 01:21:59 +02:00
|
|
|
async def test_show_setup_msg(hass):
|
|
|
|
"""Test show setup message as persistence notification."""
|
2018-05-18 16:32:57 +02:00
|
|
|
pincode = b'123-45-678'
|
2018-05-11 01:21:59 +02:00
|
|
|
|
|
|
|
call_create_notification = async_mock_service(hass, DOMAIN, 'create')
|
|
|
|
|
2018-05-18 16:32:57 +02:00
|
|
|
await hass.async_add_job(show_setup_message, hass, pincode)
|
2018-05-11 01:21:59 +02:00
|
|
|
await hass.async_block_till_done()
|
|
|
|
|
|
|
|
assert call_create_notification
|
|
|
|
assert call_create_notification[0].data[ATTR_NOTIFICATION_ID] == \
|
|
|
|
HOMEKIT_NOTIFY_ID
|
2018-05-18 16:32:57 +02:00
|
|
|
assert pincode.decode() in call_create_notification[0].data[ATTR_MESSAGE]
|
2018-05-11 01:21:59 +02:00
|
|
|
|
|
|
|
|
|
|
|
async def test_dismiss_setup_msg(hass):
|
|
|
|
"""Test dismiss setup message."""
|
|
|
|
call_dismiss_notification = async_mock_service(hass, DOMAIN, 'dismiss')
|
|
|
|
|
|
|
|
await hass.async_add_job(dismiss_setup_message, hass)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
|
|
|
|
assert call_dismiss_notification
|
|
|
|
assert call_dismiss_notification[0].data[ATTR_NOTIFICATION_ID] == \
|
|
|
|
HOMEKIT_NOTIFY_ID
|