mirror of
https://github.com/home-assistant/core.git
synced 2026-02-21 18:38:17 +00:00
Signed-off-by: JP-Ellis <josh@jpellis.me> Co-authored-by: Joostlek <joostlek@outlook.com>
263 lines
8.1 KiB
Python
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
|