use serde_json::json;
use std::time::Duration;
mod mcp_test_helpers;
use mcp_test_helpers::with_mcp_test_server;
#[tokio::test]
async fn test_session_reinitialize_clears_state() {
with_mcp_test_server("session_reinit_test", |server| async move {
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(5))
.cookie_store(true) .build()?;
let init_request = json!({
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": {"name": "test-v1", "version": "1.0"}
}
});
let response = client
.post(&server.http_url())
.json(&init_request)
.send()
.await?;
assert_eq!(response.status(), 200);
let body: serde_json::Value = response.json().await?;
assert!(body.get("result").is_some());
let tools_request = json!({
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list"
});
let response = client
.post(&server.http_url())
.json(&tools_request)
.send()
.await?;
assert_eq!(response.status(), 200);
let reinit_request = json!({
"jsonrpc": "2.0",
"id": 3,
"method": "initialize",
"params": {
"protocolVersion": "2025-03-26", "capabilities": {},
"clientInfo": {"name": "test-v2", "version": "2.0"}
}
});
let response = client
.post(&server.http_url())
.json(&reinit_request)
.send()
.await?;
assert_eq!(response.status(), 200);
let body: serde_json::Value = response.json().await?;
println!("Re-init response: {:?}", body);
let result = body.get("result").expect("Should have result");
assert_eq!(result["protocolVersion"], "2025-03-26");
let tools_request = json!({
"jsonrpc": "2.0",
"id": 4,
"method": "tools/list"
});
let response = client
.post(&server.http_url())
.json(&tools_request)
.send()
.await?;
assert_eq!(response.status(), 200);
Ok(())
})
.await
.unwrap();
}
#[tokio::test]
async fn test_concurrent_session_isolation() {
with_mcp_test_server("concurrent_sessions_test", |server| async move {
let client1 = reqwest::Client::builder()
.timeout(Duration::from_secs(5))
.build()?;
let client2 = reqwest::Client::builder()
.timeout(Duration::from_secs(5))
.build()?;
let init1 = json!({
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": {"name": "client1", "version": "1.0"}
}
});
let response = client1.post(&server.http_url()).json(&init1).send().await?;
assert_eq!(response.status(), 200);
let init2 = json!({
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-03-26",
"capabilities": {},
"clientInfo": {"name": "client2", "version": "1.0"}
}
});
let response = client2.post(&server.http_url()).json(&init2).send().await?;
assert_eq!(response.status(), 200);
let tools_request = json!({
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list"
});
let response1 = client1
.post(&server.http_url())
.json(&tools_request)
.send()
.await?;
assert_eq!(response1.status(), 200);
let response2 = client2
.post(&server.http_url())
.json(&tools_request)
.send()
.await?;
assert_eq!(response2.status(), 200);
Ok(())
})
.await
.unwrap();
}
#[tokio::test]
async fn test_uninitialized_session_rejection() {
with_mcp_test_server("uninitialized_test", |server| async move {
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(5))
.build()?;
let tools_request = json!({
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
});
let response = client
.post(&server.http_url())
.json(&tools_request)
.send()
.await?;
assert_eq!(response.status(), 200); let body: serde_json::Value = response.json().await?;
let error = body.get("error").expect("Should have error");
assert_eq!(error["code"], -32002);
Ok(())
})
.await
.unwrap();
}