@@ -164,6 +164,93 @@ def test_get_vehicle_image_filepath(self, mock_join, mock_get_base_dir) -> None:
164164 mock_join .assert_called_once_with ("/templates" , "copter" , "vehicle.jpg" )
165165 assert result == "/templates/copter/vehicle.jpg"
166166
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+
167254
168255if __name__ == "__main__" :
169256 unittest .main ()
0 commit comments