core/tests/components/tplink/test_vacuum.py

134 lines
3.7 KiB
Python

"""Tests for vacuum platform."""
from __future__ import annotations
from kasa import Device, Module
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant.components.vacuum import (
ATTR_BATTERY_LEVEL,
ATTR_FAN_SPEED,
DOMAIN as VACUUM_DOMAIN,
SERVICE_LOCATE,
SERVICE_PAUSE,
SERVICE_RETURN_TO_BASE,
SERVICE_SET_FAN_SPEED,
SERVICE_START,
VacuumActivity,
)
from homeassistant.const import ATTR_ENTITY_ID, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import (
device_registry as dr,
entity_registry as er,
translation,
)
from . import DEVICE_ID, _mocked_device, setup_platform_for_device, snapshot_platform
from tests.common import MockConfigEntry
ENTITY_ID = "vacuum.my_vacuum"
@pytest.fixture
async def mocked_vacuum(hass: HomeAssistant) -> Device:
"""Return mocked tplink vacuum."""
return _mocked_device(modules=[Module.Clean, Module.Speaker], alias="my_vacuum")
async def test_vacuum(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
entity_registry: er.EntityRegistry,
device_registry: dr.DeviceRegistry,
mocked_vacuum: Device,
) -> None:
"""Test initialization."""
await setup_platform_for_device(
hass, mock_config_entry, Platform.VACUUM, mocked_vacuum
)
device_entries = dr.async_entries_for_config_entry(
device_registry, mock_config_entry.entry_id
)
assert device_entries
entity = entity_registry.async_get(ENTITY_ID)
assert entity
assert entity.unique_id == f"{DEVICE_ID}-vacuum"
state = hass.states.get(ENTITY_ID)
assert state.state == VacuumActivity.DOCKED
assert state.attributes[ATTR_FAN_SPEED] == "max"
assert state.attributes[ATTR_BATTERY_LEVEL] == 100
result = translation.async_translate_state(
hass, "max", "vacuum", "tplink", "vacuum.state_attributes.fan_speed", None
)
assert result == "Max"
async def test_states(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
entity_registry: er.EntityRegistry,
device_registry: dr.DeviceRegistry,
snapshot: SnapshotAssertion,
mocked_vacuum: Device,
) -> None:
"""Test vacuum states."""
await setup_platform_for_device(
hass, mock_config_entry, Platform.VACUUM, mocked_vacuum
)
await snapshot_platform(
hass, entity_registry, device_registry, snapshot, mock_config_entry.entry_id
)
@pytest.mark.parametrize(
("service_call", "module_name", "method", "params"),
[
(SERVICE_START, Module.Clean, "start", {}),
(SERVICE_PAUSE, Module.Clean, "pause", {}),
(SERVICE_RETURN_TO_BASE, Module.Clean, "return_home", {}),
(
SERVICE_SET_FAN_SPEED,
Module.Clean,
"set_fan_speed_preset",
{ATTR_FAN_SPEED: "quiet"},
),
(SERVICE_LOCATE, Module.Speaker, "locate", {}),
],
)
async def test_vacuum_module(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mocked_vacuum: Device,
service_call: str,
module_name: str,
method: str,
params: dict,
) -> None:
"""Test that all vacuum commands work correctly."""
vacuum = mocked_vacuum
module = vacuum.modules[module_name]
await setup_platform_for_device(hass, mock_config_entry, Platform.VACUUM, vacuum)
mock_method = getattr(module, method)
service_data = {ATTR_ENTITY_ID: ENTITY_ID}
service_data |= params
await hass.services.async_call(
VACUUM_DOMAIN, service_call, service_data, blocking=True
)
# Is this required when using blocking=True?
await hass.async_block_till_done(wait_background_tasks=True)
mock_method.assert_called()