From 44595a7d378eb80010400b01ea2af5ccaa8445fe Mon Sep 17 00:00:00 2001 From: sdb9696 Date: Tue, 5 Mar 2024 15:59:21 +0000 Subject: [PATCH 1/3] Put child fixtures in subfolder --- devtools/dump_devinfo.py | 5 ++++- kasa/tests/device_fixtures.py | 5 +++++ kasa/tests/fixtureinfo.py | 13 ++++++++++++- kasa/tests/fixtures/smart/child/.gitkeep | 1 + 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 kasa/tests/fixtures/smart/child/.gitkeep diff --git a/devtools/dump_devinfo.py b/devtools/dump_devinfo.py index ebfe3b1bb..01921ccf1 100644 --- a/devtools/dump_devinfo.py +++ b/devtools/dump_devinfo.py @@ -39,6 +39,7 @@ FixtureResult = namedtuple("FixtureResult", "filename, folder, data") SMART_FOLDER = "kasa/tests/fixtures/smart/" +SMART_CHILD_FOLDER = "kasa/tests/fixtures/smart/child/" IOT_FOLDER = "kasa/tests/fixtures/" _LOGGER = logging.getLogger(__name__) @@ -531,7 +532,9 @@ def get_smart_child_fixture(response): model += f"({region})" save_filename = f"{model}_{hw_version}_{sw_version}.json" - return FixtureResult(filename=save_filename, folder=SMART_FOLDER, data=response) + return FixtureResult( + filename=save_filename, folder=SMART_CHILD_FOLDER, data=response + ) async def get_smart_fixtures(device: SmartDevice, batch_size: int): diff --git a/kasa/tests/device_fixtures.py b/kasa/tests/device_fixtures.py index 8a1b643bd..e65e865bd 100644 --- a/kasa/tests/device_fixtures.py +++ b/kasa/tests/device_fixtures.py @@ -349,6 +349,11 @@ async def get_device_for_fixture(fixture_data: FixtureInfo): d.protocol = FakeSmartProtocol(fixture_data.data, fixture_data.name) else: d.protocol = FakeIotProtocol(fixture_data.data) + + # smart child devices do not have their own discovery data + if fixture_data.protocol == "SMART.CHILD": + return d + if "discovery_result" in fixture_data.data: discovery_data = {"result": fixture_data.data["discovery_result"]} else: diff --git a/kasa/tests/fixtureinfo.py b/kasa/tests/fixtureinfo.py index 52250aab4..dc6e53075 100644 --- a/kasa/tests/fixtureinfo.py +++ b/kasa/tests/fixtureinfo.py @@ -29,8 +29,17 @@ class FixtureInfo(NamedTuple): ) ] +SUPPORTED_SMART_CHILD_DEVICES = [ + (device, "SMART.CHILD") + for device in glob.glob( + os.path.dirname(os.path.abspath(__file__)) + "/fixtures/smart/child/*.json" + ) +] + -SUPPORTED_DEVICES = SUPPORTED_IOT_DEVICES + SUPPORTED_SMART_DEVICES +SUPPORTED_DEVICES = ( + SUPPORTED_IOT_DEVICES + SUPPORTED_SMART_DEVICES + SUPPORTED_SMART_CHILD_DEVICES +) def idgenerator(paramtuple: FixtureInfo): @@ -50,6 +59,8 @@ def get_fixture_info() -> List[FixtureInfo]: folder = Path(__file__).parent / "fixtures" if protocol == "SMART": folder = folder / "smart" + if protocol == "SMART.CHILD": + folder = folder / "smart/child" p = folder / file with open(p) as f: diff --git a/kasa/tests/fixtures/smart/child/.gitkeep b/kasa/tests/fixtures/smart/child/.gitkeep new file mode 100644 index 000000000..74bef8496 --- /dev/null +++ b/kasa/tests/fixtures/smart/child/.gitkeep @@ -0,0 +1 @@ +Can be deleted when first fixture is added From 0975f44a66e51db94d99fef8561ac8781387e603 Mon Sep 17 00:00:00 2001 From: sdb9696 Date: Tue, 5 Mar 2024 16:46:31 +0000 Subject: [PATCH 2/3] Exclude child from discovery fixtures --- kasa/tests/discovery_fixtures.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/kasa/tests/discovery_fixtures.py b/kasa/tests/discovery_fixtures.py index ce1f7d1c2..2b6453aee 100644 --- a/kasa/tests/discovery_fixtures.py +++ b/kasa/tests/discovery_fixtures.py @@ -8,7 +8,7 @@ from .fakeprotocol_iot import FakeIotProtocol from .fakeprotocol_smart import FakeSmartProtocol -from .fixtureinfo import FIXTURE_DATA, FixtureInfo, filter_fixtures, idgenerator +from .fixtureinfo import FixtureInfo, filter_fixtures, idgenerator def _make_unsupported(device_family, encrypt_type): @@ -42,8 +42,10 @@ def _make_unsupported(device_family, encrypt_type): } -def parametrize_discovery(desc, root_key): - filtered_fixtures = filter_fixtures(desc, data_root_filter=root_key) +def parametrize_discovery(desc, *, data_root_filter, protocol_filter=None): + filtered_fixtures = filter_fixtures( + desc, data_root_filter=data_root_filter, protocol_filter=protocol_filter + ) return pytest.mark.parametrize( "discovery_mock", filtered_fixtures, @@ -52,10 +54,15 @@ def parametrize_discovery(desc, root_key): ) -new_discovery = parametrize_discovery("new discovery", "discovery_result") +new_discovery = parametrize_discovery( + "new discovery", data_root_filter="discovery_result" +) -@pytest.fixture(params=FIXTURE_DATA, ids=idgenerator) +@pytest.fixture( + params=filter_fixtures("discoverable", protocol_filter={"SMART", "IOT"}), + ids=idgenerator, +) def discovery_mock(request, mocker): fixture_info: FixtureInfo = request.param fixture_data = fixture_info.data @@ -142,7 +149,10 @@ async def _query(request, retry_count: int = 3): yield dm -@pytest.fixture(params=FIXTURE_DATA, ids=idgenerator) +@pytest.fixture( + params=filter_fixtures("discoverable", protocol_filter={"SMART", "IOT"}), + ids=idgenerator, +) def discovery_data(request, mocker): """Return raw discovery file contents as JSON. Used for discovery tests.""" fixture_info = request.param From 2cd71e0146ed62502a643ebc2d5179bdcafc1ba2 Mon Sep 17 00:00:00 2001 From: sdb9696 Date: Tue, 5 Mar 2024 17:08:45 +0000 Subject: [PATCH 3/3] Fix protocol checking --- kasa/tests/device_fixtures.py | 15 +++++++-------- kasa/tests/discovery_fixtures.py | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/kasa/tests/device_fixtures.py b/kasa/tests/device_fixtures.py index e65e865bd..5843639e8 100644 --- a/kasa/tests/device_fixtures.py +++ b/kasa/tests/device_fixtures.py @@ -277,7 +277,7 @@ def check_categories(): def device_for_fixture_name(model, protocol): - if protocol == "SMART": + if "SMART" in protocol: for d in PLUGS_SMART: if d in model: return SmartDevice @@ -345,22 +345,21 @@ async def get_device_for_fixture(fixture_data: FixtureInfo): d = device_for_fixture_name(fixture_data.name, fixture_data.protocol)( host="127.0.0.123" ) - if fixture_data.protocol == "SMART": + if "SMART" in fixture_data.protocol: d.protocol = FakeSmartProtocol(fixture_data.data, fixture_data.name) else: d.protocol = FakeIotProtocol(fixture_data.data) - # smart child devices do not have their own discovery data - if fixture_data.protocol == "SMART.CHILD": - return d - + discovery_data = None if "discovery_result" in fixture_data.data: discovery_data = {"result": fixture_data.data["discovery_result"]} - else: + elif "system" in fixture_data.data: discovery_data = { "system": {"get_sysinfo": fixture_data.data["system"]["get_sysinfo"]} } - d.update_from_discover_info(discovery_data) + if discovery_data: # Child devices do not have discovery info + d.update_from_discover_info(discovery_data) + await _update_and_close(d) return d diff --git a/kasa/tests/discovery_fixtures.py b/kasa/tests/discovery_fixtures.py index 2b6453aee..653f99709 100644 --- a/kasa/tests/discovery_fixtures.py +++ b/kasa/tests/discovery_fixtures.py @@ -135,7 +135,7 @@ async def mock_discover(self): side_effect=lambda *_, **__: [(None, None, None, None, (dm.ip, 0))], ) - if fixture_info.protocol == "SMART": + if "SMART" in fixture_info.protocol: proto = FakeSmartProtocol(fixture_data, fixture_info.name) else: proto = FakeIotProtocol(fixture_data)