# E2E 测试设置指南

## 前置条件

E2E测试需要以下服务运行：

### 1. PostgreSQL 数据库

测试使用独立的测试数据库，不会影响开发数据库。

```bash
# 确保 PostgreSQL 正在运行
# 创建测试数据库（如果还没有）
createdb rwa_identity_test

# 或使用 psql
psql -U postgres
CREATE DATABASE rwa_identity_test;
```

### 2. Redis (可选)

测试需要 Redis 用于 Token 管理。

```bash
# 启动 Redis（如果还没运行）
redis-server

# 或使用 Docker
docker run -d -p 6379:6379 redis:latest
```

### 3. 配置测试环境变量

已创建 `.env.test` 文件，包含测试环境配置：

```env
DATABASE_URL="postgresql://postgres:password@localhost:5432/rwa_identity_test?schema=public"
REDIS_HOST="localhost"
REDIS_PORT=6379
JWT_SECRET="test-jwt-secret-key-for-e2e-tests"
WALLET_ENCRYPTION_SALT="test-wallet-salt"
```

**重要**: 请根据你的本地环境修改数据库连接字符串中的用户名和密码。

## 运行测试步骤

### 1. 准备测试数据库

```bash
# 生成 Prisma Client
npm run prisma:generate

# 运行数据库迁移（针对测试数据库）
DATABASE_URL="postgresql://postgres:password@localhost:5432/rwa_identity_test?schema=public" npx prisma migrate dev
```

### 2. 运行 E2E 测试

```bash
# 设置环境变量并运行测试
NODE_ENV=test npm run test:e2e
```

### 3. 清理测试数据（可选）

E2E测试会在测试数据库中创建数据。如果需要清理：

```bash
# 重置测试数据库
DATABASE_URL="postgresql://postgres:password@localhost:5432/rwa_identity_test?schema=public" npx prisma migrate reset --skip-seed
```

## Mock 服务说明

E2E 测试已经配置了以下 Mock 服务，**不需要**真实的外部服务：

### ✅ Kafka (已 Mock)
- `EventPublisherService` 已被 mock
- 不需要运行 Kafka 服务器
- 事件发布操作会被记录但不会真实发送

### ✅ SMS 服务 (已 Mock)
- `SmsService` 已被 mock
- 不需要真实的 SMS API
- 验证码发送操作会自动成功

### ⚠️ 仍需要真实服务

- **PostgreSQL** - 需要真实数据库来测试数据持久化
- **Redis** - 需要真实 Redis 来测试 Token 缓存

## 常见问题

### 问题 1: 数据库连接失败

```
Error: Can't reach database server
```

**解决方案**:
1. 确认 PostgreSQL 正在运行
2. 检查 `.env.test` 中的数据库连接字符串
3. 确认测试数据库已创建

### 问题 2: Redis 连接失败

```
Error: connect ECONNREFUSED 127.0.0.1:6379
```

**解决方案**:
1. 启动 Redis: `redis-server`
2. 或临时禁用 Redis（需要修改代码）

### 问题 3: Kafka 警告信息

```
KafkaJS v2.0.0 switched default partitioner
```

**说明**: 这只是警告，不影响测试运行。Kafka 已被 mock，不会真实连接。

可以设置环境变量禁用警告：

```bash
KAFKAJS_NO_PARTITIONER_WARNING=1 npm run test:e2e
```

### 问题 4: 测试超时

```
Timeout - Async callback was not invoked within the 5000 ms timeout
```

**解决方案**:
- 确保数据库和 Redis 响应速度正常
- 增加 Jest 超时时间（在 jest-e2e.json 中配置）

## 测试覆盖范围

E2E 测试覆盖了以下功能：

1. ✅ 用户注册和账户创建
2. ✅ 用户资料管理
3. ✅ 设备管理（添加/删除/限制）
4. ✅ Token 刷新
5. ✅ 推荐系统
6. ✅ KYC 认证
7. ✅ 助记词恢复
8. ✅ 数据验证

总计: **20+ 个测试用例**

## 快速开始（一键命令）

如果你的环境已经配置好 PostgreSQL 和 Redis：

```bash
# 1. 准备测试数据库
DATABASE_URL="postgresql://postgres:password@localhost:5432/rwa_identity_test?schema=public" npx prisma migrate dev

# 2. 运行测试
npm run test:e2e

# 3. 查看测试结果
# 所有测试通过后，你会看到类似输出：
# Test Suites: 1 passed, 1 total
# Tests:       20 passed, 20 total
```

## Docker 环境快速启动

如果你想使用 Docker 运行依赖服务：

```bash
# 启动 PostgreSQL 和 Redis
docker-compose -f docker-compose.test.yml up -d

# 等待服务启动
sleep 5

# 运行测试
npm run test:e2e

# 停止服务
docker-compose -f docker-compose.test.yml down
```

## 注意事项

1. **测试数据隔离**: 测试使用独立的测试数据库，不会影响开发环境
2. **Mock 服务**: Kafka 和 SMS 已被 mock，测试速度更快
3. **数据清理**: 每次测试运行可能会在数据库中留下数据，定期清理测试数据库
4. **并发问题**: 避免同时运行多个测试实例，可能导致数据冲突

## 下一步

- 查看 [AUTOMATED_TESTS_README.md](AUTOMATED_TESTS_README.md) 了解完整的测试体系
- 查看 [TEST_AUTOMATION_GUIDE.md](TEST_AUTOMATION_GUIDE.md) 了解如何编写新测试
