-
-
Notifications
You must be signed in to change notification settings - Fork 30.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add tests for evohome water_heater entities (#127611)
* initial commit * move get_entity* helper to test * parameterize with TEST_INSTALLS_WITH_DHW * remove if from tests
- Loading branch information
Showing
3 changed files
with
230 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
# serializer version: 1 | ||
# name: test_set_operation_mode[default] | ||
list([ | ||
tuple( | ||
dict({ | ||
'mode': <ZoneMode.TEMPORARY_OVERRIDE: 'TemporaryOverride'>, | ||
'state': <DhwState.OFF: 'Off'>, | ||
'untilTime': '2024-07-10T12:00:00Z', | ||
}), | ||
), | ||
tuple( | ||
dict({ | ||
'mode': <ZoneMode.TEMPORARY_OVERRIDE: 'TemporaryOverride'>, | ||
'state': <DhwState.ON: 'On'>, | ||
'untilTime': '2024-07-10T12:00:00Z', | ||
}), | ||
), | ||
]) | ||
# --- |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,209 @@ | ||
"""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 == {} |