Codex Handbook
core/src/tools/handlers/mcp_resource_tests.rs 162 lines
use super::*;use pretty_assertions::assert_eq;use rmcp::model::AnnotateAble;use rmcp::model::ResourceContents;use serde_json::json;fn resource(uri: &str, name: &str) -> Resource {    rmcp::model::RawResource {        uri: uri.to_string(),        name: name.to_string(),        title: None,        description: None,        mime_type: None,        size: None,        icons: None,        meta: None,    }    .no_annotation()}fn template(uri_template: &str, name: &str) -> ResourceTemplate {    rmcp::model::RawResourceTemplate {        uri_template: uri_template.to_string(),        name: name.to_string(),        title: None,        description: None,        mime_type: None,        icons: None,    }    .no_annotation()}#[test]fn resource_with_server_serializes_server_field() {    let entry = ResourceWithServer::new("test".to_string(), resource("memo://id", "memo"));    let value = serde_json::to_value(&entry).expect("serialize resource");    assert_eq!(value["server"], json!("test"));    assert_eq!(value["uri"], json!("memo://id"));    assert_eq!(value["name"], json!("memo"));}#[test]fn list_resources_payload_from_single_server_copies_next_cursor() {    let result = ListResourcesResult {        meta: None,        next_cursor: Some("cursor-1".to_string()),        resources: vec![resource("memo://id", "memo")],    };    let payload = ListResourcesPayload::from_single_server("srv".to_string(), result);    let value = serde_json::to_value(&payload).expect("serialize payload");    assert_eq!(value["server"], json!("srv"));    assert_eq!(value["nextCursor"], json!("cursor-1"));    let resources = value["resources"].as_array().expect("resources array");    assert_eq!(resources.len(), 1);    assert_eq!(resources[0]["server"], json!("srv"));}#[test]fn list_resources_payload_from_all_servers_is_sorted() {    let mut map = HashMap::new();    map.insert("beta".to_string(), vec![resource("memo://b-1", "b-1")]);    map.insert(        "alpha".to_string(),        vec![resource("memo://a-1", "a-1"), resource("memo://a-2", "a-2")],    );    let payload = ListResourcesPayload::from_all_servers(map);    let value = serde_json::to_value(&payload).expect("serialize payload");    let uris: Vec<String> = value["resources"]        .as_array()        .expect("resources array")        .iter()        .map(|entry| entry["uri"].as_str().unwrap().to_string())        .collect();    assert_eq!(        uris,        vec![            "memo://a-1".to_string(),            "memo://a-2".to_string(),            "memo://b-1".to_string()        ]    );}#[test]fn call_tool_result_from_content_marks_success() {    let result = call_tool_result_from_content("{}", Some(true));    assert_eq!(result.is_error, Some(false));    assert_eq!(result.content.len(), 1);}#[test]fn parse_arguments_handles_empty_and_json() {    assert!(        parse_arguments(" \n\t").unwrap().is_none(),        "expected None for empty arguments"    );    assert!(        parse_arguments("null").unwrap().is_none(),        "expected None for null arguments"    );    let value = parse_arguments(r#"{"server":"figma"}"#)        .expect("parse json")        .expect("value present");    assert_eq!(value["server"], json!("figma"));}#[test]fn template_with_server_serializes_server_field() {    let entry = ResourceTemplateWithServer::new("srv".to_string(), template("memo://{id}", "memo"));    let value = serde_json::to_value(&entry).expect("serialize template");    assert_eq!(        value,        json!({            "server": "srv",            "uriTemplate": "memo://{id}",            "name": "memo"        })    );}#[test]fn serialize_function_output_preserves_small_payload() {    let payload = json!({"server": "hosted", "resources": []});    let expected = serde_json::to_string(&payload).expect("serialize payload");    let output = serialize_function_output(payload, TruncationPolicy::Bytes(1_024))        .expect("serialize function output")        .into_text();    assert_eq!(output, expected);}#[test]fn serialize_function_output_caps_read_resource_payload() {    let truncation_policy = TruncationPolicy::Bytes(8_000);    let payload = ReadResourcePayload {        server: "hosted".to_string(),        uri: "skill://large/SKILL.md".to_string(),        result: ReadResourceResult::new(vec![ResourceContents::TextResourceContents {            uri: "skill://large/SKILL.md".to_string(),            mime_type: Some("text/markdown".to_string()),            text: "x".repeat(16_000),            meta: None,        }]),    };    let serialized = serde_json::to_string(&payload).expect("serialize payload");    let expected = truncate_text(&serialized, truncation_policy * 1.2);    let output = serialize_function_output(payload, truncation_policy)        .expect("serialize bounded function output")        .into_text();    assert_ne!(output, serialized);    assert_eq!(output, expected);}