core/tests/components/laundrify/test_sensor.py

95 lines
3.1 KiB
Python

"""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