xuanwu-cli 2.1.0 → 2.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/.env.test.example +14 -0
  2. package/__tests__/E2E_TEST_REPORT.md +206 -0
  3. package/__tests__/README.md +322 -0
  4. package/__tests__/TEST_SUMMARY.md +215 -0
  5. package/__tests__/global-setup.ts +13 -0
  6. package/__tests__/global-teardown.ts +3 -0
  7. package/__tests__/helpers/test-utils.ts +70 -0
  8. package/__tests__/integration/app.integration.test.ts +363 -0
  9. package/__tests__/integration/auth.integration.test.ts +243 -0
  10. package/__tests__/integration/build.integration.test.ts +215 -0
  11. package/__tests__/integration/e2e.test.ts +267 -0
  12. package/__tests__/integration/service.integration.test.ts +267 -0
  13. package/__tests__/integration/webhook.integration.test.ts +246 -0
  14. package/__tests__/run-e2e.js +360 -0
  15. package/__tests__/setup.ts +9 -0
  16. package/bin/xuanwu +0 -0
  17. package/dist/api/client.d.ts +23 -4
  18. package/dist/api/client.js +104 -29
  19. package/dist/commands/auth/login.js +16 -14
  20. package/dist/commands/deploy.js +25 -49
  21. package/dist/commands/env.js +31 -48
  22. package/dist/commands/project.d.ts +5 -0
  23. package/dist/commands/project.js +134 -0
  24. package/dist/config/types.d.ts +1 -0
  25. package/dist/index.js +2 -0
  26. package/jest.config.js +18 -0
  27. package/package.json +10 -2
  28. package/src/api/client.ts +128 -33
  29. package/src/commands/auth/login.ts +19 -14
  30. package/src/commands/deploy.ts +32 -49
  31. package/src/commands/env.ts +35 -52
  32. package/src/commands/project.ts +153 -0
  33. package/src/config/types.ts +1 -0
  34. package/src/index.ts +2 -0
  35. package/test/cli-integration.sh +245 -0
  36. package/test/integration.js +3 -3
  37. package/test/integration.sh +252 -0
