mirror of
https://github.com/python-kasa/python-kasa.git
synced 2025-12-03 06:38:22 +00:00
Create common interfaces for remaining device types (#895)
Introduce common module interfaces across smart and iot devices and provide better typing implementation for getting modules to support this.
This commit is contained in:
95
kasa/tests/test_common_modules.py
Normal file
95
kasa/tests/test_common_modules.py
Normal file
@@ -0,0 +1,95 @@
|
||||
import pytest
|
||||
from pytest_mock import MockerFixture
|
||||
|
||||
from kasa import Device, Module
|
||||
from kasa.tests.device_fixtures import (
|
||||
lightstrip,
|
||||
parametrize,
|
||||
parametrize_combine,
|
||||
plug_iot,
|
||||
)
|
||||
|
||||
led_smart = parametrize(
|
||||
"has led smart", component_filter="led", protocol_filter={"SMART"}
|
||||
)
|
||||
led = parametrize_combine([led_smart, plug_iot])
|
||||
|
||||
light_effect_smart = parametrize(
|
||||
"has light effect smart", component_filter="light_effect", protocol_filter={"SMART"}
|
||||
)
|
||||
light_effect = parametrize_combine([light_effect_smart, lightstrip])
|
||||
|
||||
|
||||
@led
|
||||
async def test_led_module(dev: Device, mocker: MockerFixture):
|
||||
"""Test fan speed feature."""
|
||||
led_module = dev.modules.get(Module.Led)
|
||||
assert led_module
|
||||
feat = led_module._module_features["led"]
|
||||
|
||||
call = mocker.spy(led_module, "call")
|
||||
await led_module.set_led(True)
|
||||
assert call.call_count == 1
|
||||
await dev.update()
|
||||
assert led_module.led is True
|
||||
assert feat.value is True
|
||||
|
||||
await led_module.set_led(False)
|
||||
assert call.call_count == 2
|
||||
await dev.update()
|
||||
assert led_module.led is False
|
||||
assert feat.value is False
|
||||
|
||||
await feat.set_value(True)
|
||||
assert call.call_count == 3
|
||||
await dev.update()
|
||||
assert feat.value is True
|
||||
assert led_module.led is True
|
||||
|
||||
|
||||
@light_effect
|
||||
async def test_light_effect_module(dev: Device, mocker: MockerFixture):
|
||||
"""Test fan speed feature."""
|
||||
light_effect_module = dev.modules[Module.LightEffect]
|
||||
assert light_effect_module
|
||||
feat = light_effect_module._module_features["light_effect"]
|
||||
|
||||
call = mocker.spy(light_effect_module, "call")
|
||||
effect_list = light_effect_module.effect_list
|
||||
assert "Off" in effect_list
|
||||
assert effect_list.index("Off") == 0
|
||||
assert len(effect_list) > 1
|
||||
assert effect_list == feat.choices
|
||||
|
||||
assert light_effect_module.has_custom_effects is not None
|
||||
|
||||
await light_effect_module.set_effect("Off")
|
||||
assert call.call_count == 1
|
||||
await dev.update()
|
||||
assert light_effect_module.effect == "Off"
|
||||
assert feat.value == "Off"
|
||||
|
||||
second_effect = effect_list[1]
|
||||
await light_effect_module.set_effect(second_effect)
|
||||
assert call.call_count == 2
|
||||
await dev.update()
|
||||
assert light_effect_module.effect == second_effect
|
||||
assert feat.value == second_effect
|
||||
|
||||
last_effect = effect_list[len(effect_list) - 1]
|
||||
await light_effect_module.set_effect(last_effect)
|
||||
assert call.call_count == 3
|
||||
await dev.update()
|
||||
assert light_effect_module.effect == last_effect
|
||||
assert feat.value == last_effect
|
||||
|
||||
# Test feature set
|
||||
await feat.set_value(second_effect)
|
||||
assert call.call_count == 4
|
||||
await dev.update()
|
||||
assert light_effect_module.effect == second_effect
|
||||
assert feat.value == second_effect
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
await light_effect_module.set_effect("foobar")
|
||||
assert call.call_count == 4
|
||||
Reference in New Issue
Block a user