Files
2fa/tests

测试套件

🎯 快速开始

# 运行所有测试
npm test

# 观察模式(自动重跑)
npm run test:watch

# 交互式 UI
npm run test:ui

# 生成覆盖率报告
npm run test:coverage

📊 当前状态

598 个测试全部通过

模块 测试数 覆盖率 状态
OTP Generator 45 59%
Encryption 25 74%
JWT Authentication 52 核心算法
Data Validation 68 100% 🏆
Rate Limiting 54 96% 🔥
API Secrets 31 44%
Response Utils 35 100% 🏆
Crypto (E2EE) 66 97% 🔥
Security (安全配置) 47 98% 🔥
Router Handler (路由处理器) 51 100% 🏆
Backup (备份系统) 55 98% 🔥
Logger (日志系统) 69 96% 🔥
总计 598 ~55%

🔑 核心功能测试

OTP 生成算法

  • RFC 6238 (TOTP): 18 个官方测试向量
    • SHA1, SHA256, SHA512 算法
    • 6 个时间点1970-2603年
  • RFC 4226 (HOTP): 10 个官方测试向量
  • Base32 解码: RFC 4648 标准
  • 功能测试: 默认参数、时间窗口、前导零
  • 性能测试: < 100ms 单次,< 1s 并发 100 次

加密/解密 (AES-GCM 256位)

  • 基础功能: 简单/复杂对象加密往返
  • 安全特性: 错误密钥拒绝、篡改检测、IV 随机性
  • 数据支持: 中文、Emoji、特殊字符、大型数据
  • 边界条件: 空对象、深度嵌套、null 处理
  • 性能测试: < 100ms 加密/解密

JWT 认证 (PBKDF2 + HMAC-SHA256)

  • 密码强度验证: 长度、大小写、数字、特殊字符
  • PBKDF2 哈希: 100,000 迭代、随机盐、SHA-256
  • 密码验证: 正确密码接受、错误密码拒绝、格式验证
  • JWT 生成: HS256 签名、Base64URL 编码、过期时间
  • JWT 验证: 签名验证、过期检查、格式验证、篡改检测
  • Cookie 处理: HttpOnly、Secure、SameSite=Strict
  • 路径认证: requiresAuth 逻辑测试
  • 性能测试: PBKDF2 < 500ms、JWT 操作 < 50ms
  • 安全特性: 盐值随机性、时间戳唯一性、多语言支持

数据验证 (Base32/OTP/密钥) - 🏆 100% 覆盖率

  • Base32 验证: 格式验证、字符集检查、长度验证
  • 密钥强度评估: 弱密钥警告、中等密钥建议、强密钥通过
  • 位长度计算: 正确计算 Base32 编码的位数 (每8字符=40位)
  • 密钥数据验证: 服务名称、账户、密钥完整性检查
  • OTP 参数验证: 类型、位数、周期、算法、计数器
  • 密钥对象创建: UUID 生成、标准化、类型转换
  • 辅助功能: 排序、去重检测
  • 边界条件: 空值、超长字符串、特殊字符、中文支持
  • 性能测试: 1000 次验证 < 100ms

Rate Limiting (DDoS 防护) - 🔥 96% 覆盖率

  • Fixed Window Counter 算法: 固定窗口计数器实现
  • 请求计数: 首次请求、多次请求、超限拒绝
  • 窗口管理: 窗口过期重置、独立客户端计数
  • 安全特性: Fail Open 策略KV 错误时允许请求)
  • 限流响应: 429 状态码、Retry-After 头、X-RateLimit-* 头
  • 客户端识别: IP 提取CF-Connecting-IP/X-Real-IP/X-Forwarded-For
  • Token 识别: Authorization 头提取、组合模式
  • 预设配置: login、loginStrict、api、sensitive、bulk、global
  • 中间件模式: withRateLimit 包装器
  • 性能测试: 100 次检查 < 1s、并发请求处理
  • 边界条件: 极长 key、特殊字符、极短窗口

API Secrets (密钥管理) - 44% 覆盖率

  • handleGetSecrets: 获取密钥列表、解密、排序、错误处理
  • handleAddSecret: 添加密钥、数据验证、重复检测、弱密钥警告
  • handleUpdateSecret: 更新密钥、重复检测、保留ID和时间戳
  • handleDeleteSecret: 删除密钥、验证存在性、不影响其他密钥
  • handleBatchAddSecrets: 批量导入、跳过无效/重复密钥、结果统计
  • handleGenerateOTP: 生成6/8位OTP、支持参数、JSON/HTML响应
  • 集成测试: 完整CRUD流程、数据加密透明性、多密钥管理
  • 验证测试: 空名称拒绝、无效Base32拒绝、无效OTP参数拒绝
  • 重复检测: 相同名称+账户拒绝、不同账户允许
  • 加密存储: AES-GCM 256位、自动加密/解密、格式验证(v1:IV:data)

