core/tests/components/laundrify/test_sensor.py

95 lines
3.1 KiB
Python
Raw Normal View History

Add sensor platform to laundrify integration (#121378) * feat: initial implementation of sensor platform * refactor(tests): await setup of config_entry in parent function * feat(tests): add tests for laundrify sensor platform * refactor: set name property for laundrify binary_sensor * refactor(tests): add missing type hints * refactor(tests): remove global change of the logging level * refactor: address minor changes from code review * refactor(tests): transform setup_config_entry into fixture * refactor: leverage entity descriptions to define common entity properties * refactor: change native unit to Wh * fix(tests): use fixture to create the config entry * fix: remove redundant raise of LaundrifyDeviceException * fix(tests): raise a LaundrifyDeviceException to test the update failure behavior * refactor(tests): merge several library fixtures into a single one * refactor(tests): create a separate UpdateCoordinator instead of using the internal * refactor(tests): avoid using LaundrifyPowerSensor * refactor: simplify value retrieval by directly accessing the coordinator * refactor: remove non-raising code from try-block * refactor(sensor): revert usage of entity descriptions * refactor(sensor): consolidate common attributes and init func to LaundrifyBaseSensor * refactor(sensor): instantiate DeviceInfo obj instead of using dict * refactor(tests): use freezer to trigger coordinator update * refactor(tests): assert on entity state instead of coordinator * refactor(tests): make use of freezer * chore(tests): typo in comment
2024-09-16 14:21:16 +00:00
"""Test the laundrify sensor platform."""
from datetime import timedelta
import logging
from unittest.mock import patch
from freezegun.api import FrozenDateTimeFactory
from laundrify_aio import LaundrifyDevice
from laundrify_aio.exceptions import LaundrifyDeviceException
import pytest
from homeassistant.components.laundrify.const import (
DEFAULT_POLL_INTERVAL,
DOMAIN,
MODELS,
)
from homeassistant.components.sensor import SensorDeviceClass
from homeassistant.const import (
ATTR_DEVICE_CLASS,
ATTR_UNIT_OF_MEASUREMENT,
STATE_UNKNOWN,
UnitOfPower,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr
from homeassistant.util import slugify
from tests.common import MockConfigEntry, async_fire_time_changed
async def test_laundrify_sensor_init(
hass: HomeAssistant,
device_registry: dr.DeviceRegistry,
mock_device: LaundrifyDevice,
laundrify_config_entry: MockConfigEntry,
) -> None:
"""Test Laundrify sensor default state."""
device_slug = slugify(mock_device.name, separator="_")
state = hass.states.get(f"sensor.{device_slug}_power")
assert state.attributes[ATTR_DEVICE_CLASS] == SensorDeviceClass.POWER
assert state.state == STATE_UNKNOWN
device = device_registry.async_get_device({(DOMAIN, mock_device.id)})
assert device is not None
assert device.name == mock_device.name
assert device.identifiers == {(DOMAIN, mock_device.id)}
assert device.manufacturer == mock_device.manufacturer
assert device.model == MODELS[mock_device.model]
assert device.sw_version == mock_device.firmwareVersion
async def test_laundrify_sensor_update(
hass: HomeAssistant,
freezer: FrozenDateTimeFactory,
mock_device: LaundrifyDevice,
laundrify_config_entry: MockConfigEntry,
) -> None:
"""Test Laundrify sensor update."""
device_slug = slugify(mock_device.name, separator="_")
state = hass.states.get(f"sensor.{device_slug}_power")
assert state.state == STATE_UNKNOWN
with patch("laundrify_aio.LaundrifyDevice.get_power", return_value=95):
freezer.tick(timedelta(seconds=DEFAULT_POLL_INTERVAL))
async_fire_time_changed(hass)
await hass.async_block_till_done()
state = hass.states.get(f"sensor.{device_slug}_power")
assert state.attributes[ATTR_UNIT_OF_MEASUREMENT] == UnitOfPower.WATT
assert state.state == "95"
async def test_laundrify_sensor_update_failure(
hass: HomeAssistant,
caplog: pytest.LogCaptureFixture,
freezer: FrozenDateTimeFactory,
mock_device: LaundrifyDevice,
laundrify_config_entry: MockConfigEntry,
) -> None:
"""Test that update failures are logged."""
caplog.set_level(logging.DEBUG)
# test get_power() to raise a LaundrifyDeviceException
with patch(
"laundrify_aio.LaundrifyDevice.get_power",
side_effect=LaundrifyDeviceException("Raising error to test update failure."),
):
freezer.tick(timedelta(seconds=DEFAULT_POLL_INTERVAL))
async_fire_time_changed(hass)
await hass.async_block_till_done()
assert f"Couldn't load power for {mock_device.id}_power" in caplog.text