|
15 | 15 | from roborock.devices.device import RoborockDevice |
16 | 16 | from roborock.devices.device_manager import UserParams, create_device_manager, create_web_api_wrapper |
17 | 17 | from roborock.exceptions import RoborockException, RoborockInvalidCredentials |
18 | | -from roborock.testing import FakeRoborockCloud, V1VacuumSimulator |
| 18 | +from roborock.testing import FakeRoborockCloud, Q10VacuumSimulator, V1VacuumSimulator |
19 | 19 | from tests import mock_data |
20 | 20 |
|
21 | 21 | USER_DATA = UserData.from_dict(mock_data.USER_DATA) |
@@ -56,6 +56,83 @@ async def test_no_devices(cloud: FakeRoborockCloud, patch_device_manager: None) |
56 | 56 | assert devices == [] |
57 | 57 |
|
58 | 58 |
|
| 59 | +async def test_with_q10_device(cloud: FakeRoborockCloud, patch_device_manager: None) -> None: |
| 60 | + """Test DeviceManager with a Q10 device simulator registered.""" |
| 61 | + product = HomeDataProduct( |
| 62 | + id="product-id-q10", |
| 63 | + name="Roborock Q10", |
| 64 | + model="roborock.vacuum.ss07", |
| 65 | + category=RoborockCategory.VACUUM, |
| 66 | + ) |
| 67 | + device_info = HomeDataDevice( |
| 68 | + duid="q10_duid", |
| 69 | + name="My Q10", |
| 70 | + local_key="key123key123key1", |
| 71 | + product_id=product.id, |
| 72 | + sn="q10_serial", |
| 73 | + pv="B01", |
| 74 | + ) |
| 75 | + |
| 76 | + home_data = cloud.web_api.get_default_home_data() |
| 77 | + home_data.devices.append(device_info) |
| 78 | + home_data.products.append(product) |
| 79 | + cloud.web_api.set_homes_response(home_data) |
| 80 | + |
| 81 | + q10_sim = Q10VacuumSimulator( |
| 82 | + duid="q10_duid", |
| 83 | + device_info=device_info, |
| 84 | + product=product, |
| 85 | + ) |
| 86 | + cloud.add_device(q10_sim) |
| 87 | + |
| 88 | + device_manager = await create_device_manager(USER_PARAMS) |
| 89 | + devices = await device_manager.get_devices() |
| 90 | + |
| 91 | + # The setup includes fake_device (V1) by default because of the fake_device fixture |
| 92 | + # which is not requested here (we only request cloud and patch_device_manager), |
| 93 | + # but the mock EAPI returns the full home_data layout containing our Q10 device. |
| 94 | + assert len(devices) == 1 |
| 95 | + |
| 96 | + q10_device = await device_manager.get_device("q10_duid") |
| 97 | + assert q10_device is not None |
| 98 | + assert q10_device.name == "My Q10" |
| 99 | + assert q10_device.product.model == "roborock.vacuum.ss07" |
| 100 | + |
| 101 | + # Wait for background connect to establish |
| 102 | + for _ in range(20): |
| 103 | + if q10_device.is_connected: |
| 104 | + break |
| 105 | + await asyncio.sleep(0.05) |
| 106 | + assert q10_device.is_connected |
| 107 | + |
| 108 | + assert q10_device.b01_q10_properties is not None |
| 109 | + assert q10_device.b01_q10_properties.status.status is None |
| 110 | + |
| 111 | + await q10_device.b01_q10_properties.refresh() |
| 112 | + |
| 113 | + for _ in range(20): |
| 114 | + if q10_device.b01_q10_properties.status.battery == 100: |
| 115 | + break |
| 116 | + await asyncio.sleep(0.05) |
| 117 | + |
| 118 | + assert q10_device.b01_q10_properties.status.battery == 100 |
| 119 | + from roborock.data.b01_q10.b01_q10_code_mappings import YXDeviceState |
| 120 | + |
| 121 | + assert q10_device.b01_q10_properties.status.status == YXDeviceState.CHARGING |
| 122 | + |
| 123 | + await q10_device.b01_q10_properties.vacuum.start_clean() |
| 124 | + |
| 125 | + for _ in range(20): |
| 126 | + if q10_device.b01_q10_properties.status.status == YXDeviceState.CLEANING: |
| 127 | + break |
| 128 | + await asyncio.sleep(0.05) |
| 129 | + |
| 130 | + assert q10_device.b01_q10_properties.status.status == YXDeviceState.CLEANING |
| 131 | + assert q10_sim.status[121] == 5 |
| 132 | + |
| 133 | + await device_manager.close() |
| 134 | + |
| 135 | + |
59 | 136 | async def test_with_device( |
60 | 137 | cloud: FakeRoborockCloud, fake_device: V1VacuumSimulator, patch_device_manager: None |
61 | 138 | ) -> None: |
|
0 commit comments