#[test] fn test_basic_compilation() { assert_eq!(2 + 2, 4); } /// 验证套餐天数和 SQL CASE 间隔一致 /// 如果新增套餐类型,此处会失败,提醒同步更新 db.rs 中的 CASE 语句 #[test] fn test_payment_package_intervals_match() { // 必须与 db.rs 中 confirm_payment_order 的 CASE WHEN 完全一致 // 与 handlers/payment.rs 中 Pkg.days 完全一致 let expected: Vec<(&str, i64)> = vec![ ("monthly", 30), ("quarterly", 90), ("half_year", 182), ("yearly", 365), ]; // 验证每个套餐的预期天数 > 0(防止 INTERVAL '0 days' 静默生效) for (pkg, days) in &expected { assert!(*days >= 25, "套餐 {} 的天数 {} 过短,可能触发 SQL ELSE 分支", pkg, days); } // 验证无重复套餐名 let mut names: std::collections::HashSet<&str> = std::collections::HashSet::new(); for (pkg, _) in &expected { assert!( names.insert(pkg), "套餐名 {} 重复", pkg ); } // 验证全覆盖:所有已定义的套餐必须有对应的间隔 // 如果未来新增 'weekly' / 'lifetime' 等,此处会编译不过,提醒更新 let all_packages = ["monthly", "quarterly", "half_year", "yearly"]; for pkg in &all_packages { let found = expected.iter().any(|(name, _)| name == pkg); assert!(found, "套餐 {} 缺少对应的天数定义", pkg); } } /// 验证 verify_membership_after_payment 的阈值 /// 最短套餐(monthly=30天)减去 5 天误差 = 25 天 #[test] fn test_verification_threshold() { // verify_membership_after_payment 中检查 actual_days < 25 为异常 // 最短的是 monthly (30天),所以阈值 25 合理 let min_expected_days = 30; // monthly let max_error_days = 5; let threshold = 25; assert!( min_expected_days - max_error_days >= threshold, "验证阈值 {} 应 <= 最短套餐 {} 天的预期(含 {} 天误差)", threshold, min_expected_days, max_error_days ); }