@@ -602,10 +602,124 @@ def test_user_handles_parameter_upload_errors_gracefully(self, parameter_editor)
602602 # Assert: Errors handled via callback
603603 assert reset_required is False # No successful uploads
604604 assert len (uploaded_params ) == 0 # No parameters were uploaded
605+ mock_ask_confirmation .assert_not_called ()
605606 mock_show_error .assert_called_once ()
606607 error_call_args = mock_show_error .call_args [0 ]
607608 assert "Failed to set parameter" in error_call_args [1 ] # Second argument is the error message
608609
610+ def test_user_uploads_sid_axis_from_zero_to_nonzero_triggers_possible_reset (self , parameter_editor ) -> None :
611+ """
612+ Uploading SID_AXIS from 0 to a non-zero value triggers a possible reset confirmation.
613+
614+ GIVEN: SID_AXIS is currently 0 on the flight controller
615+ WHEN: The user uploads SID_AXIS with a new non-zero value
616+ THEN: A possible reset should be triggered (parameter added to reset_unsure_params)
617+ """
618+ # Arrange: SID_AXIS currently 0 on FC, new value is non-zero
619+ selected_params = {"SID_AXIS" : Par (1.0 , "Sys ID axis" )}
620+ parameter_editor ._flight_controller .fc_parameters = {"SID_AXIS" : 0 }
621+ parameter_editor ._local_filesystem .doc_dict = {"SID_AXIS" : {"RebootRequired" : False }}
622+ parameter_editor ._reset_and_reconnect_flight_controller = MagicMock (return_value = None )
623+
624+ mock_ask_confirmation = MagicMock (return_value = True )
625+ mock_show_error = MagicMock ()
626+
627+ # Act
628+ reset_happened , uploaded_params = parameter_editor .upload_parameters_that_require_reset_workflow (
629+ selected_params , mock_ask_confirmation , mock_show_error
630+ )
631+
632+ # Assert: Possible reset triggered and parameter uploaded
633+ assert reset_happened is True
634+ assert "SID_AXIS" in uploaded_params
635+ mock_ask_confirmation .assert_called_once ()
636+ mock_show_error .assert_not_called ()
637+
638+ def test_user_uploads_sid_axis_from_nonzero_to_different_nonzero_skips_reset (self , parameter_editor ) -> None :
639+ """
640+ Uploading SID_AXIS from one non-zero value to another does not trigger a reset.
641+
642+ GIVEN: SID_AXIS is currently non-zero on the flight controller
643+ WHEN: The user uploads SID_AXIS with a different non-zero value
644+ THEN: No possible reset should be triggered
645+ """
646+ # Arrange: SID_AXIS currently 1 on FC, new value is 2
647+ selected_params = {"SID_AXIS" : Par (2.0 , "Sys ID axis" )}
648+ parameter_editor ._flight_controller .fc_parameters = {"SID_AXIS" : 1.0 }
649+ parameter_editor ._local_filesystem .doc_dict = {"SID_AXIS" : {"RebootRequired" : False }}
650+ parameter_editor ._reset_and_reconnect_flight_controller = MagicMock (return_value = None )
651+
652+ mock_ask_confirmation = MagicMock (return_value = False )
653+ mock_show_error = MagicMock ()
654+
655+ # Act
656+ reset_happened , uploaded_params = parameter_editor .upload_parameters_that_require_reset_workflow (
657+ selected_params , mock_ask_confirmation , mock_show_error
658+ )
659+
660+ # Assert: No reset triggered; SID_AXIS is NOT in uploaded_params because it fell through
661+ # to the normal upload path (not handled by this workflow)
662+ assert reset_happened is False
663+ assert "SID_AXIS" not in uploaded_params
664+ mock_ask_confirmation .assert_not_called ()
665+ mock_show_error .assert_not_called ()
666+
667+ def test_user_uploads_sid_axis_from_nonzero_to_zero_skips_reset (self , parameter_editor ) -> None :
668+ """
669+ Uploading SID_AXIS from a non-zero value to 0 does not trigger a reset.
670+
671+ GIVEN: SID_AXIS is currently non-zero on the flight controller
672+ WHEN: The user uploads SID_AXIS with value 0
673+ THEN: No possible reset should be triggered
674+ """
675+ # Arrange: SID_AXIS currently 1 on FC, new value is 0
676+ selected_params = {"SID_AXIS" : Par (0.0 , "Sys ID axis" )}
677+ parameter_editor ._flight_controller .fc_parameters = {"SID_AXIS" : 1.0 }
678+ parameter_editor ._local_filesystem .doc_dict = {"SID_AXIS" : {"RebootRequired" : False }}
679+ parameter_editor ._reset_and_reconnect_flight_controller = MagicMock (return_value = None )
680+
681+ mock_ask_confirmation = MagicMock (return_value = False )
682+ mock_show_error = MagicMock ()
683+
684+ # Act
685+ reset_happened , uploaded_params = parameter_editor .upload_parameters_that_require_reset_workflow (
686+ selected_params , mock_ask_confirmation , mock_show_error
687+ )
688+
689+ # Assert: No reset triggered
690+ assert reset_happened is False
691+ assert "SID_AXIS" not in uploaded_params
692+ mock_ask_confirmation .assert_not_called ()
693+ mock_show_error .assert_not_called ()
694+
695+ def test_user_uploads_sid_axis_absent_from_fc_to_nonzero_triggers_possible_reset (self , parameter_editor ) -> None :
696+ """
697+ Uploading SID_AXIS to a non-zero value when it is absent from FC (treated as 0) triggers a possible reset.
698+
699+ GIVEN: SID_AXIS is not present in the flight controller parameter cache
700+ WHEN: The user uploads SID_AXIS with a non-zero value
701+ THEN: A possible reset should be triggered (absent value defaults to 0)
702+ """
703+ # Arrange: SID_AXIS not in FC params (defaults to 0), new value is non-zero
704+ selected_params = {"SID_AXIS" : Par (3.0 , "Sys ID axis" )}
705+ parameter_editor ._flight_controller .fc_parameters = {}
706+ parameter_editor ._local_filesystem .doc_dict = {"SID_AXIS" : {"RebootRequired" : False }}
707+ parameter_editor ._reset_and_reconnect_flight_controller = MagicMock (return_value = None )
708+
709+ mock_ask_confirmation = MagicMock (return_value = True )
710+ mock_show_error = MagicMock ()
711+
712+ # Act
713+ reset_happened , uploaded_params = parameter_editor .upload_parameters_that_require_reset_workflow (
714+ selected_params , mock_ask_confirmation , mock_show_error
715+ )
716+
717+ # Assert: Possible reset triggered and parameter uploaded
718+ assert reset_happened is True
719+ assert "SID_AXIS" in uploaded_params
720+ mock_ask_confirmation .assert_called_once ()
721+ mock_show_error .assert_not_called ()
722+
609723
610724class TestFileDownloadUrlWorkflows :
611725 """Test file download URL workflow business logic methods with callback injection."""
0 commit comments