1
0
mirror of https://github.com/home-assistant/core.git synced 2026-02-21 10:27:52 +00:00
Files
core/tests/components/izone/test_climate.py
JP-Ellis 2830221820 Allow control on missing izone thermometer (#155826)
Signed-off-by: JP-Ellis <josh@jpellis.me>
Co-authored-by: Joostlek <joostlek@outlook.com>
2026-01-26 18:34:56 +01:00

263 lines
8.1 KiB
Python

"""Tests for iZone climate platform."""
from unittest.mock import AsyncMock
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant.components.climate import ClimateEntityFeature
from homeassistant.core import HomeAssistant
import homeassistant.helpers.entity_registry as er
from . import setup_controller, setup_integration
from .conftest import create_mock_controller, create_mock_zone
from tests.common import MockConfigEntry, snapshot_platform
async def test_basic_controller_properties(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_discovery: AsyncMock,
mock_controller: AsyncMock,
entity_registry: er.EntityRegistry,
snapshot: SnapshotAssertion,
) -> None:
"""Test basic properties of ControllerDevice."""
await setup_integration(hass, mock_config_entry)
await setup_controller(hass, mock_discovery, mock_controller)
await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)
entity_id = "climate.izone_controller_test_controller_123"
entity = hass.states.get(entity_id)
assert entity is not None
assert (
entity.attributes["supported_features"]
& ClimateEntityFeature.TARGET_TEMPERATURE
) != ClimateEntityFeature.TARGET_TEMPERATURE
@pytest.mark.parametrize(
"mock_controller",
[
create_mock_controller(
ras_mode="RAS",
)
],
)
async def test_target_temperature_feature_ras_mode(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_discovery: AsyncMock,
mock_controller: AsyncMock,
) -> None:
"""Test TARGET_TEMPERATURE feature enabled in RAS mode."""
await setup_integration(hass, mock_config_entry)
await setup_controller(hass, mock_discovery, mock_controller)
entity_id = "climate.izone_controller_test_controller_123"
entity = hass.states.get(entity_id)
assert entity is not None
assert (
entity.attributes["supported_features"]
& ClimateEntityFeature.TARGET_TEMPERATURE
) == ClimateEntityFeature.TARGET_TEMPERATURE
@pytest.mark.parametrize(
"mock_controller",
[
create_mock_controller(
zone_ctrl=13, # Greater than zones_total (4)
zones_total=4,
)
],
)
async def test_target_temperature_feature_master_mode_invalid_zone(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_discovery: AsyncMock,
mock_controller: AsyncMock,
) -> None:
"""Test TARGET_TEMPERATURE feature enabled when control zone is invalid."""
await setup_integration(hass, mock_config_entry)
await setup_controller(hass, mock_discovery, mock_controller)
entity_id = "climate.izone_controller_test_controller_123"
entity = hass.states.get(entity_id)
assert entity is not None
assert (
entity.attributes["supported_features"]
& ClimateEntityFeature.TARGET_TEMPERATURE
) == ClimateEntityFeature.TARGET_TEMPERATURE
@pytest.mark.parametrize(
("mock_controller", "mock_zones"),
[
(
create_mock_controller(
zone_ctrl=1, # Valid zone
zones_total=2,
),
[
create_mock_zone(index=0, name="Living Room", temp_current=22.5),
create_mock_zone(
index=1, name="Bedroom", temp_current=None
), # No sensor
],
)
],
)
async def test_target_temperature_feature_zone_without_sensor(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_discovery: AsyncMock,
mock_controller: AsyncMock,
) -> None:
"""Test TARGET_TEMPERATURE feature enabled when any zone lacks temperature sensor."""
await setup_integration(hass, mock_config_entry)
await setup_controller(hass, mock_discovery, mock_controller)
entity_id = "climate.izone_controller_test_controller_123"
entity = hass.states.get(entity_id)
assert entity is not None
assert (
entity.attributes["supported_features"]
& ClimateEntityFeature.TARGET_TEMPERATURE
) == ClimateEntityFeature.TARGET_TEMPERATURE
@pytest.mark.parametrize(
("mock_controller", "mock_zones"),
[
(
create_mock_controller(
zones_total=3,
),
[
create_mock_zone(index=0, name="Zone 1", temp_current=22.5),
create_mock_zone(index=1, name="Zone 2", temp_current=23.0),
create_mock_zone(index=2, name="Zone 3", temp_current=21.5),
],
)
],
)
async def test_target_temperature_feature_all_zones_with_sensors(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_discovery: AsyncMock,
mock_controller: AsyncMock,
) -> None:
"""Test TARGET_TEMPERATURE feature NOT enabled when all zones have sensors."""
await setup_integration(hass, mock_config_entry)
await setup_controller(hass, mock_discovery, mock_controller)
entity_id = "climate.izone_controller_test_controller_123"
entity = hass.states.get(entity_id)
assert entity is not None
# Should NOT have TARGET_TEMPERATURE feature
assert (
entity.attributes["supported_features"]
& ClimateEntityFeature.TARGET_TEMPERATURE
) != ClimateEntityFeature.TARGET_TEMPERATURE
@pytest.mark.parametrize(
("mock_controller", "mock_zones"),
[
(
create_mock_controller(
zones_total=3,
),
[
create_mock_zone(index=0, name="Zone 1", temp_current=22.5),
create_mock_zone(index=1, name="Zone 2", temp_current=None),
create_mock_zone(index=2, name="Zone 3", temp_current=21.5),
],
)
],
)
async def test_target_temperature_feature_multiple_zones_one_without_sensor(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_discovery: AsyncMock,
mock_controller: AsyncMock,
) -> None:
"""Test TARGET_TEMPERATURE feature enabled with multiple zones when one lacks sensor."""
await setup_integration(hass, mock_config_entry)
await setup_controller(hass, mock_discovery, mock_controller)
entity_id = "climate.izone_controller_test_controller_123"
entity = hass.states.get(entity_id)
assert entity is not None
assert (
entity.attributes["supported_features"]
& ClimateEntityFeature.TARGET_TEMPERATURE
) == ClimateEntityFeature.TARGET_TEMPERATURE
@pytest.mark.parametrize(
"mock_controller",
[
create_mock_controller(
ras_mode="slave",
)
],
)
async def test_target_temperature_feature_slave_mode(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_discovery: AsyncMock,
mock_controller: AsyncMock,
) -> None:
"""Test TARGET_TEMPERATURE feature NOT enabled in slave mode."""
await setup_integration(hass, mock_config_entry)
await setup_controller(hass, mock_discovery, mock_controller)
entity_id = "climate.izone_controller_test_controller_123"
entity = hass.states.get(entity_id)
assert entity is not None
# Should NOT have TARGET_TEMPERATURE feature
assert (
entity.attributes["supported_features"]
& ClimateEntityFeature.TARGET_TEMPERATURE
) != ClimateEntityFeature.TARGET_TEMPERATURE
@pytest.mark.parametrize(
"mock_controller",
[
create_mock_controller(
zone_ctrl=13,
zones_total=4,
)
],
)
async def test_target_temperature_feature_master_mode_zone_13(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_discovery: AsyncMock,
mock_controller: AsyncMock,
) -> None:
"""Test TARGET_TEMPERATURE feature enabled when control zone is 13 (master unit)."""
await setup_integration(hass, mock_config_entry)
await setup_controller(hass, mock_discovery, mock_controller)
entity_id = "climate.izone_controller_test_controller_123"
entity = hass.states.get(entity_id)
assert entity is not None
assert (
entity.attributes["supported_features"]
& ClimateEntityFeature.TARGET_TEMPERATURE
) == ClimateEntityFeature.TARGET_TEMPERATURE