mirror of
https://github.com/home-assistant/core.git
synced 2026-08-06 13:26:29 +01:00
a3389a0d73
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
151 lines
4.8 KiB
Python
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})
|