mod mcp_test_helpers;
use anyhow::Result;
use serde_json::{json, Value};
#[tokio::test]
async fn test_server_info_correctness() -> Result<()> {
let server = mcp_test_helpers::McpTestServer::start()
.await
.map_err(|e| anyhow::anyhow!("{}", e))?;
let url = format!("{}/mcp", server.http_url());
let client = reqwest::Client::new();
let init_request = json!({
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": {
"name": "test-client",
"version": "1.0.0"
}
}
});
let response = client.post(&url).json(&init_request).send().await?;
let init_response: Value = response.json().await?;
assert!(init_response["result"]["serverInfo"].is_object());
assert!(init_response["result"]["serverInfo"]["name"].is_string());
assert!(init_response["result"]["serverInfo"]["version"].is_string());
let server_name = init_response["result"]["serverInfo"]["name"]
.as_str()
.unwrap();
assert!(!server_name.is_empty(), "Server name should not be empty");
println!("✅ Server info correctly reported: {server_name}");
Ok(())
}
#[tokio::test]
async fn test_protocol_version_negotiation() -> Result<()> {
let server = mcp_test_helpers::McpTestServer::start()
.await
.map_err(|e| anyhow::anyhow!("{}", e))?;
let url = format!("{}/mcp", server.http_url());
let client = reqwest::Client::new();
let init_request = json!({
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": {
"name": "test-client",
"version": "1.0.0"
}
}
});
let response = client.post(&url).json(&init_request).send().await?;
let init_response: Value = response.json().await?;
assert_eq!(init_response["result"]["protocolVersion"], "2025-06-18");
println!("✅ Protocol version negotiation works correctly!");
Ok(())
}
#[tokio::test]
async fn test_reinitialization_handling() -> Result<()> {
let server = mcp_test_helpers::McpTestServer::start()
.await
.map_err(|e| anyhow::anyhow!("{}", e))?;
let url = format!("{}/mcp", server.http_url());
let client = reqwest::Client::new();
let init_request = json!({
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": {
"name": "test-client",
"version": "1.0.0"
}
}
});
let response = client.post(&url).json(&init_request).send().await?;
assert_eq!(response.status(), 200);
let init_request2 = json!({
"jsonrpc": "2.0",
"id": 2,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": {
"name": "test-client-2",
"version": "2.0.0"
}
}
});
let response = client
.post(&url)
.header("Cookie", "mcp_session=http_default_session")
.json(&init_request2)
.send()
.await?;
let reinit_response: Value = response.json().await?;
assert!(reinit_response["error"].is_object());
assert_eq!(reinit_response["error"]["message"], "Already initialized");
println!("✅ Re-initialization handling works correctly!");
Ok(())
}