codex-helper-core 0.15.0

Core library for codex-helper.
Documentation
use super::*;

#[tokio::test]
async fn proxy_api_v1_sessions_report_client_identity_from_request_context() {
    let upstream = axum::Router::new().route(
        "/v1/responses",
        post(|| async {
            (
                StatusCode::OK,
                Json(serde_json::json!({
                    "id": "resp_test",
                    "output": [],
                })),
            )
        }),
    );
    let (upstream_addr, upstream_handle) = spawn_axum_server(upstream);

    let cfg = make_proxy_config(
        vec![UpstreamConfig {
            base_url: format!("http://{upstream_addr}/v1"),
            auth: UpstreamAuth::default(),
            tags: HashMap::from([("provider_id".to_string(), "u1".to_string())]),
            supported_models: HashMap::new(),
            model_mapping: HashMap::new(),
        }],
        RetryConfig::default(),
    );
    let proxy = ProxyService::new(
        Client::new(),
        Arc::new(cfg),
        "codex",
        Arc::new(std::sync::Mutex::new(HashMap::new())),
    );
    let app = crate::proxy::router(proxy);
    let (proxy_addr, proxy_handle) = spawn_axum_server(app);

    let client = Client::new();
    let response = client
        .post(format!("http://{proxy_addr}/v1/responses"))
        .header("content-type", "application/json")
        .header("session_id", "sid-client")
        .header(super::CLIENT_NAME_HEADER, "Frank-Desk")
        .header("user-agent", "Codex CLI/0.1")
        .body(r#"{"input":"hi"}"#)
        .send()
        .await
        .expect("responses send");
    assert_eq!(response.status(), StatusCode::OK);

    let sessions = client
        .get(format!(
            "http://{proxy_addr}/__codex_helper/api/v1/sessions"
        ))
        .send()
        .await
        .expect("sessions send")
        .error_for_status()
        .expect("sessions status")
        .json::<serde_json::Value>()
        .await
        .expect("sessions json");
    let sessions = sessions.as_array().expect("sessions array");
    assert_eq!(sessions.len(), 1);
    assert_eq!(
        sessions[0]
            .get("session_id")
            .and_then(|value| value.as_str()),
        Some("sid-client")
    );
    assert_eq!(
        sessions[0]
            .get("last_client_name")
            .and_then(|value| value.as_str()),
        Some("Frank-Desk")
    );
    assert_eq!(
        sessions[0]
            .get("last_client_addr")
            .and_then(|value| value.as_str()),
        Some("127.0.0.1")
    );
    assert_eq!(
        sessions[0]
            .get("observation_scope")
            .and_then(|value| value.as_str()),
        Some("observed_only")
    );

    proxy_handle.abort();
    upstream_handle.abort();
}