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

8.3 KiB
Raw Permalink Blame History

🧪 camelCase API 测试指南

测试目标

验证整条链路:后端 Go → JSON (camelCase) → 前端 TypeScript 是否正常工作。

📋 准备工作

1. 确保依赖已安装

# 后端依赖
cd backend
go mod download

# 前端依赖
cd ../frontend
npm install

2. 确保代码已重新生成

# 从项目根目录
make openapi-gen-frontend

🎮 后端运行模式

后端提供三种运行模式,根据你的需求选择:

run-0: Mock 模式(推荐用于测试)

cd backend
make run-0
  • 无依赖不需要数据库、Redis 等
  • 快速启动:立即可用
  • 热重载:代码变更自动重启
  • 适合开发和测试

run-1: 真实数据库模式

cd backend
make run-1
  • 🐘 PostgreSQL (Docker)
  • 🔥 热重载
  • 📊 真实数据持久化
  • 停止:Ctrl+C + make clean-1

run-2: 全容器模式

cd backend
make run-2
  • 🐳 所有服务在 Docker 中
  • 🔄 后台运行
  • 🏭 接近生产环境
  • 停止:docker compose down

🚀 测试步骤

方案 A自动化测试脚本推荐

步骤 1: 启动后端服务Mock 模式)

# 在终端 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 测试脚本

# 在终端 2 中运行
cd /home/mango/workspace/ocdp-go
./scripts/test-api-camelcase.sh

预期结果:

  • 所有 API 返回 camelCase 字段
  • accessToken, refreshToken, userId 存在
  • createdAt, updatedAt 存在
  • caData, certData, keyData, hasCaData 存在

步骤 3: 启动前端服务

# 在终端 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. 测试健康检查

curl http://localhost:8080/health
# 预期: {"status":"healthy"}

2. 测试登录(获取 Token

curl -X POST http://localhost:8080/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "username": "admin",
    "password": "admin123"
  }'

预期响应(注意 camelCase

{
  "accessToken": "eyJhbGci...",
  "refreshToken": "eyJhbGci...",
  "userId": "user-123",
  "username": "admin"
}

验证点:字段名是 accessTokenrefreshTokenuserIdcamelCase

3. 测试创建集群(使用 camelCase

# 替换 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

{
  "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"
}

验证点

  • 请求使用 caDatacertDatakeyData (camelCase)
  • 响应包含 hasCaDatacreatedAtupdatedAt (camelCase)

4. 测试获取集群列表

curl -X GET http://localhost:8080/api/v1/clusters \
  -H "Authorization: Bearer YOUR_TOKEN"

预期响应:

[
  {
    "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

解决:

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 已经完全正常工作!