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.""" """The tests for the Template alarm control panel platform."""
from homeassistant import setup import pytest
from homeassistant.const import ( from homeassistant.const import (
STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_AWAY,
STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_HOME,
@ -10,21 +11,80 @@ from homeassistant.const import (
STATE_ALARM_TRIGGERED, STATE_ALARM_TRIGGERED,
) )
from tests.common import async_mock_service
from tests.components.alarm_control_panel import common 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.""" """Test the state text of a template."""
await setup.async_setup_component(
hass, for set_state in [
"alarm_control_panel", 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": { "alarm_control_panel": {
"platform": "template", "platform": "template",
"panels": { "panels": {
"test_template_panel": { "test_template_panel": {
"value_template": "{{ states('alarm_control_panel.test') }}",
"arm_away": { "arm_away": {
"service": "alarm_control_panel.alarm_arm_away", "service": "alarm_control_panel.alarm_arm_away",
"entity_id": "alarm_control_panel.test", "entity_id": "alarm_control_panel.test",
@ -49,140 +109,30 @@ async def test_template_state_text(hass):
}, },
} }
}, },
],
) )
async def test_optimistic_states(hass, start_ha):
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):
"""Test the optimistic state.""" """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() state = hass.states.get(TEMPLATE_NAME)
await hass.async_start()
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
await hass.async_block_till_done() await hass.async_block_till_done()
assert state.state == "unknown" assert state.state == "unknown"
await common.async_alarm_arm_away( for func, set_state in [
hass, entity_id="alarm_control_panel.test_template_panel" (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() await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel") assert hass.states.get(TEMPLATE_NAME).state == set_state
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
async def test_no_action_scripts(hass): @pytest.mark.parametrize("count,domain", [(1, "alarm_control_panel")])
"""Test no action scripts per state.""" @pytest.mark.parametrize(
await setup.async_setup_component( "config",
hass, [
"alarm_control_panel",
{ {
"alarm_control_panel": { "alarm_control_panel": {
"platform": "template", "platform": "template",
@ -193,53 +143,29 @@ async def test_no_action_scripts(hass):
}, },
} }
}, },
],
) )
async def test_no_action_scripts(hass, start_ha):
await hass.async_block_till_done() """Test no action scripts per state."""
await hass.async_start()
await hass.async_block_till_done()
hass.states.async_set("alarm_control_panel.test", STATE_ALARM_ARMED_AWAY) hass.states.async_set("alarm_control_panel.test", STATE_ALARM_ARMED_AWAY)
await hass.async_block_till_done() await hass.async_block_till_done()
await common.async_alarm_arm_away( for func, set_state in [
hass, entity_id="alarm_control_panel.test_template_panel" (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() await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel") assert hass.states.get(TEMPLATE_NAME).state == set_state
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
async def test_template_syntax_error(hass, caplog): @pytest.mark.parametrize("count,domain", [(0, "alarm_control_panel")])
"""Test templating syntax error.""" @pytest.mark.parametrize(
await setup.async_setup_component( "config,msg",
hass, [
"alarm_control_panel", (
{ {
"alarm_control_panel": { "alarm_control_panel": {
"platform": "template", "platform": "template",
@ -270,21 +196,9 @@ async def test_template_syntax_error(hass, caplog):
}, },
} }
}, },
) "invalid 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 ("invalid template") in caplog.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": { "alarm_control_panel": {
"platform": "template", "platform": "template",
@ -315,58 +229,35 @@ async def test_invalid_name_does_not_create(hass, caplog):
}, },
} }
}, },
) "invalid slug bad name",
),
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": { "alarm_control_panel": {
"platform": "template", "platform": "template",
"wibble": {"test_panel": "Invalid"}, "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):
await hass.async_block_till_done() """Test templating syntax error."""
await hass.async_start()
await hass.async_block_till_done()
assert len(hass.states.async_all()) == 0 assert len(hass.states.async_all()) == 0
assert ("[wibble] is an invalid option") in caplog.text assert (msg) in caplog_setup_text
async def test_no_panels_does_not_create(hass, caplog): @pytest.mark.parametrize("count,domain", [(1, "alarm_control_panel")])
"""Test if there are no panels -> no creation.""" @pytest.mark.parametrize(
await setup.async_setup_component( "config",
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",
{ {
"alarm_control_panel": { "alarm_control_panel": {
"platform": "template", "platform": "template",
@ -398,23 +289,20 @@ async def test_name(hass):
}, },
} }
}, },
],
) )
async def test_name(hass, start_ha):
await hass.async_block_till_done() """Test the accessibility of the name attribute."""
await hass.async_start() state = hass.states.get(TEMPLATE_NAME)
await hass.async_block_till_done()
state = hass.states.get("alarm_control_panel.test_template_panel")
assert state is not None assert state is not None
assert state.attributes.get("friendly_name") == "Template Alarm Panel" 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")])
"""Test arm home action.""" @pytest.mark.parametrize(
await setup.async_setup_component( "config,func",
hass, [
"alarm_control_panel", (
{ {
"alarm_control_panel": { "alarm_control_panel": {
"platform": "template", "platform": "template",
@ -441,27 +329,9 @@ async def test_arm_home_action(hass):
}, },
} }
}, },
) common.async_alarm_arm_home,
),
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
async def test_arm_away_action(hass):
"""Test arm away action."""
await setup.async_setup_component(
hass,
"alarm_control_panel",
{ {
"alarm_control_panel": { "alarm_control_panel": {
"platform": "template", "platform": "template",
@ -486,29 +356,11 @@ async def test_arm_away_action(hass):
}, },
} }
}, },
}
}, },
) },
common.async_alarm_arm_away,
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": { "alarm_control_panel": {
"platform": "template", "platform": "template",
@ -535,27 +387,9 @@ async def test_arm_night_action(hass):
}, },
} }
}, },
) common.async_alarm_arm_night,
),
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": { "alarm_control_panel": {
"platform": "template", "platform": "template",
@ -582,27 +416,21 @@ async def test_disarm_action(hass):
}, },
} }
}, },
common.async_alarm_disarm,
),
],
) )
async def test_arm_home_action(hass, func, start_ha, calls):
"""Test arm home action."""
await func(hass, entity_id=TEMPLATE_NAME)
await hass.async_block_till_done() await hass.async_block_till_done()
await hass.async_start() assert len(calls) == 1
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): @pytest.mark.parametrize("count,domain", [(1, "alarm_control_panel")])
"""Test unique_id option only creates one alarm control panel per id.""" @pytest.mark.parametrize(
await setup.async_setup_component( "config",
hass, [
"alarm_control_panel",
{ {
"alarm_control_panel": { "alarm_control_panel": {
"platform": "template", "platform": "template",
@ -618,10 +446,8 @@ async def test_unique_id(hass):
}, },
}, },
}, },
],
) )
async def test_unique_id(hass, start_ha):
await hass.async_block_till_done() """Test unique_id option only creates one alarm control panel per id."""
await hass.async_start()
await hass.async_block_till_done()
assert len(hass.states.async_all()) == 1 assert len(hass.states.async_all()) == 1