Files
ocdp-go/docs/archive/root-cleanup/TEST-GUIDE.md
mangomqy c5e51ed069 ocdp v1
2025-11-13 02:54:06 +00:00

380 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🧪 camelCase API 测试指南
## 测试目标
验证整条链路:**后端 Go → JSON (camelCase) → 前端 TypeScript** 是否正常工作。
## 📋 准备工作
### 1. 确保依赖已安装
```bash
# 后端依赖
cd backend
go mod download
# 前端依赖
cd ../frontend
npm install
```
### 2. 确保代码已重新生成
```bash
# 从项目根目录
make openapi-gen-frontend
```
## 🎮 后端运行模式
后端提供三种运行模式,根据你的需求选择:
### run-0: Mock 模式(推荐用于测试)
```bash
cd backend
make run-0
```
-**无依赖**不需要数据库、Redis 等
-**快速启动**:立即可用
-**热重载**:代码变更自动重启
-**适合开发和测试**
### run-1: 真实数据库模式
```bash
cd backend
make run-1
```
- 🐘 PostgreSQL (Docker)
- 🔥 热重载
- 📊 真实数据持久化
- 停止:`Ctrl+C` + `make clean-1`
### run-2: 全容器模式
```bash
cd backend
make run-2
```
- 🐳 所有服务在 Docker 中
- 🔄 后台运行
- 🏭 接近生产环境
- 停止:`docker compose down`
## 🚀 测试步骤
### 方案 A自动化测试脚本推荐
#### 步骤 1: 启动后端服务Mock 模式)
```bash
# 在终端 1 中运行
cd /home/mango/workspace/ocdp-go/backend
make run-0
# run-0: Mock 模式(无依赖,最简单)
# run-1: 真实 PostgreSQLDocker
# run-2: 全部 Docker后台运行
```
等待看到:
```
🎭 Run-0: Hot reload + Mock
✓ Server started on :8080 (Mock mode)
```
#### 步骤 2: 运行 API 测试脚本
```bash
# 在终端 2 中运行
cd /home/mango/workspace/ocdp-go
./scripts/test-api-camelcase.sh
```
**预期结果:**
- ✅ 所有 API 返回 camelCase 字段
-`accessToken`, `refreshToken`, `userId` 存在
-`createdAt`, `updatedAt` 存在
-`caData`, `certData`, `keyData`, `hasCaData` 存在
#### 步骤 3: 启动前端服务
```bash
# 在终端 3 中运行
cd /home/mango/workspace/ocdp-go/frontend
npm run dev
```
访问: http://localhost:5173
#### 步骤 4: 前端测试页面
访问: **http://localhost:5173/api-test**
点击 **"🚀 完整测试"** 按钮,观察:
1. **注册测试** - 创建新用户
2. **登录测试** - 获取 JWT token
- 验证响应包含 `accessToken` (camelCase)
3. **获取集群列表** - 测试 GET 请求
- 验证响应包含 `createdAt`, `updatedAt` (camelCase)
4. **创建集群** - 测试 POST 请求
- 发送 `caData`, `certData`, `keyData` (camelCase)
- 验证响应包含 `hasCaData` (camelCase)
**预期结果:**
```
🧪 开始完整测试流程...
步骤 1: 注册用户
✅ 注册成功
步骤 2: 登录
✅ 登录成功 - Token: eyJhbGciOiJIUzI1NiIs...
步骤 3: 获取集群列表
✅ 获取成功 - 共 X 个集群
步骤 4: 创建测试集群 (camelCase)
✅ 创建成功 - ID: cluster-xxx
🎉 完整测试流程完成! 所有 API 调用成功camelCase 工作正常!
```
### 方案 B手动 cURL 测试
#### 1. 测试健康检查
```bash
curl http://localhost:8080/health
# 预期: {"status":"healthy"}
```
#### 2. 测试登录(获取 Token
```bash
curl -X POST http://localhost:8080/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{
"username": "admin",
"password": "admin123"
}'
```
**预期响应(注意 camelCase**
```json
{
"accessToken": "eyJhbGci...",
"refreshToken": "eyJhbGci...",
"userId": "user-123",
"username": "admin"
}
```
**验证点**:字段名是 `accessToken``refreshToken``userId`camelCase
#### 3. 测试创建集群(使用 camelCase
```bash
# 替换 YOUR_TOKEN 为上一步获取的 token
curl -X POST http://localhost:8080/api/v1/clusters \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name": "test-cluster",
"host": "https://k8s.example.com:6443",
"description": "Test cluster",
"caData": "LS0tLS1CRUdJTi1DRVJUSUZJQ0FURS0tLS0t",
"certData": "LS0tLS1CRUdJTi1DRVJUSUZJQ0FURS0tLS0t",
"keyData": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVkt"
}'
```
**预期响应(注意 camelCase**
```json
{
"id": "cluster-abc123",
"name": "test-cluster",
"host": "https://k8s.example.com:6443",
"description": "Test cluster",
"hasCaData": true,
"hasCertData": true,
"hasKeyData": true,
"hasToken": false,
"caData": "••••••••",
"certData": "••••••••",
"keyData": "••••••••",
"createdAt": "2025-11-10T10:00:00Z",
"updatedAt": "2025-11-10T10:00:00Z"
}
```
**验证点**
- 请求使用 `caData``certData``keyData` (camelCase)
- 响应包含 `hasCaData``createdAt``updatedAt` (camelCase)
#### 4. 测试获取集群列表
```bash
curl -X GET http://localhost:8080/api/v1/clusters \
-H "Authorization: Bearer YOUR_TOKEN"
```
**预期响应:**
```json
[
{
"id": "cluster-abc123",
"name": "test-cluster",
"createdAt": "2025-11-10T10:00:00Z",
"updatedAt": "2025-11-10T10:00:00Z",
...
}
]
```
**验证点**:响应字段使用 camelCase
## 🔍 验证清单
### 后端验证
- [ ] Go struct JSON tags 使用 camelCase
- [ ] OpenAPI 规范属性使用 camelCase
- [ ] API 响应 JSON 使用 camelCase
- [ ] 后端可以正确解析 camelCase 请求
### 前端验证
- [ ] TypeScript 类型定义使用 camelCase
- [ ] 前端代码使用 camelCase 属性
- [ ] API 调用发送 camelCase JSON
- [ ] 响应解析为 camelCase 对象
- [ ] IDE 自动补全正常工作
### 字段验证
必须验证这些关键字段都是 camelCase
**Auth API:**
- `accessToken`
- `refreshToken`
- `userId`
**Cluster API:**
- `caData`
- `certData`
- `keyData`
- `hasCaData`
- `hasCertData`
- `hasKeyData`
- `hasToken`
- `createdAt`
- `updatedAt`
**Registry API:**
- `registryId`
- `registryUrl`
- `hasPassword`
- `createdAt`
- `updatedAt`
**Instance API:**
- `registryId`
- `clusterId`
- `valuesYaml`
## 📊 测试结果示例
### 成功的测试输出
```
🧪 OCDP API camelCase 测试
================================
步骤 1: 检查服务健康状态
✅ 后端服务运行正常
步骤 2: 测试注册 API
✅ 注册成功,发现 accessToken 字段 (camelCase)
步骤 3: 测试登录 API
✅ 登录成功!
Token (前20字符): eyJhbGciOiJIUzI1NiIs...
✅ 验证: accessToken 字段存在 (camelCase) ✓
✅ 验证: refreshToken 字段存在 (camelCase) ✓
✅ 验证: userId 字段存在 (camelCase) ✓
步骤 4: 测试创建集群 API (camelCase)
✅ 集群创建成功!
Cluster ID: cluster-1731240123456
✅ 验证: createdAt 字段存在 (camelCase) ✓
✅ 验证: hasCaData 字段存在 (camelCase) ✓
步骤 5: 测试获取集群列表
✅ 获取集群列表成功,字段使用 camelCase ✓
步骤 6: 测试 Registry API (camelCase)
✅ Registry API 使用 camelCase ✓
================================
🎉 API 测试完成!
测试总结:
✅ 后端服务运行正常
✅ JSON 字段使用 camelCase 格式
✅ 前后端通信正常
```
## 🐛 故障排查
### 问题 1: 后端未启动
**症状:** `Connection refused`
**解决:**
```bash
cd backend
make run-mock
```
### 问题 2: 字段仍是 snake_case
**检查:**
1. 确认 Go DTO JSON tags 已更新
2. 确认 OpenAPI 规范已更新
3. 重新编译后端:`go build`
4. 清除缓存并重启
### 问题 3: 前端类型不匹配
**检查:**
1. 确认前端代码已重新生成:`npm run openapi-gen`
2. 检查生成的类型:`cat src/api/generated-orval/api.schemas.ts | grep CreateClusterRequest -A 10`
3. 重启 TypeScript 服务器VSCode: Cmd/Ctrl + Shift + P → "TypeScript: Restart TS Server")
### 问题 4: 401 Unauthorized
**解决:**
1. 确保先调用登录 API 获取 token
2. 在请求头中正确设置:`Authorization: Bearer <token>`
3. 或使用前端的 `setAuthToken()` 函数
## 📚 相关文档
- `CAMELCASE-MIGRATION.md` - 迁移总结
- `frontend/src/api/README.md` - API 使用文档
- `frontend/src/api/example.ts` - 代码示例
## ✅ 完成标志
当你看到以下结果时,说明测试成功:
1. ✅ 后端 API 返回 camelCase JSON
2. ✅ 前端可以正确解析 camelCase 响应
3. ✅ 前端发送 camelCase 请求
4. ✅ 后端可以正确解析 camelCase 请求
5. ✅ TypeScript 类型提示正常工作
6. ✅ 所有 API 调用成功
🎉 **恭喜!你的 camelCase API 已经完全正常工作!**