341 lines
12 KiB
Python
341 lines
12 KiB
Python
|
"""Test Alexa capabilities."""
|
||
|
import pytest
|
||
|
|
||
|
from homeassistant.const import (
|
||
|
STATE_LOCKED,
|
||
|
STATE_UNLOCKED,
|
||
|
STATE_UNKNOWN,
|
||
|
)
|
||
|
from homeassistant.components.alexa import smart_home
|
||
|
from tests.common import async_mock_service
|
||
|
|
||
|
from . import (
|
||
|
DEFAULT_CONFIG,
|
||
|
get_new_request,
|
||
|
assert_request_calls_service,
|
||
|
assert_request_fails,
|
||
|
reported_properties,
|
||
|
)
|
||
|
|
||
|
|
||
|
@pytest.mark.parametrize(
|
||
|
"result,adjust", [(25, '-5'), (35, '5'), (0, '-80')])
|
||
|
async def test_api_adjust_brightness(hass, result, adjust):
|
||
|
"""Test api adjust brightness process."""
|
||
|
request = get_new_request(
|
||
|
'Alexa.BrightnessController', 'AdjustBrightness', 'light#test')
|
||
|
|
||
|
# add payload
|
||
|
request['directive']['payload']['brightnessDelta'] = adjust
|
||
|
|
||
|
# setup test devices
|
||
|
hass.states.async_set(
|
||
|
'light.test', 'off', {
|
||
|
'friendly_name': "Test light", 'brightness': '77'
|
||
|
})
|
||
|
|
||
|
call_light = async_mock_service(hass, 'light', 'turn_on')
|
||
|
|
||
|
msg = await smart_home.async_handle_message(
|
||
|
hass, DEFAULT_CONFIG, request)
|
||
|
await hass.async_block_till_done()
|
||
|
|
||
|
assert 'event' in msg
|
||
|
msg = msg['event']
|
||
|
|
||
|
assert len(call_light) == 1
|
||
|
assert call_light[0].data['entity_id'] == 'light.test'
|
||
|
assert call_light[0].data['brightness_pct'] == result
|
||
|
assert msg['header']['name'] == 'Response'
|
||
|
|
||
|
|
||
|
async def test_api_set_color_rgb(hass):
|
||
|
"""Test api set color process."""
|
||
|
request = get_new_request(
|
||
|
'Alexa.ColorController', 'SetColor', 'light#test')
|
||
|
|
||
|
# add payload
|
||
|
request['directive']['payload']['color'] = {
|
||
|
'hue': '120',
|
||
|
'saturation': '0.612',
|
||
|
'brightness': '0.342',
|
||
|
}
|
||
|
|
||
|
# setup test devices
|
||
|
hass.states.async_set(
|
||
|
'light.test', 'off', {
|
||
|
'friendly_name': "Test light",
|
||
|
'supported_features': 16,
|
||
|
})
|
||
|
|
||
|
call_light = async_mock_service(hass, 'light', 'turn_on')
|
||
|
|
||
|
msg = await smart_home.async_handle_message(
|
||
|
hass, DEFAULT_CONFIG, request)
|
||
|
await hass.async_block_till_done()
|
||
|
|
||
|
assert 'event' in msg
|
||
|
msg = msg['event']
|
||
|
|
||
|
assert len(call_light) == 1
|
||
|
assert call_light[0].data['entity_id'] == 'light.test'
|
||
|
assert call_light[0].data['rgb_color'] == (33, 87, 33)
|
||
|
assert msg['header']['name'] == 'Response'
|
||
|
|
||
|
|
||
|
async def test_api_set_color_temperature(hass):
|
||
|
"""Test api set color temperature process."""
|
||
|
request = get_new_request(
|
||
|
'Alexa.ColorTemperatureController', 'SetColorTemperature',
|
||
|
'light#test')
|
||
|
|
||
|
# add payload
|
||
|
request['directive']['payload']['colorTemperatureInKelvin'] = '7500'
|
||
|
|
||
|
# setup test devices
|
||
|
hass.states.async_set(
|
||
|
'light.test', 'off', {'friendly_name': "Test light"})
|
||
|
|
||
|
call_light = async_mock_service(hass, 'light', 'turn_on')
|
||
|
|
||
|
msg = await smart_home.async_handle_message(
|
||
|
hass, DEFAULT_CONFIG, request)
|
||
|
await hass.async_block_till_done()
|
||
|
|
||
|
assert 'event' in msg
|
||
|
msg = msg['event']
|
||
|
|
||
|
assert len(call_light) == 1
|
||
|
assert call_light[0].data['entity_id'] == 'light.test'
|
||
|
assert call_light[0].data['kelvin'] == 7500
|
||
|
assert msg['header']['name'] == 'Response'
|
||
|
|
||
|
|
||
|
@pytest.mark.parametrize("result,initial", [(383, '333'), (500, '500')])
|
||
|
async def test_api_decrease_color_temp(hass, result, initial):
|
||
|
"""Test api decrease color temp process."""
|
||
|
request = get_new_request(
|
||
|
'Alexa.ColorTemperatureController', 'DecreaseColorTemperature',
|
||
|
'light#test')
|
||
|
|
||
|
# setup test devices
|
||
|
hass.states.async_set(
|
||
|
'light.test', 'off', {
|
||
|
'friendly_name': "Test light", 'color_temp': initial,
|
||
|
'max_mireds': 500,
|
||
|
})
|
||
|
|
||
|
call_light = async_mock_service(hass, 'light', 'turn_on')
|
||
|
|
||
|
msg = await smart_home.async_handle_message(
|
||
|
hass, DEFAULT_CONFIG, request)
|
||
|
await hass.async_block_till_done()
|
||
|
|
||
|
assert 'event' in msg
|
||
|
msg = msg['event']
|
||
|
|
||
|
assert len(call_light) == 1
|
||
|
assert call_light[0].data['entity_id'] == 'light.test'
|
||
|
assert call_light[0].data['color_temp'] == result
|
||
|
assert msg['header']['name'] == 'Response'
|
||
|
|
||
|
|
||
|
@pytest.mark.parametrize("result,initial", [(283, '333'), (142, '142')])
|
||
|
async def test_api_increase_color_temp(hass, result, initial):
|
||
|
"""Test api increase color temp process."""
|
||
|
request = get_new_request(
|
||
|
'Alexa.ColorTemperatureController', 'IncreaseColorTemperature',
|
||
|
'light#test')
|
||
|
|
||
|
# setup test devices
|
||
|
hass.states.async_set(
|
||
|
'light.test', 'off', {
|
||
|
'friendly_name': "Test light", 'color_temp': initial,
|
||
|
'min_mireds': 142,
|
||
|
})
|
||
|
|
||
|
call_light = async_mock_service(hass, 'light', 'turn_on')
|
||
|
|
||
|
msg = await smart_home.async_handle_message(
|
||
|
hass, DEFAULT_CONFIG, request)
|
||
|
await hass.async_block_till_done()
|
||
|
|
||
|
assert 'event' in msg
|
||
|
msg = msg['event']
|
||
|
|
||
|
assert len(call_light) == 1
|
||
|
assert call_light[0].data['entity_id'] == 'light.test'
|
||
|
assert call_light[0].data['color_temp'] == result
|
||
|
assert msg['header']['name'] == 'Response'
|
||
|
|
||
|
|
||
|
@pytest.mark.parametrize(
|
||
|
"domain,payload,source_list,idx", [
|
||
|
('media_player', 'GAME CONSOLE', ['tv', 'game console'], 1),
|
||
|
('media_player', 'SATELLITE TV', ['satellite-tv', 'game console'], 0),
|
||
|
('media_player', 'SATELLITE TV', ['satellite_tv', 'game console'], 0),
|
||
|
('media_player', 'BAD DEVICE', ['satellite_tv', 'game console'], None),
|
||
|
]
|
||
|
)
|
||
|
async def test_api_select_input(hass, domain, payload, source_list, idx):
|
||
|
"""Test api set input process."""
|
||
|
hass.states.async_set(
|
||
|
'media_player.test', 'off', {
|
||
|
'friendly_name': "Test media player",
|
||
|
'source': 'unknown',
|
||
|
'source_list': source_list,
|
||
|
})
|
||
|
|
||
|
# test where no source matches
|
||
|
if idx is None:
|
||
|
await assert_request_fails(
|
||
|
'Alexa.InputController', 'SelectInput', 'media_player#test',
|
||
|
'media_player.select_source',
|
||
|
hass,
|
||
|
payload={'input': payload})
|
||
|
return
|
||
|
|
||
|
call, _ = await assert_request_calls_service(
|
||
|
'Alexa.InputController', 'SelectInput', 'media_player#test',
|
||
|
'media_player.select_source',
|
||
|
hass,
|
||
|
payload={'input': payload})
|
||
|
assert call.data['source'] == source_list[idx]
|
||
|
|
||
|
|
||
|
async def test_report_lock_state(hass):
|
||
|
"""Test LockController implements lockState property."""
|
||
|
hass.states.async_set(
|
||
|
'lock.locked', STATE_LOCKED, {})
|
||
|
hass.states.async_set(
|
||
|
'lock.unlocked', STATE_UNLOCKED, {})
|
||
|
hass.states.async_set(
|
||
|
'lock.unknown', STATE_UNKNOWN, {})
|
||
|
|
||
|
properties = await reported_properties(hass, 'lock.locked')
|
||
|
properties.assert_equal('Alexa.LockController', 'lockState', 'LOCKED')
|
||
|
|
||
|
properties = await reported_properties(hass, 'lock.unlocked')
|
||
|
properties.assert_equal('Alexa.LockController', 'lockState', 'UNLOCKED')
|
||
|
|
||
|
properties = await reported_properties(hass, 'lock.unknown')
|
||
|
properties.assert_equal('Alexa.LockController', 'lockState', 'JAMMED')
|
||
|
|
||
|
|
||
|
async def test_report_dimmable_light_state(hass):
|
||
|
"""Test BrightnessController reports brightness correctly."""
|
||
|
hass.states.async_set(
|
||
|
'light.test_on', 'on', {'friendly_name': "Test light On",
|
||
|
'brightness': 128, 'supported_features': 1})
|
||
|
hass.states.async_set(
|
||
|
'light.test_off', 'off', {'friendly_name': "Test light Off",
|
||
|
'supported_features': 1})
|
||
|
|
||
|
properties = await reported_properties(hass, 'light.test_on')
|
||
|
properties.assert_equal('Alexa.BrightnessController', 'brightness', 50)
|
||
|
|
||
|
properties = await reported_properties(hass, 'light.test_off')
|
||
|
properties.assert_equal('Alexa.BrightnessController', 'brightness', 0)
|
||
|
|
||
|
|
||
|
async def test_report_colored_light_state(hass):
|
||
|
"""Test ColorController reports color correctly."""
|
||
|
hass.states.async_set(
|
||
|
'light.test_on', 'on', {'friendly_name': "Test light On",
|
||
|
'hs_color': (180, 75),
|
||
|
'brightness': 128,
|
||
|
'supported_features': 17})
|
||
|
hass.states.async_set(
|
||
|
'light.test_off', 'off', {'friendly_name': "Test light Off",
|
||
|
'supported_features': 17})
|
||
|
|
||
|
properties = await reported_properties(hass, 'light.test_on')
|
||
|
properties.assert_equal('Alexa.ColorController', 'color', {
|
||
|
'hue': 180,
|
||
|
'saturation': 0.75,
|
||
|
'brightness': 128 / 255.0,
|
||
|
})
|
||
|
|
||
|
properties = await reported_properties(hass, 'light.test_off')
|
||
|
properties.assert_equal('Alexa.ColorController', 'color', {
|
||
|
'hue': 0,
|
||
|
'saturation': 0,
|
||
|
'brightness': 0,
|
||
|
})
|
||
|
|
||
|
|
||
|
async def test_report_colored_temp_light_state(hass):
|
||
|
"""Test ColorTemperatureController reports color temp correctly."""
|
||
|
hass.states.async_set(
|
||
|
'light.test_on', 'on', {'friendly_name': "Test light On",
|
||
|
'color_temp': 240,
|
||
|
'supported_features': 2})
|
||
|
hass.states.async_set(
|
||
|
'light.test_off', 'off', {'friendly_name': "Test light Off",
|
||
|
'supported_features': 2})
|
||
|
|
||
|
properties = await reported_properties(hass, 'light.test_on')
|
||
|
properties.assert_equal('Alexa.ColorTemperatureController',
|
||
|
'colorTemperatureInKelvin', 4166)
|
||
|
|
||
|
properties = await reported_properties(hass, 'light.test_off')
|
||
|
properties.assert_equal('Alexa.ColorTemperatureController',
|
||
|
'colorTemperatureInKelvin', 0)
|
||
|
|
||
|
|
||
|
async def test_report_fan_speed_state(hass):
|
||
|
"""Test PercentageController reports fan speed correctly."""
|
||
|
hass.states.async_set(
|
||
|
'fan.off', 'off', {'friendly_name': "Off fan",
|
||
|
'speed': "off",
|
||
|
'supported_features': 1})
|
||
|
hass.states.async_set(
|
||
|
'fan.low_speed', 'on', {'friendly_name': "Low speed fan",
|
||
|
'speed': "low",
|
||
|
'supported_features': 1})
|
||
|
hass.states.async_set(
|
||
|
'fan.medium_speed', 'on', {'friendly_name': "Medium speed fan",
|
||
|
'speed': "medium",
|
||
|
'supported_features': 1})
|
||
|
hass.states.async_set(
|
||
|
'fan.high_speed', 'on', {'friendly_name': "High speed fan",
|
||
|
'speed': "high",
|
||
|
'supported_features': 1})
|
||
|
|
||
|
properties = await reported_properties(hass, 'fan.off')
|
||
|
properties.assert_equal('Alexa.PercentageController', 'percentage', 0)
|
||
|
|
||
|
properties = await reported_properties(hass, 'fan.low_speed')
|
||
|
properties.assert_equal('Alexa.PercentageController', 'percentage', 33)
|
||
|
|
||
|
properties = await reported_properties(hass, 'fan.medium_speed')
|
||
|
properties.assert_equal('Alexa.PercentageController', 'percentage', 66)
|
||
|
|
||
|
properties = await reported_properties(hass, 'fan.high_speed')
|
||
|
properties.assert_equal('Alexa.PercentageController', 'percentage', 100)
|
||
|
|
||
|
|
||
|
async def test_report_cover_percentage_state(hass):
|
||
|
"""Test PercentageController reports cover percentage correctly."""
|
||
|
hass.states.async_set(
|
||
|
'cover.fully_open', 'open', {'friendly_name': "Fully open cover",
|
||
|
'current_position': 100,
|
||
|
'supported_features': 15})
|
||
|
hass.states.async_set(
|
||
|
'cover.half_open', 'open', {'friendly_name': "Half open cover",
|
||
|
'current_position': 50,
|
||
|
'supported_features': 15})
|
||
|
hass.states.async_set(
|
||
|
'cover.closed', 'closed', {'friendly_name': "Closed cover",
|
||
|
'current_position': 0,
|
||
|
'supported_features': 15})
|
||
|
|
||
|
properties = await reported_properties(hass, 'cover.fully_open')
|
||
|
properties.assert_equal('Alexa.PercentageController', 'percentage', 100)
|
||
|
|
||
|
properties = await reported_properties(hass, 'cover.half_open')
|
||
|
properties.assert_equal('Alexa.PercentageController', 'percentage', 50)
|
||
|
|
||
|
properties = await reported_properties(hass, 'cover.closed')
|
||
|
properties.assert_equal('Alexa.PercentageController', 'percentage', 0)
|