Skip to content

Commit d026b67

Browse files
committed
chore: add testing
1 parent e6fc646 commit d026b67

File tree

2 files changed

+122
-1
lines changed

2 files changed

+122
-1
lines changed

roborock/devices/b01_channel.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ def find_response(response_message: RoborockMessage) -> None:
6161
if isinstance(inner, dict) and inner.get("msgId") == msg_id:
6262
_LOGGER.debug("Received query response: %s", inner)
6363
data = inner.get("data")
64+
# All get commands should be dicts
65+
if command.endswith(".get") and not isinstance(data, dict):
66+
if not future.done():
67+
future.set_exception(RoborockException("Unexpected data type for response"))
68+
return
6469
if not future.done():
6570
future.set_result(data)
6671

tests/devices/traits/b01/test_init.py

Lines changed: 117 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@
66
from Crypto.Cipher import AES
77
from Crypto.Util.Padding import pad, unpad
88

9-
from roborock.data.b01_q7 import WorkStatusMapping
9+
from roborock.data.b01_q7 import (
10+
CleanTaskTypeMapping,
11+
SCDeviceCleanParam,
12+
SCWindMapping,
13+
WaterLevelMapping,
14+
WorkStatusMapping,
15+
)
1016
from roborock.devices.b01_channel import send_decoded_command
1117
from roborock.devices.traits.b01.q7 import Q7PropertiesApi
1218
from roborock.exceptions import RoborockException
@@ -164,3 +170,113 @@ async def test_send_decoded_command_non_dict_response(fake_channel: FakeChannel)
164170

