feat: 将 e2e-check workflow 场景转为 snapshot fixture 测试 #66

Closed
opened 2026-05-31 11:18:39 +00:00 by xingyue · 0 comments
Owner

背景

现有 .workflows/e2e-check.yaml 定义了 45 个 CLI 场景测试,通过 workflow engine 调度 agent 在 Docker 里跑。但这些 case 全是确定性的 CLI 输入→输出,用 agent 跑太重(~4 分钟),适合转为 bun test 的 snapshot fixture 测试(几秒跑完,CI 自动守护)。

要求

packages/cli-json-cas/src/ 新建 e2e.test.ts,将以下 7 组场景转为 snapshot 测试:

隔离方式

已有 cli.test.tsrunCli(args, storePath) 模式:mkdtempSync 建临时目录,--store 指过去,完全不碰 ~/.uncaged/json-cas。复用此模式。

测试场景(来自 e2e-check.yaml)

Phase 1: CAS Core(14 case)

  1. bootstrap → 返回 13 字符 Base32 hash
  2. schema put → 返回 type hash
  3. schema get → 返回 schema JSON(snapshot)
  4. schema list → 列出已注册 schema
  5. put → 返回 node hash
  6. get → 返回 node JSON(snapshot)
  7. has (exists) → true
  8. has (not exists) → false
  9. verify → ok
  10. refs → 列出 refs
  11. walk → 显示遍历树
  12. hash (dry run) → 与 put 返回相同 hash
  13. cat → 输出完整 node
  14. cat --payload → 仅输出 payload

Phase 2: Schema Validation(3 case)

  1. put 无效数据 {"name":123} → 验证错误,exit 非零
  2. schema validate 合法 node → valid
  3. put 不存在的 schema hash → 报错

Phase 3: Variable System(11 case)

  1. var set → 创建
  2. var get → 返回
  3. var list → 列出全部
  4. var list prefix → 前缀过滤
  5. var set (upsert) → 更新
  6. var tag (kv + label) → 添加
  7. var list --tag (kv) → 过滤
  8. var list --tag (label) → 过滤
  9. var tag remove → 删除
  10. var delete → 删除
  11. var get (deleted) → not found

Phase 4: Template System(5 case)

  1. template set → 注册
  2. template get → 返回模板文本
  3. template list → 列出
  4. template delete → 删除
  5. template get (deleted) → not found

Phase 5: Render(3 case)

  1. render → 填充 payload 变量(注意用 {{ payload.name }}
  2. render --resolution → 不同分辨率
  3. render 不存在 hash → 报错,exit 非零

Phase 6: GC(3 case)

  1. gc → 正常运行
  2. gc 保留被引用 node
  3. gc 回收孤儿 node

Phase 7: Edge Cases(7 case)

  1. get 不存在 hash → 报错
  2. put 文件不存在 → ENOENT
  3. var set 空名 → 报错
  4. var set 非法名 → 报错
  5. schema put 无效 schema → 报错
  6. 无子命令 → 显示 help
  7. --store 不存在路径 → 报错(不是 "Node not found")

规范

  • 每个 Phase 一个 describe
  • toMatchSnapshot() 做输出快照(首次运行自动生成)
  • hash 值是内容寻址的(确定性),可以直接断言
  • exit code 断言:成功 0,失败非零
  • 测试间有数据依赖(Phase 1 创建的 node 在 Phase 3 用),可以用顶层变量或 beforeAll 链式构建
  • 文件命名 e2e.test.ts,和 cli.test.ts 同级

Ref

  • .workflows/e2e-check.yaml — 原始场景定义
  • packages/cli-json-cas/src/cli.test.ts — 现有测试模式参考(runCli helper)
## 背景 现有 `.workflows/e2e-check.yaml` 定义了 45 个 CLI 场景测试,通过 workflow engine 调度 agent 在 Docker 里跑。但这些 case 全是确定性的 CLI 输入→输出,用 agent 跑太重(~4 分钟),适合转为 `bun test` 的 snapshot fixture 测试(几秒跑完,CI 自动守护)。 ## 要求 在 `packages/cli-json-cas/src/` 新建 `e2e.test.ts`,将以下 7 组场景转为 snapshot 测试: ### 隔离方式 已有 `cli.test.ts` 的 `runCli(args, storePath)` 模式:`mkdtempSync` 建临时目录,`--store` 指过去,完全不碰 `~/.uncaged/json-cas`。复用此模式。 ### 测试场景(来自 e2e-check.yaml) **Phase 1: CAS Core(14 case)** 1. bootstrap → 返回 13 字符 Base32 hash 2. schema put → 返回 type hash 3. schema get → 返回 schema JSON(snapshot) 4. schema list → 列出已注册 schema 5. put → 返回 node hash 6. get → 返回 node JSON(snapshot) 7. has (exists) → true 8. has (not exists) → false 9. verify → ok 10. refs → 列出 refs 11. walk → 显示遍历树 12. hash (dry run) → 与 put 返回相同 hash 13. cat → 输出完整 node 14. cat --payload → 仅输出 payload **Phase 2: Schema Validation(3 case)** 1. put 无效数据 `{"name":123}` → 验证错误,exit 非零 2. schema validate 合法 node → valid 3. put 不存在的 schema hash → 报错 **Phase 3: Variable System(11 case)** 1. var set → 创建 2. var get → 返回 3. var list → 列出全部 4. var list prefix → 前缀过滤 5. var set (upsert) → 更新 6. var tag (kv + label) → 添加 7. var list --tag (kv) → 过滤 8. var list --tag (label) → 过滤 9. var tag remove → 删除 10. var delete → 删除 11. var get (deleted) → not found **Phase 4: Template System(5 case)** 1. template set → 注册 2. template get → 返回模板文本 3. template list → 列出 4. template delete → 删除 5. template get (deleted) → not found **Phase 5: Render(3 case)** 1. render → 填充 payload 变量(注意用 `{{ payload.name }}`) 2. render --resolution → 不同分辨率 3. render 不存在 hash → 报错,exit 非零 **Phase 6: GC(3 case)** 1. gc → 正常运行 2. gc 保留被引用 node 3. gc 回收孤儿 node **Phase 7: Edge Cases(7 case)** 1. get 不存在 hash → 报错 2. put 文件不存在 → ENOENT 3. var set 空名 → 报错 4. var set 非法名 → 报错 5. schema put 无效 schema → 报错 6. 无子命令 → 显示 help 7. --store 不存在路径 → 报错(不是 "Node not found") ### 规范 - 每个 Phase 一个 `describe` 块 - 用 `toMatchSnapshot()` 做输出快照(首次运行自动生成) - hash 值是内容寻址的(确定性),可以直接断言 - exit code 断言:成功 0,失败非零 - 测试间有数据依赖(Phase 1 创建的 node 在 Phase 3 用),可以用顶层变量或 `beforeAll` 链式构建 - 文件命名 `e2e.test.ts`,和 `cli.test.ts` 同级 ## Ref - `.workflows/e2e-check.yaml` — 原始场景定义 - `packages/cli-json-cas/src/cli.test.ts` — 现有测试模式参考(`runCli` helper)
This repo is archived. You cannot comment on issues.
No Label
1 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: uncaged/json-cas#66