1
0
mirror of https://github.com/home-assistant/core.git synced 2026-05-17 14:01:34 +01:00
Files
core/tests/components/evohome/test_button.py
T

133 lines
3.7 KiB
Python

"""The tests for the button platform of evohome.
All evohome systems have a controller and at least one zone.
"""
from __future__ import annotations
from collections.abc import Callable
from unittest.mock import MagicMock, patch
from evohomeasync2 import ControlSystem, EvohomeClient, HotWater, Zone
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant.components.button import DOMAIN as BUTTON_DOMAIN, SERVICE_PRESS
from homeassistant.const import ATTR_ENTITY_ID, Platform
from homeassistant.core import HomeAssistant
from .const import TEST_INSTALLS
@pytest.fixture
def system_button_id(
evohome: MagicMock, entity_id: Callable[[Platform, str], str]
) -> str:
"""Return the entity_id of the system reset button."""
evo: EvohomeClient = evohome.return_value
tcs: ControlSystem = evo.tcs
return entity_id(Platform.BUTTON, f"{tcs.id}_reset")
@pytest.fixture
def dhw_button_id(evohome: MagicMock, entity_id: Callable[[Platform, str], str]) -> str:
"""Return the entity_id of the DHW reset button."""
evo: EvohomeClient = evohome.return_value
dhw: HotWater | None = evo.tcs.hotwater
assert dhw is not None, "Fixture has no DHW zone"
return entity_id(Platform.BUTTON, f"{dhw.id}_reset")
@pytest.fixture
def zone_button_id(
evohome: MagicMock, entity_id: Callable[[Platform, str], str]
) -> str:
"""Return the entity_id of the first zone's reset button."""
evo: EvohomeClient = evohome.return_value
tcs: ControlSystem = evo.tcs
zone: Zone = evo.tcs.zones[0]
return entity_id(
Platform.BUTTON,
f"{zone.id}z_reset" if zone.id == tcs.id else f"{zone.id}_reset",
)
@pytest.mark.parametrize("install", [*TEST_INSTALLS, "botched"])
@pytest.mark.usefixtures("evohome")
async def test_setup_platform(
hass: HomeAssistant,
snapshot: SnapshotAssertion,
) -> None:
"""Test that button entities are created after setup of evohome."""
button_states = hass.states.async_all(BUTTON_DOMAIN)
assert button_states
for x in button_states:
assert x == snapshot(name=f"{x.entity_id}-state")
@pytest.mark.parametrize("install", ["default"])
@pytest.mark.usefixtures("evohome")
async def test_system_reset_button_press(
hass: HomeAssistant,
system_button_id: str,
) -> None:
"""Test SERVICE_PRESS on the system reset button."""
with patch("evohomeasync2.control_system.ControlSystem.reset") as mock_fcn:
await hass.services.async_call(
BUTTON_DOMAIN,
SERVICE_PRESS,
{ATTR_ENTITY_ID: system_button_id},
blocking=True,
)
mock_fcn.assert_awaited_once_with()
@pytest.mark.parametrize("install", ["default"])
@pytest.mark.usefixtures("evohome")
async def test_zone_reset_button_press(
hass: HomeAssistant,
zone_button_id: str,
) -> None:
"""Test SERVICE_PRESS on a zone reset button."""
with patch("evohomeasync2.zone.Zone.reset") as mock_fcn:
await hass.services.async_call(
BUTTON_DOMAIN,
SERVICE_PRESS,
{ATTR_ENTITY_ID: zone_button_id},
blocking=True,
)
mock_fcn.assert_awaited_once_with()
@pytest.mark.parametrize("install", ["default"])
@pytest.mark.usefixtures("evohome")
async def test_dhw_reset_button_press(
hass: HomeAssistant,
dhw_button_id: str,
) -> None:
"""Test SERVICE_PRESS on the DHW reset button."""
with patch("evohomeasync2.hotwater.HotWater.reset") as mock_fcn:
await hass.services.async_call(
BUTTON_DOMAIN,
SERVICE_PRESS,
{ATTR_ENTITY_ID: dhw_button_id},
blocking=True,
)
mock_fcn.assert_awaited_once_with()