@@ -0,0 +1,14 @@
1
+ # 测试环境变量配置示例
2
+ # 复制此文件为 .env.test 并填入实际值
3
+
4
+ # API 服务器地址
5
+ TEST_API_URL=https://i.xuanwu.dev.aimstek.cn
6
+
7
+ # 测试用户邮箱
8
+ TEST_USER_EMAIL=your-email@example.com
9
+
10
+ # 测试用户密码
11
+ TEST_USER_PASSWORD=your-password
12
+
13
+ # 测试命名空间(可选)
14
+ TEST_NAMESPACE=default
@@ -0,0 +1,206 @@
1
+ # E2E 测试执行报告
2
+
3
+ ## 测试执行信息
4
+
5
+ - **执行时间**: 2026-03-12
6
+ - **API URL**: https://i.xuanwu.dev.aimstek.cn
7
+ - **测试环境**: 未配置测试凭据
8
+
9
+ ## 测试结果
10
+
11
+ ### 总体统计
12
+ - ✅ **通过**: 3
13
+ - ❌ **失败**: 1
14
+ - ⏭️ **跳过**: 12
15
+ - 📊 **总计**: 16
16
+ - **通过率**: 75.0%
17
+
18
+ ### 详细结果
19
+
20
+ #### ✅ 通过的测试
21
+
22
+ 1. **显示帮助信息**
23
+ - 状态: 通过
24
+ - 说明: CLI `--help` 命令正常工作,显示玄武工厂平台信息
25
+
26
+ 2. **显示版本信息**
27
+ - 状态: 通过
28
+ - 输出: `2.0.0`
29
+ - 说明: CLI `--version` 命令正常工作
30
+
31
+ 3. **无效命令处理**
32
+ - 状态: 通过
33
+ - 说明: 对无效命令正确返回非零退出码
34
+
35
+ #### ⏭️ 跳过的测试(需要测试凭据)
36
+
37
+ 以下测试需要 `TEST_USER_EMAIL` 和 `TEST_USER_PASSWORD` 环境变量:
38
+
39
+ 4. **邮箱密码登录**
40
+ 5. **查看当前用户信息 (whoami)**
41
+ 6. **列出应用**
42
+ 7. **创建应用**
43
+ 8. **获取应用详情**
44
+ 9. **更新应用**
45
+ 10. **触发构建**
46
+ 11. **删除应用**
47
+ 12. **列出服务**
48
+ 13. **列出构建**
49
+ 14. **列出Tokens**
50
+ 15. **登出**
51
+
52
+ #### ❌ 失败的测试
53
+
54
+ 16. **查询不存在的应用**
55
+ - 状态: 失败
56
+ - 预期: 返回非零退出码
57
+ - 实际: 返回退出码 0
58
+ - 输出: `✗ Request failed with status code 404`
59
+ - **问题分析**: CLI 在错误情况下只输出错误消息,但未设置非零退出码
60
+
61
+ ## 发现的问题
62
+
63
+ ### 🔴 严重问题:错误退出码处理
64
+
65
+ **问题描述**:
66
+ CLI 在遇到错误时,虽然输出了错误信息,但没有设置正确的退出码(exit code)。
67
+
68
+ **影响**:
69
+ - 脚本和自动化工具无法通过退出码判断命令是否成功
70
+ - 违反 Unix/Linux CLI 设计原则
71
+ - CI/CD 流程可能无法正确检测失败
72
+
73
+ **复现步骤**:
74
+ ```bash
75
+ node bin/xuanwu app get non-existent-app
76
+ echo $? # 输出: 0 (应该输出非零值)
77
+ ```
78
+
79
+ **预期行为**:
80
+ - 错误时应设置 `process.exit(1)` 或其他非零退出码
81
+ - 成功时退出码为 0
82
+
83
+ **修复建议**:
84
+ 在 `src/commands/app.ts` 和其他命令文件中,错误处理时添加退出码:
85
+
86
+ ```typescript
87
+ if (!result.success) {
88
+ OutputFormatter.error(result.error!.message)
89
+ process.exit(1) // 添加这行
90
+ }
91
+ ```
92
+
93
+ 或者修改 `OutputFormatter.error()` 方法:
94
+
95
+ ```typescript
96
+ static error(message: string): void {
97
+ console.error(`✗ ${message}`)
98
+ process.exitCode = 1
99
+ }
100
+ ```
101
+
102
+ ### 🟡 需要改进:未登录状态处理
103
+
104
+ **问题描述**:
105
+ 在没有登录的情况下,某些命令(如 `app get`)仍然尝试调用 API,而不是先检查登录状态。
106
+
107
+ **改进建议**:
108
+ 在命令执行前检查登录状态:
109
+
110
+ ```typescript
111
+ const conn = configStore.getDefaultConnection()
112
+ if (!conn) {
113
+ OutputFormatter.error('No connection configured. Please login first: xw login')
114
+ process.exit(1)
115
+ }
116
+ ```
117
+
118
+ ## 建议的后续测试
119
+
120
+ ### 1. 使用测试凭据运行完整测试
121
+
122
+ ```bash
123
+ export TEST_USER_EMAIL="your-email@example.com"
124
+ export TEST_PASSWORD="your-password"
125
+ node __tests__/run-e2e.js
126
+ ```
127
+
128
+ ### 2. 修复错误退出码后重新测试
129
+
130
+ 修复上述问题后,预期所有测试应该通过。
131
+
132
+ ### 3. 添加更多测试场景
133
+
134
+ - 并发操作测试
135
+ - 网络超时测试
136
+ - 无效参数测试
137
+ - 权限错误测试
138
+
139
+ ## 测试环境配置
140
+
141
+ ### 环境变量
142
+
143
+ ```bash
144
+ # 必需
145
+ export TEST_API_URL="https://i.xuanwu.dev.aimstek.cn"
146
+ export TEST_USER_EMAIL="your-email@example.com"
147
+ export TEST_USER_PASSWORD="your-password"
148
+
149
+ # 可选
150
+ export TEST_NAMESPACE="default"
151
+ ```
152
+
153
+ ### 运行测试
154
+
155
+ ```bash
156
+ # 方式1: 使用独立测试运行器(推荐,无需安装 Jest)
157
+ node __tests__/run-e2e.js
158
+
159
+ # 方式2: 使用 Jest(需要先安装依赖)
160
+ npm install
161
+ npm run test:e2e
162
+ ```
163
+
164
+ ## 测试覆盖的功能点
165
+
166
+ ### ✅ 已测试(无认证)
167
+ - [x] 帮助信息显示
168
+ - [x] 版本信息显示
169
+ - [x] 无效命令错误处理
170
+
171
+ ### ⏸️ 需要认证才能测试
172
+ - [ ] 用户登录(浏览器授权)
173
+ - [ ] 用户登录(邮箱密码)
174
+ - [ ] Token 管理
175
+ - [ ] 应用 CRUD 操作
176
+ - [ ] 构建触发和查询
177
+ - [ ] 服务管理
178
+ - [ ] 日志查看
179
+ - [ ] 服务重启和扩缩容
180
+
181
+ ## 下一步行动
182
+
183
+ 1. **修复错误退出码问题** - 高优先级
184
+ - 更新所有命令的错误处理
185
+ - 添加退出码测试
186
+
187
+ 2. **配置测试凭据** - 高优先级
188
+ - 创建测试账号
189
+ - 配置环境变量
190
+ - 重新运行完整测试
191
+
192
+ 3. **改进测试框架** - 中优先级
193
+ - 安装 Jest 依赖
194
+ - 运行完整的测试套件
195
+ - 生成覆盖率报告
196
+
197
+ 4. **增强测试场景** - 低优先级
198
+ - 添加性能测试
199
+ - 添加压力测试
200
+ - 添加 Mock 支持
201
+
202
+ ## 总结
203
+
204
+ 本次 E2E 测试发现了 CLI 工具的一个关键问题:**错误时未设置正确的退出码**。这是一个重要的 bug,需要在生产环境使用前修复。
205
+
206
+ 测试覆盖了 CLI 的基本功能,但由于缺少测试凭据,认证相关的测试被跳过。建议配置测试环境后重新运行完整测试。
@@ -0,0 +1,322 @@
1
+ # 玄武工厂 CLI 集成测试文档
2
+
3
+ ## 测试概述
4
+
5
+ 本测试套件实现了对玄武工厂 CLI 工具的全面集成测试,覆盖了设计文档中定义的所有核心功能。
6
+
7
+ ## 测试范围
8
+
9
+ ### 1. 认证集成测试 (`auth.integration.test.ts`)
10
+ - ✅ 设备授权码登录流程
11
+ - 生成设备授权码
12
+ - 轮询授权状态
13
+ - ✅ 邮箱密码登录
14
+ - 成功登录
15
+ - 无效凭据处理
16
+ - ✅ Token 管理
17
+ - Token 验证
18
+ - Token 列表查询
19
+ - ✅ Session 管理
20
+ - Session 保存与加载
21
+ - Session 清除
22
+ - 过期检测
23
+
24
+ ### 2. 应用命令集成测试 (`app.integration.test.ts`)
25
+ - ✅ 应用列表查询
26
+ - ✅ 创建应用
27
+ - 自动生成 code
28
+ - 自定义 code
29
+ - 完整字段创建
30
+ - 重复 code 处理
31
+ - 必填字段验证
32
+ - ✅ 获取应用详情
33
+ - ✅ 更新应用
34
+ - 更新名称
35
+ - 更新分支
36
+ - ✅ 删除应用
37
+ - ✅ 触发构建
38
+ - ✅ 查询构建列表
39
+
40
+ ### 3. 服务命令集成测试 (`service.integration.test.ts`)
41
+ - ✅ 服务列表查询
42
+ - ✅ 获取服务详情
43
+ - ✅ 获取服务状态
44
+ - ✅ 获取服务日志
45
+ - ✅ 重启服务
46
+ - ✅ 扩缩容服务
47
+ - ✅ 列出服务 Pod
48
+ - ✅ 在服务中执行命令
49
+ - ✅ 删除服务
50
+
51
+ ### 4. 构建命令集成测试 (`build.integration.test.ts`)
52
+ - ✅ 构建列表查询
53
+ - 全部构建
54
+ - 按应用过滤
55
+ - 按状态过滤
56
+ - ✅ 获取构建详情
57
+ - ✅ 取消构建
58
+ - 运行中的构建
59
+ - 已完成的构建
60
+ - ✅ 构建生命周期追踪
61
+
62
+ ### 5. Webhook 集成测试 (`webhook.integration.test.ts`)
63
+ - ✅ Git Webhook
64
+ - 处理 push 事件
65
+ - 应用不存在处理
66
+ - 签名验证
67
+ - ✅ Jenkins Webhook
68
+ - 构建成功通知
69
+ - 构建失败通知
70
+
71
+ ### 6. 端到端测试 (`e2e.test.ts`)
72
+ - ✅ 完整 CLI 命令流程
73
+ - 登录
74
+ - 应用管理(创建、查询、更新、删除)
75
+ - 触发构建
76
+ - 服务管理
77
+ - 构建查询
78
+ - 用户信息
79
+ - Token 管理
80
+ - 登出
81
+ - ✅ 错误处理
82
+ - 不存在的资源
83
+ - 无效命令
84
+ - 帮助信息
85
+
86
+ ## 测试覆盖的设计文档要求
87
+
88
+ ### 六、CLI 命令设计
89
+ | 设计文档要求 | 测试覆盖 |
90
+ |------------|---------|
91
+ | `xw app list` | ✅ app.integration.test.ts |
92
+ | `xw app get <code>` | ✅ app.integration.test.ts |
93
+ | `xw app create` | ✅ app.integration.test.ts |
94
+ | `xw app update <code>` | ✅ app.integration.test.ts |
95
+ | `xw app delete <code>` | ✅ app.integration.test.ts |
96
+ | `xw app build <code>` | ✅ app.integration.test.ts |
97
+ | `xw app builds <code>` | ✅ app.integration.test.ts |
98
+ | `xw svc list` | ✅ service.integration.test.ts |
99
+ | `xw svc get <ns>/<name>` | ✅ service.integration.test.ts |
100
+ | `xw svc status` | ✅ service.integration.test.ts |
101
+ | `xw svc logs` | ✅ service.integration.test.ts |
102
+ | `xw svc restart` | ✅ service.integration.test.ts |
103
+ | `xw svc scale` | ✅ service.integration.test.ts |
104
+ | `xw build list` | ✅ build.integration.test.ts |
105
+ | `xw build cancel <id>` | ✅ build.integration.test.ts |
106
+
107
+ ### 六、CLI 授权登录设计
108
+ | 设计文档要求 | 测试覆盖 |
109
+ |------------|---------|
110
+ | 浏览器 OAuth 授权 | ✅ auth.integration.test.ts |
111
+ | 邮箱密码登录 | ✅ auth.integration.test.ts |
112
+ | Token 管理 | ✅ auth.integration.test.ts |
113
+ | Session 管理 | ✅ auth.integration.test.ts |
114
+ | Token 过期检查 | ✅ auth.integration.test.ts |
115
+
116
+ ## 运行测试
117
+
118
+ ### 1. 安装依赖
119
+
120
+ ```bash
121
+ npm install
122
+ ```
123
+
124
+ ### 2. 配置测试环境
125
+
126
+ 复制环境变量示例文件:
127
+
128
+ ```bash
129
+ cp .env.test.example .env.test
130
+ ```
131
+
132
+ 编辑 `.env.test` 文件,填入实际的测试凭据:
133
+
134
+ ```env
135
+ TEST_API_URL=https://i.xuanwu.dev.aimstek.cn
136
+ TEST_USER_EMAIL=your-email@example.com
137
+ TEST_USER_PASSWORD=your-password
138
+ TEST_NAMESPACE=default
139
+ ```
140
+
141
+ ### 3. 运行测试
142
+
143
+ 运行所有测试:
144
+ ```bash
145
+ npm test
146
+ ```
147
+
148
+ 运行特定测试:
149
+ ```bash
150
+ # 运行集成测试
151
+ npm run test:integration
152
+
153
+ # 运行端到端测试
154
+ npm run test:e2e
155
+
156
+ # 运行并生成覆盖率报告
157
+ npm run test:coverage
158
+
159
+ # 监听模式
160
+ npm run test:watch
161
+ ```
162
+
163
+ ### 4. 测试输出
164
+
165
+ 测试完成后会生成以下报告:
166
+ - `coverage/` - 代码覆盖率报告(HTML 格式)
167
+ - `coverage/lcov.info` - LCOV 格式覆盖率数据
168
+
169
+ ## 测试策略
170
+
171
+ ### 1. 测试隔离
172
+ - 每个测试套件独立管理测试数据
173
+ - 测试后自动清理创建的资源
174
+ - 使用随机生成的 code 避免冲突
175
+
176
+ ### 2. 条件跳过
177
+ - 未配置测试凭据时,自动跳过需要认证的测试
178
+ - 使用 `test.skipIf()` 条件跳过
179
+
180
+ ### 3. 测试清理
181
+ - `afterEach` 清理创建的应用
182
+ - `afterAll` 清理所有测试资源
183
+
184
+ ### 4. 错误处理
185
+ - 测试各种错误场景
186
+ - 验证错误响应格式
187
+ - 确保错误信息清晰
188
+
189
+ ## 测试最佳实践
190
+
191
+ ### 1. 使用测试工具函数
192
+
193
+ ```typescript
194
+ // 生成随机测试标识
195
+ const testCode = generateRandomCode('app')
196
+
197
+ // 等待异步操作
198
+ await sleep(1000)
199
+
200
+ // 解析表格输出
201
+ const table = parseTableOutput(output)
202
+
203
+ // 提取输出值
204
+ const value = extractValue(output, 'Code')
205
+ ```
206
+
207
+ ### 2. 测试数据管理
208
+
209
+ ```typescript
210
+ describe('My Test', () => {
211
+ let createdApps: string[] = []
212
+
213
+ afterEach(async () => {
214
+ // 清理所有创建的资源
215
+ for (const code of createdApps) {
216
+ await apiClient.deleteApplication(code)
217
+ }
218
+ createdApps = []
219
+ })
220
+ })
221
+ ```
222
+
223
+ ### 3. 条件测试
224
+
225
+ ```typescript
226
+ test.skipIf(!TEST_EMAIL || !TEST_PASSWORD)('should login', async () => {
227
+ // 测试代码
228
+ })
229
+ ```
230
+
231
+ ## 持续集成
232
+
233
+ ### GitHub Actions 配置示例
234
+
235
+ ```yaml
236
+ name: Tests
237
+
238
+ on: [push, pull_request]
239
+
240
+ jobs:
241
+ test:
242
+ runs-on: ubuntu-latest
243
+
244
+ steps:
245
+ - uses: actions/checkout@v2
246
+
247
+ - name: Setup Node.js
248
+ uses: actions/setup-node@v2
249
+ with:
250
+ node-version: '20'
251
+
252
+ - name: Install dependencies
253
+ run: npm ci
254
+
255
+ - name: Run tests
256
+ env:
257
+ TEST_API_URL: ${{ secrets.TEST_API_URL }}
258
+ TEST_USER_EMAIL: ${{ secrets.TEST_USER_EMAIL }}
259
+ TEST_USER_PASSWORD: ${{ secrets.TEST_USER_PASSWORD }}
260
+ run: npm test
261
+
262
+ - name: Upload coverage
263
+ uses: codecov/codecov-action@v2
264
+ with:
265
+ files: ./coverage/lcov.info
266
+ ```
267
+
268
+ ## 测试报告
269
+
270
+ ### 覆盖率目标
271
+ - 行覆盖率: > 80%
272
+ - 分支覆盖率: > 70%
273
+ - 函数覆盖率: > 85%
274
+
275
+ ### 关键指标
276
+ - ✅ 所有设计文档定义的 API 路由
277
+ - ✅ 所有设计文档定义的 CLI 命令
278
+ - ✅ 错误处理和边界情况
279
+ - ✅ 认证和授权流程
280
+
281
+ ## 注意事项
282
+
283
+ 1. **测试环境**: 确保测试使用的 API 服务器是测试环境,避免影响生产数据
284
+ 2. **测试账号**: 使用专门的测试账号,不要使用生产账号
285
+ 3. **并发测试**: 避免同时运行多个测试实例,可能导致资源冲突
286
+ 4. **网络依赖**: 集成测试需要网络连接,确保 API 服务器可访问
287
+
288
+ ## 故障排查
289
+
290
+ ### 测试失败常见原因
291
+
292
+ 1. **认证失败**
293
+ - 检查 TEST_USER_EMAIL 和 TEST_USER_PASSWORD 是否正确
294
+ - 确认 API 服务器地址正确
295
+
296
+ 2. **网络超时**
297
+ - 增加 jest.config.js 中的 testTimeout 值
298
+ - 检查网络连接
299
+
300
+ 3. **资源冲突**
301
+ - 清理测试环境中残留的测试数据
302
+ - 使用唯一标识符避免冲突
303
+
304
+ 4. **API 变更**
305
+ - 检查 API 接口是否与设计文档一致
306
+ - 更新测试用例以匹配最新 API
307
+
308
+ ## 扩展测试
309
+
310
+ ### 添加新的集成测试
311
+
312
+ 1. 在 `__tests__/integration/` 目录创建测试文件
313
+ 2. 使用相同的测试模式和工具函数
314
+ 3. 确保测试清理逻辑完整
315
+ 4. 更新本文档
316
+
317
+ ### 添加新的端到端测试
318
+
319
+ 1. 在 `__tests__/integration/e2e.test.ts` 添加测试用例
320
+ 2. 使用 CLIExecutor 执行 CLI 命令
321
+ 3. 验证命令输出和退出码
322
+ 4. 更新测试覆盖率报告