@@ -164,6 +164,93 @@ def test_get_vehicle_image_filepath(self, mock_join, mock_get_base_dir) -> None:
164
164
mock_join .assert_called_once_with ("/templates" , "copter" , "vehicle.jpg" )
165
165
assert result == "/templates/copter/vehicle.jpg"
166
166
167
+ def test_wipe_component_info (self ) -> None :
168
+ # Test with nested dictionary containing various data types
169
+ self .vehicle_components .vehicle_components = {
170
+ "Components" : {
171
+ "Flight Controller" : {
172
+ "Firmware" : {"Type" : "ArduCopter" , "Version" : "4.3.0" },
173
+ "Hardware" : {"Model" : "Pixhawk" , "Ports" : 5 , "Sensors" : ["GPS" , "Barometer" , "IMU" ]},
174
+ "Options" : {"Enabled" : True , "Value" : 42.5 },
175
+ }
176
+ }
177
+ }
178
+
179
+ # Call the method to wipe
180
+ self .vehicle_components .wipe_component_info ()
181
+
182
+ # Verify structure is preserved but values are cleared
183
+ result = self .vehicle_components .vehicle_components
184
+ assert "Components" in result
185
+ assert "Flight Controller" in result ["Components" ]
186
+ assert "Firmware" in result ["Components" ]["Flight Controller" ]
187
+ assert result ["Components" ]["Flight Controller" ]["Firmware" ]["Type" ] == ""
188
+ assert result ["Components" ]["Flight Controller" ]["Firmware" ]["Version" ] == ""
189
+ assert result ["Components" ]["Flight Controller" ]["Hardware" ]["Model" ] == ""
190
+ assert result ["Components" ]["Flight Controller" ]["Hardware" ]["Ports" ] == 0
191
+ assert result ["Components" ]["Flight Controller" ]["Hardware" ]["Sensors" ] == []
192
+ assert result ["Components" ]["Flight Controller" ]["Options" ]["Enabled" ] == 0
193
+ assert result ["Components" ]["Flight Controller" ]["Options" ]["Value" ] == 0.0
194
+
195
+ @patch ("builtins.open" )
196
+ def test_save_vehicle_components_json_data_file_not_found (self , mock_open ) -> None : # pylint: disable=redefined-outer-name
197
+ mock_open .side_effect = FileNotFoundError ()
198
+
199
+ result , msg = self .vehicle_components .save_vehicle_components_json_data (self .valid_component_data , "/nonexistent/dir" )
200
+
201
+ assert result # True means error
202
+ assert "not found" in msg
203
+
204
+ @patch ("builtins.open" )
205
+ def test_save_vehicle_components_json_data_permission_error (self , mock_open ) -> None : # pylint: disable=redefined-outer-name
206
+ mock_open .side_effect = PermissionError ()
207
+
208
+ result , msg = self .vehicle_components .save_vehicle_components_json_data (self .valid_component_data , "/test/dir" )
209
+
210
+ assert result # True means error
211
+ assert "Permission denied" in msg
212
+
213
+ @patch ("builtins.open" )
214
+ def test_save_vehicle_components_json_data_is_a_directory_error (self , mock_open ) -> None : # pylint: disable=redefined-outer-name
215
+ mock_open .side_effect = IsADirectoryError ()
216
+
217
+ result , msg = self .vehicle_components .save_vehicle_components_json_data (self .valid_component_data , "/test/dir" )
218
+
219
+ assert result # True means error
220
+ assert "is a directory" in msg .lower ()
221
+
222
+ @patch ("builtins.open" )
223
+ def test_save_vehicle_components_json_data_os_error (self , mock_open ) -> None : # pylint: disable=redefined-outer-name
224
+ mock_open .side_effect = OSError ("Disk full" )
225
+
226
+ result , msg = self .vehicle_components .save_vehicle_components_json_data (self .valid_component_data , "/test/dir" )
227
+
228
+ assert result # True means error
229
+ assert "OS error" in msg
230
+ assert "Disk full" in msg
231
+
232
+ @patch ("builtins.open" , new_callable = mock_open )
233
+ @patch ("ardupilot_methodic_configurator.backend_filesystem_vehicle_components.json_dump" )
234
+ def test_save_vehicle_components_json_data_type_error (self , mock_json_dump , mock_file ) -> None : # pylint: disable=unused-argument
235
+ mock_json_dump .side_effect = TypeError ("Invalid type" )
236
+
237
+ result , msg = self .vehicle_components .save_vehicle_components_json_data (self .valid_component_data , "/test/dir" )
238
+
239
+ assert result # True means error
240
+ assert "Type error" in msg
241
+ assert "Invalid type" in msg
242
+
243
+ @patch ("builtins.open" , new_callable = mock_open )
244
+ @patch ("ardupilot_methodic_configurator.backend_filesystem_vehicle_components.json_dump" )
245
+ def test_save_vehicle_components_json_data_value_error (self , mock_json_dump , mock_file ) -> None : # pylint: disable=unused-argument
246
+ mock_json_dump .side_effect = ValueError ("Circular reference" )
247
+
248
+ result , msg = self .vehicle_components .save_vehicle_components_json_data (self .valid_component_data , "/test/dir" )
249
+
250
+ assert result # True means error
251
+ assert "Value error" in msg
252
+ assert "Circular reference" in msg
253
+
167
254
168
255
if __name__ == "__main__" :
169
256
unittest .main ()
0 commit comments