core/src/context/contextual_user_message_tests.rs
152 lines
use super::*;use crate::context::ContextualUserFragment;use crate::context::InternalContextSource;use crate::context::InternalModelContextFragment;use crate::context::SubagentNotification;use codex_protocol::items::HookPromptFragment;use codex_protocol::items::build_hook_prompt_message;use codex_protocol::models::ResponseItem;use pretty_assertions::assert_eq;#[test]fn detects_environment_context_fragment() { assert!(is_contextual_user_fragment(&ContentItem::InputText { text: "<environment_context>\n<cwd>/tmp</cwd>\n</environment_context>".to_string(), }));}#[test]fn detects_agents_instructions_fragment() { for text in [ "# AGENTS.md instructions for /tmp\n\n<INSTRUCTIONS>\nbody\n</INSTRUCTIONS>", "# AGENTS.md instructions\n\n<INSTRUCTIONS>\nbody\n</INSTRUCTIONS>", ] { assert!(is_contextual_user_fragment(&ContentItem::InputText { text: text.to_string(), })); }}#[test]fn renders_agents_instructions_with_legacy_directory_header() { assert_eq!( UserInstructions { directory: Some("/tmp".to_string()), text: "body".to_string(), } .render(), "# AGENTS.md instructions for /tmp\n\n<INSTRUCTIONS>\nbody\n</INSTRUCTIONS>" );}#[test]fn renders_agents_instructions_without_directory_header() { assert_eq!( UserInstructions { directory: None, text: "body".to_string(), } .render(), "# AGENTS.md instructions\n\n<INSTRUCTIONS>\nbody\n</INSTRUCTIONS>" );}#[test]fn detects_subagent_notification_fragment_case_insensitively() { assert!(SubagentNotification::matches_text( "<SUBAGENT_NOTIFICATION>{}</subagent_notification>" ));}#[test]fn detects_internal_model_context_fragment() { let text = InternalModelContextFragment::new( InternalContextSource::from_static("extension"), "Internal steering.", ) .render(); assert_eq!( text, "<codex_internal_context source=\"extension\">\nInternal steering.\n</codex_internal_context>" ); assert!(is_contextual_user_fragment(&ContentItem::InputText { text }));}#[test]fn detects_legacy_goal_context_fragment() { assert!(is_contextual_user_fragment(&ContentItem::InputText { text: "<goal_context>\nContinue working toward the active thread goal.\n</goal_context>" .to_string(), }));}#[test]fn does_not_hide_arbitrary_context_tags() { assert!(!is_contextual_user_fragment(&ContentItem::InputText { text: "<project_context>\nbody\n</project_context>".to_string(), }));}#[test]fn rejects_invalid_internal_model_context_source() { assert!(!is_contextual_user_fragment(&ContentItem::InputText { text: "<codex_internal_context source=\"Extension\">\nbody\n</codex_internal_context>" .to_string(), }));}#[test]fn contextual_user_fragment_is_dyn_compatible() { let fragment: Box<dyn ContextualUserFragment> = Box::new(InternalModelContextFragment::new( InternalContextSource::from_static("extension"), "Internal steering.", )); assert_eq!( fragment.render(), "<codex_internal_context source=\"extension\">\nInternal steering.\n</codex_internal_context>" );}#[test]fn ignores_regular_user_text() { assert!(!is_contextual_user_fragment(&ContentItem::InputText { text: "hello".to_string(), }));}#[test]fn detects_hook_prompt_fragment_and_roundtrips_escaping() { let message = build_hook_prompt_message(&[HookPromptFragment::from_single_hook( r#"Retry with "waves" & <tides>"#, "hook-run-1", )]) .expect("hook prompt message"); let ResponseItem::Message { content, .. } = message else { panic!("expected hook prompt response item"); }; let [content_item] = content.as_slice() else { panic!("expected a single content item"); }; assert!(is_contextual_user_fragment(content_item)); let ContentItem::InputText { text } = content_item else { panic!("expected input text content item"); }; let parsed = parse_visible_hook_prompt_message(/*id*/ None, content.as_slice()) .expect("visible hook prompt"); assert_eq!( parsed.fragments, vec![HookPromptFragment { text: r#"Retry with "waves" & <tides>"#.to_string(), hook_run_id: "hook-run-1".to_string(), }], ); assert!(!text.contains(""waves" & <tides>"));}