mod common;
use common::{make_test_analyzer, send_raw_request};
use rmcp::model::{CallToolResult, ContentBlock, ResultType};
#[test]
fn test_call_tool_result_constructors_set_result_type_complete() {
for result in [
CallToolResult::success(vec![ContentBlock::text("ok")]),
CallToolResult::error(vec![ContentBlock::text("err")]),
] {
assert_eq!(
result.result_type,
Some(ResultType::COMPLETE),
"CallToolResult constructor must set result_type to Complete"
);
}
}
#[test]
fn test_call_tool_result_type_serializes_as_complete() {
let result = CallToolResult::success(vec![ContentBlock::text("ok")]);
let json = serde_json::to_value(&result).expect("should serialize");
assert_eq!(
json.get("resultType").and_then(|v| v.as_str()),
Some("complete"),
"resultType must serialize as \"complete\": {json}"
);
}
#[tokio::test]
async fn test_tools_list_has_ttl_and_cache_scope() {
let analyzer = make_test_analyzer();
let response = send_raw_request(analyzer, "tools/list", serde_json::json!({})).await;
let result = response
.get("result")
.expect("tools/list must return a result");
assert_eq!(
result.get("ttlMs").and_then(|v| v.as_u64()),
Some(3_600_000),
"tools/list must advertise ttlMs=3600000: {result}"
);
assert_eq!(
result.get("cacheScope").and_then(|v| v.as_str()),
Some("public"),
"tools/list must advertise cacheScope=public: {result}"
);
}