diff --git a/codex-rs/core/src/prompt_debug.rs b/codex-rs/core/src/prompt_debug.rs index 1f62c2b08..b6c66410a 100644 --- a/codex-rs/core/src/prompt_debug.rs +++ b/codex-rs/core/src/prompt_debug.rs @@ -98,62 +98,3 @@ pub(crate) async fn build_prompt_input_from_session( Ok(prompt.get_formatted_input()) } - -#[cfg(test)] -mod tests { - use codex_protocol::models::ContentItem; - use codex_protocol::models::ResponseItem; - use codex_protocol::user_input::UserInput; - use codex_utils_absolute_path::AbsolutePathBuf; - use pretty_assertions::assert_eq; - - use crate::config::test_config; - - use super::build_prompt_input; - - #[tokio::test] - async fn build_prompt_input_includes_context_and_user_message() { - let codex_home = tempfile::tempdir().expect("create codex home"); - let cwd = tempfile::tempdir().expect("create cwd"); - let mut config = test_config().await; - config.codex_home = - AbsolutePathBuf::from_absolute_path(codex_home.path()).expect("codex home is absolute"); - config.cwd = AbsolutePathBuf::try_from(cwd.path().to_path_buf()).expect("absolute cwd"); - config.user_instructions = Some("Project-specific test instructions".to_string()); - - let input = build_prompt_input( - config, - vec![UserInput::Text { - text: "hello from debug prompt".to_string(), - text_elements: Vec::new(), - }], - ) - .await - .expect("build prompt input"); - - let expected_user_message = ResponseItem::Message { - id: None, - role: "user".to_string(), - content: vec![ContentItem::InputText { - text: "hello from debug prompt".to_string(), - }], - end_turn: None, - phase: None, - }; - assert_eq!(input.last(), Some(&expected_user_message)); - assert!(input.iter().any(|item| { - let ResponseItem::Message { content, .. } = item else { - return false; - }; - - content.iter().any(|content_item| { - let (ContentItem::InputText { text } | ContentItem::OutputText { text }) = - content_item - else { - return false; - }; - text.contains("Project-specific test instructions") - }) - })); - } -} diff --git a/codex-rs/core/tests/suite/mod.rs b/codex-rs/core/tests/suite/mod.rs index 9f8389c45..6c4cb1981 100644 --- a/codex-rs/core/tests/suite/mod.rs +++ b/codex-rs/core/tests/suite/mod.rs @@ -67,6 +67,7 @@ mod personality; mod personality_migration; mod plugins; mod prompt_caching; +mod prompt_debug_tests; mod quota_exceeded; mod realtime_conversation; mod remote_env; diff --git a/codex-rs/core/tests/suite/prompt_debug_tests.rs b/codex-rs/core/tests/suite/prompt_debug_tests.rs new file mode 100644 index 000000000..1221560bb --- /dev/null +++ b/codex-rs/core/tests/suite/prompt_debug_tests.rs @@ -0,0 +1,60 @@ +use anyhow::Result; +use codex_core::build_prompt_input; +use codex_core::config::ConfigBuilder; +use codex_core::config::ConfigOverrides; +use codex_protocol::models::ContentItem; +use codex_protocol::models::ResponseItem; +use codex_protocol::user_input::UserInput; +use pretty_assertions::assert_eq; +use tempfile::TempDir; + +#[tokio::test] +async fn build_prompt_input_includes_context_and_user_message() -> Result<()> { + let codex_home = TempDir::new()?; + let cwd = TempDir::new()?; + let mut config = ConfigBuilder::default() + .codex_home(codex_home.path().to_path_buf()) + .harness_overrides(ConfigOverrides { + cwd: Some(cwd.path().to_path_buf()), + codex_self_exe: Some(std::env::current_exe()?), + ..ConfigOverrides::default() + }) + .build() + .await?; + config.user_instructions = Some("Project-specific test instructions".to_string()); + + let input = build_prompt_input( + config, + vec![UserInput::Text { + text: "hello from debug prompt".to_string(), + text_elements: Vec::new(), + }], + ) + .await?; + + let expected_user_message = ResponseItem::Message { + id: None, + role: "user".to_string(), + content: vec![ContentItem::InputText { + text: "hello from debug prompt".to_string(), + }], + end_turn: None, + phase: None, + }; + assert_eq!(input.last(), Some(&expected_user_message)); + assert!(input.iter().any(|item| { + let ResponseItem::Message { content, .. } = item else { + return false; + }; + + content.iter().any(|content_item| { + let (ContentItem::InputText { text } | ContentItem::OutputText { text }) = content_item + else { + return false; + }; + text.contains("Project-specific test instructions") + }) + })); + + Ok(()) +}