From 34e707738fe96ad7894e129f779a0a644145e469 Mon Sep 17 00:00:00 2001 From: Charles Cunningham Date: Fri, 13 Mar 2026 10:58:36 -0700 Subject: [PATCH] Update tests for split contextual-user fragments Co-authored-by: Codex --- codex-rs/core/tests/suite/compact.rs | 13 +++-- codex-rs/core/tests/suite/prompt_caching.rs | 58 ++++++++++----------- 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/codex-rs/core/tests/suite/compact.rs b/codex-rs/core/tests/suite/compact.rs index bb34789499..43e41fd3e0 100644 --- a/codex-rs/core/tests/suite/compact.rs +++ b/codex-rs/core/tests/suite/compact.rs @@ -764,10 +764,15 @@ async fn multiple_auto_compact_per_task_runs_after_token_limit_hit() { let filtered_content = content .iter() .filter(|item| { - !item - .get("text") - .and_then(|text| text.as_str()) - .is_some_and(|text| text.starts_with("# AGENTS.md instructions for ")) + let Some(text) = item.get("text").and_then(|text| text.as_str()) else { + return true; + }; + !text.starts_with("# AGENTS.md instructions for ") + && !text.starts_with("") + && !text.starts_with("") + && !text.starts_with("") + && !text.starts_with("") + && !text.starts_with("") }) .cloned() .collect::>(); diff --git a/codex-rs/core/tests/suite/prompt_caching.rs b/codex-rs/core/tests/suite/prompt_caching.rs index d8fd96ddfa..a1b2ad3062 100644 --- a/codex-rs/core/tests/suite/prompt_caching.rs +++ b/codex-rs/core/tests/suite/prompt_caching.rs @@ -72,6 +72,15 @@ fn assert_default_env_context(text: &str, cwd: &str, shell: &Shell) { ); } +fn message_input_texts(value: &serde_json::Value) -> Vec<&str> { + value["content"] + .as_array() + .expect("message content array") + .iter() + .filter_map(|entry| entry["text"].as_str()) + .collect() +} + fn assert_tool_names(body: &serde_json::Value, expected_names: &[&str]) { assert_eq!( body["tools"] @@ -338,9 +347,12 @@ async fn prefixes_context_and_instructions_once_and_consistently_across_requests "expected permissions + cached contextual user prefix + user msg" ); - let ui_text = input1[1]["content"][0]["text"] - .as_str() - .expect("ui message text"); + let contextual_user_texts = message_input_texts(&input1[1]); + let ui_text = contextual_user_texts + .iter() + .copied() + .find(|text| text.contains("be consistent and helpful")) + .expect("user instructions text"); assert!( ui_text.contains("be consistent and helpful"), "expected user instructions in UI message: {ui_text}" @@ -348,15 +360,12 @@ async fn prefixes_context_and_instructions_once_and_consistently_across_requests let shell = default_user_shell(); let cwd_str = config.cwd.to_string_lossy(); - let env_text = input1[1]["content"][1]["text"] - .as_str() + let env_text = contextual_user_texts + .iter() + .copied() + .find(|text| text.starts_with(ENVIRONMENT_CONTEXT_OPEN_TAG)) .expect("environment context text"); assert_default_env_context(env_text, &cwd_str, &shell); - assert_eq!( - input1[1]["content"][1]["type"].as_str(), - Some("input_text"), - "expected environment context bundled after UI message in cached contextual message" - ); assert_eq!(input1[2], text_user_input("hello 1".to_string())); let body2 = req2.single_request().body_json(); @@ -846,23 +855,16 @@ async fn send_user_turn_with_no_changes_does_not_send_environment_context() -> a let body2 = request2.body_json(); let expected_permissions_msg = body1["input"][0].clone(); - let expected_ui_msg = body1["input"][1].clone(); + let expected_contextual_user_msg_1 = body1["input"][1].clone(); let shell = default_user_shell(); let default_cwd_lossy = default_cwd.to_string_lossy(); - let expected_env_text_1 = expected_ui_msg["content"][1]["text"] - .as_str() + let expected_env_text_1 = message_input_texts(&expected_contextual_user_msg_1) + .into_iter() + .find(|text| text.starts_with(ENVIRONMENT_CONTEXT_OPEN_TAG)) .expect("cached environment context text") .to_string(); assert_default_env_context(&expected_env_text_1, &default_cwd_lossy, &shell); - - let expected_contextual_user_msg_1 = text_user_input_parts(vec![ - expected_ui_msg["content"][0]["text"] - .as_str() - .expect("cached user instructions text") - .to_string(), - expected_env_text_1, - ]); let expected_user_message_1 = text_user_input("hello 1".to_string()); let expected_input_1 = serde_json::Value::Array(vec![ @@ -970,21 +972,15 @@ async fn send_user_turn_with_changes_sends_environment_context() -> anyhow::Resu let body2 = request2.body_json(); let expected_permissions_msg = body1["input"][0].clone(); - let expected_ui_msg = body1["input"][1].clone(); + let expected_contextual_user_msg_1 = body1["input"][1].clone(); let shell = default_user_shell(); - let expected_env_text_1 = expected_ui_msg["content"][1]["text"] - .as_str() + let expected_env_text_1 = message_input_texts(&expected_contextual_user_msg_1) + .into_iter() + .find(|text| text.starts_with(ENVIRONMENT_CONTEXT_OPEN_TAG)) .expect("cached environment context text") .to_string(); assert_default_env_context(&expected_env_text_1, &default_cwd.to_string_lossy(), &shell); - let expected_contextual_user_msg_1 = text_user_input_parts(vec![ - expected_ui_msg["content"][0]["text"] - .as_str() - .expect("cached user instructions text") - .to_string(), - expected_env_text_1, - ]); let expected_user_message_1 = text_user_input("hello 1".to_string()); let expected_input_1 = serde_json::Value::Array(vec![ expected_permissions_msg.clone(),