2022-02-21 23:17:54 +00:00
|
|
|
"""Tests for Vallox sensor platform."""
|
|
|
|
|
|
|
|
from datetime import datetime, timedelta, tzinfo
|
|
|
|
|
|
|
|
import pytest
|
2024-02-19 13:36:51 +00:00
|
|
|
from vallox_websocket_api import MetricData
|
2022-02-21 23:17:54 +00:00
|
|
|
|
|
|
|
from homeassistant.core import HomeAssistant
|
2023-05-29 21:00:43 +00:00
|
|
|
from homeassistant.util import dt as dt_util
|
2022-02-21 23:17:54 +00:00
|
|
|
|
|
|
|
from tests.common import MockConfigEntry
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def set_tz(request):
|
|
|
|
"""Set the default TZ to the one requested."""
|
2022-03-20 09:25:15 +00:00
|
|
|
request.getfixturevalue(request.param)
|
2022-02-21 23:17:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
2024-05-20 09:06:03 +00:00
|
|
|
async def utc(hass: HomeAssistant) -> None:
|
2022-02-21 23:17:54 +00:00
|
|
|
"""Set the default TZ to UTC."""
|
2024-05-20 09:06:03 +00:00
|
|
|
hass.config.async_set_time_zone("UTC")
|
2022-02-21 23:17:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
2024-05-20 09:06:03 +00:00
|
|
|
async def helsinki(hass: HomeAssistant) -> None:
|
2022-02-21 23:17:54 +00:00
|
|
|
"""Set the default TZ to Europe/Helsinki."""
|
2024-05-20 09:06:03 +00:00
|
|
|
hass.config.async_set_time_zone("Europe/Helsinki")
|
2022-02-21 23:17:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
2024-05-20 09:06:03 +00:00
|
|
|
async def new_york(hass: HomeAssistant) -> None:
|
2022-02-21 23:17:54 +00:00
|
|
|
"""Set the default TZ to America/New_York."""
|
2024-05-20 09:06:03 +00:00
|
|
|
hass.config.async_set_time_zone("America/New_York")
|
2022-02-21 23:17:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
def _sensor_to_datetime(sensor):
|
|
|
|
return datetime.fromisoformat(sensor.state)
|
|
|
|
|
|
|
|
|
|
|
|
def _now_at_13():
|
2023-05-29 21:00:43 +00:00
|
|
|
return dt_util.now().timetz().replace(hour=13, minute=0, second=0, microsecond=0)
|
2022-02-21 23:17:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
async def test_remaining_time_for_filter_none_returned_from_vallox(
|
2024-02-19 13:36:51 +00:00
|
|
|
mock_entry: MockConfigEntry, hass: HomeAssistant, setup_fetch_metric_data_mock
|
2023-02-17 15:34:53 +00:00
|
|
|
) -> None:
|
2022-02-21 23:17:54 +00:00
|
|
|
"""Test that the remaining time for filter sensor returns 'unknown' when Vallox returns None."""
|
2024-02-19 13:36:51 +00:00
|
|
|
|
|
|
|
class MockMetricData(MetricData):
|
|
|
|
@property
|
|
|
|
def next_filter_change_date(self):
|
|
|
|
return None
|
|
|
|
|
|
|
|
# Arrange
|
|
|
|
setup_fetch_metric_data_mock(metric_data_class=MockMetricData)
|
2022-02-21 23:17:54 +00:00
|
|
|
# Act
|
2024-02-19 13:36:51 +00:00
|
|
|
await hass.config_entries.async_setup(mock_entry.entry_id)
|
|
|
|
await hass.async_block_till_done()
|
2022-02-21 23:17:54 +00:00
|
|
|
|
|
|
|
# Assert
|
|
|
|
sensor = hass.states.get("sensor.vallox_remaining_time_for_filter")
|
|
|
|
assert sensor.state == "unknown"
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
2024-02-19 13:36:51 +00:00
|
|
|
("remaining_days", "set_tz"),
|
2022-02-21 23:17:54 +00:00
|
|
|
[
|
2024-02-19 13:36:51 +00:00
|
|
|
(112, "utc"),
|
|
|
|
(112, "helsinki"),
|
|
|
|
(112, "new_york"),
|
|
|
|
(0, "utc"),
|
|
|
|
(-3, "utc"),
|
2022-02-21 23:17:54 +00:00
|
|
|
],
|
2024-02-19 13:36:51 +00:00
|
|
|
indirect=["set_tz"],
|
2022-02-21 23:17:54 +00:00
|
|
|
)
|
2024-02-19 13:36:51 +00:00
|
|
|
async def test_remaining_time_for_filter(
|
|
|
|
remaining_days,
|
|
|
|
set_tz: tzinfo,
|
|
|
|
mock_entry: MockConfigEntry,
|
|
|
|
hass: HomeAssistant,
|
|
|
|
setup_fetch_metric_data_mock,
|
2023-02-17 15:34:53 +00:00
|
|
|
) -> None:
|
2024-02-19 13:36:51 +00:00
|
|
|
"""Test remaining time for filter when Vallox returns different dates."""
|
2022-02-21 23:17:54 +00:00
|
|
|
# Arrange
|
2023-05-29 21:00:43 +00:00
|
|
|
mocked_filter_end_date = dt_util.now().date() + timedelta(days=remaining_days)
|
2022-02-21 23:17:54 +00:00
|
|
|
|
2024-02-19 13:36:51 +00:00
|
|
|
class MockMetricData(MetricData):
|
|
|
|
@property
|
|
|
|
def next_filter_change_date(self):
|
|
|
|
return mocked_filter_end_date
|
2022-02-21 23:17:54 +00:00
|
|
|
|
2024-02-19 13:36:51 +00:00
|
|
|
setup_fetch_metric_data_mock(metric_data_class=MockMetricData)
|
2022-02-21 23:17:54 +00:00
|
|
|
|
|
|
|
# Act
|
2024-02-19 13:36:51 +00:00
|
|
|
await hass.config_entries.async_setup(mock_entry.entry_id)
|
|
|
|
await hass.async_block_till_done()
|
2022-02-21 23:17:54 +00:00
|
|
|
|
|
|
|
# Assert
|
|
|
|
sensor = hass.states.get("sensor.vallox_remaining_time_for_filter")
|
2024-02-19 13:36:51 +00:00
|
|
|
assert sensor.attributes["device_class"] == "timestamp"
|
2022-02-21 23:17:54 +00:00
|
|
|
assert _sensor_to_datetime(sensor) == datetime.combine(
|
|
|
|
mocked_filter_end_date,
|
|
|
|
_now_at_13(),
|
|
|
|
)
|
2022-03-30 03:07:09 +00:00
|
|
|
|
|
|
|
|
2024-02-19 13:36:51 +00:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
("metrics", "expected_state"),
|
|
|
|
[
|
|
|
|
({"A_CYC_CELL_STATE": 0}, "Heat Recovery"),
|
|
|
|
({"A_CYC_CELL_STATE": 1}, "Cool Recovery"),
|
|
|
|
({"A_CYC_CELL_STATE": 2}, "Bypass"),
|
|
|
|
({"A_CYC_CELL_STATE": 3}, "Defrosting"),
|
|
|
|
({"A_CYC_CELL_STATE": 4}, "unknown"),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
async def test_cell_state_sensor(
|
|
|
|
metrics,
|
|
|
|
expected_state,
|
|
|
|
mock_entry: MockConfigEntry,
|
|
|
|
hass: HomeAssistant,
|
|
|
|
setup_fetch_metric_data_mock,
|
2023-02-17 15:34:53 +00:00
|
|
|
) -> None:
|
2024-02-19 13:36:51 +00:00
|
|
|
"""Test cell state sensor in different states."""
|
2022-03-30 03:07:09 +00:00
|
|
|
# Arrange
|
2024-02-19 13:36:51 +00:00
|
|
|
setup_fetch_metric_data_mock(metrics=metrics)
|
2022-03-30 03:07:09 +00:00
|
|
|
|
|
|
|
# Act
|
2024-02-19 13:36:51 +00:00
|
|
|
await hass.config_entries.async_setup(mock_entry.entry_id)
|
|
|
|
await hass.async_block_till_done()
|
2022-03-30 03:07:09 +00:00
|
|
|
|
|
|
|
# Assert
|
|
|
|
sensor = hass.states.get("sensor.vallox_cell_state")
|
2024-02-19 13:36:51 +00:00
|
|
|
assert sensor.state == expected_state
|