Files
codex-proxy-rs/tests/admin/api_contract.rs
T
2026-06-14 17:48:25 +08:00

95 lines
2.4 KiB
Rust

use axum::{
body::to_bytes,
http::StatusCode,
response::{IntoResponse, Response},
};
use serde_json::{json, Value};
use codex_proxy_rs::{
admin::api::{AdminEnvelope, AdminError, AdminPageEnvelope, AdminResponse},
utils::pagination::Page,
};
#[test]
fn admin_envelope_serializes_lower_camel_case_request_id() {
let body = AdminEnvelope::ok(json!({ "id": "acct_1" }), "req_1");
let value = serde_json::to_value(body).unwrap();
assert_eq!(
value,
json!({
"code": 200,
"message": "OK",
"data": { "id": "acct_1" },
"requestId": "req_1"
})
);
}
#[test]
fn admin_page_envelope_exposes_items_as_data_with_page_metadata() {
let page = Page {
items: vec![json!({ "id": "evt_1" })],
next_cursor: Some("cursor_1".to_string()),
};
let body = AdminPageEnvelope::ok(page, 50, "req_1");
let value = serde_json::to_value(body).unwrap();
assert_eq!(
value,
json!({
"code": 200,
"message": "OK",
"data": [{ "id": "evt_1" }],
"page": {
"limit": 50,
"nextCursor": "cursor_1"
},
"requestId": "req_1"
})
);
}
#[test]
fn admin_response_keeps_http_status_separate_from_body_code() {
let body = AdminEnvelope::new(40101, "Admin login required", (), "req_1");
let response: Response = AdminResponse::new(StatusCode::UNAUTHORIZED, body).into_response();
assert_eq!(response.status(), StatusCode::UNAUTHORIZED);
}
#[test]
fn admin_error_body_uses_null_data() {
let body = AdminEnvelope::new(40101, "Admin login required", (), "req_1");
let value = serde_json::to_value(body).unwrap();
assert_eq!(value["data"], Value::Null);
}
#[tokio::test]
async fn admin_error_into_response_uses_admin_envelope() {
let response: Response = AdminError::new(
StatusCode::UNAUTHORIZED,
40101,
"Admin login required",
"req_1",
)
.into_response();
assert_eq!(response.status(), StatusCode::UNAUTHORIZED);
let bytes = to_bytes(response.into_body(), usize::MAX).await.unwrap();
let value: Value = serde_json::from_slice(&bytes).unwrap();
assert_eq!(
value,
json!({
"code": 40101,
"message": "Admin login required",
"data": null,
"requestId": "req_1"
})
);
}