// MCP search_text API のテスト(MCP が 127.0.0.1:3001 で起動している前提。通常の cargo test ではスキップ)
use reqwest::Client;
use serde_json::json;
#[tokio::test]
#[ignore = "requires MCP server on 127.0.0.1:3001; run with: cargo test --test search_api -- --ignored"]
async fn test_search_text_returns_results() {
let client = Client::new();
let req = json!({
"jsonrpc": "2.0",
"method": "search_text",
"params": { "content": "テスト", "limit": 5 },
"id": 1
});
let resp = client
.post("http://127.0.0.1:3001/messages")
.json(&req)
.send()
.await
.expect("API呼び出し失敗");
assert!(resp.status().is_success());
let body: serde_json::Value = resp.json().await.expect("JSONデコード失敗");
assert_eq!(body["jsonrpc"], "2.0");
assert!(body["result"].get("content").is_some());
assert!(body["result"]["content"].is_array());
let text = body["result"]["content"][0]["text"].as_str().unwrap_or("");
let parsed: serde_json::Value = serde_json::from_str(text).unwrap_or(json!(null));
// 新形式: { items, vector_search_used } であること
if let Some(obj) = parsed.as_object() {
assert!(obj.contains_key("items"), "search レスポンスに items があること");
assert!(
obj.contains_key("vector_search_used"),
"search レスポンスに vector_search_used があること(ベクトル検索の有無を判定するため)"
);
let items = &obj["items"];
assert!(items.is_array(), "items は配列");
if let Some(arr) = items.as_array() {
for item in arr.iter().take(3) {
if let Some(sim) = item.get("similarity").and_then(|v| v.as_f64()) {
assert!((0.0..=1.0).contains(&sim), "similarity は 0〜1: {}", sim);
}
}
}
}
}