Codex Handbook
exec/tests/suite/hooks.rs 43 lines
#![cfg(not(target_os = "windows"))]use core_test_support::responses;use core_test_support::test_codex_exec::test_codex_exec;use serde_json::json;#[tokio::test(flavor = "multi_thread", worker_threads = 2)]async fn exec_hook_trust_bypass_runs_session_start_hook() -> anyhow::Result<()> {    let test = test_codex_exec();    let marker_path = test.home_path().join("session-start-ran");    let command = format!("touch {}", marker_path.display());    std::fs::write(        test.home_path().join("hooks.json"),        serde_json::to_vec_pretty(&json!({            "hooks": {                "SessionStart": [{                    "hooks": [{                        "type": "command",                        "command": command,                    }],                }],            },        }))?,    )?;    let server = responses::start_mock_server().await;    let body = responses::sse(vec![        responses::ev_response_created("response_1"),        responses::ev_assistant_message("response_1", "done"),        responses::ev_completed("response_1"),    ]);    responses::mount_sse_once(&server, body).await;    test.cmd_with_server(&server)        .arg("--skip-git-repo-check")        .arg("--dangerously-bypass-hook-trust")        .arg("run the session start hook")        .assert()        .success();    assert!(marker_path.exists(), "session start hook did not run");    Ok(())}