233 lines
6.5 KiB
Python
233 lines
6.5 KiB
Python
"""The tests for climate entities of evohome.
|
|
|
|
All evohome systems have controllers and at least one zone.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from unittest.mock import patch
|
|
|
|
from freezegun.api import FrozenDateTimeFactory
|
|
import pytest
|
|
from syrupy import SnapshotAssertion
|
|
|
|
from homeassistant.components.climate import (
|
|
ATTR_HVAC_MODE,
|
|
ATTR_PRESET_MODE,
|
|
SERVICE_SET_HVAC_MODE,
|
|
SERVICE_SET_PRESET_MODE,
|
|
SERVICE_SET_TEMPERATURE,
|
|
HVACMode,
|
|
)
|
|
from homeassistant.const import (
|
|
ATTR_ENTITY_ID,
|
|
ATTR_TEMPERATURE,
|
|
SERVICE_TURN_OFF,
|
|
SERVICE_TURN_ON,
|
|
Platform,
|
|
)
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from .const import TEST_INSTALLS
|
|
|
|
|
|
@pytest.mark.parametrize("install", TEST_INSTALLS)
|
|
async def test_zone_set_hvac_mode(
|
|
hass: HomeAssistant,
|
|
zone_id: str,
|
|
snapshot: SnapshotAssertion,
|
|
) -> None:
|
|
"""Test SERVICE_SET_HVAC_MODE of an evohome zone Climate entity."""
|
|
|
|
results = []
|
|
|
|
# SERVICE_SET_HVAC_MODE: HVACMode.HEAT
|
|
with patch("evohomeasync2.zone.Zone.reset_mode") as mock_fcn:
|
|
await hass.services.async_call(
|
|
Platform.CLIMATE,
|
|
SERVICE_SET_HVAC_MODE,
|
|
{
|
|
ATTR_ENTITY_ID: zone_id,
|
|
ATTR_HVAC_MODE: HVACMode.HEAT,
|
|
},
|
|
blocking=True,
|
|
)
|
|
|
|
assert mock_fcn.await_count == 1
|
|
assert mock_fcn.await_args.args == ()
|
|
assert mock_fcn.await_args.kwargs == {}
|
|
|
|
# SERVICE_SET_HVAC_MODE: HVACMode.OFF
|
|
with patch("evohomeasync2.zone.Zone.set_temperature") as mock_fcn:
|
|
await hass.services.async_call(
|
|
Platform.CLIMATE,
|
|
SERVICE_SET_HVAC_MODE,
|
|
{
|
|
ATTR_ENTITY_ID: zone_id,
|
|
ATTR_HVAC_MODE: HVACMode.OFF,
|
|
},
|
|
blocking=True,
|
|
)
|
|
|
|
assert mock_fcn.await_count == 1
|
|
assert mock_fcn.await_args.args != () # minimum target temp
|
|
assert mock_fcn.await_args.kwargs == {"until": None}
|
|
|
|
results.append(mock_fcn.await_args.args)
|
|
|
|
assert results == snapshot
|
|
|
|
|
|
@pytest.mark.parametrize("install", TEST_INSTALLS)
|
|
async def test_zone_set_preset_mode(
|
|
hass: HomeAssistant,
|
|
zone_id: str,
|
|
freezer: FrozenDateTimeFactory,
|
|
snapshot: SnapshotAssertion,
|
|
) -> None:
|
|
"""Test SERVICE_SET_PRESET_MODE of an evohome zone Climate entity."""
|
|
|
|
freezer.move_to("2024-07-10T12:00:00Z")
|
|
results = []
|
|
|
|
# SERVICE_SET_PRESET_MODE: none
|
|
with patch("evohomeasync2.zone.Zone.reset_mode") as mock_fcn:
|
|
await hass.services.async_call(
|
|
Platform.CLIMATE,
|
|
SERVICE_SET_PRESET_MODE,
|
|
{
|
|
ATTR_ENTITY_ID: zone_id,
|
|
ATTR_PRESET_MODE: "none",
|
|
},
|
|
blocking=True,
|
|
)
|
|
|
|
assert mock_fcn.await_count == 1
|
|
assert mock_fcn.await_args.args == ()
|
|
assert mock_fcn.await_args.kwargs == {}
|
|
|
|
# SERVICE_SET_PRESET_MODE: permanent
|
|
with patch("evohomeasync2.zone.Zone.set_temperature") as mock_fcn:
|
|
await hass.services.async_call(
|
|
Platform.CLIMATE,
|
|
SERVICE_SET_PRESET_MODE,
|
|
{
|
|
ATTR_ENTITY_ID: zone_id,
|
|
ATTR_PRESET_MODE: "permanent",
|
|
},
|
|
blocking=True,
|
|
)
|
|
|
|
assert mock_fcn.await_count == 1
|
|
assert mock_fcn.await_args.args != () # current target temp
|
|
assert mock_fcn.await_args.kwargs == {"until": None}
|
|
|
|
results.append(mock_fcn.await_args.args)
|
|
|
|
# SERVICE_SET_PRESET_MODE: temporary
|
|
with patch("evohomeasync2.zone.Zone.set_temperature") as mock_fcn:
|
|
await hass.services.async_call(
|
|
Platform.CLIMATE,
|
|
SERVICE_SET_PRESET_MODE,
|
|
{
|
|
ATTR_ENTITY_ID: zone_id,
|
|
ATTR_PRESET_MODE: "temporary",
|
|
},
|
|
blocking=True,
|
|
)
|
|
|
|
assert mock_fcn.await_count == 1
|
|
assert mock_fcn.await_args.args != () # current target temp
|
|
assert mock_fcn.await_args.kwargs != {} # next setpoint dtm
|
|
|
|
results.append(mock_fcn.await_args.args)
|
|
results.append(mock_fcn.await_args.kwargs)
|
|
|
|
assert results == snapshot
|
|
|
|
|
|
@pytest.mark.parametrize("install", TEST_INSTALLS)
|
|
async def test_zone_set_temperature(
|
|
hass: HomeAssistant,
|
|
zone_id: str,
|
|
freezer: FrozenDateTimeFactory,
|
|
snapshot: SnapshotAssertion,
|
|
) -> None:
|
|
"""Test SERVICE_SET_TEMPERATURE of an evohome zone Climate entity."""
|
|
|
|
freezer.move_to("2024-07-10T12:00:00Z")
|
|
results = []
|
|
|
|
# SERVICE_SET_TEMPERATURE: temperature
|
|
with patch("evohomeasync2.zone.Zone.set_temperature") as mock_fcn:
|
|
await hass.services.async_call(
|
|
Platform.CLIMATE,
|
|
SERVICE_SET_TEMPERATURE,
|
|
{
|
|
ATTR_ENTITY_ID: zone_id,
|
|
ATTR_TEMPERATURE: 19.1,
|
|
},
|
|
blocking=True,
|
|
)
|
|
|
|
assert mock_fcn.await_count == 1
|
|
assert mock_fcn.await_args.args == (19.1,)
|
|
assert mock_fcn.await_args.kwargs != {} # next setpoint dtm
|
|
|
|
results.append(mock_fcn.await_args.kwargs)
|
|
|
|
assert results == snapshot
|
|
|
|
|
|
@pytest.mark.parametrize("install", TEST_INSTALLS)
|
|
async def test_zone_turn_off(
|
|
hass: HomeAssistant,
|
|
zone_id: str,
|
|
snapshot: SnapshotAssertion,
|
|
) -> None:
|
|
"""Test SERVICE_TURN_OFF of a evohome zone Climate entity."""
|
|
|
|
results = []
|
|
|
|
# SERVICE_TURN_OFF
|
|
with patch("evohomeasync2.zone.Zone.set_temperature") as mock_fcn:
|
|
await hass.services.async_call(
|
|
Platform.CLIMATE,
|
|
SERVICE_TURN_OFF,
|
|
{
|
|
ATTR_ENTITY_ID: zone_id,
|
|
},
|
|
blocking=True,
|
|
)
|
|
|
|
assert mock_fcn.await_count == 1
|
|
assert mock_fcn.await_args.args != () # minimum target temp
|
|
assert mock_fcn.await_args.kwargs == {"until": None}
|
|
|
|
results.append(mock_fcn.await_args.args)
|
|
|
|
assert results == snapshot
|
|
|
|
|
|
@pytest.mark.parametrize("install", TEST_INSTALLS)
|
|
async def test_zone_turn_on(
|
|
hass: HomeAssistant,
|
|
zone_id: str,
|
|
) -> None:
|
|
"""Test SERVICE_TURN_ON of a evohome zone Climate entity."""
|
|
|
|
# SERVICE_TURN_ON
|
|
with patch("evohomeasync2.zone.Zone.reset_mode") as mock_fcn:
|
|
await hass.services.async_call(
|
|
Platform.CLIMATE,
|
|
SERVICE_TURN_ON,
|
|
{
|
|
ATTR_ENTITY_ID: zone_id,
|
|
},
|
|
blocking=True,
|
|
)
|
|
|
|
assert mock_fcn.await_count == 1
|
|
assert mock_fcn.await_args.args == ()
|
|
assert mock_fcn.await_args.kwargs == {}
|