Codex Handbook
core/tests/suite/unstable_features_warning.rs 106 lines
#![allow(clippy::unwrap_used)]use codex_config::CONFIG_TOML_FILE;use codex_core::NewThread;use codex_features::Feature;use codex_login::CodexAuth;use codex_protocol::protocol::EventMsg;use codex_protocol::protocol::InitialHistory;use codex_protocol::protocol::WarningEvent;use codex_utils_absolute_path::AbsolutePathBuf;use core::time::Duration;use core_test_support::load_default_config_for_test;use core_test_support::wait_for_event;use tempfile::TempDir;use tokio::time::timeout;use toml::toml;#[tokio::test(flavor = "multi_thread", worker_threads = 2)]async fn emits_warning_when_unstable_features_enabled_via_config() {    let home = TempDir::new().expect("tempdir");    let mut config = load_default_config_for_test(&home).await;    config        .features        .enable(Feature::ChildAgentsMd)        .expect("test config should allow feature update");    let user_config_path =        AbsolutePathBuf::from_absolute_path(config.codex_home.join(CONFIG_TOML_FILE))            .expect("absolute user config path");    config.config_layer_stack = config.config_layer_stack.with_user_config(        &user_config_path,        toml! { features = { child_agents_md = true } }.into(),    );    let thread_manager = codex_core::test_support::thread_manager_with_models_provider(        CodexAuth::from_api_key("test"),        config.model_provider.clone(),    );    let auth_manager =        codex_core::test_support::auth_manager_from_auth(CodexAuth::from_api_key("test"));    let NewThread {        thread: conversation,        ..    } = thread_manager        .resume_thread_with_history(            config.clone(),            InitialHistory::New,            auth_manager,            /*parent_trace*/ None,        )        .await        .expect("spawn conversation");    let warning = wait_for_event(&conversation, |ev| matches!(ev, EventMsg::Warning(_))).await;    let EventMsg::Warning(WarningEvent { message }) = warning else {        panic!("expected warning event");    };    assert!(message.contains("child_agents_md"));    assert!(message.contains("Under-development features enabled"));    assert!(message.contains("suppress_unstable_features_warning = true"));}#[tokio::test(flavor = "multi_thread", worker_threads = 2)]async fn suppresses_warning_when_configured() {    let home = TempDir::new().expect("tempdir");    let mut config = load_default_config_for_test(&home).await;    config        .features        .enable(Feature::ChildAgentsMd)        .expect("test config should allow feature update");    config.suppress_unstable_features_warning = true;    let user_config_path =        AbsolutePathBuf::from_absolute_path(config.codex_home.join(CONFIG_TOML_FILE))            .expect("absolute user config path");    config.config_layer_stack = config.config_layer_stack.with_user_config(        &user_config_path,        toml! { features = { child_agents_md = true } }.into(),    );    let thread_manager = codex_core::test_support::thread_manager_with_models_provider(        CodexAuth::from_api_key("test"),        config.model_provider.clone(),    );    let auth_manager =        codex_core::test_support::auth_manager_from_auth(CodexAuth::from_api_key("test"));    let NewThread {        thread: conversation,        ..    } = thread_manager        .resume_thread_with_history(            config.clone(),            InitialHistory::New,            auth_manager,            /*parent_trace*/ None,        )        .await        .expect("spawn conversation");    let warning = timeout(        Duration::from_millis(150),        wait_for_event(&conversation, |ev| matches!(ev, EventMsg::Warning(_))),    )    .await;    assert!(warning.is_err());}