@@ -689,6 +689,103 @@ def test_run_tests_config_data_processing(
689689 assert "dut_config" in result .output
690690 assert "network" in result .output
691691
692+ def test_run_tests_prompt_timeout_merges_into_execution_config (
693+ self ,
694+ cli_runner : CliRunner ,
695+ mock_async_apis : Mock ,
696+ sample_test_collections : api_models .TestCollections ,
697+ sample_test_run_execution : api_models .TestRunExecutionWithChildren ,
698+ sample_default_config_dict : dict ,
699+ ) -> None :
700+ """--prompt-timeout should merge th_config.prompt_timeout_seconds into the
701+ execution config submitted for the run, without requiring --config."""
702+ # Arrange
703+ project_api = mock_async_apis .projects_api .default_config_api_v1_projects_default_config_get
704+ test_collection_api = mock_async_apis .test_collections_api .read_test_collections_api_v1_test_collections__get
705+ test_run_executions_api = mock_async_apis .test_run_executions_api
706+ cli_api = test_run_executions_api .create_cli_test_run_execution_api_v1_test_run_executions_cli_post
707+ id_start = test_run_executions_api .start_test_run_execution_api_v1_test_run_executions_id_start_post
708+
709+ project_api .return_value = sample_default_config_dict
710+ test_collection_api .return_value = sample_test_collections
711+ cli_api .return_value = sample_test_run_execution
712+ id_start .return_value = sample_test_run_execution
713+ with patch ("th_cli.commands.run_tests.AsyncApis" , return_value = mock_async_apis ):
714+ with patch (
715+ "th_cli.commands.run_tests.test_logging.configure_logger_for_run" , return_value = "./test_logs/test.log"
716+ ):
717+ with patch ("th_cli.commands.run_tests.TestRunSocket" ) as mock_socket_class :
718+ with patch (
719+ "th_cli.commands.run_tests.convert_nested_to_dict" , return_value = sample_default_config_dict
720+ ):
721+ mock_socket = Mock ()
722+ mock_socket .connect_websocket = AsyncMock ()
723+ mock_socket_class .return_value = mock_socket
724+
725+ # Act
726+ result = cli_runner .invoke (
727+ run_tests ,
728+ ["--tests-list" , "TC-ACE-1.1" , "--prompt-timeout" , "300" ],
729+ )
730+
731+ # Assert
732+ assert result .exit_code == 0
733+ assert "Prompt Timeout Used (Execution Only)" in result .output
734+ submitted_body = cli_api .call_args [0 ][0 ]
735+ assert submitted_body .execution_config ["th_config" ]["prompt_timeout_seconds" ] == 300
736+
737+ def test_run_tests_prompt_timeout_wins_over_config_file (
738+ self ,
739+ cli_runner : CliRunner ,
740+ mock_async_apis : Mock ,
741+ sample_test_collections : api_models .TestCollections ,
742+ sample_test_run_execution : api_models .TestRunExecutionWithChildren ,
743+ sample_default_config_dict : dict ,
744+ mock_json_config_file : Path ,
745+ ) -> None :
746+ """--prompt-timeout takes precedence over any prompt_timeout_seconds already
747+ present in a --config file, since it's applied after the config merge."""
748+ # Arrange
749+ project_api = mock_async_apis .projects_api .default_config_api_v1_projects_default_config_get
750+ test_collection_api = mock_async_apis .test_collections_api .read_test_collections_api_v1_test_collections__get
751+ test_run_executions_api = mock_async_apis .test_run_executions_api
752+ cli_api = test_run_executions_api .create_cli_test_run_execution_api_v1_test_run_executions_cli_post
753+ id_start = test_run_executions_api .start_test_run_execution_api_v1_test_run_executions_id_start_post
754+
755+ project_api .return_value = sample_default_config_dict
756+ test_collection_api .return_value = sample_test_collections
757+ cli_api .return_value = sample_test_run_execution
758+ id_start .return_value = sample_test_run_execution
759+ with patch ("th_cli.commands.run_tests.AsyncApis" , return_value = mock_async_apis ):
760+ with patch (
761+ "th_cli.commands.run_tests.test_logging.configure_logger_for_run" , return_value = "./test_logs/test.log"
762+ ):
763+ with patch ("th_cli.commands.run_tests.TestRunSocket" ) as mock_socket_class :
764+ with patch (
765+ "th_cli.commands.run_tests.convert_nested_to_dict" , return_value = sample_default_config_dict
766+ ):
767+ mock_socket = Mock ()
768+ mock_socket .connect_websocket = AsyncMock ()
769+ mock_socket_class .return_value = mock_socket
770+
771+ # Act
772+ result = cli_runner .invoke (
773+ run_tests ,
774+ [
775+ "--tests-list" ,
776+ "TC-ACE-1.1" ,
777+ "--config" ,
778+ str (mock_json_config_file ),
779+ "--prompt-timeout" ,
780+ "45" ,
781+ ],
782+ )
783+
784+ # Assert
785+ assert result .exit_code == 0
786+ submitted_body = cli_api .call_args [0 ][0 ]
787+ assert submitted_body .execution_config ["th_config" ]["prompt_timeout_seconds" ] == 45
788+
692789 @pytest .mark .parametrize (
693790 "invalid_test_id" ,
694791 [
0 commit comments