Update template/alarm_control_panel.py to use pytest (#56229)

This commit is contained in:
jan iversen 2021-09-14 22:06:29 +02:00 committed by GitHub
parent 2b51896d7a
commit 4b2ff0a0ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,5 +1,6 @@
"""The tests for the Template alarm control panel platform."""
from homeassistant import setup
import pytest
from homeassistant.const import (
STATE_ALARM_ARMED_AWAY,
STATE_ALARM_ARMED_HOME,
@ -10,21 +11,80 @@ from homeassistant.const import (
STATE_ALARM_TRIGGERED,
)
from tests.common import async_mock_service
from tests.components.alarm_control_panel import common
TEMPLATE_NAME = "alarm_control_panel.test_template_panel"
PANEL_NAME = "alarm_control_panel.test"
async def test_template_state_text(hass):
@pytest.mark.parametrize("count,domain", [(1, "alarm_control_panel")])
@pytest.mark.parametrize(
"config",
[
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"test_template_panel": {
"value_template": "{{ states('alarm_control_panel.test') }}",
"arm_away": {
"service": "alarm_control_panel.alarm_arm_away",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_home": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_night": {
"service": "alarm_control_panel.alarm_arm_night",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"disarm": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
}
},
}
},
],
)
async def test_template_state_text(hass, start_ha):
"""Test the state text of a template."""
await setup.async_setup_component(
hass,
"alarm_control_panel",
for set_state in [
STATE_ALARM_ARMED_HOME,
STATE_ALARM_ARMED_AWAY,
STATE_ALARM_ARMED_NIGHT,
STATE_ALARM_ARMING,
STATE_ALARM_DISARMED,
STATE_ALARM_PENDING,
STATE_ALARM_TRIGGERED,
]:
hass.states.async_set(PANEL_NAME, set_state)
await hass.async_block_till_done()
state = hass.states.get(TEMPLATE_NAME)
assert state.state == set_state
hass.states.async_set(PANEL_NAME, "invalid_state")
await hass.async_block_till_done()
state = hass.states.get(TEMPLATE_NAME)
assert state.state == "unknown"
@pytest.mark.parametrize("count,domain", [(1, "alarm_control_panel")])
@pytest.mark.parametrize(
"config",
[
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"test_template_panel": {
"value_template": "{{ states('alarm_control_panel.test') }}",
"arm_away": {
"service": "alarm_control_panel.alarm_arm_away",
"entity_id": "alarm_control_panel.test",
@ -49,140 +109,30 @@ async def test_template_state_text(hass):
},
}
},
)
await hass.async_block_till_done()
await hass.async_start()
await hass.async_block_till_done()
hass.states.async_set("alarm_control_panel.test", STATE_ALARM_ARMED_HOME)
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
assert state.state == STATE_ALARM_ARMED_HOME
hass.states.async_set("alarm_control_panel.test", STATE_ALARM_ARMED_AWAY)
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
assert state.state == STATE_ALARM_ARMED_AWAY
hass.states.async_set("alarm_control_panel.test", STATE_ALARM_ARMED_NIGHT)
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
assert state.state == STATE_ALARM_ARMED_NIGHT
hass.states.async_set("alarm_control_panel.test", STATE_ALARM_ARMING)
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
assert state.state == STATE_ALARM_ARMING
hass.states.async_set("alarm_control_panel.test", STATE_ALARM_DISARMED)
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
assert state.state == STATE_ALARM_DISARMED
hass.states.async_set("alarm_control_panel.test", STATE_ALARM_PENDING)
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
assert state.state == STATE_ALARM_PENDING
hass.states.async_set("alarm_control_panel.test", STATE_ALARM_TRIGGERED)
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
assert state.state == STATE_ALARM_TRIGGERED
hass.states.async_set("alarm_control_panel.test", "invalid_state")
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
assert state.state == "unknown"
async def test_optimistic_states(hass):
],
)
async def test_optimistic_states(hass, start_ha):
"""Test the optimistic state."""
await setup.async_setup_component(
hass,
"alarm_control_panel",
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"test_template_panel": {
"arm_away": {
"service": "alarm_control_panel.alarm_arm_away",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_home": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_night": {
"service": "alarm_control_panel.alarm_arm_night",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"disarm": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
}
},
}
},
)
await hass.async_block_till_done()
await hass.async_start()
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
state = hass.states.get(TEMPLATE_NAME)
await hass.async_block_till_done()
assert state.state == "unknown"
await common.async_alarm_arm_away(
hass, entity_id="alarm_control_panel.test_template_panel"
)
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
await hass.async_block_till_done()
assert state.state == STATE_ALARM_ARMED_AWAY
await common.async_alarm_arm_home(
hass, entity_id="alarm_control_panel.test_template_panel"
)
state = hass.states.get("alarm_control_panel.test_template_panel")
await hass.async_block_till_done()
assert state.state == STATE_ALARM_ARMED_HOME
await common.async_alarm_arm_night(
hass, entity_id="alarm_control_panel.test_template_panel"
)
state = hass.states.get("alarm_control_panel.test_template_panel")
await hass.async_block_till_done()
assert state.state == STATE_ALARM_ARMED_NIGHT
await common.async_alarm_disarm(
hass, entity_id="alarm_control_panel.test_template_panel"
)
state = hass.states.get("alarm_control_panel.test_template_panel")
await hass.async_block_till_done()
assert state.state == STATE_ALARM_DISARMED
for func, set_state in [
(common.async_alarm_arm_away, STATE_ALARM_ARMED_AWAY),
(common.async_alarm_arm_home, STATE_ALARM_ARMED_HOME),
(common.async_alarm_arm_night, STATE_ALARM_ARMED_NIGHT),
(common.async_alarm_disarm, STATE_ALARM_DISARMED),
]:
await func(hass, entity_id=TEMPLATE_NAME)
await hass.async_block_till_done()
assert hass.states.get(TEMPLATE_NAME).state == set_state
async def test_no_action_scripts(hass):
"""Test no action scripts per state."""
await setup.async_setup_component(
hass,
"alarm_control_panel",
@pytest.mark.parametrize("count,domain", [(1, "alarm_control_panel")])
@pytest.mark.parametrize(
"config",
[
{
"alarm_control_panel": {
"platform": "template",
@ -193,180 +143,121 @@ async def test_no_action_scripts(hass):
},
}
},
)
await hass.async_block_till_done()
await hass.async_start()
await hass.async_block_till_done()
],
)
async def test_no_action_scripts(hass, start_ha):
"""Test no action scripts per state."""
hass.states.async_set("alarm_control_panel.test", STATE_ALARM_ARMED_AWAY)
await hass.async_block_till_done()
await common.async_alarm_arm_away(
hass, entity_id="alarm_control_panel.test_template_panel"
)
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
await hass.async_block_till_done()
assert state.state == STATE_ALARM_ARMED_AWAY
await common.async_alarm_arm_home(
hass, entity_id="alarm_control_panel.test_template_panel"
)
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
await hass.async_block_till_done()
assert state.state == STATE_ALARM_ARMED_AWAY
await common.async_alarm_arm_night(
hass, entity_id="alarm_control_panel.test_template_panel"
)
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
await hass.async_block_till_done()
assert state.state == STATE_ALARM_ARMED_AWAY
await common.async_alarm_disarm(
hass, entity_id="alarm_control_panel.test_template_panel"
)
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
await hass.async_block_till_done()
assert state.state == STATE_ALARM_ARMED_AWAY
for func, set_state in [
(common.async_alarm_arm_away, STATE_ALARM_ARMED_AWAY),
(common.async_alarm_arm_home, STATE_ALARM_ARMED_AWAY),
(common.async_alarm_arm_night, STATE_ALARM_ARMED_AWAY),
(common.async_alarm_disarm, STATE_ALARM_ARMED_AWAY),
]:
await func(hass, entity_id=TEMPLATE_NAME)
await hass.async_block_till_done()
assert hass.states.get(TEMPLATE_NAME).state == set_state
async def test_template_syntax_error(hass, caplog):
@pytest.mark.parametrize("count,domain", [(0, "alarm_control_panel")])
@pytest.mark.parametrize(
"config,msg",
[
(
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"test_template_panel": {
"value_template": "{% if blah %}",
"arm_away": {
"service": "alarm_control_panel.alarm_arm_away",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_home": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_night": {
"service": "alarm_control_panel.alarm_arm_night",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"disarm": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
}
},
}
},
"invalid template",
),
(
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"bad name here": {
"value_template": "{{ disarmed }}",
"arm_away": {
"service": "alarm_control_panel.alarm_arm_away",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_home": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_night": {
"service": "alarm_control_panel.alarm_arm_night",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"disarm": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
}
},
}
},
"invalid slug bad name",
),
(
{
"alarm_control_panel": {
"platform": "template",
"wibble": {"test_panel": "Invalid"},
}
},
"[wibble] is an invalid option",
),
(
{
"alarm_control_panel": {"platform": "template"},
},
"required key not provided @ data['panels']",
),
],
)
async def test_template_syntax_error(hass, msg, start_ha, caplog_setup_text):
"""Test templating syntax error."""
await setup.async_setup_component(
hass,
"alarm_control_panel",
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"test_template_panel": {
"value_template": "{% if blah %}",
"arm_away": {
"service": "alarm_control_panel.alarm_arm_away",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_home": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_night": {
"service": "alarm_control_panel.alarm_arm_night",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"disarm": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
}
},
}
},
)
await hass.async_block_till_done()
await hass.async_start()
await hass.async_block_till_done()
assert len(hass.states.async_all()) == 0
assert ("invalid template") in caplog.text
assert (msg) in caplog_setup_text
async def test_invalid_name_does_not_create(hass, caplog):
"""Test invalid name."""
await setup.async_setup_component(
hass,
"alarm_control_panel",
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"bad name here": {
"value_template": "{{ disarmed }}",
"arm_away": {
"service": "alarm_control_panel.alarm_arm_away",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_home": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_night": {
"service": "alarm_control_panel.alarm_arm_night",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"disarm": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
}
},
}
},
)
await hass.async_block_till_done()
await hass.async_start()
await hass.async_block_till_done()
assert len(hass.states.async_all()) == 0
assert ("invalid slug bad name") in caplog.text
async def test_invalid_panel_does_not_create(hass, caplog):
"""Test invalid alarm control panel."""
await setup.async_setup_component(
hass,
"alarm_control_panel",
{
"alarm_control_panel": {
"platform": "template",
"wibble": {"test_panel": "Invalid"},
}
},
)
await hass.async_block_till_done()
await hass.async_start()
await hass.async_block_till_done()
assert len(hass.states.async_all()) == 0
assert ("[wibble] is an invalid option") in caplog.text
async def test_no_panels_does_not_create(hass, caplog):
"""Test if there are no panels -> no creation."""
await setup.async_setup_component(
hass,
"alarm_control_panel",
{"alarm_control_panel": {"platform": "template"}},
)
await hass.async_block_till_done()
await hass.async_start()
await hass.async_block_till_done()
assert len(hass.states.async_all()) == 0
assert ("required key not provided @ data['panels']") in caplog.text
async def test_name(hass):
"""Test the accessibility of the name attribute."""
await setup.async_setup_component(
hass,
"alarm_control_panel",
@pytest.mark.parametrize("count,domain", [(1, "alarm_control_panel")])
@pytest.mark.parametrize(
"config",
[
{
"alarm_control_panel": {
"platform": "template",
@ -398,211 +289,148 @@ async def test_name(hass):
},
}
},
)
await hass.async_block_till_done()
await hass.async_start()
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
],
)
async def test_name(hass, start_ha):
"""Test the accessibility of the name attribute."""
state = hass.states.get(TEMPLATE_NAME)
assert state is not None
assert state.attributes.get("friendly_name") == "Template Alarm Panel"
async def test_arm_home_action(hass):
@pytest.mark.parametrize("count,domain", [(1, "alarm_control_panel")])
@pytest.mark.parametrize(
"config,func",
[
(
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"test_template_panel": {
"value_template": "{{ states('alarm_control_panel.test') }}",
"arm_away": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_home": {"service": "test.automation"},
"arm_night": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"disarm": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
}
},
}
},
common.async_alarm_arm_home,
),
(
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"test_template_panel": {
"value_template": "{{ states('alarm_control_panel.test') }}",
"arm_home": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_away": {"service": "test.automation"},
"arm_night": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"disarm": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
}
},
},
},
common.async_alarm_arm_away,
),
(
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"test_template_panel": {
"value_template": "{{ states('alarm_control_panel.test') }}",
"arm_home": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_night": {"service": "test.automation"},
"arm_away": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"disarm": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
}
},
}
},
common.async_alarm_arm_night,
),
(
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"test_template_panel": {
"value_template": "{{ states('alarm_control_panel.test') }}",
"arm_home": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"disarm": {"service": "test.automation"},
"arm_away": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_night": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
}
},
}
},
common.async_alarm_disarm,
),
],
)
async def test_arm_home_action(hass, func, start_ha, calls):
"""Test arm home action."""
await setup.async_setup_component(
hass,
"alarm_control_panel",
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"test_template_panel": {
"value_template": "{{ states('alarm_control_panel.test') }}",
"arm_away": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_home": {"service": "test.automation"},
"arm_night": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"disarm": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
}
},
}
},
)
await func(hass, entity_id=TEMPLATE_NAME)
await hass.async_block_till_done()
await hass.async_start()
await hass.async_block_till_done()
service_calls = async_mock_service(hass, "test", "automation")
await common.async_alarm_arm_home(
hass, entity_id="alarm_control_panel.test_template_panel"
)
await hass.async_block_till_done()
assert len(service_calls) == 1
assert len(calls) == 1
async def test_arm_away_action(hass):
"""Test arm away action."""
await setup.async_setup_component(
hass,
"alarm_control_panel",
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"test_template_panel": {
"value_template": "{{ states('alarm_control_panel.test') }}",
"arm_home": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_away": {"service": "test.automation"},
"arm_night": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"disarm": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
}
},
}
},
)
await hass.async_block_till_done()
await hass.async_start()
await hass.async_block_till_done()
service_calls = async_mock_service(hass, "test", "automation")
await common.async_alarm_arm_away(
hass, entity_id="alarm_control_panel.test_template_panel"
)
await hass.async_block_till_done()
assert len(service_calls) == 1
async def test_arm_night_action(hass):
"""Test arm night action."""
await setup.async_setup_component(
hass,
"alarm_control_panel",
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"test_template_panel": {
"value_template": "{{ states('alarm_control_panel.test') }}",
"arm_home": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_night": {"service": "test.automation"},
"arm_away": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"disarm": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
}
},
}
},
)
await hass.async_block_till_done()
await hass.async_start()
await hass.async_block_till_done()
service_calls = async_mock_service(hass, "test", "automation")
await common.async_alarm_arm_night(
hass, entity_id="alarm_control_panel.test_template_panel"
)
await hass.async_block_till_done()
assert len(service_calls) == 1
async def test_disarm_action(hass):
"""Test disarm action."""
await setup.async_setup_component(
hass,
"alarm_control_panel",
{
"alarm_control_panel": {
"platform": "template",
"panels": {
"test_template_panel": {
"value_template": "{{ states('alarm_control_panel.test') }}",
"arm_home": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"disarm": {"service": "test.automation"},
"arm_away": {
"service": "alarm_control_panel.alarm_arm_home",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
"arm_night": {
"service": "alarm_control_panel.alarm_disarm",
"entity_id": "alarm_control_panel.test",
"data": {"code": "1234"},
},
}
},
}
},
)
await hass.async_block_till_done()
await hass.async_start()
await hass.async_block_till_done()
service_calls = async_mock_service(hass, "test", "automation")
await common.async_alarm_disarm(
hass, entity_id="alarm_control_panel.test_template_panel"
)
await hass.async_block_till_done()
assert len(service_calls) == 1
async def test_unique_id(hass):
"""Test unique_id option only creates one alarm control panel per id."""
await setup.async_setup_component(
hass,
"alarm_control_panel",
@pytest.mark.parametrize("count,domain", [(1, "alarm_control_panel")])
@pytest.mark.parametrize(
"config",
[
{
"alarm_control_panel": {
"platform": "template",
@ -618,10 +446,8 @@ async def test_unique_id(hass):
},
},
},
)
await hass.async_block_till_done()
await hass.async_start()
await hass.async_block_till_done()
],
)
async def test_unique_id(hass, start_ha):
"""Test unique_id option only creates one alarm control panel per id."""
assert len(hass.states.async_all()) == 1