# 🧪 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: 真实 PostgreSQL(Docker) # 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 ` 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 已经完全正常工作!**