mirror of
https://github.com/python-kasa/python-kasa.git
synced 2025-08-06 10:44:04 +00:00
Implement choice feature type (#880)
Implement the choice feature type allowing to provide a list of choices that can be set. Co-authored-by: sdb9696
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import copy
|
||||
from dataclasses import dataclass
|
||||
from json import dumps as json_dumps
|
||||
|
||||
@@ -8,7 +9,7 @@ import pytest
|
||||
from kasa.xortransport import XorEncryption
|
||||
|
||||
from .fakeprotocol_iot import FakeIotProtocol
|
||||
from .fakeprotocol_smart import FakeSmartProtocol
|
||||
from .fakeprotocol_smart import FakeSmartProtocol, FakeSmartTransport
|
||||
from .fixtureinfo import FixtureInfo, filter_fixtures, idgenerator
|
||||
|
||||
|
||||
@@ -65,6 +66,7 @@ new_discovery = parametrize_discovery(
|
||||
ids=idgenerator,
|
||||
)
|
||||
def discovery_mock(request, mocker):
|
||||
"""Mock discovery and patch protocol queries to use Fake protocols."""
|
||||
fixture_info: FixtureInfo = request.param
|
||||
fixture_data = fixture_info.data
|
||||
|
||||
@@ -157,12 +159,23 @@ def discovery_mock(request, mocker):
|
||||
def discovery_data(request, mocker):
|
||||
"""Return raw discovery file contents as JSON. Used for discovery tests."""
|
||||
fixture_info = request.param
|
||||
mocker.patch("kasa.IotProtocol.query", return_value=fixture_info.data)
|
||||
mocker.patch("kasa.SmartProtocol.query", return_value=fixture_info.data)
|
||||
if "discovery_result" in fixture_info.data:
|
||||
return {"result": fixture_info.data["discovery_result"]}
|
||||
fixture_data = copy.deepcopy(fixture_info.data)
|
||||
# Add missing queries to fixture data
|
||||
if "component_nego" in fixture_data:
|
||||
components = {
|
||||
comp["id"]: int(comp["ver_code"])
|
||||
for comp in fixture_data["component_nego"]["component_list"]
|
||||
}
|
||||
for k, v in FakeSmartTransport.FIXTURE_MISSING_MAP.items():
|
||||
# Value is a tuple of component,reponse
|
||||
if k not in fixture_data and v[0] in components:
|
||||
fixture_data[k] = v[1]
|
||||
mocker.patch("kasa.IotProtocol.query", return_value=fixture_data)
|
||||
mocker.patch("kasa.SmartProtocol.query", return_value=fixture_data)
|
||||
if "discovery_result" in fixture_data:
|
||||
return {"result": fixture_data["discovery_result"]}
|
||||
else:
|
||||
return {"system": {"get_sysinfo": fixture_info.data["system"]["get_sysinfo"]}}
|
||||
return {"system": {"get_sysinfo": fixture_data["system"]["get_sysinfo"]}}
|
||||
|
||||
|
||||
@pytest.fixture(params=UNSUPPORTED_DEVICES.values(), ids=UNSUPPORTED_DEVICES.keys())
|
||||
|
@@ -354,9 +354,6 @@ async def test_credentials(discovery_mock, mocker, runner):
|
||||
|
||||
mocker.patch("kasa.cli.state", new=_state)
|
||||
|
||||
mocker.patch("kasa.IotProtocol.query", return_value=discovery_mock.query_data)
|
||||
mocker.patch("kasa.SmartProtocol.query", return_value=discovery_mock.query_data)
|
||||
|
||||
dr = DiscoveryResult(**discovery_mock.discovery_data["result"])
|
||||
res = await runner.invoke(
|
||||
cli,
|
||||
|
@@ -1,4 +1,5 @@
|
||||
import pytest
|
||||
from pytest_mock import MockFixture
|
||||
|
||||
from kasa import Feature
|
||||
|
||||
@@ -110,6 +111,23 @@ async def test_feature_action(mocker):
|
||||
mock_call_action.assert_called()
|
||||
|
||||
|
||||
async def test_feature_choice_list(dummy_feature, caplog, mocker: MockFixture):
|
||||
"""Test the choice feature type."""
|
||||
dummy_feature.type = Feature.Type.Choice
|
||||
dummy_feature.choices = ["first", "second"]
|
||||
|
||||
mock_setter = mocker.patch.object(dummy_feature.device, "dummysetter", create=True)
|
||||
await dummy_feature.set_value("first")
|
||||
mock_setter.assert_called_with("first")
|
||||
mock_setter.reset_mock()
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
await dummy_feature.set_value("invalid")
|
||||
assert "Unexpected value" in caplog.text
|
||||
|
||||
mock_setter.assert_not_called()
|
||||
|
||||
|
||||
@pytest.mark.parametrize("precision_hint", [1, 2, 3])
|
||||
async def test_precision_hint(dummy_feature, precision_hint):
|
||||
"""Test that precision hint works as expected."""
|
||||
|
Reference in New Issue
Block a user