Climate validate temperature(s) out of range (#118649)
* Climate temperature out of range * Fix test sensibo * use temp converting for min/max * Fix * Fix mqtt tests * Fix honeywell tests * Fix Balboa tests * Fix whirlpool test * Fix teslemetry test * Fix plugwise test * Fix tplink test * Fix generic thermostat test * Fix modbus test * Fix fritzbox tests * Honewell
This commit is contained in:
parent
ae9e8ca419
commit
a913587eb6
17 changed files with 245 additions and 69 deletions
|
@ -4,6 +4,7 @@ from __future__ import annotations
|
|||
|
||||
from enum import Enum
|
||||
from types import ModuleType
|
||||
from typing import Any
|
||||
from unittest.mock import MagicMock, Mock, patch
|
||||
|
||||
import pytest
|
||||
|
@ -17,9 +18,14 @@ from homeassistant.components.climate import (
|
|||
HVACMode,
|
||||
)
|
||||
from homeassistant.components.climate.const import (
|
||||
ATTR_CURRENT_TEMPERATURE,
|
||||
ATTR_FAN_MODE,
|
||||
ATTR_MAX_TEMP,
|
||||
ATTR_MIN_TEMP,
|
||||
ATTR_PRESET_MODE,
|
||||
ATTR_SWING_MODE,
|
||||
ATTR_TARGET_TEMP_HIGH,
|
||||
ATTR_TARGET_TEMP_LOW,
|
||||
SERVICE_SET_FAN_MODE,
|
||||
SERVICE_SET_PRESET_MODE,
|
||||
SERVICE_SET_SWING_MODE,
|
||||
|
@ -27,7 +33,13 @@ from homeassistant.components.climate.const import (
|
|||
ClimateEntityFeature,
|
||||
)
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.const import SERVICE_TURN_OFF, SERVICE_TURN_ON, UnitOfTemperature
|
||||
from homeassistant.const import (
|
||||
ATTR_TEMPERATURE,
|
||||
PRECISION_WHOLE,
|
||||
SERVICE_TURN_OFF,
|
||||
SERVICE_TURN_ON,
|
||||
UnitOfTemperature,
|
||||
)
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.exceptions import ServiceValidationError
|
||||
from homeassistant.helpers import issue_registry as ir
|
||||
|
@ -1152,3 +1164,127 @@ async def test_no_issue_no_aux_property(
|
|||
"the auxiliary heater methods in a subclass of ClimateEntity which is deprecated "
|
||||
"and will be unsupported from Home Assistant 2024.10."
|
||||
) not in caplog.text
|
||||
|
||||
|
||||
async def test_temperature_validation(
|
||||
hass: HomeAssistant, config_flow_fixture: None
|
||||
) -> None:
|
||||
"""Test validation for temperatures."""
|
||||
|
||||
class MockClimateEntityTemp(MockClimateEntity):
|
||||
"""Mock climate class with mocked aux heater."""
|
||||
|
||||
_attr_supported_features = (
|
||||
ClimateEntityFeature.FAN_MODE
|
||||
| ClimateEntityFeature.PRESET_MODE
|
||||
| ClimateEntityFeature.SWING_MODE
|
||||
| ClimateEntityFeature.TARGET_TEMPERATURE
|
||||
| ClimateEntityFeature.TARGET_TEMPERATURE_RANGE
|
||||
)
|
||||
_attr_target_temperature = 15
|
||||
_attr_target_temperature_high = 18
|
||||
_attr_target_temperature_low = 10
|
||||
_attr_target_temperature_step = PRECISION_WHOLE
|
||||
|
||||
def set_temperature(self, **kwargs: Any) -> None:
|
||||
"""Set new target temperature."""
|
||||
if ATTR_TEMPERATURE in kwargs:
|
||||
self._attr_target_temperature = kwargs[ATTR_TEMPERATURE]
|
||||
if ATTR_TARGET_TEMP_HIGH in kwargs:
|
||||
self._attr_target_temperature_high = kwargs[ATTR_TARGET_TEMP_HIGH]
|
||||
self._attr_target_temperature_low = kwargs[ATTR_TARGET_TEMP_LOW]
|
||||
|
||||
async def async_setup_entry_init(
|
||||
hass: HomeAssistant, config_entry: ConfigEntry
|
||||
) -> bool:
|
||||
"""Set up test config entry."""
|
||||
await hass.config_entries.async_forward_entry_setups(config_entry, [DOMAIN])
|
||||
return True
|
||||
|
||||
async def async_setup_entry_climate_platform(
|
||||
hass: HomeAssistant,
|
||||
config_entry: ConfigEntry,
|
||||
async_add_entities: AddEntitiesCallback,
|
||||
) -> None:
|
||||
"""Set up test climate platform via config entry."""
|
||||
async_add_entities(
|
||||
[MockClimateEntityTemp(name="test", entity_id="climate.test")]
|
||||
)
|
||||
|
||||
mock_integration(
|
||||
hass,
|
||||
MockModule(
|
||||
"test",
|
||||
async_setup_entry=async_setup_entry_init,
|
||||
),
|
||||
built_in=False,
|
||||
)
|
||||
mock_platform(
|
||||
hass,
|
||||
"test.climate",
|
||||
MockPlatform(async_setup_entry=async_setup_entry_climate_platform),
|
||||
)
|
||||
|
||||
config_entry = MockConfigEntry(domain="test")
|
||||
config_entry.add_to_hass(hass)
|
||||
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
state = hass.states.get("climate.test")
|
||||
assert state.attributes.get(ATTR_CURRENT_TEMPERATURE) is None
|
||||
assert state.attributes.get(ATTR_MIN_TEMP) == 7
|
||||
assert state.attributes.get(ATTR_MAX_TEMP) == 35
|
||||
|
||||
with pytest.raises(
|
||||
ServiceValidationError,
|
||||
match="Provided temperature 40.0 is not valid. Accepted range is 7 to 35",
|
||||
) as exc:
|
||||
await hass.services.async_call(
|
||||
DOMAIN,
|
||||
SERVICE_SET_TEMPERATURE,
|
||||
{
|
||||
"entity_id": "climate.test",
|
||||
ATTR_TEMPERATURE: "40",
|
||||
},
|
||||
blocking=True,
|
||||
)
|
||||
assert (
|
||||
str(exc.value)
|
||||
== "Provided temperature 40.0 is not valid. Accepted range is 7 to 35"
|
||||
)
|
||||
assert exc.value.translation_key == "temp_out_of_range"
|
||||
|
||||
with pytest.raises(
|
||||
ServiceValidationError,
|
||||
match="Provided temperature 0.0 is not valid. Accepted range is 7 to 35",
|
||||
) as exc:
|
||||
await hass.services.async_call(
|
||||
DOMAIN,
|
||||
SERVICE_SET_TEMPERATURE,
|
||||
{
|
||||
"entity_id": "climate.test",
|
||||
ATTR_TARGET_TEMP_HIGH: "25",
|
||||
ATTR_TARGET_TEMP_LOW: "0",
|
||||
},
|
||||
blocking=True,
|
||||
)
|
||||
assert (
|
||||
str(exc.value)
|
||||
== "Provided temperature 0.0 is not valid. Accepted range is 7 to 35"
|
||||
)
|
||||
assert exc.value.translation_key == "temp_out_of_range"
|
||||
|
||||
await hass.services.async_call(
|
||||
DOMAIN,
|
||||
SERVICE_SET_TEMPERATURE,
|
||||
{
|
||||
"entity_id": "climate.test",
|
||||
ATTR_TARGET_TEMP_HIGH: "25",
|
||||
ATTR_TARGET_TEMP_LOW: "10",
|
||||
},
|
||||
blocking=True,
|
||||
)
|
||||
|
||||
state = hass.states.get("climate.test")
|
||||
assert state.attributes.get(ATTR_TARGET_TEMP_LOW) == 10
|
||||
assert state.attributes.get(ATTR_TARGET_TEMP_HIGH) == 25
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue