#![cfg(feature = "mcp")]
use crate::core::ApiMetadata;
use crate::docs::mcp_markdown::generate_mcp_docs;
use crate::mcp::{McpToolRegistration, SdForgeTool};
use rmcp::model::{CallToolResult, ContentBlock, ErrorData as McpError};
use serde_json::Value;
use std::sync::Arc;
fn create_test_mcp_tool_for_docs() -> Arc<dyn SdForgeTool> {
struct TestMcpToolForDocs;
impl SdForgeTool for TestMcpToolForDocs {
fn name(&self) -> &str {
"test_mcp_tool_for_docs"
}
fn description(&self) -> &str {
"A test MCP tool for docs generation"
}
fn input_schema(&self) -> Value {
serde_json::json!({"type": "object"})
}
fn call(&self, _input: Option<Value>) -> Result<CallToolResult, McpError> {
Ok(CallToolResult::success(vec![ContentBlock::text(
"ok".to_string(),
)]))
}
}
Arc::new(TestMcpToolForDocs) as Arc<dyn SdForgeTool>
}
fn create_test_mcp_metadata_for_docs() -> ApiMetadata {
ApiMetadata {
name: "test_mcp_tool_for_docs".to_string(),
version: "v1".to_string(),
description: "A test MCP tool for docs generation".to_string(),
cache_ttl: None,
is_streaming: false,
}
}
inventory::submit!(McpToolRegistration::new(
"test_mcp_tool_for_docs",
"v1",
create_test_mcp_tool_for_docs,
create_test_mcp_metadata_for_docs,
));
#[test]
fn test_generate_mcp_docs_contains_tool_name() {
let md = generate_mcp_docs();
assert!(!md.is_empty(), "MCP Markdown 文档不应为空");
assert!(
md.contains("test_mcp_tool_for_docs"),
"MCP Markdown 应包含工具名 `test_mcp_tool_for_docs`,实际: {}",
&md[..md.len().min(300)]
);
assert!(
md.contains("MCP Tools"),
"MCP Markdown 应含 `# MCP Tools` 标题"
);
}
#[test]
fn test_generate_mcp_docs_contains_description() {
let md = generate_mcp_docs();
assert!(
md.contains("A test MCP tool for docs generation"),
"MCP Markdown 应含工具描述"
);
}