test(cli): add e2e test for workflow runs / inspect / thread #173

Merged
xiaomo merged 1 commits from test/160-workflow-e2e into main 2026-04-27 07:06:58 +00:00
Owner

What

E2E test for workflow CLI commands with a real daemon.

Why

Validates the full workflow trigger → run → inspect → show pipeline end-to-end.

Changes

  • e2e-harness.ts — add echo workflow config, workflow worker symlink, workflow/thread CLI commands to harness
  • e2e-workflow.test.ts — test: trigger echo workflow, verify thread list, thread list --all, thread inspect, thread show

Ref

Fixes #160

## What E2E test for workflow CLI commands with a real daemon. ## Why Validates the full workflow trigger → run → inspect → show pipeline end-to-end. ## Changes - `e2e-harness.ts` — add echo workflow config, workflow worker symlink, `workflow`/`thread` CLI commands to harness - `e2e-workflow.test.ts` — test: trigger echo workflow, verify `thread list`, `thread list --all`, `thread inspect`, `thread show` ## Ref Fixes #160
xiaoju added 1 commit 2026-04-27 06:48:21 +00:00
Start real daemon with echo workflow, trigger runs, verify:
- thread list shows active runs
- thread list --all includes completed runs
- thread inspect shows log entries
- thread show displays conversation output

Extends e2e-harness with workflow support (echo workflow config).

Fixes #160
Owner

Code Review — PR #173 (workflow e2e)

Verdict: Comment (整体扎实,几点讨论)

⚠️ Warnings

  1. 单个 it() 承载了整条 trigger → list → wait → inspect → show 链路 — 如果中间某步断言失败,报错信息很难定位是哪个环节挂了。建议至少把 inspectshow 拆成独立 it()(共享 daemon handle 就行),或者在断言前加 descriptive message。e2e 测试排错成本高,失败可读性很重要。

  2. echo workflow 的 350ms delay 在 CI 环境下有竞态风险 — 如果第二次 trigger 在第一次完成之后才发出,thread list 就看不到 queued 状态。当前断言用 queued|started 做了兜底,但如果 CI 机器很快,两次 trigger 都可能在 list 之前就跑完了。建议要么加大 delay,要么把这个断言放宽(或者 trigger 之后立即 list,不等)。

💡 Suggestions

  1. waitForCompletedEchoRuns 每次循环都 createLogStore + close — 这是安全的但开销不小(反复打开 SQLite)。可以考虑在循环外开一次 store,循环内只做查询,最后 close。不过考虑到这是测试代码,不阻塞。

  2. e2e-harness 的 linkWorkspaceDaemonPackage 很巧妙 👍 — 用 symlink 让 loadDaemonModule 在 temp workspace 下也能 resolve @uncaged/nerve-daemon,避免了复杂的 mock。这个 pattern 值得在 harness 文件顶部的 JSDoc 里提一句,方便后人理解为什么需要这个 symlink。

  3. echoWorkflowIndexJs 用模板字符串写 JS 代码 — 可读性还行,但如果以后 workflow fixture 变复杂,建议考虑放到独立的 fixture 文件里。

Looks Good

  • 用真实 daemon + real IPC 做 e2e,覆盖了完整的 workflow 生命周期
  • afterEach 的 timeout guard(10s race)很稳健,防止 CI hang
  • 断言覆盖全面:trigger 返回值、thread list 活跃/历史、inspect 事件类型、show 内容输出
  • harness 改动干净,向后兼容(sense 测试不受影响)

Reviewed by 小糯 🍡

## Code Review — PR #173 (workflow e2e) **Verdict:** Comment (整体扎实,几点讨论) ### ⚠️ Warnings 1. **单个 `it()` 承载了整条 trigger → list → wait → inspect → show 链路** — 如果中间某步断言失败,报错信息很难定位是哪个环节挂了。建议至少把 `inspect` 和 `show` 拆成独立 `it()`(共享 `daemon` handle 就行),或者在断言前加 descriptive message。e2e 测试排错成本高,失败可读性很重要。 2. **echo workflow 的 350ms delay 在 CI 环境下有竞态风险** — 如果第二次 trigger 在第一次完成之后才发出,`thread list` 就看不到 `queued` 状态。当前断言用 `queued|started` 做了兜底,但如果 CI 机器很快,两次 trigger 都可能在 list 之前就跑完了。建议要么加大 delay,要么把这个断言放宽(或者 trigger 之后立即 list,不等)。 ### 💡 Suggestions 1. **`waitForCompletedEchoRuns` 每次循环都 `createLogStore` + `close`** — 这是安全的但开销不小(反复打开 SQLite)。可以考虑在循环外开一次 store,循环内只做查询,最后 close。不过考虑到这是测试代码,不阻塞。 2. **e2e-harness 的 `linkWorkspaceDaemonPackage` 很巧妙** 👍 — 用 symlink 让 `loadDaemonModule` 在 temp workspace 下也能 resolve `@uncaged/nerve-daemon`,避免了复杂的 mock。这个 pattern 值得在 harness 文件顶部的 JSDoc 里提一句,方便后人理解为什么需要这个 symlink。 3. **`echoWorkflowIndexJs` 用模板字符串写 JS 代码** — 可读性还行,但如果以后 workflow fixture 变复杂,建议考虑放到独立的 fixture 文件里。 ### ✅ Looks Good - 用真实 daemon + real IPC 做 e2e,覆盖了完整的 workflow 生命周期 - afterEach 的 timeout guard(10s race)很稳健,防止 CI hang - 断言覆盖全面:trigger 返回值、thread list 活跃/历史、inspect 事件类型、show 内容输出 - harness 改动干净,向后兼容(sense 测试不受影响) --- *Reviewed by 小糯 🍡*
xiaomo approved these changes 2026-04-27 07:01:30 +00:00
xiaomo left a comment
Owner

LGTM

亮点:

  • echo workflow 设计巧妙:350ms delay 确保能观察到 queued 状态
  • 测试覆盖了完整生命周期:trigger → list (active) → wait → list --all (completed) → inspect → show
  • 直接用 createLogStore 获取 runId 而不是解析 CLI 输出,更稳健

小建议(不阻塞):

  • waitForCompletedEchoRuns 可以复用 harness 里的 pollUntil,减少重复
  • symlink 逻辑(linkWorkspaceDaemonPackage)和 #174 有重复,合并后可以统一到 harness 的公共 export
✅ LGTM **亮点:** - echo workflow 设计巧妙:350ms delay 确保能观察到 queued 状态 - 测试覆盖了完整生命周期:trigger → list (active) → wait → list --all (completed) → inspect → show - 直接用 `createLogStore` 获取 runId 而不是解析 CLI 输出,更稳健 **小建议(不阻塞):** - `waitForCompletedEchoRuns` 可以复用 harness 里的 `pollUntil`,减少重复 - symlink 逻辑(`linkWorkspaceDaemonPackage`)和 #174 有重复,合并后可以统一到 harness 的公共 export
xiaomo force-pushed test/160-workflow-e2e from b5a365c487 to c45a2f36d2 2026-04-27 07:05:58 +00:00 Compare
xiaomo merged commit 961b657d7e into main 2026-04-27 07:06:58 +00:00
This repo is archived. You cannot comment on pull requests.
No Reviewers
No Label
3 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: uncaged/nerve#173