#![cfg(feature = "docs")]
use crate::cli::docs_subcommand::{docs_subcommand, docs_subcommand_definition};
#[test]
fn test_docs_subcommand_definition_has_format_arg() {
let cmd = docs_subcommand_definition();
let format_arg = cmd
.get_arguments()
.find(|a| a.get_id().as_str() == "format")
.expect("--format 参数必须存在");
assert_eq!(
format_arg.get_long(),
Some("format"),
"format 必须是 --long 选项"
);
let defaults: Vec<String> = format_arg
.get_default_values()
.iter()
.map(|v| v.to_string_lossy().into_owned())
.collect();
assert_eq!(defaults, vec!["all".to_string()], "format 默认值必须是 all");
}
#[test]
fn test_docs_subcommand_definition_has_output_arg() {
let cmd = docs_subcommand_definition();
let output_arg = cmd
.get_arguments()
.find(|a| a.get_id().as_str() == "output")
.expect("--output 参数必须存在");
assert_eq!(
output_arg.get_long(),
Some("output"),
"output 必须是 --long 选项"
);
assert!(!output_arg.is_required_set(), "output 必须是可选的");
}
#[test]
fn test_docs_subcommand_writes_file() {
let dir = tempfile::tempdir().expect("无法创建临时目录");
let output_path = dir.path().join("spec.json");
let cmd = docs_subcommand_definition();
let matches = cmd
.try_get_matches_from([
"docs",
"--format",
"openapi",
"--output",
output_path.to_str().unwrap(),
])
.expect("解析参数失败");
docs_subcommand(&matches).expect("docs_subcommand 必须成功");
let metadata = std::fs::metadata(&output_path).expect("输出文件必须存在");
assert!(metadata.is_file(), "输出必须是普通文件");
assert!(
metadata.len() > 0,
"输出文件必须非空(OpenAPI JSON 应有内容)"
);
let content = std::fs::read_to_string(&output_path).expect("读取输出文件失败");
let parsed: serde_json::Value =
serde_json::from_str(&content).expect("OpenAPI 输出必须是合法 JSON");
assert!(
parsed.get("openapi").is_some(),
"OpenAPI 输出必须包含 `openapi` 字段"
);
}
#[test]
fn test_docs_subcommand_stdout_when_no_output() {
let cmd = docs_subcommand_definition();
let matches = cmd
.try_get_matches_from(["docs", "--format", "cli-markdown"])
.expect("解析参数失败");
let result = docs_subcommand(&matches);
assert!(result.is_ok(), "无 --output 时 docs_subcommand 必须返回 Ok");
}