mod integration;
mod validation;
use integration::{common::*, v3_tests::V3TestSuite, v4_tests::V4TestSuite};
use validation::OpenApiValidator;
#[tokio::test]
async fn run_api_integration_tests() {
let integration_enabled = std::env::var("INTEGRATION_TEST_ENABLED")
.map(|v| v == "1" || v.to_lowercase() == "true")
.unwrap_or(false);
let config_file_exists = std::path::Path::new("tests/config/test_config.toml").exists();
if !integration_enabled && !config_file_exists {
println!("集成测试已跳过(未配置 INTEGRATION_TEST_ENABLED=1 且配置文件不存在)");
println!("要运行集成测试,请:");
println!(" 1. 设置环境变量: INTEGRATION_TEST_ENABLED=1");
println!(" 2. 或创建配置文件: tests/config/test_config.toml");
return;
}
println!("\n╔══════════════════════════════════════════════════════════╗");
println!("║ Cloudreve API 集成测试套件 ║");
println!("╚══════════════════════════════════════════════════════════╝");
let config = match TestConfig::load() {
Ok(cfg) => cfg,
Err(e) => {
println!("\n错误: {}", e);
println!("\n请按以下步骤配置测试环境:");
println!(
"1. 复制配置文件: cp tests/config/test_config.example.toml tests/config/test_config.toml"
);
println!("2. 编辑 tests/config/test_config.toml,填入你的测试环境信息");
println!("3. 重新运行测试\n");
panic!("配置文件未找到或无效");
}
};
println!("配置加载成功:");
if config.v3_enabled() {
println!(" - V3: 已启用 ({})", config.v3_config().unwrap().base_url);
} else {
println!(" - V3: 未配置");
}
if config.v4_enabled() {
println!(" - V4: 已启用 ({})", config.v4_config().unwrap().base_url);
} else {
println!(" - V4: 未配置");
}
let mut all_results = TestResults::new();
if config.v3_enabled() {
let credentials = TestCredentials::from(config.v3_config().unwrap());
match V3TestSuite::new(config.clone(), credentials).await {
Ok(mut suite) => {
let results = suite.run_all().await;
all_results.merge(results);
}
Err(e) => {
println!("│ ✗ V3 测试套件初始化失败: {}", e);
}
}
}
if config.v4_enabled() {
let credentials = TestCredentials::from(config.v4_config().unwrap());
match V4TestSuite::new(config.clone(), credentials).await {
Ok(suite) => {
let results = suite.run_all().await;
all_results.merge(results);
}
Err(e) => {
println!("│ ✗ V4 测试套件初始化失败: {}", e);
}
}
}
all_results.print_summary();
if config.validation_enabled() {
println!("\n╔══════════════════════════════════════════════════════════╗");
println!("║ OpenAPI 规范验证 ║");
println!("╚══════════════════════════════════════════════════════════╝");
let mut validator =
OpenApiValidator::new(config.strict_mode(), config.allow_extra_fields())
.await
.expect("无法创建验证器");
let _ = validator.load_v3_from_cache().await;
let _ = validator.load_v4_from_cache().await;
if !validator.has_v3_spec() || !validator.has_v4_spec() {
println!(" [OpenAPI] 缓存不存在,尝试从 MCP 加载...");
let _ = validator.load_v3_from_mcp().await;
let _ = validator.load_v4_from_mcp().await;
}
let v3_report = validator.validate_v3();
v3_report.print();
let v4_report = validator.validate_v4();
v4_report.print();
if config.strict_mode() && (v3_report.has_errors() || v4_report.has_errors()) {
panic!("OpenAPI 验证失败(严格模式)");
}
}
if !all_results.is_success() {
println!("\n╔══════════════════════════════════════════════════════════╗");
println!("║ 测试发现的问题汇总 ║");
println!("╚══════════════════════════════════════════════════════════╝");
println!("上述测试失败表明可能存在以下问题:");
println!("1. API 端点实现不正确");
println!("2. 请求/响应结构体与实际 API 不匹配");
println!("3. 某些端点返回格式不符合预期");
println!("4. 时序问题(某些操作需要等待)");
println!("\n建议:");
println!("1. 检查失败的端点对应的代码实现");
println!("2. 对比 OpenAPI 规范验证实现是否正确");
println!("3. 考虑添加重试逻辑处理时序问题");
println!("4. 检查错误响应处理是否完善");
}
}