test(cli): add e2e test for nerve sense query #165

Merged
xiaomo merged 1 commits from test/156-sense-query into main 2026-04-27 07:01:39 +00:00
Owner

What

E2E test for nerve sense query — the exact bug that motivated #153.

Why

Validates the full signal persistence → query pipeline works end-to-end.

Changes

  • e2e-sense-query.test.ts — 4 test cases: default query, payload columns, --json output, --sql custom query
  • sense-sqlite.ts — add --sql flag support to parseSenseQueryArgs
  • sense-sqlite.test.ts — unit tests for --sql parsing
  • sense.ts — update description to mention --sql

Ref

Fixes #156

## What E2E test for `nerve sense query` — the exact bug that motivated #153. ## Why Validates the full signal persistence → query pipeline works end-to-end. ## Changes - `e2e-sense-query.test.ts` — 4 test cases: default query, payload columns, --json output, --sql custom query - `sense-sqlite.ts` — add `--sql` flag support to `parseSenseQueryArgs` - `sense-sqlite.test.ts` — unit tests for `--sql` parsing - `sense.ts` — update description to mention `--sql` ## Ref Fixes #156
xiaoju added 1 commit 2026-04-27 06:38:42 +00:00
Verifies sense query returns data after signal persistence:
- Default query returns rows (not 0 rows)
- Output contains payload columns
- --json flag returns valid JSON array with payload field
- --sql flag runs custom read-only SQL

Also adds --sql flag support to sense query CLI.

Fixes #156
scottwei reviewed 2026-04-27 06:50:19 +00:00
scottwei left a comment
Owner

Code Review — PR #165

整体评价:代码质量不错,测试覆盖合理。有几个建议。

Looks Good

  • E2E 测试结构清晰,4 个 case 覆盖了 default query / payload columns / --json / --sql
  • afterEach 用 Promise.race 防超时挂起,防御性好
  • parseSenseQueryArgs 的 --sql 优先级逻辑合理(--sql > positional)
  • 单元测试补充了 --sql 解析的边界 case

⚠️ Warnings

  1. sense-sqlite.ts 重构引入了不必要的复杂度
    原来的 parseSenseQueryArgs 是一个简单的 for 循环,现在拆成了 endIndexAfterGenericDashArg + nextSenseQueryArgStep + 主函数三层。只是为了加一个 --sql flag,过度工程化了。可以在原循环里加两行 if 处理 --sql / --sql= 就行。

  2. endIndexAfterGenericDashArg 命名不直观 — 函数返回的是 "跳过 flag value 后的 index",但名字暗示的是 "结束位置"。而且这个函数只在 nextSenseQueryArgStep 里调用一次,没必要单独提取。

💡 Suggestions

  1. e2e 测试的 waitForSignalsPersisted 打开 DB 后如果 prepare/get 抛异常,db.close() 不会被调用。建议用 try/finally:

  2. nextSenseQueryArgStep 的返回类型用了 string | undefinedstring | null 混用 — flagSql 是 undefined,positionalToken 是 null。项目规范要求 T | null 而非 optional/undefined(CLAUDE.md: "No optional properties")。建议统一用 null。


Reviewed by 团子 🐰

## Code Review — PR #165 **整体评价:代码质量不错,测试覆盖合理。有几个建议。** ### ✅ Looks Good - E2E 测试结构清晰,4 个 case 覆盖了 default query / payload columns / --json / --sql - afterEach 用 Promise.race 防超时挂起,防御性好 - `parseSenseQueryArgs` 的 --sql 优先级逻辑合理(--sql > positional) - 单元测试补充了 --sql 解析的边界 case ### ⚠️ Warnings 1. **`sense-sqlite.ts` 重构引入了不必要的复杂度** 原来的 `parseSenseQueryArgs` 是一个简单的 for 循环,现在拆成了 `endIndexAfterGenericDashArg` + `nextSenseQueryArgStep` + 主函数三层。只是为了加一个 `--sql` flag,过度工程化了。可以在原循环里加两行 if 处理 `--sql` / `--sql=` 就行。 2. **`endIndexAfterGenericDashArg` 命名不直观** — 函数返回的是 "跳过 flag value 后的 index",但名字暗示的是 "结束位置"。而且这个函数只在 `nextSenseQueryArgStep` 里调用一次,没必要单独提取。 ### 💡 Suggestions 3. **e2e 测试的 `waitForSignalsPersisted` 打开 DB 后如果 prepare/get 抛异常,db.close() 不会被调用**。建议用 try/finally: 4. **`nextSenseQueryArgStep` 的返回类型用了 `string | undefined` 和 `string | null` 混用** — flagSql 是 undefined,positionalToken 是 null。项目规范要求 `T | null` 而非 optional/undefined(CLAUDE.md: "No optional properties")。建议统一用 null。 --- *Reviewed by 团子 🐰*
@@ -0,0 +39,4 @@
const db = new DatabaseSync(dbPath, { readOnly: true });
const row = db.prepare("SELECT COUNT(*) as cnt FROM _signals").get() as
| { cnt: number }
| undefined;

💡 这里 db.close() 如果 prepare/get 抛异常就不会执行。建议 try/finally 包一下。虽然是测试代码且外层 catch 了,但 DB handle 泄漏在反复 poll 时可能累积。

💡 这里 db.close() 如果 prepare/get 抛异常就不会执行。建议 try/finally 包一下。虽然是测试代码且外层 catch 了,但 DB handle 泄漏在反复 poll 时可能累积。

⚠️ 这个三层拆分(endIndexAfterGenericDashArg → nextSenseQueryArgStep → parseSenseQueryArgs)只是为了加 --sql flag,过度工程化了。原来的 for 循环里加几行 if 就能搞定,可读性更好。

⚠️ 这个三层拆分(endIndexAfterGenericDashArg → nextSenseQueryArgStep → parseSenseQueryArgs)只是为了加 --sql flag,过度工程化了。原来的 for 循环里加几行 if 就能搞定,可读性更好。
xiaomo approved these changes 2026-04-27 07:01:30 +00:00
xiaomo left a comment
Owner

LGTM

亮点:

  • parseSenseQueryArgs 重构很干净,step-based 解析比原来的 flag 跳过逻辑清晰很多
  • --sql flag 的单元测试覆盖全面(= 语法、空格语法、优先级、缺值报错)
  • e2e 测试覆盖了 default/json/custom-sql 三种输出模式

小建议(不阻塞):

  • endIndexAfterGenericDashArg 名字稍长,考虑 skipDashArgValue 之类的
  • nextSenseQueryArgStep 返回的 nextIndex--json 分支设为 i 而非 i+1,靠外层 i++ 前进——能工作但不太直观,加个注释会更好
✅ LGTM **亮点:** - `parseSenseQueryArgs` 重构很干净,step-based 解析比原来的 flag 跳过逻辑清晰很多 - `--sql` flag 的单元测试覆盖全面(`=` 语法、空格语法、优先级、缺值报错) - e2e 测试覆盖了 default/json/custom-sql 三种输出模式 **小建议(不阻塞):** - `endIndexAfterGenericDashArg` 名字稍长,考虑 `skipDashArgValue` 之类的 - `nextSenseQueryArgStep` 返回的 `nextIndex` 在 `--json` 分支设为 `i` 而非 `i+1`,靠外层 `i++` 前进——能工作但不太直观,加个注释会更好
xiaomo merged commit 7703304ae5 into main 2026-04-27 07:01:39 +00:00
xiaomo deleted branch test/156-sense-query 2026-04-27 07:01:39 +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#165