165171
with pytest.raises(RoborockException, match="Unexpected data type for response"):
166172
await send_decoded_command(fake_channel, 10000, "prop.get", []) # type: ignore[arg-type]
173+
174+
175+
async def test_q7_api_set_fan_speed(q7_api: Q7PropertiesApi, fake_channel: FakeChannel):
176+
"""Test setting fan speed."""
177+
msg_id = "12345"
178+
with patch("roborock.devices.b01_channel.get_next_int", return_value=int(msg_id)):
179+
fake_channel.response_queue.append(build_b01_message({"result": "ok"}, msg_id=msg_id))
180+
await q7_api.set_fan_speed(SCWindMapping.STRONG)
181+
182+
assert len(fake_channel.published_messages) == 1
183+
message = fake_channel.published_messages[0]
184+
payload_data = json.loads(unpad(message.payload, AES.block_size))
185+
assert payload_data["dps"]["10000"]["method"] == "prop.set"
186+
assert payload_data["dps"]["10000"]["params"] == {RoborockB01Props.WIND: SCWindMapping.STRONG.code}
187+
188+
189+
async def test_q7_api_set_water_level(q7_api: Q7PropertiesApi, fake_channel: FakeChannel):
190+
"""Test setting water level."""
191+
msg_id = "12346"
192+
with patch("roborock.devices.b01_channel.get_next_int", return_value=int(msg_id)):
193+
fake_channel.response_queue.append(build_b01_message({"result": "ok"}, msg_id=msg_id))
194+
await q7_api.set_water_level(WaterLevelMapping.HIGH)
195+
196+
assert len(fake_channel.published_messages) == 1
197+
message = fake_channel.published_messages[0]
198+
payload_data = json.loads(unpad(message.payload, AES.block_size))
199+
assert payload_data["dps"]["10000"]["method"] == "prop.set"
200+
assert payload_data["dps"]["10000"]["params"] == {RoborockB01Props.WATER: WaterLevelMapping.HIGH.code}
201+
202+
203+
async def test_q7_api_start_clean(q7_api: Q7PropertiesApi, fake_channel: FakeChannel):
204+
"""Test starting cleaning."""
205+
msg_id = "12347"
206+
with patch("roborock.devices.b01_channel.get_next_int", return_value=int(msg_id)):
207+
fake_channel.response_queue.append(build_b01_message({"result": "ok"}, msg_id=msg_id))
208+
await q7_api.start_clean()
209+
210+
assert len(fake_channel.published_messages) == 1
211+
message = fake_channel.published_messages[0]
212+
payload_data = json.loads(unpad(message.payload, AES.block_size))
213+
assert payload_data["dps"]["10000"]["method"] == "service.set_room_clean"
214+
assert payload_data["dps"]["10000"]["params"] == {
215+
"clean_type": CleanTaskTypeMapping.ALL.code,
216+
"ctrl_value": SCDeviceCleanParam.START.code,
217+
"room_ids": [],
218+
}
219+
220+
221+
async def test_q7_api_pause_clean(q7_api: Q7PropertiesApi, fake_channel: FakeChannel):
222+
"""Test pausing cleaning."""
223+
msg_id = "12348"
224+
with patch("roborock.devices.b01_channel.get_next_int", return_value=int(msg_id)):
225+
fake_channel.response_queue.append(build_b01_message({"result": "ok"}, msg_id=msg_id))
226+
await q7_api.pause_clean()
227+
228+
assert len(fake_channel.published_messages) == 1
229+
message = fake_channel.published_messages[0]
230+
payload_data = json.loads(unpad(message.payload, AES.block_size))
231+
assert payload_data["dps"]["10000"]["method"] == "service.set_room_clean"
232+
assert payload_data["dps"]["10000"]["params"] == {
233+
"clean_type": CleanTaskTypeMapping.ALL.code,
234+
"ctrl_value": SCDeviceCleanParam.PAUSE.code,
235+
"room_ids": [],
236+
}
237+
238+
239+
async def test_q7_api_stop_clean(q7_api: Q7PropertiesApi, fake_channel: FakeChannel):
240+
"""Test stopping cleaning."""
241+
msg_id = "12349"
242+
with patch("roborock.devices.b01_channel.get_next_int", return_value=int(msg_id)):
243+
fake_channel.response_queue.append(build_b01_message({"result": "ok"}, msg_id=msg_id))
244+
await q7_api.stop_clean()
245+
246+
assert len(fake_channel.published_messages) == 1
247+
message = fake_channel.published_messages[0]
248+
payload_data = json.loads(unpad(message.payload, AES.block_size))
249+
assert payload_data["dps"]["10000"]["method"] == "service.set_room_clean"
250+
assert payload_data["dps"]["10000"]["params"] == {
251+
"clean_type": CleanTaskTypeMapping.ALL.code,
252+
"ctrl_value": SCDeviceCleanParam.STOP.code,
253+
"room_ids": [],
254+
}
255+
256+
257+
async def test_q7_api_return_to_dock(q7_api: Q7PropertiesApi, fake_channel: FakeChannel):
258+
"""Test returning to dock."""
259+
msg_id = "12350"
260+
with patch("roborock.devices.b01_channel.get_next_int", return_value=int(msg_id)):
261+
fake_channel.response_queue.append(build_b01_message({"result": "ok"}, msg_id=msg_id))
262+
await q7_api.return_to_dock()
263+
264+
assert len(fake_channel.published_messages) == 1
265+
message = fake_channel.published_messages[0]
266+
payload_data = json.loads(unpad(message.payload, AES.block_size))
267+
assert payload_data["dps"]["10000"]["method"] == "service.start_recharge"
268+
assert payload_data["dps"]["10000"]["params"] == {}
269+
270+
271+
async def test_q7_api_find_me(q7_api: Q7PropertiesApi, fake_channel: FakeChannel):
272+
"""Test locating the device."""
273+
msg_id = "12351"
274+
with patch("roborock.devices.b01_channel.get_next_int", return_value=int(msg_id)):
275+
fake_channel.response_queue.append(build_b01_message({"result": "ok"}, msg_id=msg_id))
276+
await q7_api.find_me()
277+
278+
assert len(fake_channel.published_messages) == 1
279+
message = fake_channel.published_messages[0]
280+
payload_data = json.loads(unpad(message.payload, AES.block_size))
281+
assert payload_data["dps"]["10000"]["method"] == "service.find_device"
282+
assert payload_data["dps"]["10000"]["params"] == {}

0 commit comments

Comments
 (0)