mirror of
https://github.com/home-assistant/core.git
synced 2025-07-25 22:27:07 +00:00
Fix SET_TEMPERATURE_SCHEMA in climate component (#8879)
* Require either temperature or high/low target temperatures. * Add tests.
This commit is contained in:
parent
369caeedbd
commit
fbb6782081
@ -86,13 +86,17 @@ SET_AUX_HEAT_SCHEMA = vol.Schema({
|
|||||||
vol.Optional(ATTR_ENTITY_ID): cv.entity_ids,
|
vol.Optional(ATTR_ENTITY_ID): cv.entity_ids,
|
||||||
vol.Required(ATTR_AUX_HEAT): cv.boolean,
|
vol.Required(ATTR_AUX_HEAT): cv.boolean,
|
||||||
})
|
})
|
||||||
SET_TEMPERATURE_SCHEMA = vol.Schema({
|
SET_TEMPERATURE_SCHEMA = vol.Schema(vol.All(
|
||||||
|
cv.has_at_least_one_key(
|
||||||
|
ATTR_TEMPERATURE, ATTR_TARGET_TEMP_HIGH, ATTR_TARGET_TEMP_LOW),
|
||||||
|
{
|
||||||
vol.Exclusive(ATTR_TEMPERATURE, 'temperature'): vol.Coerce(float),
|
vol.Exclusive(ATTR_TEMPERATURE, 'temperature'): vol.Coerce(float),
|
||||||
vol.Inclusive(ATTR_TARGET_TEMP_HIGH, 'temperature'): vol.Coerce(float),
|
vol.Inclusive(ATTR_TARGET_TEMP_HIGH, 'temperature'): vol.Coerce(float),
|
||||||
vol.Inclusive(ATTR_TARGET_TEMP_LOW, 'temperature'): vol.Coerce(float),
|
vol.Inclusive(ATTR_TARGET_TEMP_LOW, 'temperature'): vol.Coerce(float),
|
||||||
vol.Optional(ATTR_ENTITY_ID): cv.entity_ids,
|
vol.Optional(ATTR_ENTITY_ID): cv.entity_ids,
|
||||||
vol.Optional(ATTR_OPERATION_MODE): cv.string,
|
vol.Optional(ATTR_OPERATION_MODE): cv.string,
|
||||||
})
|
}
|
||||||
|
))
|
||||||
SET_FAN_MODE_SCHEMA = vol.Schema({
|
SET_FAN_MODE_SCHEMA = vol.Schema({
|
||||||
vol.Optional(ATTR_ENTITY_ID): cv.entity_ids,
|
vol.Optional(ATTR_ENTITY_ID): cv.entity_ids,
|
||||||
vol.Required(ATTR_FAN_MODE): cv.string,
|
vol.Required(ATTR_FAN_MODE): cv.string,
|
||||||
|
@ -174,7 +174,7 @@ def get_test_instance_port():
|
|||||||
|
|
||||||
|
|
||||||
@ha.callback
|
@ha.callback
|
||||||
def async_mock_service(hass, domain, service):
|
def async_mock_service(hass, domain, service, schema=None):
|
||||||
"""Set up a fake service & return a calls log list to this service."""
|
"""Set up a fake service & return a calls log list to this service."""
|
||||||
calls = []
|
calls = []
|
||||||
|
|
||||||
@ -183,7 +183,8 @@ def async_mock_service(hass, domain, service):
|
|||||||
"""Mock service call."""
|
"""Mock service call."""
|
||||||
calls.append(call)
|
calls.append(call)
|
||||||
|
|
||||||
hass.services.async_register(domain, service, mock_service_log)
|
hass.services.async_register(
|
||||||
|
domain, service, mock_service_log, schema=schema)
|
||||||
|
|
||||||
return calls
|
return calls
|
||||||
|
|
||||||
|
40
tests/components/climate/test_init.py
Normal file
40
tests/components/climate/test_init.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
"""The tests for the climate component."""
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
from homeassistant.components.climate import SET_TEMPERATURE_SCHEMA
|
||||||
|
from tests.common import async_mock_service
|
||||||
|
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def test_set_temp_schema_no_req(hass, caplog):
|
||||||
|
"""Test the set temperature schema with missing required data."""
|
||||||
|
domain = 'climate'
|
||||||
|
service = 'test_set_temperature'
|
||||||
|
schema = SET_TEMPERATURE_SCHEMA
|
||||||
|
calls = async_mock_service(hass, domain, service, schema)
|
||||||
|
|
||||||
|
data = {'operation_mode': 'test', 'entity_id': ['climate.test_id']}
|
||||||
|
yield from hass.services.async_call(domain, service, data)
|
||||||
|
yield from hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert len(calls) == 0
|
||||||
|
assert 'ERROR' in caplog.text
|
||||||
|
assert 'Invalid service data' in caplog.text
|
||||||
|
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def test_set_temp_schema(hass, caplog):
|
||||||
|
"""Test the set temperature schema with ok required data."""
|
||||||
|
domain = 'climate'
|
||||||
|
service = 'test_set_temperature'
|
||||||
|
schema = SET_TEMPERATURE_SCHEMA
|
||||||
|
calls = async_mock_service(hass, domain, service, schema)
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'temperature': 20.0, 'operation_mode': 'test',
|
||||||
|
'entity_id': ['climate.test_id']}
|
||||||
|
yield from hass.services.async_call(domain, service, data)
|
||||||
|
yield from hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert len(calls) == 1
|
||||||
|
assert calls[-1].data == data
|
Loading…
x
Reference in New Issue
Block a user