From be4364bb8032556c6b5b7dbb95df4fa104b6c5a5 Mon Sep 17 00:00:00 2001 From: Celia Chen Date: Thu, 8 Jan 2026 14:27:55 -0800 Subject: [PATCH] [chore] move app server tests from chat completion to responses (#8939) We are deprecating chat completions. Move all app server tests from chat completion to responses. --- codex-rs/app-server/tests/common/lib.rs | 4 +- .../tests/common/mock_model_server.rs | 21 ++-- codex-rs/app-server/tests/common/responses.rs | 115 ++++-------------- codex-rs/app-server/tests/suite/auth.rs | 2 +- .../suite/codex_message_processor_flow.rs | 10 +- .../app-server/tests/suite/create_thread.rs | 31 +++-- codex-rs/app-server/tests/suite/interrupt.rs | 6 +- codex-rs/app-server/tests/suite/login.rs | 2 +- codex-rs/app-server/tests/suite/v2/account.rs | 2 +- codex-rs/app-server/tests/suite/v2/review.rs | 21 ++-- .../app-server/tests/suite/v2/thread_fork.rs | 6 +- .../tests/suite/v2/thread_loaded_list.rs | 8 +- .../tests/suite/v2/thread_rollback.rs | 6 +- .../app-server/tests/suite/v2/thread_start.rs | 6 +- .../tests/suite/v2/turn_interrupt.rs | 6 +- .../app-server/tests/suite/v2/turn_start.rs | 24 ++-- 16 files changed, 93 insertions(+), 177 deletions(-) diff --git a/codex-rs/app-server/tests/common/lib.rs b/codex-rs/app-server/tests/common/lib.rs index 38beab779..594bb78c2 100644 --- a/codex-rs/app-server/tests/common/lib.rs +++ b/codex-rs/app-server/tests/common/lib.rs @@ -18,9 +18,9 @@ pub use core_test_support::test_path_buf_with_windows; pub use core_test_support::test_tmp_path; pub use core_test_support::test_tmp_path_buf; pub use mcp_process::McpProcess; -pub use mock_model_server::create_mock_chat_completions_server; -pub use mock_model_server::create_mock_chat_completions_server_unchecked; pub use mock_model_server::create_mock_responses_server_repeating_assistant; +pub use mock_model_server::create_mock_responses_server_sequence; +pub use mock_model_server::create_mock_responses_server_sequence_unchecked; pub use models_cache::write_models_cache; pub use models_cache::write_models_cache_with_models; pub use responses::create_apply_patch_sse_response; diff --git a/codex-rs/app-server/tests/common/mock_model_server.rs b/codex-rs/app-server/tests/common/mock_model_server.rs index 77fa6b201..24edcba93 100644 --- a/codex-rs/app-server/tests/common/mock_model_server.rs +++ b/codex-rs/app-server/tests/common/mock_model_server.rs @@ -7,13 +7,12 @@ use wiremock::MockServer; use wiremock::Respond; use wiremock::ResponseTemplate; use wiremock::matchers::method; -use wiremock::matchers::path; use wiremock::matchers::path_regex; /// Create a mock server that will provide the responses, in order, for -/// requests to the `/v1/chat/completions` endpoint. -pub async fn create_mock_chat_completions_server(responses: Vec) -> MockServer { - let server = MockServer::start().await; +/// requests to the `/v1/responses` endpoint. +pub async fn create_mock_responses_server_sequence(responses: Vec) -> MockServer { + let server = responses::start_mock_server().await; let num_calls = responses.len(); let seq_responder = SeqResponder { @@ -22,7 +21,7 @@ pub async fn create_mock_chat_completions_server(responses: Vec) -> Mock }; Mock::given(method("POST")) - .and(path("/v1/chat/completions")) + .and(path_regex(".*/responses$")) .respond_with(seq_responder) .expect(num_calls as u64) .mount(&server) @@ -31,10 +30,10 @@ pub async fn create_mock_chat_completions_server(responses: Vec) -> Mock server } -/// Same as `create_mock_chat_completions_server` but does not enforce an +/// Same as `create_mock_responses_server_sequence` but does not enforce an /// expectation on the number of calls. -pub async fn create_mock_chat_completions_server_unchecked(responses: Vec) -> MockServer { - let server = MockServer::start().await; +pub async fn create_mock_responses_server_sequence_unchecked(responses: Vec) -> MockServer { + let server = responses::start_mock_server().await; let seq_responder = SeqResponder { num_calls: AtomicUsize::new(0), @@ -42,7 +41,7 @@ pub async fn create_mock_chat_completions_server_unchecked(responses: Vec ResponseTemplate { let call_num = self.num_calls.fetch_add(1, Ordering::SeqCst); match self.responses.get(call_num) { - Some(response) => ResponseTemplate::new(200) - .insert_header("content-type", "text/event-stream") - .set_body_raw(response.clone(), "text/event-stream"), + Some(response) => responses::sse_response(response.clone()), None => panic!("no response for {call_num}"), } } diff --git a/codex-rs/app-server/tests/common/responses.rs b/codex-rs/app-server/tests/common/responses.rs index d3d1f40cd..35c1862e8 100644 --- a/codex-rs/app-server/tests/common/responses.rs +++ b/codex-rs/app-server/tests/common/responses.rs @@ -1,3 +1,4 @@ +use core_test_support::responses; use serde_json::json; use std::path::Path; @@ -14,85 +15,30 @@ pub fn create_shell_command_sse_response( "workdir": workdir.map(|w| w.to_string_lossy()), "timeout_ms": timeout_ms }))?; - let tool_call = json!({ - "choices": [ - { - "delta": { - "tool_calls": [ - { - "id": call_id, - "function": { - "name": "shell_command", - "arguments": tool_call_arguments - } - } - ] - }, - "finish_reason": "tool_calls" - } - ] - }); - - let sse = format!( - "data: {}\n\ndata: DONE\n\n", - serde_json::to_string(&tool_call)? - ); - Ok(sse) + Ok(responses::sse(vec![ + responses::ev_response_created("resp-1"), + responses::ev_function_call(call_id, "shell_command", &tool_call_arguments), + responses::ev_completed("resp-1"), + ])) } pub fn create_final_assistant_message_sse_response(message: &str) -> anyhow::Result { - let assistant_message = json!({ - "choices": [ - { - "delta": { - "content": message - }, - "finish_reason": "stop" - } - ] - }); - - let sse = format!( - "data: {}\n\ndata: DONE\n\n", - serde_json::to_string(&assistant_message)? - ); - Ok(sse) + Ok(responses::sse(vec![ + responses::ev_response_created("resp-1"), + responses::ev_assistant_message("msg-1", message), + responses::ev_completed("resp-1"), + ])) } pub fn create_apply_patch_sse_response( patch_content: &str, call_id: &str, ) -> anyhow::Result { - // Use shell_command to call apply_patch with heredoc format - let command = format!("apply_patch <<'EOF'\n{patch_content}\nEOF"); - let tool_call_arguments = serde_json::to_string(&json!({ - "command": command - }))?; - - let tool_call = json!({ - "choices": [ - { - "delta": { - "tool_calls": [ - { - "id": call_id, - "function": { - "name": "shell_command", - "arguments": tool_call_arguments - } - } - ] - }, - "finish_reason": "tool_calls" - } - ] - }); - - let sse = format!( - "data: {}\n\ndata: DONE\n\n", - serde_json::to_string(&tool_call)? - ); - Ok(sse) + Ok(responses::sse(vec![ + responses::ev_response_created("resp-1"), + responses::ev_apply_patch_shell_command_call_via_heredoc(call_id, patch_content), + responses::ev_completed("resp-1"), + ])) } pub fn create_exec_command_sse_response(call_id: &str) -> anyhow::Result { @@ -108,28 +54,9 @@ pub fn create_exec_command_sse_response(call_id: &str) -> anyhow::Result "cmd": command.join(" "), "yield_time_ms": 500 }))?; - let tool_call = json!({ - "choices": [ - { - "delta": { - "tool_calls": [ - { - "id": call_id, - "function": { - "name": "exec_command", - "arguments": tool_call_arguments - } - } - ] - }, - "finish_reason": "tool_calls" - } - ] - }); - - let sse = format!( - "data: {}\n\ndata: DONE\n\n", - serde_json::to_string(&tool_call)? - ); - Ok(sse) + Ok(responses::sse(vec![ + responses::ev_response_created("resp-1"), + responses::ev_function_call(call_id, "exec_command", &tool_call_arguments), + responses::ev_completed("resp-1"), + ])) } diff --git a/codex-rs/app-server/tests/suite/auth.rs b/codex-rs/app-server/tests/suite/auth.rs index 72912362f..469315861 100644 --- a/codex-rs/app-server/tests/suite/auth.rs +++ b/codex-rs/app-server/tests/suite/auth.rs @@ -37,7 +37,7 @@ model_provider = "mock_provider" [model_providers.mock_provider] name = "Mock provider for test" base_url = "http://127.0.0.1:0/v1" -wire_api = "chat" +wire_api = "responses" request_max_retries = 0 stream_max_retries = 0 {requires_line} diff --git a/codex-rs/app-server/tests/suite/codex_message_processor_flow.rs b/codex-rs/app-server/tests/suite/codex_message_processor_flow.rs index 1dcb917f0..f902b1126 100644 --- a/codex-rs/app-server/tests/suite/codex_message_processor_flow.rs +++ b/codex-rs/app-server/tests/suite/codex_message_processor_flow.rs @@ -1,7 +1,7 @@ use anyhow::Result; use app_test_support::McpProcess; use app_test_support::create_final_assistant_message_sse_response; -use app_test_support::create_mock_chat_completions_server; +use app_test_support::create_mock_responses_server_sequence; use app_test_support::create_shell_command_sse_response; use app_test_support::format_with_current_shell; use app_test_support::to_response; @@ -65,7 +65,7 @@ async fn test_codex_jsonrpc_conversation_flow() -> Result<()> { )?, create_final_assistant_message_sse_response("Enjoy your new git repo!")?, ]; - let server = create_mock_chat_completions_server(responses).await; + let server = create_mock_responses_server_sequence(responses).await; create_config_toml(&codex_home, &server.uri())?; // Start MCP server and initialize. @@ -197,7 +197,7 @@ async fn test_send_user_turn_changes_approval_policy_behavior() -> Result<()> { )?, create_final_assistant_message_sse_response("done 2")?, ]; - let server = create_mock_chat_completions_server(responses).await; + let server = create_mock_responses_server_sequence(responses).await; create_config_toml(&codex_home, &server.uri())?; // Start MCP server and initialize. @@ -363,7 +363,7 @@ async fn test_send_user_turn_updates_sandbox_and_cwd_between_turns() -> Result<( )?, create_final_assistant_message_sse_response("done second")?, ]; - let server = create_mock_chat_completions_server(responses).await; + let server = create_mock_responses_server_sequence(responses).await; create_config_toml(&codex_home, &server.uri())?; let mut mcp = McpProcess::new(&codex_home).await?; @@ -500,7 +500,7 @@ model_provider = "mock_provider" [model_providers.mock_provider] name = "Mock provider for test" base_url = "{server_uri}/v1" -wire_api = "chat" +wire_api = "responses" request_max_retries = 0 stream_max_retries = 0 "# diff --git a/codex-rs/app-server/tests/suite/create_thread.rs b/codex-rs/app-server/tests/suite/create_thread.rs index 7788b8f38..9709af03b 100644 --- a/codex-rs/app-server/tests/suite/create_thread.rs +++ b/codex-rs/app-server/tests/suite/create_thread.rs @@ -1,7 +1,6 @@ use anyhow::Result; use app_test_support::McpProcess; use app_test_support::create_final_assistant_message_sse_response; -use app_test_support::create_mock_chat_completions_server; use app_test_support::to_response; use codex_app_server_protocol::AddConversationListenerParams; use codex_app_server_protocol::AddConversationSubscriptionResponse; @@ -12,6 +11,7 @@ use codex_app_server_protocol::NewConversationResponse; use codex_app_server_protocol::RequestId; use codex_app_server_protocol::SendUserMessageParams; use codex_app_server_protocol::SendUserMessageResponse; +use core_test_support::responses; use pretty_assertions::assert_eq; use serde_json::json; use std::path::Path; @@ -23,8 +23,9 @@ const DEFAULT_READ_TIMEOUT: std::time::Duration = std::time::Duration::from_secs #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_conversation_create_and_send_message_ok() -> Result<()> { // Mock server – we won't strictly rely on it, but provide one to satisfy any model wiring. - let responses = vec![create_final_assistant_message_sse_response("Done")?]; - let server = create_mock_chat_completions_server(responses).await; + let response_body = create_final_assistant_message_sse_response("Done")?; + let server = responses::start_mock_server().await; + let response_mock = responses::mount_sse_sequence(&server, vec![response_body]).await; // Temporary Codex home with config pointing at the mock server. let codex_home = TempDir::new()?; @@ -86,32 +87,30 @@ async fn test_conversation_create_and_send_message_ok() -> Result<()> { .await??; let _ok: SendUserMessageResponse = to_response::(send_resp)?; - // avoid race condition by waiting for the mock server to receive the chat.completions request + // Avoid race condition by waiting for the mock server to receive the responses request. let deadline = std::time::Instant::now() + DEFAULT_READ_TIMEOUT; let requests = loop { - let requests = server.received_requests().await.unwrap_or_default(); + let requests = response_mock.requests(); if !requests.is_empty() { break requests; } if std::time::Instant::now() >= deadline { - panic!("mock server did not receive the chat.completions request in time"); + panic!("mock server did not receive the responses request in time"); } tokio::time::sleep(std::time::Duration::from_millis(10)).await; }; - // Verify the outbound request body matches expectations for Chat Completions. + // Verify the outbound request body matches expectations for Responses. let request = requests .first() .expect("mock server should have received at least one request"); - let body = request.body_json::()?; + let body = request.body_json(); assert_eq!(body["model"], json!("o3")); - assert!(body["stream"].as_bool().unwrap_or(false)); - let messages = body["messages"] - .as_array() - .expect("messages should be array"); - let last = messages.last().expect("at least one message"); - assert_eq!(last["role"], json!("user")); - assert_eq!(last["content"], json!("Hello")); + let user_texts = request.message_input_texts("user"); + assert!( + user_texts.iter().any(|text| text == "Hello"), + "expected user input to include Hello, got {user_texts:?}" + ); drop(server); Ok(()) @@ -133,7 +132,7 @@ model_provider = "mock_provider" [model_providers.mock_provider] name = "Mock provider for test" base_url = "{server_uri}/v1" -wire_api = "chat" +wire_api = "responses" request_max_retries = 0 stream_max_retries = 0 "# diff --git a/codex-rs/app-server/tests/suite/interrupt.rs b/codex-rs/app-server/tests/suite/interrupt.rs index d8e6182be..6248581e2 100644 --- a/codex-rs/app-server/tests/suite/interrupt.rs +++ b/codex-rs/app-server/tests/suite/interrupt.rs @@ -18,7 +18,7 @@ use tempfile::TempDir; use tokio::time::timeout; use app_test_support::McpProcess; -use app_test_support::create_mock_chat_completions_server; +use app_test_support::create_mock_responses_server_sequence; use app_test_support::create_shell_command_sse_response; use app_test_support::to_response; @@ -56,7 +56,7 @@ async fn shell_command_interruption() -> anyhow::Result<()> { std::fs::create_dir(&working_directory)?; // Create mock server with a single SSE response: the long sleep command - let server = create_mock_chat_completions_server(vec![create_shell_command_sse_response( + let server = create_mock_responses_server_sequence(vec![create_shell_command_sse_response( shell_command.clone(), Some(&working_directory), Some(10_000), // 10 seconds timeout in ms @@ -153,7 +153,7 @@ model_provider = "mock_provider" [model_providers.mock_provider] name = "Mock provider for test" base_url = "{server_uri}/v1" -wire_api = "chat" +wire_api = "responses" request_max_retries = 0 stream_max_retries = 0 "# diff --git a/codex-rs/app-server/tests/suite/login.rs b/codex-rs/app-server/tests/suite/login.rs index e252bcb0c..afc69787e 100644 --- a/codex-rs/app-server/tests/suite/login.rs +++ b/codex-rs/app-server/tests/suite/login.rs @@ -32,7 +32,7 @@ model_provider = "mock_provider" [model_providers.mock_provider] name = "Mock provider for test" base_url = "http://127.0.0.1:0/v1" -wire_api = "chat" +wire_api = "responses" request_max_retries = 0 stream_max_retries = 0 "#, diff --git a/codex-rs/app-server/tests/suite/v2/account.rs b/codex-rs/app-server/tests/suite/v2/account.rs index 4d481f395..cbbdad84c 100644 --- a/codex-rs/app-server/tests/suite/v2/account.rs +++ b/codex-rs/app-server/tests/suite/v2/account.rs @@ -67,7 +67,7 @@ model_provider = "mock_provider" [model_providers.mock_provider] name = "Mock provider for test" base_url = "http://127.0.0.1:0/v1" -wire_api = "chat" +wire_api = "responses" request_max_retries = 0 stream_max_retries = 0 {requires_line} diff --git a/codex-rs/app-server/tests/suite/v2/review.rs b/codex-rs/app-server/tests/suite/v2/review.rs index 3ad987a38..7a626abfe 100644 --- a/codex-rs/app-server/tests/suite/v2/review.rs +++ b/codex-rs/app-server/tests/suite/v2/review.rs @@ -1,7 +1,6 @@ use anyhow::Result; use app_test_support::McpProcess; -use app_test_support::create_final_assistant_message_sse_response; -use app_test_support::create_mock_chat_completions_server_unchecked; +use app_test_support::create_mock_responses_server_repeating_assistant; use app_test_support::to_response; use codex_app_server_protocol::ItemCompletedNotification; use codex_app_server_protocol::ItemStartedNotification; @@ -44,10 +43,7 @@ async fn review_start_runs_review_turn_and_emits_code_review_item() -> Result<() "overall_confidence_score": 0.75 }) .to_string(); - let responses = vec![create_final_assistant_message_sse_response( - &review_payload, - )?]; - let server = create_mock_chat_completions_server_unchecked(responses).await; + let server = create_mock_responses_server_repeating_assistant(&review_payload).await; let codex_home = TempDir::new()?; create_config_toml(codex_home.path(), &server.uri())?; @@ -135,7 +131,7 @@ async fn review_start_runs_review_turn_and_emits_code_review_item() -> Result<() #[tokio::test] async fn review_start_rejects_empty_base_branch() -> Result<()> { - let server = create_mock_chat_completions_server_unchecked(vec![]).await; + let server = create_mock_responses_server_repeating_assistant("Done").await; let codex_home = TempDir::new()?; create_config_toml(codex_home.path(), &server.uri())?; @@ -176,10 +172,7 @@ async fn review_start_with_detached_delivery_returns_new_thread_id() -> Result<( "overall_confidence_score": 0.5 }) .to_string(); - let responses = vec![create_final_assistant_message_sse_response( - &review_payload, - )?]; - let server = create_mock_chat_completions_server_unchecked(responses).await; + let server = create_mock_responses_server_repeating_assistant(&review_payload).await; let codex_home = TempDir::new()?; create_config_toml(codex_home.path(), &server.uri())?; @@ -219,7 +212,7 @@ async fn review_start_with_detached_delivery_returns_new_thread_id() -> Result<( #[tokio::test] async fn review_start_rejects_empty_commit_sha() -> Result<()> { - let server = create_mock_chat_completions_server_unchecked(vec![]).await; + let server = create_mock_responses_server_repeating_assistant("Done").await; let codex_home = TempDir::new()?; create_config_toml(codex_home.path(), &server.uri())?; @@ -254,7 +247,7 @@ async fn review_start_rejects_empty_commit_sha() -> Result<()> { #[tokio::test] async fn review_start_rejects_empty_custom_instructions() -> Result<()> { - let server = create_mock_chat_completions_server_unchecked(vec![]).await; + let server = create_mock_responses_server_repeating_assistant("Done").await; let codex_home = TempDir::new()?; create_config_toml(codex_home.path(), &server.uri())?; @@ -320,7 +313,7 @@ model_provider = "mock_provider" [model_providers.mock_provider] name = "Mock provider" base_url = "{server_uri}/v1" -wire_api = "chat" +wire_api = "responses" request_max_retries = 0 stream_max_retries = 0 "# diff --git a/codex-rs/app-server/tests/suite/v2/thread_fork.rs b/codex-rs/app-server/tests/suite/v2/thread_fork.rs index c6ee2878d..a5445998f 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_fork.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_fork.rs @@ -1,7 +1,7 @@ use anyhow::Result; use app_test_support::McpProcess; use app_test_support::create_fake_rollout; -use app_test_support::create_mock_chat_completions_server; +use app_test_support::create_mock_responses_server_repeating_assistant; use app_test_support::to_response; use codex_app_server_protocol::JSONRPCNotification; use codex_app_server_protocol::JSONRPCResponse; @@ -22,7 +22,7 @@ const DEFAULT_READ_TIMEOUT: std::time::Duration = std::time::Duration::from_secs #[tokio::test] async fn thread_fork_creates_new_thread_and_emits_started() -> Result<()> { - let server = create_mock_chat_completions_server(vec![]).await; + let server = create_mock_responses_server_repeating_assistant("Done").await; let codex_home = TempDir::new()?; create_config_toml(codex_home.path(), &server.uri())?; @@ -131,7 +131,7 @@ model_provider = "mock_provider" [model_providers.mock_provider] name = "Mock provider for test" base_url = "{server_uri}/v1" -wire_api = "chat" +wire_api = "responses" request_max_retries = 0 stream_max_retries = 0 "# diff --git a/codex-rs/app-server/tests/suite/v2/thread_loaded_list.rs b/codex-rs/app-server/tests/suite/v2/thread_loaded_list.rs index f8f9ec157..6cc298828 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_loaded_list.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_loaded_list.rs @@ -1,6 +1,6 @@ use anyhow::Result; use app_test_support::McpProcess; -use app_test_support::create_mock_chat_completions_server; +use app_test_support::create_mock_responses_server_repeating_assistant; use app_test_support::to_response; use codex_app_server_protocol::JSONRPCResponse; use codex_app_server_protocol::RequestId; @@ -17,7 +17,7 @@ const DEFAULT_READ_TIMEOUT: std::time::Duration = std::time::Duration::from_secs #[tokio::test] async fn thread_loaded_list_returns_loaded_thread_ids() -> Result<()> { - let server = create_mock_chat_completions_server(vec![]).await; + let server = create_mock_responses_server_repeating_assistant("Done").await; let codex_home = TempDir::new()?; create_config_toml(codex_home.path(), &server.uri())?; @@ -47,7 +47,7 @@ async fn thread_loaded_list_returns_loaded_thread_ids() -> Result<()> { #[tokio::test] async fn thread_loaded_list_paginates() -> Result<()> { - let server = create_mock_chat_completions_server(vec![]).await; + let server = create_mock_responses_server_repeating_assistant("Done").await; let codex_home = TempDir::new()?; create_config_toml(codex_home.path(), &server.uri())?; @@ -114,7 +114,7 @@ model_provider = "mock_provider" [model_providers.mock_provider] name = "Mock provider for test" base_url = "{server_uri}/v1" -wire_api = "chat" +wire_api = "responses" request_max_retries = 0 stream_max_retries = 0 "# diff --git a/codex-rs/app-server/tests/suite/v2/thread_rollback.rs b/codex-rs/app-server/tests/suite/v2/thread_rollback.rs index f3313c759..e88c065f7 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_rollback.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_rollback.rs @@ -1,7 +1,7 @@ use anyhow::Result; use app_test_support::McpProcess; use app_test_support::create_final_assistant_message_sse_response; -use app_test_support::create_mock_chat_completions_server_unchecked; +use app_test_support::create_mock_responses_server_sequence_unchecked; use app_test_support::to_response; use codex_app_server_protocol::JSONRPCResponse; use codex_app_server_protocol::RequestId; @@ -28,7 +28,7 @@ async fn thread_rollback_drops_last_turns_and_persists_to_rollout() -> Result<() create_final_assistant_message_sse_response("Done")?, create_final_assistant_message_sse_response("Done")?, ]; - let server = create_mock_chat_completions_server_unchecked(responses).await; + let server = create_mock_responses_server_sequence_unchecked(responses).await; let codex_home = TempDir::new()?; create_config_toml(codex_home.path(), &server.uri())?; @@ -168,7 +168,7 @@ model_provider = "mock_provider" [model_providers.mock_provider] name = "Mock provider for test" base_url = "{server_uri}/v1" -wire_api = "chat" +wire_api = "responses" request_max_retries = 0 stream_max_retries = 0 "# diff --git a/codex-rs/app-server/tests/suite/v2/thread_start.rs b/codex-rs/app-server/tests/suite/v2/thread_start.rs index ad0949ba2..eedc05cd5 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_start.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_start.rs @@ -1,6 +1,6 @@ use anyhow::Result; use app_test_support::McpProcess; -use app_test_support::create_mock_chat_completions_server; +use app_test_support::create_mock_responses_server_repeating_assistant; use app_test_support::to_response; use codex_app_server_protocol::JSONRPCNotification; use codex_app_server_protocol::JSONRPCResponse; @@ -17,7 +17,7 @@ const DEFAULT_READ_TIMEOUT: std::time::Duration = std::time::Duration::from_secs #[tokio::test] async fn thread_start_creates_thread_and_emits_started() -> Result<()> { // Provide a mock server and config so model wiring is valid. - let server = create_mock_chat_completions_server(vec![]).await; + let server = create_mock_responses_server_repeating_assistant("Done").await; let codex_home = TempDir::new()?; create_config_toml(codex_home.path(), &server.uri())?; @@ -85,7 +85,7 @@ model_provider = "mock_provider" [model_providers.mock_provider] name = "Mock provider for test" base_url = "{server_uri}/v1" -wire_api = "chat" +wire_api = "responses" request_max_retries = 0 stream_max_retries = 0 "# diff --git a/codex-rs/app-server/tests/suite/v2/turn_interrupt.rs b/codex-rs/app-server/tests/suite/v2/turn_interrupt.rs index f68ffb899..34587793c 100644 --- a/codex-rs/app-server/tests/suite/v2/turn_interrupt.rs +++ b/codex-rs/app-server/tests/suite/v2/turn_interrupt.rs @@ -2,7 +2,7 @@ use anyhow::Result; use app_test_support::McpProcess; -use app_test_support::create_mock_chat_completions_server; +use app_test_support::create_mock_responses_server_sequence; use app_test_support::create_shell_command_sse_response; use app_test_support::to_response; use codex_app_server_protocol::JSONRPCNotification; @@ -41,7 +41,7 @@ async fn turn_interrupt_aborts_running_turn() -> Result<()> { std::fs::create_dir(&working_directory)?; // Mock server: long-running shell command then (after abort) nothing else needed. - let server = create_mock_chat_completions_server(vec![create_shell_command_sse_response( + let server = create_mock_responses_server_sequence(vec![create_shell_command_sse_response( shell_command.clone(), Some(&working_directory), Some(10_000), @@ -135,7 +135,7 @@ model_provider = "mock_provider" [model_providers.mock_provider] name = "Mock provider for test" base_url = "{server_uri}/v1" -wire_api = "chat" +wire_api = "responses" request_max_retries = 0 stream_max_retries = 0 "# diff --git a/codex-rs/app-server/tests/suite/v2/turn_start.rs b/codex-rs/app-server/tests/suite/v2/turn_start.rs index d992eeee4..1a3643374 100644 --- a/codex-rs/app-server/tests/suite/v2/turn_start.rs +++ b/codex-rs/app-server/tests/suite/v2/turn_start.rs @@ -3,8 +3,8 @@ use app_test_support::McpProcess; use app_test_support::create_apply_patch_sse_response; use app_test_support::create_exec_command_sse_response; use app_test_support::create_final_assistant_message_sse_response; -use app_test_support::create_mock_chat_completions_server; -use app_test_support::create_mock_chat_completions_server_unchecked; +use app_test_support::create_mock_responses_server_sequence; +use app_test_support::create_mock_responses_server_sequence_unchecked; use app_test_support::create_shell_command_sse_response; use app_test_support::format_with_current_shell_display; use app_test_support::to_response; @@ -50,7 +50,7 @@ async fn turn_start_emits_notifications_and_accepts_model_override() -> Result<( create_final_assistant_message_sse_response("Done")?, create_final_assistant_message_sse_response("Done")?, ]; - let server = create_mock_chat_completions_server_unchecked(responses).await; + let server = create_mock_responses_server_sequence_unchecked(responses).await; let codex_home = TempDir::new()?; create_config_toml(codex_home.path(), &server.uri(), "never")?; @@ -157,7 +157,7 @@ async fn turn_start_accepts_local_image_input() -> Result<()> { ]; // Use the unchecked variant because the request payload includes a LocalImage // which the strict matcher does not currently cover. - let server = create_mock_chat_completions_server_unchecked(responses).await; + let server = create_mock_responses_server_sequence_unchecked(responses).await; let codex_home = TempDir::new()?; create_config_toml(codex_home.path(), &server.uri(), "never")?; @@ -233,7 +233,7 @@ async fn turn_start_exec_approval_toggle_v2() -> Result<()> { )?, create_final_assistant_message_sse_response("done 2")?, ]; - let server = create_mock_chat_completions_server(responses).await; + let server = create_mock_responses_server_sequence(responses).await; // Default approval is untrusted to force elicitation on first turn. create_config_toml(codex_home.as_path(), &server.uri(), "untrusted")?; @@ -357,7 +357,7 @@ async fn turn_start_exec_approval_decline_v2() -> Result<()> { )?, create_final_assistant_message_sse_response("done")?, ]; - let server = create_mock_chat_completions_server(responses).await; + let server = create_mock_responses_server_sequence(responses).await; create_config_toml(codex_home.as_path(), &server.uri(), "untrusted")?; let mut mcp = McpProcess::new(codex_home.as_path()).await?; @@ -503,7 +503,7 @@ async fn turn_start_updates_sandbox_and_cwd_between_turns_v2() -> Result<()> { )?, create_final_assistant_message_sse_response("done second")?, ]; - let server = create_mock_chat_completions_server(responses).await; + let server = create_mock_responses_server_sequence(responses).await; create_config_toml(&codex_home, &server.uri(), "untrusted")?; let mut mcp = McpProcess::new(&codex_home).await?; @@ -637,7 +637,7 @@ async fn turn_start_file_change_approval_v2() -> Result<()> { create_apply_patch_sse_response(patch, "patch-call")?, create_final_assistant_message_sse_response("patch applied")?, ]; - let server = create_mock_chat_completions_server(responses).await; + let server = create_mock_responses_server_sequence(responses).await; create_config_toml(&codex_home, &server.uri(), "untrusted")?; let mut mcp = McpProcess::new(&codex_home).await?; @@ -813,7 +813,7 @@ async fn turn_start_file_change_approval_accept_for_session_persists_v2() -> Res create_apply_patch_sse_response(patch_2, "patch-call-2")?, create_final_assistant_message_sse_response("patch 2 applied")?, ]; - let server = create_mock_chat_completions_server(responses).await; + let server = create_mock_responses_server_sequence(responses).await; create_config_toml(&codex_home, &server.uri(), "untrusted")?; let mut mcp = McpProcess::new(&codex_home).await?; @@ -987,7 +987,7 @@ async fn turn_start_file_change_approval_decline_v2() -> Result<()> { create_apply_patch_sse_response(patch, "patch-call")?, create_final_assistant_message_sse_response("patch declined")?, ]; - let server = create_mock_chat_completions_server(responses).await; + let server = create_mock_responses_server_sequence(responses).await; create_config_toml(&codex_home, &server.uri(), "untrusted")?; let mut mcp = McpProcess::new(&codex_home).await?; @@ -1125,7 +1125,7 @@ async fn command_execution_notifications_include_process_id() -> Result<()> { create_exec_command_sse_response("uexec-1")?, create_final_assistant_message_sse_response("done")?, ]; - let server = create_mock_chat_completions_server(responses).await; + let server = create_mock_responses_server_sequence(responses).await; let codex_home = TempDir::new()?; create_config_toml(codex_home.path(), &server.uri(), "never")?; let config_toml = codex_home.path().join("config.toml"); @@ -1264,7 +1264,7 @@ model_provider = "mock_provider" [model_providers.mock_provider] name = "Mock provider for test" base_url = "{server_uri}/v1" -wire_api = "chat" +wire_api = "responses" request_max_retries = 0 stream_max_retries = 0 "#