core/tests/components/vallox/test_sensor.py

161 lines
4.7 KiB
Python

"""Tests for Vallox sensor platform."""
from datetime import datetime, timedelta, tzinfo
from unittest.mock import patch
import pytest
from homeassistant.core import HomeAssistant
from homeassistant.util import dt
from .conftest import patch_metrics
from tests.common import MockConfigEntry
@pytest.fixture
def set_tz(request):
"""Set the default TZ to the one requested."""
request.getfixturevalue(request.param)
@pytest.fixture
def utc(hass: HomeAssistant) -> None:
"""Set the default TZ to UTC."""
hass.config.set_time_zone("UTC")
@pytest.fixture
def helsinki(hass: HomeAssistant) -> None:
"""Set the default TZ to Europe/Helsinki."""
hass.config.set_time_zone("Europe/Helsinki")
@pytest.fixture
def new_york(hass: HomeAssistant) -> None:
"""Set the default TZ to America/New_York."""
hass.config.set_time_zone("America/New_York")
def _sensor_to_datetime(sensor):
return datetime.fromisoformat(sensor.state)
def _now_at_13():
return dt.now().timetz().replace(hour=13, minute=0, second=0, microsecond=0)
async def test_remaining_filter_returns_timestamp(
mock_entry: MockConfigEntry, hass: HomeAssistant
):
"""Test that the remaining time for filter sensor returns a timestamp."""
# Act
with patch(
"homeassistant.components.vallox.calculate_next_filter_change_date",
return_value=dt.now().date(),
), patch_metrics(metrics={}):
await hass.config_entries.async_setup(mock_entry.entry_id)
await hass.async_block_till_done()
# Assert
sensor = hass.states.get("sensor.vallox_remaining_time_for_filter")
assert sensor.attributes["device_class"] == "timestamp"
async def test_remaining_time_for_filter_none_returned_from_vallox(
mock_entry: MockConfigEntry, hass: HomeAssistant
):
"""Test that the remaining time for filter sensor returns 'unknown' when Vallox returns None."""
# Act
with patch(
"homeassistant.components.vallox.calculate_next_filter_change_date",
return_value=None,
), patch_metrics(metrics={}):
await hass.config_entries.async_setup(mock_entry.entry_id)
await hass.async_block_till_done()
# Assert
sensor = hass.states.get("sensor.vallox_remaining_time_for_filter")
assert sensor.state == "unknown"
@pytest.mark.parametrize(
"set_tz",
[
"utc",
"helsinki",
"new_york",
],
indirect=True,
)
async def test_remaining_time_for_filter_in_the_future(
mock_entry: MockConfigEntry, set_tz: tzinfo, hass: HomeAssistant
):
"""Test remaining time for filter when Vallox returns a date in the future."""
# Arrange
remaining_days = 112
mocked_filter_end_date = dt.now().date() + timedelta(days=remaining_days)
# Act
with patch(
"homeassistant.components.vallox.calculate_next_filter_change_date",
return_value=mocked_filter_end_date,
), patch_metrics(metrics={}):
await hass.config_entries.async_setup(mock_entry.entry_id)
await hass.async_block_till_done()
# Assert
sensor = hass.states.get("sensor.vallox_remaining_time_for_filter")
assert _sensor_to_datetime(sensor) == datetime.combine(
mocked_filter_end_date,
_now_at_13(),
)
async def test_remaining_time_for_filter_today(
mock_entry: MockConfigEntry, hass: HomeAssistant
):
"""Test remaining time for filter when Vallox returns today."""
# Arrange
remaining_days = 0
mocked_filter_end_date = dt.now().date() + timedelta(days=remaining_days)
# Act
with patch(
"homeassistant.components.vallox.calculate_next_filter_change_date",
return_value=mocked_filter_end_date,
), patch_metrics(metrics={}):
await hass.config_entries.async_setup(mock_entry.entry_id)
await hass.async_block_till_done()
# Assert
sensor = hass.states.get("sensor.vallox_remaining_time_for_filter")
assert _sensor_to_datetime(sensor) == datetime.combine(
mocked_filter_end_date,
_now_at_13(),
)
async def test_remaining_time_for_filter_in_the_past(
mock_entry: MockConfigEntry, hass: HomeAssistant
):
"""Test remaining time for filter when Vallox returns a date in the past."""
# Arrange
remaining_days = -3
mocked_filter_end_date = dt.now().date() + timedelta(days=remaining_days)
# Act
with patch(
"homeassistant.components.vallox.calculate_next_filter_change_date",
return_value=mocked_filter_end_date,
), patch_metrics(metrics={}):
await hass.config_entries.async_setup(mock_entry.entry_id)
await hass.async_block_till_done()
# Assert
sensor = hass.states.get("sensor.vallox_remaining_time_for_filter")
assert _sensor_to_datetime(sensor) == datetime.combine(
mocked_filter_end_date,
_now_at_13(),
)