use crate::docs::{generate_docs, write_docs, DocFormat};
#[test]
fn test_doc_format_variants() {
let openapi = DocFormat::OpenApi;
let swagger = DocFormat::SwaggerUi;
let cli_md = DocFormat::CliMarkdown;
let mcp_md = DocFormat::McpMarkdown;
let all = DocFormat::All;
let variants = [openapi, swagger, cli_md, mcp_md, all];
for (i, &a) in variants.iter().enumerate() {
for (j, &b) in variants.iter().enumerate() {
if i == j {
assert_eq!(a, b, "相同变体必须相等: idx={}", i);
} else {
assert_ne!(a, b, "不同变体必须不等: idx={} vs {}", i, j);
}
}
}
let debug = format!("{:?}", openapi);
assert!(
debug.contains("OpenApi"),
"Debug 输出应含变体名,实际: {}",
debug
);
let cloned = openapi.clone();
assert_eq!(openapi, cloned);
let copied = openapi;
assert_eq!(openapi, copied);
let default = DocFormat::default();
assert_eq!(default, DocFormat::OpenApi, "Default 应为 OpenApi");
}
#[test]
fn test_generate_docs_openapi_returns_json() {
let json = generate_docs(DocFormat::OpenApi).expect("generate_docs OpenApi");
assert!(!json.is_empty(), "OpenApi 文档不应为空");
assert!(
json.trim_start().starts_with('{'),
"OpenApi 文档首字符应为 `{{`,实际首字符: {:?}",
json.chars().next()
);
}
#[test]
fn test_generate_docs_cli_markdown_returns_md() {
let md = generate_docs(DocFormat::CliMarkdown).expect("generate_docs CliMarkdown");
assert!(!md.is_empty(), "CliMarkdown 文档不应为空");
assert!(
md.contains('#'),
"CliMarkdown 文档应含 markdown 标题标记 `#`,实际: {}",
&md[..md.len().min(200)]
);
}
#[test]
fn test_write_docs_creates_file() {
let dir = tempfile::tempdir().expect("创建临时目录失败");
let file_path = dir.path().join("openapi.json");
write_docs(DocFormat::OpenApi, &file_path).expect("write_docs 应成功");
assert!(file_path.exists(), "文档文件应被创建: {:?}", file_path);
let content = std::fs::read_to_string(&file_path).expect("读取写入的文件");
assert!(!content.is_empty(), "文档内容不应为空");
assert!(
content.trim_start().starts_with('{'),
"OpenApi 文档首字符应为 `{{`,实际: {:?}",
content.chars().next()
);
}
#[test]
fn test_generate_docs_swagger_returns_html() {
let html = generate_docs(DocFormat::SwaggerUi).expect("generate_docs SwaggerUi");
assert!(!html.is_empty(), "SwaggerUi HTML 不应为空");
let lower = html.to_lowercase();
assert!(
lower.contains("<html"),
"SwaggerUi 输出应含 <html 标签,实际: {}",
&html[..html.len().min(200)]
);
assert!(
lower.contains("swagger-ui"),
"SwaggerUi 输出应含 swagger-ui 链接,实际: {}",
&html[..html.len().min(200)]
);
}
#[test]
fn test_generate_docs_mcp_markdown() {
let md = generate_docs(DocFormat::McpMarkdown).expect("generate_docs McpMarkdown");
assert!(!md.is_empty(), "McpMarkdown 文档不应为空");
#[cfg(feature = "mcp")]
{
assert!(
md.contains("# MCP Tools"),
"McpMarkdown 应含 `# MCP Tools` 标题,实际: {}",
&md[..md.len().min(200)]
);
}
#[cfg(not(feature = "mcp"))]
{
assert!(
md.to_lowercase().contains("mcp"),
"McpMarkdown 占位提示应含 `mcp` 字样,实际: {}",
&md[..md.len().min(200)]
);
}
}
#[test]
fn test_generate_docs_all_combines() {
let all = generate_docs(DocFormat::All).expect("generate_docs All");
assert!(!all.is_empty(), "All 文档不应为空");
assert!(
all.contains('{'),
"All 应含 OpenApi JSON 内容(`{{`),实际: {}",
&all[..all.len().min(200)]
);
assert!(
all.contains('#'),
"All 应含 CliMarkdown 标题标记 `#`,实际: {}",
&all[..all.len().min(200)]
);
}