core/tests/components/evohome/test_water_heater.py

210 lines
6.8 KiB
Python

"""The tests for water_heater entities of evohome.
Not all evohome systems will have a DHW zone.
"""
from __future__ import annotations
from unittest.mock import patch
from freezegun.api import FrozenDateTimeFactory
import pytest
from syrupy import SnapshotAssertion
from homeassistant.components.evohome import DOMAIN
from homeassistant.components.evohome.coordinator import EvoBroker
from homeassistant.components.evohome.water_heater import EvoDHW
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from homeassistant.helpers.entity_component import EntityComponent
from .conftest import setup_evohome
from .const import TEST_INSTALLS_WITH_DHW
def get_dhw_entity(hass: HomeAssistant) -> EvoDHW | None:
"""Return the DHW entity of the evohome system."""
broker: EvoBroker = hass.data[DOMAIN]["broker"]
if (dhw := broker.tcs.hotwater) is None:
return None
entity_registry = er.async_get(hass)
entity_id = entity_registry.async_get_entity_id(
Platform.WATER_HEATER, DOMAIN, dhw._id
)
component: EntityComponent = hass.data.get(Platform.WATER_HEATER) # type: ignore[assignment]
return next(e for e in component.entities if e.entity_id == entity_id) # type: ignore[return-value]
@pytest.mark.parametrize("install", TEST_INSTALLS_WITH_DHW)
async def test_set_operation_mode(
hass: HomeAssistant,
config: dict[str, str],
install: str,
freezer: FrozenDateTimeFactory,
snapshot: SnapshotAssertion,
) -> None:
"""Test water_heater services of a evohome-compatible DHW zone."""
freezer.move_to("2024-07-10T11:55:00Z")
results = []
async for _ in setup_evohome(hass, config, install=install):
dhw = get_dhw_entity(hass)
# set_operation_mode(auto): FollowSchedule
with patch("evohomeasync2.hotwater.HotWater._set_mode") as mock_fcn:
await dhw.async_set_operation_mode("auto")
assert mock_fcn.await_count == 1
assert mock_fcn.await_args.args == (
{
"mode": "FollowSchedule",
"state": None,
"untilTime": None,
},
)
assert mock_fcn.await_args.kwargs == {}
# set_operation_mode(off): TemporaryOverride, advanced
with patch("evohomeasync2.hotwater.HotWater._set_mode") as mock_fcn:
await dhw.async_set_operation_mode("off")
assert mock_fcn.await_count == 1
assert install != "default" or mock_fcn.await_args.args == (
{
"mode": "TemporaryOverride",
"state": "Off",
"untilTime": "2024-07-10T12:00:00Z", # varies by install
},
)
assert mock_fcn.await_args.kwargs == {}
results.append(mock_fcn.await_args.args)
# set_operation_mode(on): TemporaryOverride, advanced
with patch("evohomeasync2.hotwater.HotWater._set_mode") as mock_fcn:
await dhw.async_set_operation_mode("on")
assert mock_fcn.await_count == 1
assert install != "default" or mock_fcn.await_args.args == (
{
"mode": "TemporaryOverride",
"state": "On",
"untilTime": "2024-07-10T12:00:00Z", # varies by install
},
)
assert mock_fcn.await_args.kwargs == {}
results.append(mock_fcn.await_args.args)
assert results == snapshot
@pytest.mark.parametrize("install", TEST_INSTALLS_WITH_DHW)
async def test_turn_away_mode_off(
hass: HomeAssistant,
config: dict[str, str],
install: str,
) -> None:
"""Test water_heater services of a evohome-compatible DHW zone."""
async for _ in setup_evohome(hass, config, install=install):
dhw = get_dhw_entity(hass)
# turn_away_mode_off(): FollowSchedule
with patch("evohomeasync2.hotwater.HotWater._set_mode") as mock_fcn:
await dhw.async_turn_away_mode_off()
assert mock_fcn.await_count == 1
assert mock_fcn.await_args.args == (
{
"mode": "FollowSchedule",
"state": None,
"untilTime": None,
},
)
assert mock_fcn.await_args.kwargs == {}
@pytest.mark.parametrize("install", TEST_INSTALLS_WITH_DHW)
async def test_turn_away_mode_on(
hass: HomeAssistant,
config: dict[str, str],
install: str,
) -> None:
"""Test water_heater services of a evohome-compatible DHW zone."""
async for _ in setup_evohome(hass, config, install=install):
dhw = get_dhw_entity(hass)
# turn_away_mode_on(): PermanentOverride, Off
with patch("evohomeasync2.hotwater.HotWater._set_mode") as mock_fcn:
await dhw.async_turn_away_mode_on()
assert mock_fcn.await_count == 1
assert mock_fcn.await_args.args == (
{
"mode": "PermanentOverride",
"state": "Off",
"untilTime": None,
},
)
assert mock_fcn.await_args.kwargs == {}
@pytest.mark.parametrize("install", TEST_INSTALLS_WITH_DHW)
async def test_turn_off(
hass: HomeAssistant,
config: dict[str, str],
install: str,
) -> None:
"""Test water_heater services of a evohome-compatible DHW zone."""
async for _ in setup_evohome(hass, config, install=install):
dhw = get_dhw_entity(hass)
# turn_off(): PermanentOverride, Off
with patch("evohomeasync2.hotwater.HotWater._set_mode") as mock_fcn:
await dhw.async_turn_off()
assert mock_fcn.await_count == 1
assert mock_fcn.await_args.args == (
{
"mode": "PermanentOverride",
"state": "Off",
"untilTime": None,
},
)
assert mock_fcn.await_args.kwargs == {}
@pytest.mark.parametrize("install", TEST_INSTALLS_WITH_DHW)
async def test_turn_on(
hass: HomeAssistant,
config: dict[str, str],
install: str,
) -> None:
"""Test water_heater services of a evohome-compatible DHW zone."""
async for _ in setup_evohome(hass, config, install=install):
dhw = get_dhw_entity(hass)
# turn_on(): PermanentOverride, On
with patch("evohomeasync2.hotwater.HotWater._set_mode") as mock_fcn:
await dhw.async_turn_on()
assert mock_fcn.await_count == 1
assert mock_fcn.await_args.args == (
{
"mode": "PermanentOverride",
"state": "On",
"untilTime": None,
},
)
assert mock_fcn.await_args.kwargs == {}