|
6 | 6 | from Crypto.Cipher import AES |
7 | 7 | from Crypto.Util.Padding import pad, unpad |
8 | 8 |
|
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 | +) |
10 | 16 | from roborock.devices.b01_channel import send_decoded_command |
11 | 17 | from roborock.devices.traits.b01.q7 import Q7PropertiesApi |
12 | 18 | from roborock.exceptions import RoborockException |
@@ -164,3 +170,113 @@ async def test_send_decoded_command_non_dict_response(fake_channel: FakeChannel) |
164 | 170 |
|
165 | 171 | with pytest.raises(RoborockException, match="Unexpected data type for response"): |
166 | 172 | 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