1
1
"""Tests for TuyaQuirkBuilder."""
2
2
3
+ import datetime
3
4
from unittest import mock
4
5
5
6
import pytest
9
10
from zigpy .zcl import foundation
10
11
from zigpy .zcl .clusters .general import Basic , BatterySize
11
12
12
- from tests .common import ClusterListener , wait_for_zigpy_tasks
13
+ from tests .common import ClusterListener , MockDatetime , wait_for_zigpy_tasks
13
14
import zhaquirks
14
15
from zhaquirks .tuya import (
15
16
TUYA_QUERY_DATA ,
17
+ TUYA_SET_TIME ,
16
18
TuyaPowerConfigurationCluster ,
17
19
TuyaPowerConfigurationCluster2AAA ,
18
20
)
31
33
TuyaValveWaterConsumed ,
32
34
)
33
35
from zhaquirks .tuya .mcu import TuyaMCUCluster , TuyaOnOffNM
36
+ from zhaquirks .tuya .tuya_sensor import NoManufTimeTuyaMCUCluster
37
+
38
+ ZCL_TUYA_SET_TIME = b"\x09 \x12 \x24 \x0d \x00 "
34
39
35
40
zhaquirks .setup ()
36
41
@@ -140,6 +145,9 @@ class TestEnum(t.enum8):
140
145
A = 0x00
141
146
B = 0x01
142
147
148
+ class ModTuyaMCUCluster (TuyaMCUCluster ):
149
+ """Modified Cluster."""
150
+
143
151
entry = (
144
152
TuyaQuirkBuilder (device_mock .manufacturer , device_mock .model , registry = registry )
145
153
.tuya_battery (dp_id = 1 )
@@ -178,7 +186,7 @@ class TestEnum(t.enum8):
178
186
fallback_name = "Test enum" ,
179
187
)
180
188
.skip_configuration ()
181
- .add_to_registry ()
189
+ .add_to_registry (replacement_cluster = ModTuyaMCUCluster )
182
190
)
183
191
184
192
# coverage for overridden __eq__ method
@@ -195,6 +203,7 @@ class TestEnum(t.enum8):
195
203
assert isinstance (ep .basic , Basic )
196
204
197
205
assert ep .tuya_manufacturer is not None
206
+ assert isinstance (ep .tuya_manufacturer , ModTuyaMCUCluster )
198
207
assert isinstance (ep .tuya_manufacturer , TuyaMCUCluster )
199
208
200
209
tuya_cluster = ep .tuya_manufacturer
@@ -303,3 +312,49 @@ async def test_tuya_spell(device_mock, read_attr_spell, data_query_spell):
303
312
messages += 1
304
313
305
314
request_mock .reset_mock ()
315
+
316
+
317
+ async def test_tuya_mcu_set_time (device_mock ):
318
+ """Test TuyaQuirkBuilder replacement cluster, set_time requests (0x24) messages for MCU devices."""
319
+
320
+ registry = DeviceRegistry ()
321
+
322
+ (
323
+ TuyaQuirkBuilder (device_mock .manufacturer , device_mock .model , registry = registry )
324
+ .tuya_battery (dp_id = 1 )
325
+ .skip_configuration ()
326
+ .add_to_registry (replacement_cluster = NoManufTimeTuyaMCUCluster )
327
+ )
328
+
329
+ quirked = registry .get_device (device_mock )
330
+ assert isinstance (quirked , CustomDeviceV2 )
331
+ assert quirked in registry
332
+
333
+ ep = quirked .endpoints [1 ]
334
+
335
+ assert not ep .tuya_manufacturer ._is_manuf_specific
336
+ assert not ep .tuya_manufacturer .server_commands [
337
+ TUYA_SET_TIME
338
+ ].is_manufacturer_specific
339
+
340
+ # Mock datetime
341
+ origdatetime = datetime .datetime
342
+ datetime .datetime = MockDatetime
343
+
344
+ # simulate a SET_TIME message
345
+ hdr , args = ep .tuya_manufacturer .deserialize (ZCL_TUYA_SET_TIME )
346
+ assert hdr .command_id == TUYA_SET_TIME
347
+
348
+ with mock .patch .object (
349
+ ep .tuya_manufacturer ._endpoint ,
350
+ "request" ,
351
+ return_value = foundation .Status .SUCCESS ,
352
+ ) as m1 :
353
+ ep .tuya_manufacturer .handle_message (hdr , args )
354
+ await wait_for_zigpy_tasks ()
355
+
356
+ res_hdr = foundation .ZCLHeader .deserialize (m1 .await_args [1 ]["data" ])
357
+ assert not res_hdr [0 ].manufacturer
358
+ assert not res_hdr [0 ].frame_control .is_manufacturer_specific
359
+
360
+ datetime .datetime = origdatetime # restore datetime
0 commit comments