Response Utils (响应工具) - 🏆 100% 覆盖率

  • createJsonResponse: 创建JSON响应、状态码、安全头、CORS头
  • createErrorResponse: 标准错误响应、ISO 8601时间戳、错误详情
  • createSuccessResponse: 成功响应封装、统一格式、数据包装
  • createHtmlResponse: HTML响应、字符集、安全头集成
  • 安全头集成: X-Frame-Options、X-Content-Type-Options、Referrer-Policy
  • CORS处理: 动态origin验证、向后兼容模式、自定义头优先
  • 边界条件: 大数据对象、极长消息、特殊字符、Unicode支持
  • 性能测试: 1000次响应创建 < 100ms

Crypto (端到端加密 E2EE) - 🔥 97% 覆盖率

  • deriveKey: PBKDF2-SHA256 密钥派生100,000 迭代,盐值验证
  • encryptData: AES-256-GCM 加密,随机 IV/Salt时间戳生成
  • decryptData: AES-GCM 解密,错误密码拒绝,篡改检测
  • verifyMasterPassword: 主密码验证,错误处理
  • isEncrypted: 加密数据识别,格式验证
  • evaluatePasswordStrength: 密码强度评分(弱/中等/强),多规则检查
  • 安全特性: 密钥不可导出、随机盐值/IV、篡改保护
  • 集成测试: 完整加密/解密流程、密码更改、多用户并发
  • 性能测试: PBKDF2 < 1s加密/解密 < 1.5s
  • 边界条件: 极长密码、特殊字符、Unicode、空对象

Security (安全配置) - 🔥 98% 覆盖率

  • getAllowedOrigin: 同源检测、协议匹配、localhost特殊处理
  • isOriginAllowed: Host比对、跨域策略、端口处理
  • getSecurityHeaders: 完整安全头、可选CORS、可选CSP、可选凭据
  • getCorsPreflightHeaders: 预检响应头、方法/头允许、凭据支持
  • isPreflightRequest: OPTIONS识别、Access-Control-Request-Method检查
  • createPreflightResponse: 204/403响应、完整预检头、CORS错误处理
  • mergeSecurityHeaders: 头合并策略、优先级处理、选项传递
  • getCSPPolicy: CSP策略字符串、CDN白名单、指令完整性
  • 集成测试: 完整同源流程、预检流程、跨域拒绝场景
  • 边界条件: 空Host、畸形URL、IPv6、端口处理
  • 性能测试: 1000次调用 < 100ms

Router Handler (路由处理器) - 🏆 100% 覆盖率

  • 首次设置流程: 设置页面渲染、完成后重定向、API请求处理
  • 认证检查: verifyAuth集成、401响应、503错误未配置KV、未设置密码
  • 静态资源路由: 主页面、PWA manifest、Service Worker、图标文件
  • 登录和Token刷新: handleLogin集成、handleRefreshToken集成
  • API路由分发: CRUD操作GET/POST/PUT/DELETE、方法验证、404处理
    • /api/secrets - 密钥列表和添加
    • /api/secrets/batch - 批量导入
    • /api/secrets/{id} - 更新和删除
    • /api/backup - 备份创建和获取
    • /api/backup/restore - 恢复备份
    • /api/backup/export/{key} - 导出备份
  • OTP生成路由: /otp使用说明、/otp/{secret}生成、查询参数传递
  • 404和错误处理: 未知路径404、异常捕获500、错误日志记录
  • CORS处理: 预检请求识别、204响应、非预检返回null
  • 集成测试: 完整CRUD流程、备份流程、公开OTP路由
  • 边界条件: 无KV环境、极长路径、特殊字符、查询参数
  • 性能测试: 100次路由匹配 < 500ms

Backup (备份系统) - 🔥 98% 覆盖率

  • BackupManager: 构造函数初始化、状态管理、单例模式
  • 防抖机制: shouldBackup检查、5分钟防抖间隔、首次立即执行
  • 执行备份: executeBackup核心逻辑、加密/明文备份、备份数据结构
  • 事件驱动: triggerBackup触发、immediate立即模式、防抖调度
  • 延迟备份: setTimeout调度、取消待处理备份、延迟执行验证
  • 备份文件名: 生成格式backup_YYYY-MM-DD_HH-MM-SS.json、时间戳唯一性
  • 自动清理: _cleanupOldBackupsAsync、保留最新100个、按文件名排序
  • 状态跟踪: lastBackupTime、getTimeSinceLastBackup、backupInProgress标志
  • 取消机制: cancelPendingBackup、清理timeout、状态重置
  • 工厂函数: getBackupManager单例、env隔离、实例复用
  • 快捷方法: triggerBackup包装、executeImmediateBackup立即执行
  • 集成测试: 完整备份流程、加密对比、防抖混合场景
  • 性能监控: recordMetric集成、错误不影响备份
  • 错误监控: captureError集成、监控系统异常处理
  • 边界条件: 极大数量密钥、空列表、特殊字符、KV错误处理
  • 性能测试: 备份 < 1s、防抖检查1000次 < 10ms

