1
0
mirror of https://github.com/home-assistant/core.git synced 2026-08-06 13:26:29 +01:00
Files
core/tests/components/melcloud/test_climate.py
T
Ivan Milchev a3389a0d73 Melcloud atw on/off capability (#177119)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 20:38:08 +02:00

151 lines
4.8 KiB
Python

"""Test the MELCloud climate platform."""
from typing import Any
from unittest.mock import MagicMock
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant.components.climate import (
DOMAIN as CLIMATE_DOMAIN,
SERVICE_SET_HVAC_MODE,
SERVICE_TURN_OFF,
SERVICE_TURN_ON,
HVACMode,
)
from homeassistant.const import ATTR_ENTITY_ID, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from . import setup_platform
from tests.common import MockConfigEntry, snapshot_platform
ZONE_CLIMATE_ENTITY = "climate.ecodan_zone_1"
HEAT_ONLY_MODES = ["heat-thermostat", "heat-flow", "curve"]
HEAT_COOL_MODES = [
"heat-thermostat",
"heat-flow",
"curve",
"cool-thermostat",
"cool-flow",
]
@pytest.mark.usefixtures("entity_registry_enabled_by_default", "mock_get_devices")
async def test_all_entities(
hass: HomeAssistant,
snapshot: SnapshotAssertion,
mock_config_entry: MockConfigEntry,
entity_registry: er.EntityRegistry,
) -> None:
"""Test all climate entities with snapshot."""
await setup_platform(hass, mock_config_entry, [Platform.CLIMATE])
await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)
@pytest.mark.parametrize(
("operation_modes", "expected_hvac_modes"),
[
(HEAT_ONLY_MODES, [HVACMode.OFF, HVACMode.HEAT]),
(HEAT_COOL_MODES, [HVACMode.OFF, HVACMode.HEAT, HVACMode.COOL]),
],
)
@pytest.mark.usefixtures("mock_get_devices")
async def test_hvac_modes(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_atw_device: MagicMock,
operation_modes: list[str],
expected_hvac_modes: list[HVACMode],
) -> None:
"""The hvac modes reflect the zone's heating/cooling capability."""
mock_atw_device.zones[0].operation_modes = operation_modes
await setup_platform(hass, mock_config_entry, [Platform.CLIMATE])
state = hass.states.get(ZONE_CLIMATE_ENTITY)
assert state is not None
assert state.attributes["hvac_modes"] == expected_hvac_modes
@pytest.mark.parametrize(
("service", "service_data", "expected_power"),
[
(SERVICE_TURN_ON, {}, True),
(SERVICE_TURN_OFF, {}, False),
(SERVICE_SET_HVAC_MODE, {"hvac_mode": HVACMode.OFF}, False),
],
)
@pytest.mark.usefixtures("mock_get_devices")
async def test_power(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_atw_device: MagicMock,
service: str,
service_data: dict[str, Any],
expected_power: bool,
) -> None:
"""Turning the zone on/off toggles the device power."""
await setup_platform(hass, mock_config_entry, [Platform.CLIMATE])
await hass.services.async_call(
CLIMATE_DOMAIN,
service,
{ATTR_ENTITY_ID: ZONE_CLIMATE_ENTITY, **service_data},
blocking=True,
)
mock_atw_device.set.assert_awaited_with({"power": expected_power})
@pytest.mark.parametrize(
("current_mode", "hvac_mode", "expected_mode"),
[
("heat-flow", HVACMode.HEAT, "heat-flow"),
("heat-flow", HVACMode.COOL, "cool-flow"),
("heat-thermostat", HVACMode.COOL, "cool-thermostat"),
("curve", HVACMode.COOL, "cool-thermostat"),
("cool-flow", HVACMode.HEAT, "heat-flow"),
("cool-thermostat", HVACMode.HEAT, "heat-thermostat"),
],
)
@pytest.mark.usefixtures("mock_get_devices")
async def test_set_hvac_mode(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_atw_device: MagicMock,
current_mode: str,
hvac_mode: HVACMode,
expected_mode: str,
) -> None:
"""Setting a direction selects the operation mode, preserving the method."""
zone = mock_atw_device.zones[0]
zone.operation_modes = HEAT_COOL_MODES
zone.operation_mode = current_mode
await setup_platform(hass, mock_config_entry, [Platform.CLIMATE])
await hass.services.async_call(
CLIMATE_DOMAIN,
SERVICE_SET_HVAC_MODE,
{ATTR_ENTITY_ID: ZONE_CLIMATE_ENTITY, "hvac_mode": hvac_mode},
blocking=True,
)
zone.set_operation_mode.assert_awaited_once_with(expected_mode)
mock_atw_device.set.assert_not_called()
@pytest.mark.usefixtures("mock_get_devices")
async def test_set_hvac_mode_powers_on_when_off(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_atw_device: MagicMock,
) -> None:
"""Setting a direction while powered off also powers on."""
mock_atw_device.power = False
await setup_platform(hass, mock_config_entry, [Platform.CLIMATE])
await hass.services.async_call(
CLIMATE_DOMAIN,
SERVICE_SET_HVAC_MODE,
{ATTR_ENTITY_ID: ZONE_CLIMATE_ENTITY, "hvac_mode": HVACMode.HEAT},
blocking=True,
)
mock_atw_device.zones[0].set_operation_mode.assert_awaited_once_with("heat-flow")
mock_atw_device.set.assert_awaited_with({"power": True})