mirror of https://github.com/home-assistant/core
159 lines
4.7 KiB
Python
159 lines
4.7 KiB
Python
"""Tests for the water heater platform of the A. O. Smith integration."""
|
|
|
|
from collections.abc import AsyncGenerator
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
from py_aosmith.models import OperationMode
|
|
import pytest
|
|
from syrupy.assertion import SnapshotAssertion
|
|
|
|
from homeassistant.components.water_heater import (
|
|
ATTR_AWAY_MODE,
|
|
ATTR_OPERATION_MODE,
|
|
ATTR_TEMPERATURE,
|
|
DOMAIN as WATER_HEATER_DOMAIN,
|
|
SERVICE_SET_AWAY_MODE,
|
|
SERVICE_SET_OPERATION_MODE,
|
|
SERVICE_SET_TEMPERATURE,
|
|
STATE_ECO,
|
|
STATE_ELECTRIC,
|
|
STATE_HEAT_PUMP,
|
|
WaterHeaterEntityFeature,
|
|
)
|
|
from homeassistant.const import ATTR_ENTITY_ID, ATTR_SUPPORTED_FEATURES, Platform
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.exceptions import HomeAssistantError
|
|
from homeassistant.helpers import entity_registry as er
|
|
|
|
from tests.common import MockConfigEntry, snapshot_platform
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
async def platforms() -> AsyncGenerator[None]:
|
|
"""Return the platforms to be loaded for this test."""
|
|
with patch("homeassistant.components.aosmith.PLATFORMS", [Platform.WATER_HEATER]):
|
|
yield
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("get_devices_fixture_heat_pump"),
|
|
[False, True],
|
|
)
|
|
async def test_state(
|
|
hass: HomeAssistant,
|
|
init_integration: MockConfigEntry,
|
|
snapshot: SnapshotAssertion,
|
|
entity_registry: er.EntityRegistry,
|
|
) -> None:
|
|
"""Test the state of the water heater entities."""
|
|
await snapshot_platform(hass, entity_registry, snapshot, init_integration.entry_id)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("get_devices_fixture_has_vacation_mode"),
|
|
[False],
|
|
)
|
|
async def test_state_away_mode_unsupported(
|
|
hass: HomeAssistant, init_integration: MockConfigEntry
|
|
) -> None:
|
|
"""Test that away mode is not supported if the water heater does not support vacation mode."""
|
|
state = hass.states.get("water_heater.my_water_heater")
|
|
assert (
|
|
state.attributes.get(ATTR_SUPPORTED_FEATURES)
|
|
== WaterHeaterEntityFeature.TARGET_TEMPERATURE
|
|
| WaterHeaterEntityFeature.OPERATION_MODE
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("hass_mode", "aosmith_mode"),
|
|
[
|
|
(STATE_HEAT_PUMP, OperationMode.HEAT_PUMP),
|
|
(STATE_ECO, OperationMode.HYBRID),
|
|
(STATE_ELECTRIC, OperationMode.ELECTRIC),
|
|
],
|
|
)
|
|
async def test_set_operation_mode(
|
|
hass: HomeAssistant,
|
|
mock_client: MagicMock,
|
|
init_integration: MockConfigEntry,
|
|
hass_mode: str,
|
|
aosmith_mode: str,
|
|
) -> None:
|
|
"""Test setting the operation mode."""
|
|
await hass.services.async_call(
|
|
WATER_HEATER_DOMAIN,
|
|
SERVICE_SET_OPERATION_MODE,
|
|
{
|
|
ATTR_ENTITY_ID: "water_heater.my_water_heater",
|
|
ATTR_OPERATION_MODE: hass_mode,
|
|
},
|
|
)
|
|
await hass.async_block_till_done()
|
|
|
|
mock_client.update_mode.assert_called_once_with("junctionId", aosmith_mode)
|
|
|
|
|
|
async def test_unsupported_operation_mode(
|
|
hass: HomeAssistant,
|
|
mock_client: MagicMock,
|
|
init_integration: MockConfigEntry,
|
|
) -> None:
|
|
"""Test setting the operation mode with an unsupported mode."""
|
|
with pytest.raises(HomeAssistantError):
|
|
await hass.services.async_call(
|
|
WATER_HEATER_DOMAIN,
|
|
SERVICE_SET_OPERATION_MODE,
|
|
{
|
|
ATTR_ENTITY_ID: "water_heater.my_water_heater",
|
|
ATTR_OPERATION_MODE: "unsupported_mode",
|
|
},
|
|
blocking=True,
|
|
)
|
|
|
|
|
|
async def test_set_temperature(
|
|
hass: HomeAssistant,
|
|
mock_client: MagicMock,
|
|
init_integration: MockConfigEntry,
|
|
) -> None:
|
|
"""Test setting the target temperature."""
|
|
await hass.services.async_call(
|
|
WATER_HEATER_DOMAIN,
|
|
SERVICE_SET_TEMPERATURE,
|
|
{ATTR_ENTITY_ID: "water_heater.my_water_heater", ATTR_TEMPERATURE: 120},
|
|
)
|
|
await hass.async_block_till_done()
|
|
|
|
mock_client.update_setpoint.assert_called_once_with("junctionId", 120)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("get_devices_fixture_heat_pump", "hass_away_mode", "aosmith_mode"),
|
|
[
|
|
(True, True, OperationMode.VACATION),
|
|
(True, False, OperationMode.HYBRID),
|
|
(False, True, OperationMode.VACATION),
|
|
(False, False, OperationMode.ELECTRIC),
|
|
],
|
|
)
|
|
async def test_away_mode(
|
|
hass: HomeAssistant,
|
|
mock_client: MagicMock,
|
|
init_integration: MockConfigEntry,
|
|
hass_away_mode: bool,
|
|
aosmith_mode: str,
|
|
) -> None:
|
|
"""Test turning away mode on/off."""
|
|
await hass.services.async_call(
|
|
WATER_HEATER_DOMAIN,
|
|
SERVICE_SET_AWAY_MODE,
|
|
{
|
|
ATTR_ENTITY_ID: "water_heater.my_water_heater",
|
|
ATTR_AWAY_MODE: hass_away_mode,
|
|
},
|
|
)
|
|
await hass.async_block_till_done()
|
|
|
|
mock_client.update_mode.assert_called_once_with("junctionId", aosmith_mode)
|