core/tests/components/sensibo/test_switch.py

283 lines
7.4 KiB
Python

"""The test for the sensibo switch platform."""
from __future__ import annotations
from datetime import timedelta
from unittest.mock import MagicMock
from freezegun.api import FrozenDateTimeFactory
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
ATTR_ENTITY_ID,
SERVICE_TURN_OFF,
SERVICE_TURN_ON,
STATE_OFF,
STATE_ON,
Platform,
)
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import entity_registry as er
from tests.common import async_fire_time_changed, snapshot_platform
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
@pytest.mark.parametrize(
"load_platforms",
[[Platform.SWITCH]],
)
async def test_switch(
hass: HomeAssistant,
load_int: ConfigEntry,
entity_registry: er.EntityRegistry,
snapshot: SnapshotAssertion,
) -> None:
"""Test the Sensibo switch."""
await snapshot_platform(hass, entity_registry, snapshot, load_int.entry_id)
async def test_switch_timer(
hass: HomeAssistant,
load_int: ConfigEntry,
mock_client: MagicMock,
freezer: FrozenDateTimeFactory,
) -> None:
"""Test the Sensibo switch timer."""
state = hass.states.get("switch.hallway_timer")
assert state.state == STATE_OFF
assert state.attributes["id"] is None
assert state.attributes["turn_on"] is None
mock_client.async_set_timer.return_value = {
"status": "success",
"result": {"id": "SzTGE4oZ4D"},
}
await hass.services.async_call(
SWITCH_DOMAIN,
SERVICE_TURN_ON,
{
ATTR_ENTITY_ID: state.entity_id,
},
blocking=True,
)
mock_client.async_get_devices_data.return_value.parsed["ABC999111"].timer_on = True
mock_client.async_get_devices_data.return_value.parsed[
"ABC999111"
].timer_id = "SzTGE4oZ4D"
mock_client.async_get_devices_data.return_value.parsed[
"ABC999111"
].timer_state_on = False
freezer.tick(timedelta(minutes=5))
async_fire_time_changed(hass)
await hass.async_block_till_done()
state = hass.states.get("switch.hallway_timer")
assert state.state == STATE_ON
assert state.attributes["id"] == "SzTGE4oZ4D"
assert state.attributes["turn_on"] is False
mock_client.async_del_timer.return_value = {
"status": "success",
"result": {"id": "SzTGE4oZ4D"},
}
await hass.services.async_call(
SWITCH_DOMAIN,
SERVICE_TURN_OFF,
{
ATTR_ENTITY_ID: state.entity_id,
},
blocking=True,
)
mock_client.async_get_devices_data.return_value.parsed["ABC999111"].timer_on = False
freezer.tick(timedelta(minutes=5))
async_fire_time_changed(hass)
await hass.async_block_till_done()
state = hass.states.get("switch.hallway_timer")
assert state.state == STATE_OFF
async def test_switch_pure_boost(
hass: HomeAssistant,
load_int: ConfigEntry,
mock_client: MagicMock,
freezer: FrozenDateTimeFactory,
) -> None:
"""Test the Sensibo switch pure boost."""
state = hass.states.get("switch.kitchen_pure_boost")
assert state.state == STATE_OFF
mock_client.async_set_pureboost.return_value = {"status": "success"}
await hass.services.async_call(
SWITCH_DOMAIN,
SERVICE_TURN_ON,
{
ATTR_ENTITY_ID: state.entity_id,
},
blocking=True,
)
mock_client.async_get_devices_data.return_value.parsed[
"AAZZAAZZ"
].pure_boost_enabled = True
mock_client.async_get_devices_data.return_value.parsed[
"AAZZAAZZ"
].pure_measure_integration = None
freezer.tick(timedelta(minutes=5))
async_fire_time_changed(hass)
await hass.async_block_till_done()
state = hass.states.get("switch.kitchen_pure_boost")
assert state.state == STATE_ON
await hass.services.async_call(
SWITCH_DOMAIN,
SERVICE_TURN_OFF,
{
ATTR_ENTITY_ID: state.entity_id,
},
blocking=True,
)
mock_client.async_get_devices_data.return_value.parsed[
"AAZZAAZZ"
].pure_boost_enabled = False
freezer.tick(timedelta(minutes=5))
async_fire_time_changed(hass)
await hass.async_block_till_done()
state = hass.states.get("switch.kitchen_pure_boost")
assert state.state == STATE_OFF
async def test_switch_command_failure(
hass: HomeAssistant, load_int: ConfigEntry, mock_client: MagicMock
) -> None:
"""Test the Sensibo switch fails commands."""
state = hass.states.get("switch.hallway_timer")
mock_client.async_set_timer.return_value = {"status": "failure"}
with pytest.raises(
HomeAssistantError,
):
await hass.services.async_call(
SWITCH_DOMAIN,
SERVICE_TURN_ON,
{
ATTR_ENTITY_ID: state.entity_id,
},
blocking=True,
)
mock_client.async_del_timer.return_value = {"status": "failure"}
with pytest.raises(
HomeAssistantError,
):
await hass.services.async_call(
SWITCH_DOMAIN,
SERVICE_TURN_OFF,
{
ATTR_ENTITY_ID: state.entity_id,
},
blocking=True,
)
async def test_switch_climate_react(
hass: HomeAssistant,
load_int: ConfigEntry,
mock_client: MagicMock,
freezer: FrozenDateTimeFactory,
) -> None:
"""Test the Sensibo switch for climate react."""
state = hass.states.get("switch.hallway_climate_react")
assert state.state == STATE_OFF
mock_client.async_enable_climate_react.return_value = {"status": "success"}
await hass.services.async_call(
SWITCH_DOMAIN,
SERVICE_TURN_ON,
{
ATTR_ENTITY_ID: state.entity_id,
},
blocking=True,
)
mock_client.async_get_devices_data.return_value.parsed["ABC999111"].smart_on = True
freezer.tick(timedelta(minutes=5))
async_fire_time_changed(hass)
await hass.async_block_till_done()
state = hass.states.get("switch.hallway_climate_react")
assert state.state == STATE_ON
await hass.services.async_call(
SWITCH_DOMAIN,
SERVICE_TURN_OFF,
{
ATTR_ENTITY_ID: state.entity_id,
},
blocking=True,
)
mock_client.async_get_devices_data.return_value.parsed["ABC999111"].smart_on = False
freezer.tick(timedelta(minutes=5))
async_fire_time_changed(hass)
await hass.async_block_till_done()
state = hass.states.get("switch.hallway_climate_react")
assert state.state == STATE_OFF
async def test_switch_climate_react_no_data(
hass: HomeAssistant,
load_int: ConfigEntry,
mock_client: MagicMock,
freezer: FrozenDateTimeFactory,
) -> None:
"""Test the Sensibo switch for climate react with no data."""
mock_client.async_get_devices_data.return_value.parsed[
"ABC999111"
].smart_type = None
freezer.tick(timedelta(minutes=5))
async_fire_time_changed(hass)
await hass.async_block_till_done()
state = hass.states.get("switch.hallway_climate_react")
assert state.state == STATE_OFF
with pytest.raises(HomeAssistantError):
await hass.services.async_call(
SWITCH_DOMAIN,
SERVICE_TURN_ON,
{
ATTR_ENTITY_ID: state.entity_id,
},
blocking=True,
)