From df32b8dadf40d39bfbfa367b462d6db5c9fd71e6 Mon Sep 17 00:00:00 2001 From: jif Date: Mon, 28 Sep 2026 11:55:54 +0000 Subject: [PATCH] Isolate realtime auth fallback test from startup prewarm (#48973) ## Why Startup prewarm can reconnect after its empty WebSocket connection closes, consuming the scripted realtime session reply in the environment-key fallback test with ChatGPT authentication. ## What changed Use separate WebSocket servers for startup and realtime traffic, configuring `experimental_realtime_ws_base_url` to point to the realtime server. Assert that it receives exactly one handshake and that the handshake uses the environment key for authorization. GitOrigin-RevId: 0e8ba4bdd66ef8aa3c619e36454dded9dcf55444 --- .../core/tests/suite/realtime_conversation.rs | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/codex-rs/core/tests/suite/realtime_conversation.rs b/codex-rs/core/tests/suite/realtime_conversation.rs index 4a9d557c6a..745439ebf3 100644 --- a/codex-rs/core/tests/suite/realtime_conversation.rs +++ b/codex-rs/core/tests/suite/realtime_conversation.rs @@ -2110,19 +2110,26 @@ async fn conversation_start_uses_openai_env_key_fallback_with_chatgpt_auth() -> skip_if_no_network!(Ok(())); - let server = start_websocket_server(vec![ - vec![], - vec![vec![json!({ - "type": "session.updated", - "session": { "id": "sess_env", "instructions": "backend prompt" } - })]], - ]) + // Startup prewarm can reconnect after the empty connection closes. Keep its + // Responses requests from consuming the realtime session's scripted reply. + let startup_server = start_websocket_server(vec![vec![]]).await; + let server = start_websocket_server(vec![vec![vec![json!({ + "type": "session.updated", + "session": { "id": "sess_env", "instructions": "backend prompt" } + })]]]) .await; - let mut builder = test_codex().with_auth(CodexAuth::create_dummy_chatgpt_auth_for_testing()); - let test = builder.build_with_websocket_server(&server).await?; + let mut builder = test_codex() + .with_auth(CodexAuth::create_dummy_chatgpt_auth_for_testing()) + .with_config({ + let realtime_base_url = server.uri().to_string(); + move |config| { + config.experimental_realtime_ws_base_url = Some(realtime_base_url); + } + }); + let test = builder.build_with_websocket_server(&startup_server).await?; assert!( - server + startup_server .wait_for_handshakes(/*expected*/ 1, Duration::from_secs(2)) .await ); @@ -2174,8 +2181,9 @@ async fn conversation_start_uses_openai_env_key_fallback_with_chatgpt_auth() -> .await; assert_eq!(session_updated, "sess_env"); + assert_eq!(server.handshakes().len(), 1); assert_eq!( - server.handshakes()[1].header("authorization").as_deref(), + server.handshakes()[0].header("authorization").as_deref(), Some("Bearer env-realtime-key") ); @@ -2186,6 +2194,7 @@ async fn conversation_start_uses_openai_env_key_fallback_with_chatgpt_auth() -> }) .await; + startup_server.shutdown().await; server.shutdown().await; Ok(()) }