core/tests/suite/prompt_debug_tests.rs
70 lines
use std::sync::Arc;use anyhow::Result;use codex_core::build_prompt_input;use codex_core::config::ConfigBuilder;use codex_core::config::ConfigOverrides;use codex_home::CodexHomeUserInstructionsProvider;use codex_protocol::models::ContentItem;use codex_protocol::models::ResponseItem;use codex_protocol::user_input::UserInput;use pretty_assertions::assert_eq;use tempfile::TempDir;const TEST_INSTRUCTIONS: &str = "Global test instructions";#[tokio::test]async fn build_prompt_input_includes_context_and_user_message() -> Result<()> { let codex_home = TempDir::new()?; let cwd = TempDir::new()?; std::fs::write(codex_home.path().join("AGENTS.md"), TEST_INSTRUCTIONS)?; let 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?; let user_instructions_provider = Arc::new(CodexHomeUserInstructionsProvider::new( config.codex_home.clone(), )); let input = build_prompt_input( config, vec![UserInput::Text { text: "hello from debug prompt".to_string(), text_elements: Vec::new(), }], /*state_db*/ None, user_instructions_provider, ) .await?; let expected_user_message = ResponseItem::Message { id: None, role: "user".to_string(), content: vec![ContentItem::InputText { text: "hello from debug prompt".to_string(), }], phase: None, metadata: 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(TEST_INSTRUCTIONS) }) })); Ok(())}