8000 Correct Quality Issues · python-kasa/python-kasa@5ebaadb · GitHub
[go: up one dir, main page]

Skip to content

Commit 5ebaadb

Browse files
committed
Correct Quality Issues
- Fix: Decrease log message severity in `feature.py`. - Fix: Rename `_set_range_cli` to `_set_range_from_str`. - Add: Basic tests for string to Motion Range value converter function.
1 parent 17ecda6 commit 5ebaadb

File tree

4 files changed

+53
-6
lines changed

4 files changed

+53
-6
lines changed

kasa/feature.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ def __repr__(self) -> str:
280280

281281
if self.type == Feature.Type.Choice:
282282
if not isinstance(choices, list):
283-
_LOGGER.critical(
283+
_LOGGER.error(
284284
"Choices are not properly defined for %s (%s). Type: <%s> Value: %s", # noqa: E501
285285
self.name,
286286
self.id,

kasa/iot/modules/motion.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def _initialize_features(self) -> None:
124124
name="Motion Sensor Range",
125125
icon="mdi:motion-sensor",
126126
attribute_getter="range",
127-
attribute_setter="_set_range_cli",
127+
attribute_setter="_set_range_from_str",
128128
type=Feature.Type.Choice,
129129
choices_getter="ranges",
130130
category=Feature.Category.Config,
@@ -336,7 +336,7 @@ def _parse_range_value(self, value: str) -> Range:
336336
)
337337
return Range[value]
338338

339-
async def _set_range_cli(self, input: str) -> dict:
339+
async def _set_range_from_str(self, input: str) -> dict:
340340
value = self._parse_range_value(input)
341341
return await self.set_range(range=value)
342342

tests/iot/modules/test_motion.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import pytest
12
from pytest_mock import MockerFixture
23

3-
from kasa import Module
4+
from kasa import KasaException, Module
45
from kasa.iot import IotDimmer
56
from kasa.iot.modules.motion import Motion, Range
67

@@ -45,6 +46,33 @@ async def test_motion_range(dev: IotDimmer, mocker: MockerFixture):
4546
)
4647

4748

49+
@dimmer_iot
50+
async def test_motion_range_from_string(dev: IotDimmer, mocker: MockerFixture):
51+
motion: Motion = dev.modules[Module.IotMotion]
52+
query_helper = mocker.patch("kasa.iot.IotDimmer._query_helper")
53+
54+
ranges_good = {
55+
"near": Range.< 10000 span class=pl-c1>Near,
56+
"MID": Range.Mid,
57+
"fAr": Range.Far,
58+
" Custom ": Range.Custom,
59+
}
60+
for range_str, range in ranges_good.items():
61+
await motion._set_range_from_str(range_str)
62+
query_helper.assert_called_with(
63+
"smartlife.iot.PIR",
64+
"set_trigger_sens",
65+
{"index": range.value},
66+
)
67+
68+
query_helper = mocker.patch("kasa.iot.IotDimmer._query_helper")
69+
ranges_bad = ["near1", "MD", "F\nAR", "Custom Near", '"FAR"', "'FAR'"]
70+
for range_str in ranges_bad:
71+
with pytest.raises(KasaException):
72+
await motion._set_range_from_str(range_str)
73+
query_helper.assert_not_called()
74+
75+
4876
@dimmer_iot
4977
async def test_motion_threshold(dev: IotDimmer, mocker: MockerFixture):
5078
motion: Motion = dev.modules[Module.IotMotion]

tests/test_cli.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,7 +1185,7 @@ async def test_feature_set_unquoted(mocker, runner):
11851185
dummy_device = await get_device_for_fixture_protocol(
11861186
"ES20M(US)_1.0_1.0.11.json", "IOT"
11871187
)
1188-
range_setter = mocker.patch("kasa.iot.modules.motion.Motion._set_range_cli")
1188+
range_setter = mocker.patch("kasa.iot.modules.motion.Motion._set_range_from_str")
11891189
mocker.patch("kasa.discover.Discover.discover_single", return_value=dummy_device)
11901190

11911191
res = await runner.invoke(
@@ -1204,7 +1204,7 @@ async def test_feature_set_badquoted(mocker, runner):
12041204
dummy_device = await get_device_for_fixture_protocol(
12051205
"ES20M(US)_1.0_1.0.11.json", "IOT"
12061206
)
1207-
range_setter = mocker.patch("kasa.iot.modules.motion.Motion._set_range_cli")
1207+
range_setter = mocker.patch("kasa.iot.modules.motion.Motion._set_range_from_str")
12081208
mocker.patch("kasa.discover.Discover.discover_single", return_value=dummy_device)
12091209

12101210
res = await runner.invoke(
@@ -1218,6 +1218,25 @@ async def test_feature_set_badquoted(mocker, runner):
12181218
assert res.exit_code != 0
12191219

12201220

1221+
async def test_feature_set_goodquoted(mocker, runner):
1222+
"""Test feature command's set value."""
1223+
dummy_device = await get_device_for_fixture_protocol(
1224+
"ES20M(US)_1.0_1.0.11.json", "IOT"
1225+
)
1226+
range_setter = mocker.patch("kasa.iot.modules.motion.Motion._set_range_from_str")
1227+
mocker.patch("kasa.discover.Discover.discover_single", return_value=dummy_device)
1228+
1229+
res = await runner.invoke(
1230+
cli,
1231+
["--host", "127.0.0.123", "--debug", "feature", "pir_range", "'Far'"],
1232+
catch_exceptions=False,
1233+
)
1234+
1235+
range_setter.assert_called()
1236+
assert "Error: Invalid value: " not in res.output
1237+
assert res.exit_code == 0
1238+
1239+
12211240
async def test_cli_child_commands(
12221241
dev: Device, runner: CliRunner, mocker: MockerFixture
12231242
):

0 commit comments

Comments
 (0)
0