134 lines
3.7 KiB
Python
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()
|