210 lines
6.8 KiB
Python
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 == {}
|