Logger (日志系统) - 🔥 96% 覆盖率

  • LogLevel 枚举: 5 个日志级别DEBUG < INFO < WARN < ERROR < FATAL、递增验证
  • Logger 类构造: 默认配置、自定义配置、enableConsole 默认 true
  • 消息格式化: 基本日志、附加数据、错误信息、上下文、图标验证
  • 头部清理: 敏感头部脱敏authorization/cookie/x-api-key、保留非敏感头
  • 控制台输出: DEBUG→console.debug、INFO→console.log、WARN→console.warn、ERROR/FATAL→console.error
  • 远程日志: enableRemote 开关、POST 发送、fetch 失败容错
  • 日志方法: debug/info/warn/error/fatal、日志级别过滤、错误对象支持
  • 子 Logger: child() 创建、上下文继承、上下文覆盖
  • 配置管理: setMinLevel 动态调整、setRemoteLogging 启用/禁用
  • 单例模式: getLogger 工厂函数、环境变量配置LOG_LEVEL/ENVIRONMENT
  • 快捷方法: log.debug/info/warn/error/fatal 全局快捷方式
  • 性能计时: PerformanceTimer 类、checkpoint 检查点、end 完成计时、cancel 取消
  • 请求日志: createRequestLogger 中间件、logRequest 记录请求、logResponse 记录响应
  • 状态码分类: 2xx→info、4xx→warn、5xx→error、请求失败→error
  • 集成测试: 完整请求流程、上下文层级、性能与日志集成
  • 边界条件: 空消息、null数据、undefined、特殊字符、极长消息、循环引用
  • 性能测试: 1000 条日志 < 1s、100 个子 Logger < 100ms

🐛 已修复的 Bug

Bug #1: 大时间戳精度错误

  • 症状: 时间戳 > 2^32 时 OTP 计算错误
  • 原因: 64 位 counter 未正确拆分为高/低 32 位
  • 修复: 正确实现大端序 64 位整数编码
  • 测试: 通过 2603 年的 RFC 测试向量

📁 测试文件结构

tests/
├── api/
│   └── secrets.test.js          # API 密钥管理测试 (31 个)
├── otp/
│   └── generator.test.js        # OTP 算法测试 (45 个)
├── router/
│   └── handler.test.js          # 路由处理器测试 (51 个) 🏆 100% 覆盖率
└── utils/
    ├── encryption.test.js       # 加密功能测试 (25 个)
    ├── auth.test.js             # JWT 认证测试 (52 个)
    ├── validation.test.js       # 数据验证测试 (68 个) 🏆 100% 覆盖率
    ├── rateLimit.test.js        # Rate Limiting 测试 (54 个) 🔥 96% 覆盖率
    ├── response.test.js         # Response 工具测试 (35 个) 🏆 100% 覆盖率
    ├── crypto.test.js           # Crypto E2EE 测试 (66 个) 🔥 97% 覆盖率
    ├── security.test.js         # Security 安全测试 (47 个) 🔥 98% 覆盖率
    ├── backup.test.js           # Backup 备份测试 (55 个) 🔥 98% 覆盖率
    └── logger.test.js           # Logger 日志测试 (69 个) 🔥 96% 覆盖率

📈 覆盖率详情

npm run test:coverage

覆盖率报告会生成在 coverage/ 目录,使用浏览器打开 coverage/index.html 查看详细报告。

🚀 下一步

高优先级

  • 数据验证测试 (validation.js) - 已完成 68 个测试100% 覆盖率 🏆
  • JWT 认证测试 (auth.js) - 已完成 52 个测试
  • Rate Limiting 测试 (rateLimit.js) - 已完成 54 个测试96% 覆盖率 🔥
  • API Secrets 测试 (secrets.js) - 已完成 31 个测试44% 覆盖率
  • 响应工具测试 (response.js) - 已完成 35 个测试100% 覆盖率 🏆
  • Crypto E2EE 测试 (crypto.js) - 已完成 66 个测试97% 覆盖率 🔥
  • Security 安全测试 (security.js) - 已完成 47 个测试98% 覆盖率 🔥
  • Router Handler 路由测试 (handler.js) - 已完成 51 个测试100% 覆盖率 🏆
  • Backup 备份系统测试 (backup.js) - 已完成 55 个测试98% 覆盖率 🔥
  • Logger 日志系统测试 (logger.js) - 已完成 69 个测试96% 覆盖率 🔥

中优先级

  • 监控工具测试 (monitoring.js)
  • API 备份功能测试 (handleBackupSecrets/GetBackups/ExportBackup/RestoreBackup)

长期

  • E2E 测试 (Playwright)
  • 性能基准测试

💡 编写新测试

  1. tests/ 目录创建对应的测试文件
  2. 使用 Vitest 的 describeit
  3. 参考现有测试的结构

示例:

import { describe, it, expect } from 'vitest';

describe('My Module', () => {
	it('应该正确处理输入', () => {
		expect(myFunction('test')).toBe('expected');
	});
});

🔬 测试工具

  • Vitest: 快速、现代的测试框架
  • @vitest/ui: 交互式测试界面
  • @vitest/coverage-v8: V8 引擎覆盖率

📚 参考