Tweak template cover tests (#71732)

pull/71746/head
Erik Montnemery 2022-05-12 15:22:57 +02:00 committed by GitHub
parent 5a7624bfd4
commit 1ef3800844
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 98 additions and 171 deletions

View File

@ -4,7 +4,10 @@ import pytest
from homeassistant import setup
from homeassistant.components.cover import ATTR_POSITION, ATTR_TILT_POSITION, DOMAIN
from homeassistant.const import (
ATTR_DOMAIN,
ATTR_ENTITY_ID,
ATTR_SERVICE_DATA,
EVENT_CALL_SERVICE,
SERVICE_CLOSE_COVER,
SERVICE_CLOSE_COVER_TILT,
SERVICE_OPEN_COVER,
@ -22,12 +25,45 @@ from homeassistant.const import (
STATE_OPENING,
STATE_UNAVAILABLE,
)
from homeassistant.core import callback
from tests.common import assert_setup_component
ENTITY_COVER = "cover.test_template_cover"
@pytest.fixture
def service_calls(hass):
"""Track service call events for cover.test_state."""
events = []
entity_id = "cover.test_state"
@callback
def capture_events(event):
print(event.data)
if event.data[ATTR_DOMAIN] != DOMAIN:
return
if event.data[ATTR_SERVICE_DATA][ATTR_ENTITY_ID] != [entity_id]:
return
events.append(event)
hass.bus.async_listen(EVENT_CALL_SERVICE, capture_events)
return events
OPEN_CLOSE_COVER_CONFIG = {
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
}
@pytest.mark.parametrize("count,domain", [(1, DOMAIN)])
@pytest.mark.parametrize(
"config, states",
@ -38,15 +74,8 @@ ENTITY_COVER = "cover.test_template_cover"
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"value_template": "{{ states.cover.test_state.state }}",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
}
},
}
@ -90,16 +119,9 @@ ENTITY_COVER = "cover.test_template_cover"
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"position_template": "{{ states.cover.test.attributes.position }}",
"value_template": "{{ states.cover.test_state.state }}",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
}
},
}
@ -148,15 +170,8 @@ async def test_template_state_text(hass, states, start_ha, caplog):
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"value_template": "{{ 1 == 1 }}",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
}
},
}
@ -178,15 +193,8 @@ async def test_template_state_boolean(hass, start_ha):
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"position_template": "{{ states.cover.test.attributes.position }}",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test",
},
}
},
}
@ -202,11 +210,8 @@ async def test_template_position(hass, start_ha):
(STATE_CLOSED, 42, STATE_OPEN),
(STATE_OPEN, 0.0, STATE_CLOSED),
]:
state = hass.states.async_set("cover.test", set_state)
await hass.async_block_till_done()
entity = hass.states.get("cover.test")
attrs["position"] = pos
hass.states.async_set(entity.entity_id, entity.state, attributes=attrs)
hass.states.async_set("cover.test", set_state, attributes=attrs)
await hass.async_block_till_done()
state = hass.states.get("cover.test_template_cover")
assert state.attributes.get("current_position") == pos
@ -222,16 +227,9 @@ async def test_template_position(hass, start_ha):
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"value_template": "{{ 1 == 1 }}",
"tilt_template": "{{ 42 }}",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
}
},
}
@ -253,16 +251,9 @@ async def test_template_tilt(hass, start_ha):
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"position_template": "{{ -1 }}",
"tilt_template": "{{ 110 }}",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
}
},
}
@ -272,20 +263,13 @@ async def test_template_tilt(hass, start_ha):
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"position_template": "{{ on }}",
"tilt_template": "{% if states.cover.test_state.state %}"
"on"
"{% else %}"
"off"
"{% endif %}",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
},
},
}
@ -340,19 +324,15 @@ async def test_template_open_or_position(hass, start_ha, caplog_setup_text):
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"position_template": "{{ 0 }}",
"open_cover": {"service": "test.automation"},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
}
},
}
},
],
)
async def test_open_action(hass, start_ha, calls):
async def test_open_action(hass, start_ha, service_calls):
"""Test the open_cover command."""
state = hass.states.get("cover.test_template_cover")
assert state.state == STATE_CLOSED
@ -362,7 +342,8 @@ async def test_open_action(hass, start_ha, calls):
)
await hass.async_block_till_done()
assert len(calls) == 1
assert len(service_calls) == 1
assert service_calls[0].data["service"] == "open_cover"
@pytest.mark.parametrize("count,domain", [(1, DOMAIN)])
@ -374,20 +355,19 @@ async def test_open_action(hass, start_ha, calls):
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"position_template": "{{ 100 }}",
"open_cover": {
"service": "cover.open_cover",
"stop_cover": {
"service": "cover.stop_cover",
"entity_id": "cover.test_state",
},
"close_cover": {"service": "test.automation"},
"stop_cover": {"service": "test.automation"},
}
},
}
},
],
)
async def test_close_stop_action(hass, start_ha, calls):
async def test_close_stop_action(hass, start_ha, service_calls):
"""Test the close-cover and stop_cover commands."""
state = hass.states.get("cover.test_template_cover")
assert state.state == STATE_OPEN
@ -402,7 +382,9 @@ async def test_close_stop_action(hass, start_ha, calls):
)
await hass.async_block_till_done()
assert len(calls) == 2
assert len(service_calls) == 2
assert service_calls[0].data["service"] == "close_cover"
assert service_calls[1].data["service"] == "stop_cover"
@pytest.mark.parametrize("count,domain", [(1, "input_number")])
@ -412,7 +394,7 @@ async def test_close_stop_action(hass, start_ha, calls):
{"input_number": {"test": {"min": "0", "max": "100", "initial": "42"}}},
],
)
async def test_set_position(hass, start_ha, calls):
async def test_set_position(hass, start_ha, service_calls):
"""Test the set_position command."""
with assert_setup_component(1, "cover"):
assert await setup.async_setup_component(
@ -423,11 +405,10 @@ async def test_set_position(hass, start_ha, calls):
"platform": "template",
"covers": {
"test_template_cover": {
"position_template": "{{ states.input_number.test.state | int }}",
"set_cover_position": {
"service": "input_number.set_value",
"entity_id": "input_number.test",
"data_template": {"value": "{{ position }}"},
"service": "cover.set_cover_position",
"entity_id": "cover.test_state",
"data_template": {"position": "{{ position }}"},
},
}
},
@ -450,6 +431,9 @@ async def test_set_position(hass, start_ha, calls):
await hass.async_block_till_done()
state = hass.states.get("cover.test_template_cover")
assert state.attributes.get("current_position") == 100.0
assert len(service_calls) == 1
assert service_calls[-1].data["service"] == "set_cover_position"
assert service_calls[-1].data["service_data"]["position"] == 100
await hass.services.async_call(
DOMAIN, SERVICE_CLOSE_COVER, {ATTR_ENTITY_ID: ENTITY_COVER}, blocking=True
@ -457,6 +441,9 @@ async def test_set_position(hass, start_ha, calls):
await hass.async_block_till_done()
state = hass.states.get("cover.test_template_cover")
assert state.attributes.get("current_position") == 0.0
assert len(service_calls) == 2
assert service_calls[-1].data["service"] == "set_cover_position"
assert service_calls[-1].data["service_data"]["position"] == 0
await hass.services.async_call(
DOMAIN, SERVICE_TOGGLE, {ATTR_ENTITY_ID: ENTITY_COVER}, blocking=True
@ -464,6 +451,9 @@ async def test_set_position(hass, start_ha, calls):
await hass.async_block_till_done()
state = hass.states.get("cover.test_template_cover")
assert state.attributes.get("current_position") == 100.0
assert len(service_calls) == 3
assert service_calls[-1].data["service"] == "set_cover_position"
assert service_calls[-1].data["service_data"]["position"] == 100
await hass.services.async_call(
DOMAIN, SERVICE_TOGGLE, {ATTR_ENTITY_ID: ENTITY_COVER}, blocking=True
@ -471,6 +461,9 @@ async def test_set_position(hass, start_ha, calls):
await hass.async_block_till_done()
state = hass.states.get("cover.test_template_cover")
assert state.attributes.get("current_position") == 0.0
assert len(service_calls) == 4
assert service_calls[-1].data["service"] == "set_cover_position"
assert service_calls[-1].data["service_data"]["position"] == 0
await hass.services.async_call(
DOMAIN,
@ -481,6 +474,9 @@ async def test_set_position(hass, start_ha, calls):
await hass.async_block_till_done()
state = hass.states.get("cover.test_template_cover")
assert state.attributes.get("current_position") == 25.0
assert len(service_calls) == 5
assert service_calls[-1].data["service"] == "set_cover_position"
assert service_calls[-1].data["service_data"]["position"] == 25
@pytest.mark.parametrize("count,domain", [(1, DOMAIN)])
@ -492,16 +488,12 @@ async def test_set_position(hass, start_ha, calls):
"platform": "template",
"covers": {
"test_template_cover": {
"position_template": "{{ 100 }}",
"open_cover": {
"service": "cover.open_cover",
**OPEN_CLOSE_COVER_CONFIG,
"set_cover_tilt_position": {
"service": "cover.set_cover_tilt_position",
"entity_id": "cover.test_state",
"data_template": {"tilt_position": "{{ tilt }}"},
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
"set_cover_tilt_position": {"service": "test.automation"},
}
},
}
@ -509,17 +501,20 @@ async def test_set_position(hass, start_ha, calls):
],
)
@pytest.mark.parametrize(
"service,attr",
"service,attr,tilt_position",
[
(
SERVICE_SET_COVER_TILT_POSITION,
{ATTR_ENTITY_ID: ENTITY_COVER, ATTR_TILT_POSITION: 42},
42,
),
(SERVICE_OPEN_COVER_TILT, {ATTR_ENTITY_ID: ENTITY_COVER}),
(SERVICE_CLOSE_COVER_TILT, {ATTR_ENTITY_ID: ENTITY_COVER}),
(SERVICE_OPEN_COVER_TILT, {ATTR_ENTITY_ID: ENTITY_COVER}, 100),
(SERVICE_CLOSE_COVER_TILT, {ATTR_ENTITY_ID: ENTITY_COVER}, 0),
],
)
async def test_set_tilt_position(hass, service, attr, start_ha, calls):
async def test_set_tilt_position(
hass, service, attr, start_ha, service_calls, tilt_position
):
"""Test the set_tilt_position command."""
await hass.services.async_call(
DOMAIN,
@ -529,7 +524,9 @@ async def test_set_tilt_position(hass, service, attr, start_ha, calls):
)
await hass.async_block_till_done()
assert len(calls) == 1
assert len(service_calls) == 1
assert service_calls[-1].data["service"] == "set_cover_tilt_position"
assert service_calls[-1].data["service_data"]["tilt_position"] == tilt_position
@pytest.mark.parametrize("count,domain", [(1, DOMAIN)])
@ -633,15 +630,8 @@ async def test_set_tilt_position_optimistic(hass, start_ha, calls):
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"value_template": "{{ states.cover.test_state.state }}",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
"icon_template": "{% if states.cover.test_state.state %}"
"mdi:check"
"{% endif %}",
@ -673,15 +663,8 @@ async def test_icon_template(hass, start_ha):
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"value_template": "{{ states.cover.test_state.state }}",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
"entity_picture_template": "{% if states.cover.test_state.state %}"
"/local/cover.png"
"{% endif %}",
@ -713,15 +696,8 @@ async def test_entity_picture_template(hass, start_ha):
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"value_template": "open",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
"availability_template": "{{ is_state('availability_state.state','on') }}",
}
},
@ -751,15 +727,8 @@ async def test_availability_template(hass, start_ha):
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"value_template": "open",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
}
},
}
@ -781,16 +750,9 @@ async def test_availability_without_availability_template(hass, start_ha):
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"availability_template": "{{ x - 12 }}",
"value_template": "open",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
}
},
}
@ -814,16 +776,9 @@ async def test_invalid_availability_template_keeps_component_available(
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"value_template": "{{ states.cover.test_state.state }}",
"device_class": "door",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
}
},
}
@ -845,16 +800,9 @@ async def test_device_class(hass, start_ha):
"platform": "template",
"covers": {
"test_template_cover": {
**OPEN_CLOSE_COVER_CONFIG,
"value_template": "{{ states.cover.test_state.state }}",
"device_class": "barnacle_bill",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
}
},
}
@ -876,28 +824,14 @@ async def test_invalid_device_class(hass, start_ha):
"platform": "template",
"covers": {
"test_template_cover_01": {
**OPEN_CLOSE_COVER_CONFIG,
"unique_id": "not-so-unique-anymore",
"value_template": "{{ true }}",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
},
"test_template_cover_02": {
**OPEN_CLOSE_COVER_CONFIG,
"unique_id": "not-so-unique-anymore",
"value_template": "{{ false }}",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
},
},
}
@ -918,16 +852,9 @@ async def test_unique_id(hass, start_ha):
"platform": "template",
"covers": {
"garage_door": {
**OPEN_CLOSE_COVER_CONFIG,
"friendly_name": "Garage Door",
"value_template": "{{ is_state('binary_sensor.garage_door_sensor', 'off') }}",
"open_cover": {
"service": "cover.open_cover",
"entity_id": "cover.test_state",
},
"close_cover": {
"service": "cover.close_cover",
"entity_id": "cover.test_state",
},
},
},
}