13
13
from tests .common import ClusterListener , wait_for_zigpy_tasks
14
14
import zhaquirks
15
15
from zhaquirks .tuya .builder import (
16
+ TuyaIasContact ,
17
+ TuyaIasFire ,
16
18
TuyaPowerConfigurationCluster2AAA ,
17
19
TuyaQuirkBuilder ,
18
20
TuyaRelativeHumidity ,
@@ -46,6 +48,41 @@ def real_device(MockAppController):
46
48
return device
47
49
48
50
51
+ @pytest .mark .parametrize (
52
+ "method_name,attr_name,exp_class" ,
53
+ [
54
+ ("tuya_battery" , "power" , TuyaPowerConfigurationCluster2AAA ),
55
+ ("tuya_metering" , "smartenergy_metering" , TuyaValveWaterConsumed ),
56
+ ("tuya_onoff" , "on_off" , TuyaOnOffNM ),
57
+ ("tuya_soil_moisture" , "soil_moisture" , TuyaSoilMoisture ),
58
+ ("tuya_temperature" , "temperature" , TuyaTemperatureMeasurement ),
59
+ ("tuya_humidity" , "humidity" , TuyaRelativeHumidity ),
60
+ ("tuya_smoke" , "ias_zone" , TuyaIasFire ),
61
+ ("tuya_contact" , "ias_zone" , TuyaIasContact ),
62
+ ],
63
+ )
64
+ async def test_convenience_methods (device_mock , method_name , attr_name , exp_class ):
65
+ """Test TuyaQuirkBuilder convenience methods."""
66
+
67
+ registry = DeviceRegistry ()
68
+
69
+ entry = TuyaQuirkBuilder (
70
+ device_mock .manufacturer , device_mock .model , registry = registry
71
+ )
72
+ entry = getattr (entry , method_name )(dp_id = 1 )
73
+ entry .skip_configuration ().add_to_registry ()
74
+
75
+ quirked = registry .get_device (device_mock )
76
+ assert isinstance (quirked , CustomDeviceV2 )
77
+ assert quirked in registry
78
+
79
+ ep = quirked .endpoints [1 ]
80
+
81
+ ep_attr = getattr (ep , attr_name )
82
+ assert ep_attr is not None
83
+ assert isinstance (ep_attr , exp_class )
84
+
85
+
49
86
async def test_tuya_quirkbuilder (device_mock ):
50
87
"""Test adding a v2 Tuya Quirk to the registry and getting back a quirked device."""
51
88
@@ -60,10 +97,7 @@ class TestEnum(t.enum8):
60
97
entry = (
61
98
TuyaQuirkBuilder (device_mock .manufacturer , device_mock .model , registry = registry )
62
99
.tuya_battery (dp_id = 1 )
63
- .tuya_metering (dp_id = 2 )
64
100
.tuya_onoff (dp_id = 3 )
65
- .tuya_soil_moisture (dp_id = 4 )
66
- .tuya_temperature (dp_id = 5 )
67
101
.tuya_switch (
68
102
dp_id = 6 ,
69
103
attribute_name = "test_onoff" ,
@@ -97,7 +131,7 @@ class TestEnum(t.enum8):
97
131
translation_key = "test_enum" ,
98
132
fallback_name = "Test enum" ,
99
133
)
100
- .tuya_humidity ( dp_id = 11 )
134
+ .skip_configuration ( )
101
135
.add_to_registry ()
102
136
)
103
137
@@ -126,24 +160,6 @@ class TestEnum(t.enum8):
126
160
assert tuya_cluster .attributes_by_name ["test_sensor" ].id == 0xEF09
127
161
assert tuya_cluster .attributes_by_name ["test_enum" ].id == 0xEF0A
128
162
129
- assert ep .power is not None
130
- assert isinstance (ep .power , TuyaPowerConfigurationCluster2AAA )
131
-
132
- assert ep .smartenergy_metering is not None
133
- assert isinstance (ep .smartenergy_metering , TuyaValveWaterConsumed )
134
-
135
- assert ep .on_off is not None
136
- assert isinstance (ep .on_off , TuyaOnOffNM )
137
-
138
- assert ep .soil_moisture is not None
139
- assert isinstance (ep .soil_moisture , TuyaSoilMoisture )
140
-
141
- assert ep .temperature is not None
142
- assert isinstance (ep .temperature , TuyaTemperatureMeasurement )
143
-
144
- assert ep .humidity is not None
145
- assert isinstance (ep .humidity , TuyaRelativeHumidity )
146
-
147
163
with mock .patch .object (
148
164
tuya_cluster .endpoint , "request" , return_value = foundation .Status .SUCCESS
149
165
) as m1 :
0 commit comments