Skip to content

Commit d82747d

Browse files
authored
Support multiple child requests (python-kasa#795)
1 parent cbf82c9 commit d82747d

File tree

2 files changed

+14
-10
lines changed

2 files changed

+14
-10
lines changed

kasa/smartprotocol.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,10 +340,16 @@ async def query(self, request: Union[str, Dict], retry_count: int = 3) -> Dict:
340340
result = response.get("control_child")
341341
# Unwrap responseData for control_child
342342
if result and (response_data := result.get("responseData")):
343-
self._handle_response_error_code(response_data, "control_child")
344343
result = response_data.get("result")
344+
if result and (multi_responses := result.get("responses")):
345+
ret_val = {}
346+
for multi_response in multi_responses:
347+
method = multi_response["method"]
348+
self._handle_response_error_code(multi_response, method)
349+
ret_val[method] = multi_response.get("result")
350+
return ret_val
345351

346-
# TODO: handle multipleRequest unwrapping
352+
self._handle_response_error_code(response_data, "control_child")
347353

348354
return {method: result}
349355

kasa/tests/test_smartprotocol.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ async def test_childdevicewrapper_error(dummy_protocol, mocker):
122122
await wrapped_protocol.query(DUMMY_QUERY)
123123

124124

125-
@pytest.mark.skip("childprotocolwrapper does not yet support multirequests")
126125
async def test_childdevicewrapper_unwrapping_multiplerequest(dummy_protocol, mocker):
127126
"""Test that unwrapping multiplerequest works correctly."""
128127
mock_response = {
@@ -146,13 +145,12 @@ async def test_childdevicewrapper_unwrapping_multiplerequest(dummy_protocol, moc
146145
}
147146
},
148147
}
149-
150-
mocker.patch.object(dummy_protocol._transport, "send", return_value=mock_response)
151-
resp = await dummy_protocol.query(DUMMY_QUERY)
148+
wrapped_protocol = _ChildProtocolWrapper("dummyid", dummy_protocol)
149+
mocker.patch.object(wrapped_protocol._transport, "send", return_value=mock_response)
150+
resp = await wrapped_protocol.query(DUMMY_QUERY)
152151
assert resp == {"get_device_info": {"foo": "bar"}, "second_command": {"bar": "foo"}}
153152

154153

155-
@pytest.mark.skip("childprotocolwrapper does not yet support multirequests")
156154
async def test_childdevicewrapper_multiplerequest_error(dummy_protocol, mocker):
157155
"""Test that errors inside multipleRequest response of responseData raise an exception."""
158156
mock_response = {
@@ -172,7 +170,7 @@ async def test_childdevicewrapper_multiplerequest_error(dummy_protocol, mocker):
172170
}
173171
},
174172
}
175-
176-
mocker.patch.object(dummy_protocol._transport, "send", return_value=mock_response)
173+
wrapped_protocol = _ChildProtocolWrapper("dummyid", dummy_protocol)
174+
mocker.patch.object(wrapped_protocol._transport, "send", return_value=mock_response)
177175
with pytest.raises(KasaException):
178-
await dummy_protocol.query(DUMMY_QUERY)
176+
await wrapped_protocol.query(DUMMY_QUERY)

0 commit comments

Comments
 (0)