# 🧪 自动化测试快速开始

> **💡 重要提示**：
> - ✅ **单元测试**：46个测试，可在任何机器运行（无需数据库）→ **开发时使用**
> - ⚠️ **E2E测试**：20个测试，需要PostgreSQL和Redis → **测试环境使用**
>
> 📖 详细说明请查看：[TESTING_STRATEGY.md](TESTING_STRATEGY.md)

## 📦 已创建的测试文件

### ✅ E2E 测试（端到端测试）
- **文件**: [test/app.e2e-spec.ts](test/app.e2e-spec.ts)
- **测试场景**: 8 个完整的用户场景
- **测试用例**: 40+ 个测试用例
- **覆盖功能**:
  - 用户注册和账户创建
  - 用户资料管理
  - 设备管理（最多5个设备）
  - Token 刷新
  - 推荐系统
  - KYC 认证
  - 助记词恢复
  - 数据验证

### ✅ 单元测试
1. **助记词测试**: [src/domain/value-objects/mnemonic.vo.spec.ts](src/domain/value-objects/mnemonic.vo.spec.ts)
   - 生成助记词
   - 验证格式
   - 转换为 seed
   - 相等性比较

2. **手机号测试**: [src/domain/value-objects/phone-number.vo.spec.ts](src/domain/value-objects/phone-number.vo.spec.ts)
   - 格式验证（中国手机号）
   - 掩码显示
   - 相等性比较

3. **钱包生成服务测试**: [src/infrastructure/external/blockchain/wallet-generator.service.spec.ts](src/infrastructure/external/blockchain/wallet-generator.service.spec.ts)
   - 生成钱包系统
   - 三条链地址（KAVA/DST/BSC）
   - 助记词恢复
   - 加密解密

## 🚀 快速运行测试

### 1. 安装测试依赖
```bash
npm install
```

新增的测试依赖：
- `supertest@^6.3.3` - HTTP 断言库
- `@types/supertest@^6.0.0` - TypeScript 类型定义

### 2. 准备 E2E 测试环境

E2E 测试需要数据库和 Redis，但 **不需要** Kafka（已使用 Mock）。

详细设置请参阅: [E2E_TEST_SETUP.md](E2E_TEST_SETUP.md)

快速开始：
```bash
# 确保 PostgreSQL 和 Redis 正在运行
# 准备测试数据库
DATABASE_URL="postgresql://postgres:password@localhost:5432/rwa_identity_test?schema=public" npx prisma migrate dev
```

### 3. 运行所有单元测试
```bash
npm test
```

**预期输出**:
```
PASS  src/domain/value-objects/mnemonic.vo.spec.ts
PASS  src/domain/value-objects/phone-number.vo.spec.ts
PASS  src/infrastructure/external/blockchain/wallet-generator.service.spec.ts

Test Suites: 3 passed, 3 total
Tests:       30+ passed, 30+ total
```

### 4. 运行 E2E 测试
```bash
npm run test:e2e
```

**注意**: E2E 测试需要:
- ✅ PostgreSQL 数据库（测试数据库）
- ✅ Redis 服务
- ❌ **不需要** Kafka（已使用 Mock）
- ❌ **不需要** SMS 服务（已使用 Mock）

**预期输出**:
```
PASS  test/app.e2e-spec.ts
  Identity Service E2E Tests
    ✓ 应该成功自动创建账户 (150ms)
    ✓ 应该获取个人资料 (50ms)
    ✓ 应该更新个人资料 (60ms)
    ✓ 应该获取设备列表 (45ms)
    ...

Test Suites: 1 passed, 1 total
Tests:       20+ passed, 20+ total
```

如果遇到问题，请参阅 [E2E_TEST_SETUP.md](E2E_TEST_SETUP.md)

### 4. 查看测试覆盖率
```bash
npm run test:cov
```

然后打开生成的报告：
```bash
# Windows
start coverage/lcov-report/index.html

# macOS
open coverage/lcov-report/index.html

# Linux
xdg-open coverage/lcov-report/index.html
```

## 📊 测试统计

### E2E 测试覆盖
- ✅ 8 个主要测试场景
- ✅ 40+ 个具体测试用例
- ✅ 覆盖所有 14 个 API 端点
- ✅ 验证所有关键业务逻辑

### 单元测试覆盖
- ✅ 核心值对象（Mnemonic, PhoneNumber）
- ✅ 关键服务（WalletGenerator）
- ✅ 领域聚合根（UserAccount - 已存在）

## 🎯 测试示例

### E2E 测试示例
```typescript
it('应该成功自动创建账户', async () => {
  const response = await request(app.getHttpServer())
    .post('/api/v1/user/auto-create')
    .send({
      deviceId: 'test-device-001',
      deviceName: 'Test Device',
      provinceCode: '110000',
      cityCode: '110100',
    })
    .expect(201);

  expect(response.body.data).toHaveProperty('userId');
  expect(response.body.data).toHaveProperty('mnemonic');
  expect(response.body.data).toHaveProperty('accessToken');
});
```

### 单元测试示例
```typescript
it('应该生成有效的12个单词助记词', () => {
  const mnemonic = Mnemonic.generate();
  const words = mnemonic.getWords();

  expect(words).toHaveLength(12);
  expect(words.every(word => word.length > 0)).toBe(true);
});
```

## 🔍 常用测试命令

```bash
# 运行所有测试
npm test

# 监听模式（自动重新运行）
npm run test:watch

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

# 运行 E2E 测试
npm run test:e2e

# 运行特定测试文件
npm test -- mnemonic.vo.spec

# 运行特定测试用例
npm test -- --testNamePattern="应该生成有效的助记词"

# 调试模式
npm run test:debug
```

## 📝 测试编写指南

### 添加新的单元测试

在源文件同目录创建 `.spec.ts` 文件：

```typescript
// src/your-module/your-class.spec.ts
import { YourClass } from './your-class';

describe('YourClass', () => {
  it('should do something', () => {
    const instance = new YourClass();
    const result = instance.doSomething();
    expect(result).toBe('expected');
  });
});
```

### 添加新的 E2E 测试场景

在 `test/app.e2e-spec.ts` 中添加：

```typescript
describe('新功能测试', () => {
  it('should test new feature', async () => {
    const response = await request(app.getHttpServer())
      .post('/api/v1/new-endpoint')
      .set('Authorization', `Bearer ${accessToken}`)
      .send({ data: 'test' })
      .expect(201);

    expect(response.body.success).toBe(true);
  });
});
```

## 🎬 CI/CD 集成

测试可以轻松集成到 CI/CD 流程：

```yaml
# .github/workflows/test.yml
name: Tests
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '20'
      - run: npm ci
      - run: npm run prisma:generate
      - run: npm test
      - run: npm run test:e2e
```

## 📚 更多信息

详细的测试指南请参阅：
- [TEST_AUTOMATION_GUIDE.md](TEST_AUTOMATION_GUIDE.md) - 完整的自动化测试文档
- [TESTING_GUIDE.md](TESTING_GUIDE.md) - 手动测试指南

## ⚡ 下一步

1. **运行测试验证**
   ```bash
   npm install
   npm test
   npm run test:e2e
   ```

2. **查看测试覆盖率**
   ```bash
   npm run test:cov
   ```

3. **添加更多测试**
   - 为新功能编写单元测试
   - 为新 API 添加 E2E 测试

4. **集成到 CI/CD**
   - 设置 GitHub Actions
   - 自动运行测试

---

🎉 **恭喜！** 你的项目现在有了完整的自动化测试套件！
