File: test_vacuums.py

package info (click to toggle)
python-miio 0.5.12-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,888 kB
  • sloc: python: 23,425; makefile: 9
file content (55 lines) | stat: -rw-r--r-- 2,350 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
"""Test of vacuum devices."""
from collections.abc import Iterable
from typing import List, Sequence, Tuple, Type

import pytest

from miio.device import Device
from miio.integrations.vacuum.roborock.vacuum import ROCKROBO_V1
from miio.interfaces import VacuumInterface

# list of all supported vacuum classes
VACUUM_CLASSES: Tuple[Type[VacuumInterface], ...] = tuple(
    cl for cl in VacuumInterface.__subclasses__()  # type: ignore
)


def _all_vacuum_models() -> Sequence[Tuple[Type[Device], str]]:
    """:return: list of tuples with supported vacuum models with corresponding class"""
    result: List[Tuple[Type[Device], str]] = []
    for cls in VACUUM_CLASSES:
        assert issubclass(cls, Device)
        vacuum_models = cls.supported_models
        assert isinstance(vacuum_models, Iterable)
        for model in vacuum_models:
            result.append((cls, model))
    return result  # type: ignore


@pytest.mark.parametrize("cls, model", _all_vacuum_models())
def test_vacuum_fan_speed_presets(cls: Type[Device], model: str) -> None:
    """Test method VacuumInterface.fan_speed_presets()"""
    if model == ROCKROBO_V1:
        return  # this model cannot be tested because presets depends on firmware
    dev = cls("127.0.0.1", "68ffffffffffffffffffffffffffffff", model=model)
    assert isinstance(dev, VacuumInterface)
    presets = dev.fan_speed_presets()
    assert presets is not None, "presets must be defined"
    assert bool(presets), "presets cannot be empty"
    assert isinstance(presets, dict), "presets must be dictionary"
    for name, value in presets.items():
        assert isinstance(name, str), "presets key must be string"
        assert name, "presets key cannot be empty"
        assert isinstance(value, int), "presets value must be integer"
        assert value >= 0, "presets value must be >= 0"


@pytest.mark.parametrize("cls, model", _all_vacuum_models())
def test_vacuum_set_fan_speed_presets_fails(cls: Type[Device], model: str) -> None:
    """Test method VacuumInterface.fan_speed_presets()"""
    if model == ROCKROBO_V1:
        return  # this model cannot be tested because presets depends on firmware
    dev = cls("127.0.0.1", "68ffffffffffffffffffffffffffffff", model=model)
    assert isinstance(dev, VacuumInterface)
    with pytest.raises(ValueError):
        dev.set_fan_speed_preset(-1)