@@ -198,6 +198,79 @@ local function initialize_subscribe_request(mock_device, subscribed_attributes)
198198end
199199
200200
201+ local function test_init_modular_fingerprint ()
202+ test .mock_device .add_test_device (mock_device_modular )
203+ test .socket .device_lifecycle :__queue_receive ({ mock_device_modular .id , " init" })
204+ local subscribe_request = initialize_subscribe_request (mock_device_modular , {
205+ [clusters .Thermostat .ID ] = {
206+ clusters .Thermostat .attributes .LocalTemperature ,
207+ clusters .Thermostat .attributes .SystemMode ,
208+ clusters .Thermostat .attributes .ControlSequenceOfOperation ,
209+ },
210+ [clusters .TemperatureMeasurement .ID ] = {
211+ clusters .TemperatureMeasurement .attributes .MaxMeasuredValue ,
212+ clusters .TemperatureMeasurement .attributes .MeasuredValue ,
213+ clusters .TemperatureMeasurement .attributes .MinMeasuredValue ,
214+ },
215+ })
216+ test .socket .matter :__expect_send ({mock_device_modular .id , subscribe_request })
217+ end
218+
219+ test .register_coroutine_test (
220+ " Component-capability update without profile ID update should cause re-subscribe in infoChanged handler" , function ()
221+ local subscribe_request = initialize_subscribe_request (mock_device_modular , {
222+ [clusters .Thermostat .ID ] = {
223+ clusters .Thermostat .attributes .LocalTemperature ,
224+ clusters .Thermostat .attributes .SystemMode ,
225+ clusters .Thermostat .attributes .ControlSequenceOfOperation ,
226+ },
227+ [clusters .TemperatureMeasurement .ID ] = {
228+ clusters .TemperatureMeasurement .attributes .MaxMeasuredValue ,
229+ clusters .TemperatureMeasurement .attributes .MeasuredValue ,
230+ clusters .TemperatureMeasurement .attributes .MinMeasuredValue ,
231+ },
232+ [clusters .FanControl .ID ] = {
233+ clusters .FanControl .attributes .FanMode ,
234+ clusters .FanControl .attributes .FanModeSequence ,
235+ },
236+ })
237+ local expected_metadata_modular = {
238+ optional_component_capabilities = {{" main" , {" fanMode" }}},
239+ profile = " thermostat-modular" ,
240+ }
241+ local updated_device_profile = t_utils .get_profile_definition (" thermostat-modular.yml" ,
242+ {enabled_optional_capabilities = expected_metadata_modular .optional_component_capabilities }
243+ )
244+ updated_device_profile .id = " 00000000-1111-2222-3333-000000000003"
245+ test .socket .device_lifecycle :__queue_receive (mock_device_modular :generate_info_changed ({ profile = updated_device_profile }))
246+ test .socket .matter :__expect_send ({mock_device_modular .id , subscribe_request })
247+ end ,
248+ { test_init = test_init_modular_fingerprint }
249+ )
250+
251+ test .register_coroutine_test (
252+ " No component-capability update and no profile ID update should not cause a re-subscribe in infoChanged handler" , function ()
253+ -- simulate no actual change
254+ test .socket .device_lifecycle :__queue_receive (mock_device_modular :generate_info_changed ({}))
255+ end ,
256+ { test_init = function () test .mock_device .add_test_device (mock_device_modular ) end }
257+ )
258+
259+ local function initialize_subscribe_request (mock_device , subscribed_attributes )
260+ local subscribe_request = nil
261+ for _ , attributes in pairs (subscribed_attributes ) do
262+ for _ , attribute in pairs (attributes ) do
263+ if subscribe_request == nil then
264+ subscribe_request = attribute :subscribe (mock_device )
265+ else
266+ subscribe_request :merge (attribute :subscribe (mock_device ))
267+ end
268+ end
269+ end
270+ return subscribe_request
271+ end
272+
273+
201274local function test_init_modular_fingerprint ()
202275 test .mock_device .add_test_device (mock_device_modular )
203276 test .socket .device_lifecycle :__queue_receive ({ mock_device_modular .id , " init" })
0 commit comments