mirror of
https://github.com/python-kasa/python-kasa.git
synced 2026-07-08 14:52:03 +00:00
tests: add type annotations to IoT tests (#1685)
Add type annotations to all test functions across 8 files in `tests/iot/`, improving type safety and enabling mypy to check function bodies.
This commit is contained in:
@@ -8,7 +8,7 @@ from ...device_fixtures import dimmer_iot
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
def test_ambientlight_getters(dev: IotDimmer):
|
||||
def test_ambientlight_getters(dev: IotDimmer) -> None:
|
||||
assert Module.IotAmbientLight in dev.modules
|
||||
ambientlight: AmbientLight = dev.modules[Module.IotAmbientLight]
|
||||
|
||||
@@ -22,7 +22,7 @@ def test_ambientlight_getters(dev: IotDimmer):
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
async def test_ambientlight_setters(dev: IotDimmer, mocker: MockerFixture):
|
||||
async def test_ambientlight_setters(dev: IotDimmer, mocker: MockerFixture) -> None:
|
||||
ambientlight: AmbientLight = dev.modules[Module.IotAmbientLight]
|
||||
query_helper = mocker.patch("kasa.iot.IotDimmer._query_helper")
|
||||
|
||||
@@ -36,7 +36,7 @@ async def test_ambientlight_setters(dev: IotDimmer, mocker: MockerFixture):
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
def test_ambientlight_feature(dev: IotDimmer):
|
||||
def test_ambientlight_feature(dev: IotDimmer) -> None:
|
||||
assert Module.IotAmbientLight in dev.modules
|
||||
ambientlight: AmbientLight = dev.modules[Module.IotAmbientLight]
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ from ...device_fixtures import device_iot
|
||||
|
||||
|
||||
@device_iot
|
||||
def test_cloud(dev: Device):
|
||||
def test_cloud(dev: Device) -> None:
|
||||
cloud = dev.modules.get(Module.IotCloud)
|
||||
assert cloud
|
||||
info = cloud.info
|
||||
|
||||
@@ -14,7 +14,7 @@ _TD_ONE_MS: Final[timedelta] = timedelta(milliseconds=1)
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
def test_dimmer_getters(dev: IotDimmer):
|
||||
def test_dimmer_getters(dev: IotDimmer) -> None:
|
||||
assert Module.IotDimmer in dev.modules
|
||||
dimmer: Dimmer = dev.modules[Module.IotDimmer]
|
||||
|
||||
@@ -27,7 +27,7 @@ def test_dimmer_getters(dev: IotDimmer):
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
async def test_dimmer_setters(dev: IotDimmer, mocker: MockerFixture):
|
||||
async def test_dimmer_setters(dev: IotDimmer, mocker: MockerFixture) -> None:
|
||||
dimmer: Dimmer = dev.modules[Module.IotDimmer]
|
||||
query_helper = mocker.patch("kasa.iot.IotDimmer._query_helper")
|
||||
|
||||
@@ -65,7 +65,7 @@ async def test_dimmer_setters(dev: IotDimmer, mocker: MockerFixture):
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
async def test_dimmer_setter_min(dev: IotDimmer, mocker: MockerFixture):
|
||||
async def test_dimmer_setter_min(dev: IotDimmer, mocker: MockerFixture) -> None:
|
||||
dimmer: Dimmer = dev.modules[Module.IotDimmer]
|
||||
query_helper = mocker.patch("kasa.iot.IotDimmer._query_helper")
|
||||
|
||||
@@ -103,7 +103,7 @@ async def test_dimmer_setter_min(dev: IotDimmer, mocker: MockerFixture):
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
async def test_dimmer_setter_max(dev: IotDimmer, mocker: MockerFixture):
|
||||
async def test_dimmer_setter_max(dev: IotDimmer, mocker: MockerFixture) -> None:
|
||||
dimmer: Dimmer = dev.modules[Module.IotDimmer]
|
||||
query_helper = mocker.patch("kasa.iot.IotDimmer._query_helper")
|
||||
|
||||
@@ -141,7 +141,7 @@ async def test_dimmer_setter_max(dev: IotDimmer, mocker: MockerFixture):
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
async def test_dimmer_setters_min_oob(dev: IotDimmer, mocker: MockerFixture):
|
||||
async def test_dimmer_setters_min_oob(dev: IotDimmer, mocker: MockerFixture) -> None:
|
||||
dimmer: Dimmer = dev.modules[Module.IotDimmer]
|
||||
query_helper = mocker.patch("kasa.iot.IotDimmer._query_helper")
|
||||
|
||||
@@ -173,7 +173,7 @@ async def test_dimmer_setters_min_oob(dev: IotDimmer, mocker: MockerFixture):
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
async def test_dimmer_setters_max_oob(dev: IotDimmer, mocker: MockerFixture):
|
||||
async def test_dimmer_setters_max_oob(dev: IotDimmer, mocker: MockerFixture) -> None:
|
||||
dimmer: Dimmer = dev.modules[Module.IotDimmer]
|
||||
query_helper = mocker.patch("kasa.iot.IotDimmer._query_helper")
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ from voluptuous import (
|
||||
|
||||
from kasa import Device, DeviceType, EmeterStatus, Module
|
||||
from kasa.interfaces.energy import Energy
|
||||
from kasa.iot import IotStrip
|
||||
from kasa.iot import IotDevice, IotStrip
|
||||
from kasa.iot.modules.emeter import Emeter
|
||||
from tests.conftest import has_emeter_iot, no_emeter_iot
|
||||
|
||||
@@ -37,22 +37,22 @@ CURRENT_CONSUMPTION_SCHEMA = Schema(
|
||||
|
||||
|
||||
@no_emeter_iot
|
||||
async def test_no_emeter(dev):
|
||||
async def test_no_emeter(dev: IotDevice) -> None:
|
||||
assert not dev.has_emeter
|
||||
|
||||
with pytest.raises(AttributeError):
|
||||
await dev.get_emeter_realtime()
|
||||
await dev.get_emeter_realtime() # type: ignore[attr-defined]
|
||||
|
||||
with pytest.raises(AttributeError):
|
||||
await dev.get_emeter_daily()
|
||||
await dev.get_emeter_daily() # type: ignore[attr-defined]
|
||||
with pytest.raises(AttributeError):
|
||||
await dev.get_emeter_monthly()
|
||||
await dev.get_emeter_monthly() # type: ignore[attr-defined]
|
||||
with pytest.raises(AttributeError):
|
||||
await dev.erase_emeter_stats()
|
||||
await dev.erase_emeter_stats() # type: ignore[attr-defined]
|
||||
|
||||
|
||||
@has_emeter_iot
|
||||
async def test_get_emeter_realtime(dev):
|
||||
async def test_get_emeter_realtime(dev: IotDevice) -> None:
|
||||
emeter = dev.modules[Module.Energy]
|
||||
|
||||
current_emeter = await emeter.get_status()
|
||||
@@ -65,7 +65,7 @@ async def test_get_emeter_realtime(dev):
|
||||
|
||||
@has_emeter_iot
|
||||
@pytest.mark.requires_dummy
|
||||
async def test_get_emeter_daily(dev):
|
||||
async def test_get_emeter_daily(dev: IotDevice) -> None:
|
||||
emeter = dev.modules[Module.Energy]
|
||||
|
||||
assert await emeter.get_daily_stats(year=1900, month=1) == {}
|
||||
@@ -85,7 +85,7 @@ async def test_get_emeter_daily(dev):
|
||||
|
||||
@has_emeter_iot
|
||||
@pytest.mark.requires_dummy
|
||||
async def test_get_emeter_monthly(dev):
|
||||
async def test_get_emeter_monthly(dev: IotDevice) -> None:
|
||||
emeter = dev.modules[Module.Energy]
|
||||
|
||||
assert await emeter.get_monthly_stats(year=1900) == {}
|
||||
@@ -104,7 +104,7 @@ async def test_get_emeter_monthly(dev):
|
||||
|
||||
|
||||
@has_emeter_iot
|
||||
async def test_emeter_status(dev):
|
||||
async def test_emeter_status(dev: IotDevice) -> None:
|
||||
emeter = dev.modules[Module.Energy]
|
||||
|
||||
d = await emeter.get_status()
|
||||
@@ -126,21 +126,21 @@ async def test_emeter_status(dev):
|
||||
|
||||
@pytest.mark.skip("not clearing your stats..")
|
||||
@has_emeter_iot
|
||||
async def test_erase_emeter_stats(dev):
|
||||
async def test_erase_emeter_stats(dev: IotDevice) -> None:
|
||||
emeter = dev.modules[Module.Energy]
|
||||
|
||||
await emeter.erase_emeter()
|
||||
|
||||
|
||||
@has_emeter_iot
|
||||
async def test_current_consumption(dev):
|
||||
async def test_current_consumption(dev: IotDevice) -> None:
|
||||
emeter = dev.modules[Module.Energy]
|
||||
x = emeter.current_consumption
|
||||
assert isinstance(x, float)
|
||||
assert x >= 0.0
|
||||
|
||||
|
||||
async def test_emeterstatus_missing_current():
|
||||
async def test_emeterstatus_missing_current() -> None:
|
||||
"""KL125 does not report 'current' for emeter."""
|
||||
regular = EmeterStatus(
|
||||
{"err_code": 0, "power_mw": 0, "total_wh": 13, "current_ma": 123}
|
||||
@@ -154,13 +154,13 @@ async def test_emeterstatus_missing_current():
|
||||
assert missing_current["current"] is None
|
||||
|
||||
|
||||
async def test_emeter_daily():
|
||||
async def test_emeter_daily() -> None:
|
||||
"""Test fetching the emeter for today.
|
||||
|
||||
This test uses inline data since the fixtures
|
||||
will not have data for the current day.
|
||||
"""
|
||||
emeter_data = {
|
||||
emeter_data: dict = {
|
||||
"get_daystat": {
|
||||
"day_list": [{"day": 1, "energy_wh": 8, "month": 1, "year": 2023}],
|
||||
"err_code": 0,
|
||||
@@ -181,7 +181,7 @@ async def test_emeter_daily():
|
||||
|
||||
|
||||
@has_emeter_iot
|
||||
async def test_supported(dev: Device):
|
||||
async def test_supported(dev: Device) -> None:
|
||||
energy_module = dev.modules.get(Module.Energy)
|
||||
assert energy_module
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ from ...device_fixtures import device_iot
|
||||
|
||||
|
||||
@device_iot
|
||||
def test_homekit_getters(dev: IotDevice):
|
||||
def test_homekit_getters(dev: IotDevice) -> None:
|
||||
# HomeKit can be present on any IOT device
|
||||
if Module.IotHomeKit not in dev.modules:
|
||||
pytest.skip("HomeKit module not present on this device")
|
||||
@@ -31,7 +31,7 @@ def test_homekit_getters(dev: IotDevice):
|
||||
|
||||
|
||||
@device_iot
|
||||
def test_homekit_feature(dev: IotDevice):
|
||||
def test_homekit_feature(dev: IotDevice) -> None:
|
||||
if Module.IotHomeKit not in dev.modules:
|
||||
pytest.skip("HomeKit module not present on this device")
|
||||
homekit: HomeKit = dev.modules[Module.IotHomeKit]
|
||||
@@ -45,7 +45,7 @@ def test_homekit_feature(dev: IotDevice):
|
||||
|
||||
|
||||
@device_iot
|
||||
def test_initialize_features_skips_when_no_data(dev: IotDevice):
|
||||
def test_initialize_features_skips_when_no_data(dev: IotDevice) -> None:
|
||||
if Module.IotHomeKit not in dev.modules:
|
||||
pytest.skip("HomeKit module not present on this device")
|
||||
homekit: HomeKit = dev.modules[Module.IotHomeKit]
|
||||
|
||||
@@ -9,7 +9,7 @@ from ...device_fixtures import dimmer_iot
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
def test_motion_getters(dev: IotDimmer):
|
||||
def test_motion_getters(dev: IotDimmer) -> None:
|
||||
assert Module.IotMotion in dev.modules
|
||||
motion: Motion = dev.modules[Module.IotMotion]
|
||||
|
||||
@@ -19,7 +19,7 @@ def test_motion_getters(dev: IotDimmer):
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
async def test_motion_setters(dev: IotDimmer, mocker: MockerFixture):
|
||||
async def test_motion_setters(dev: IotDimmer, mocker: MockerFixture) -> None:
|
||||
motion: Motion = dev.modules[Module.IotMotion]
|
||||
query_helper = mocker.patch("kasa.iot.IotDimmer._query_helper")
|
||||
|
||||
@@ -33,7 +33,7 @@ async def test_motion_setters(dev: IotDimmer, mocker: MockerFixture):
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
async def test_motion_range(dev: IotDimmer, mocker: MockerFixture):
|
||||
async def test_motion_range(dev: IotDimmer, mocker: MockerFixture) -> None:
|
||||
motion: Motion = dev.modules[Module.IotMotion]
|
||||
query_helper = mocker.patch("kasa.iot.IotDimmer._query_helper")
|
||||
|
||||
@@ -47,7 +47,7 @@ async def test_motion_range(dev: IotDimmer, mocker: MockerFixture):
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
async def test_motion_range_from_string(dev: IotDimmer, mocker: MockerFixture):
|
||||
async def test_motion_range_from_string(dev: IotDimmer, mocker: MockerFixture) -> None:
|
||||
motion: Motion = dev.modules[Module.IotMotion]
|
||||
query_helper = mocker.patch("kasa.iot.IotDimmer._query_helper")
|
||||
|
||||
@@ -74,7 +74,7 @@ async def test_motion_range_from_string(dev: IotDimmer, mocker: MockerFixture):
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
async def test_motion_threshold(dev: IotDimmer, mocker: MockerFixture):
|
||||
async def test_motion_threshold(dev: IotDimmer, mocker: MockerFixture) -> None:
|
||||
motion: Motion = dev.modules[Module.IotMotion]
|
||||
query_helper = mocker.patch("kasa.iot.IotDimmer._query_helper")
|
||||
|
||||
@@ -97,7 +97,7 @@ async def test_motion_threshold(dev: IotDimmer, mocker: MockerFixture):
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
async def test_motion_realtime(dev: IotDimmer, mocker: MockerFixture):
|
||||
async def test_motion_realtime(dev: IotDimmer, mocker: MockerFixture) -> None:
|
||||
motion: Motion = dev.modules[Module.IotMotion]
|
||||
query_helper = mocker.patch("kasa.iot.IotDimmer._query_helper")
|
||||
|
||||
@@ -106,7 +106,7 @@ async def test_motion_realtime(dev: IotDimmer, mocker: MockerFixture):
|
||||
|
||||
|
||||
@dimmer_iot
|
||||
def test_motion_feature(dev: IotDimmer):
|
||||
def test_motion_feature(dev: IotDimmer) -> None:
|
||||
assert Module.IotMotion in dev.modules
|
||||
motion: Motion = dev.modules[Module.IotMotion]
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ from ...device_fixtures import device_iot
|
||||
|
||||
@device_iot
|
||||
@pytest.mark.xdist_group(name="caplog")
|
||||
def test_schedule(dev: Device, caplog: pytest.LogCaptureFixture):
|
||||
def test_schedule(dev: Device, caplog: pytest.LogCaptureFixture) -> None:
|
||||
schedule = dev.modules.get(Module.IotSchedule)
|
||||
assert schedule
|
||||
if rules := schedule.rules:
|
||||
|
||||
@@ -4,10 +4,10 @@ from unittest.mock import Mock
|
||||
from kasa.iot.modules import Usage
|
||||
|
||||
|
||||
def test_usage_convert_stat_data():
|
||||
usage = Usage(None, module="usage")
|
||||
def test_usage_convert_stat_data() -> None:
|
||||
usage = Usage(Mock(), module="usage")
|
||||
|
||||
test_data = []
|
||||
test_data: list[dict[str, int]] = []
|
||||
assert usage._convert_stat_data(test_data, "day") == {}
|
||||
|
||||
test_data = [
|
||||
@@ -24,13 +24,13 @@ def test_usage_convert_stat_data():
|
||||
assert v == 30
|
||||
|
||||
|
||||
def test_usage_today():
|
||||
def test_usage_today() -> None:
|
||||
"""Test fetching the usage for today.
|
||||
|
||||
This test uses inline data since the fixtures
|
||||
will not have data for the current day.
|
||||
"""
|
||||
emeter_data = {
|
||||
emeter_data: dict = {
|
||||
"get_daystat": {
|
||||
"day_list": [],
|
||||
"err_code": 0,
|
||||
@@ -55,13 +55,13 @@ def test_usage_today():
|
||||
assert usage.usage_today == 500
|
||||
|
||||
|
||||
def test_usage_this_month():
|
||||
def test_usage_this_month() -> None:
|
||||
"""Test fetching the usage for this month.
|
||||
|
||||
This test uses inline data since the fixtures
|
||||
will not have data for the current month.
|
||||
"""
|
||||
emeter_data = {
|
||||
emeter_data: dict = {
|
||||
"get_monthstat": {
|
||||
"month_list": [],
|
||||
"err_code": 0,
|
||||
|
||||
Reference in New Issue
Block a user