@yss123/cage-testkit 0.1.0 → 0.3.0

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.
package/dist/derived.js CHANGED
@@ -1,14 +1,26 @@
1
- // 派生测试运行时:cage test 生成的测试文件调用这里。它们不是测 handler,而是持续证明「笼子没有洞」:
2
- // 如果有人把内核的能力判定改坏了,或者某个路由绕过了内核,这一批测试会同时失败。
3
- import { randomUUID } from 'node:crypto';
4
- import { rowToSnapshot } from '@yss123/cage-kernel/db';
5
- import { systemCtx } from '@yss123/cage-kernel';
1
+ /**
2
+ * 为 CLI 生成的测试提供真实数据库性质检查:能力、状态、范围、掩码、审计、幂等与不变量。
3
+ * setup/teardown 控制隔离测试环境,通用样例无法构造或未覆盖成功路径时返回 SKIP,不能计为业务通过。
4
+ * 不变量序列使用固定种子并保存脱敏轨迹;通用性质测试补充项目定向用例,不能替代完整业务验收。
5
+ */
6
+ // cage test 生成的测试文件调用这里,对可构造的样本执行内核性质检查。
7
+ // 它能发现已覆盖路径的授权与不变量回归,不能证明任意业务输入或所有 HTTP 路由都安全。
8
+ import { loadScoped, systemCtx } from '@yss123/cage-kernel';
6
9
  import { sql } from 'kysely';
7
10
  import { z } from 'zod';
8
11
  import { createTestEnv } from './env.js';
9
12
  import { sampleValue } from './fakes.js';
13
+ import { DerivedTestError, derivedRedactor, seededRandom, seededUuid } from './derived-diagnostics.js';
14
+ export { DerivedTestError } from './derived-diagnostics.js';
15
+ /**
16
+ * 统一跳过值,与成功断言结果区分;调用方须保留跳过计数和原因上下文。
17
+ */
10
18
  export const SKIP = 'skip';
11
- function sampleJson(s) {
19
+ /**
20
+ * 从可表达的 JSON Schema 生成简单候选输入,优先常量/枚举与非 null 分支。
21
+ * 不求解任意正则、refine 或跨字段规则;最终还需 safeParse,失败可导致派生用例跳过。
22
+ */
23
+ function sampleJson(s, random) {
12
24
  if (!s || typeof s !== 'object')
13
25
  return null;
14
26
  if (s.const !== undefined)
@@ -16,15 +28,15 @@ function sampleJson(s) {
16
28
  if (s.enum)
17
29
  return s.enum[0];
18
30
  if (s.anyOf)
19
- return sampleJson(s.anyOf.find((x) => x.type !== 'null') ?? s.anyOf[0]);
31
+ return sampleJson(s.anyOf.find((x) => x.type !== 'null') ?? s.anyOf[0], random);
20
32
  switch (Array.isArray(s.type) ? s.type.find((t) => t !== 'null') : s.type) {
21
33
  case 'string':
22
34
  if (s.format === 'uuid')
23
- return randomUUID();
35
+ return seededUuid(random);
24
36
  if (s.format === 'email')
25
37
  return 'someone@example.com';
26
38
  if (s.format === 'date-time')
27
- return new Date().toISOString();
39
+ return '2026-01-01T00:00:00.000Z';
28
40
  if (s.pattern)
29
41
  return s.pattern.includes('\\d') ? '100.00' : 'a';
30
42
  return 'x'.repeat(Math.max(1, s.minLength ?? 1));
@@ -34,14 +46,24 @@ function sampleJson(s) {
34
46
  case 'boolean':
35
47
  return false;
36
48
  case 'array':
37
- return Array.from({ length: Math.max(1, s.minItems ?? 1) }, () => sampleJson(s.items));
49
+ return Array.from({ length: Math.max(1, s.minItems ?? 1) }, () => sampleJson(s.items, random));
38
50
  case 'object':
39
- return Object.fromEntries(Object.entries(s.properties ?? {}).filter(([k]) => (s.required ?? []).includes(k)).map(([k, v]) => [k, sampleJson(v)]));
51
+ return Object.fromEntries(Object.entries(s.properties ?? {}).filter(([k]) => (s.required ?? []).includes(k)).map(([k, v]) => [k, sampleJson(v, random)]));
40
52
  default:
41
53
  return null;
42
54
  }
43
55
  }
44
- export function derived(domain) {
56
+ /**
57
+ * 为一个 domain 建立延迟初始化的性质测试集合,默认固定种子,非法 seed 立即拒绝。
58
+ * 能力/状态检查构造针对性身份,范围检查验证详情、列表和裸安全视图;成功性质无法执行时报告 SKIP。
59
+ * invariantsHold 先验证初始夹具再执行有限命令序列,区分准备失败和执行失败,并保留可定位轨迹。
60
+ */
61
+ export function derived(domain, options = {}) {
62
+ const seed = options.seed ?? 20261103;
63
+ if (!Number.isSafeInteger(seed) || seed < 0 || seed > 0xffff_ffff)
64
+ throw new RangeError('DerivedOptions.seed 必须是 uint32 整数');
65
+ const random = seededRandom(seed);
66
+ const uuid = () => seededUuid(random);
45
67
  let env;
46
68
  const rc = (cap) => {
47
69
  const c = env.kernel.registry.command(cap);
@@ -50,15 +72,40 @@ export function derived(domain) {
50
72
  return c;
51
73
  };
52
74
  const agg = (name) => env.kernel.registry.aggregate(name);
75
+ /**
76
+ * 为样例中的引用准备真实记录 ID:部门复用根节点,用户新建空权限身份,其他对象走测试 insert。
77
+ */
53
78
  async function refValue(target) {
54
79
  if (target === 'Dept')
55
80
  return env.rootDeptId;
56
81
  if (target === 'User')
57
82
  return (await env.user({ caps: [] })).id;
58
- return (await env.insert(target)).id;
83
+ return (await env.insert(target, { id: uuid() })).id;
59
84
  }
60
- /** 构造一份合法输入:id 取种子数据;聚合同名字段取种子值或示例值;其他按 schema 造 */
61
- async function sampleInput(c, seeded) {
85
+ /**
86
+ * 使用指定随机源构造字段候选,文本和 ID 随种子变化,嵌套列表递归处理。
87
+ * 仅为造数据策略,不保证满足业务不变量或已存在引用。
88
+ */
89
+ function fieldValue(field, name, rng) {
90
+ if (field.isOptional)
91
+ return null;
92
+ if (field.kind === 'id' || field.kind === 'ref')
93
+ return seededUuid(rng);
94
+ if (field.kind === 'text' && !field.sensitiveKind)
95
+ return `${name || 'text'}-${seededUuid(rng).slice(0, 8)}`.slice(0, field.max ?? 500);
96
+ if (field.kind === 'list' && field.shape) {
97
+ if ('item' in field.shape && Object.keys(field.shape).length === 1)
98
+ return [fieldValue(field.shape.item, 'item', rng)];
99
+ return [Object.fromEntries(Object.entries(field.shape).map(([key, entry]) => [key, fieldValue(entry, key, rng)]))];
100
+ }
101
+ return sampleValue(field, name);
102
+ }
103
+ /** 构造可通过输入 schema 的候选;handler 的业务规则仍可能拒绝。 */
104
+ /**
105
+ * 结合已有记录、同名聚合字段及输入 schema 构造命令候选,并用 Zod 做最终输入校验。
106
+ * 集合引用先准备目标记录;非对象 schema 或校验失败返回 null,不猜测任意业务合法值。
107
+ */
108
+ async function sampleInput(c, seeded, rng = random) {
62
109
  const schema = c.cmd.input;
63
110
  if (!(schema instanceof z.ZodObject))
64
111
  return null;
@@ -81,14 +128,19 @@ export function derived(domain) {
81
128
  const f = fields[key];
82
129
  if (f.isOptional && !required)
83
130
  continue;
84
- out[key] = f.ref ? await refValue(f.ref) : sampleValue(f, key);
131
+ // 集合引用需要目标 ID 数组,不能沿用标量 ref 的取值;否则用例会被误判为无法造输入而跳过。
132
+ out[key] = f.kind === 'manyToMany' ? [await refValue(f.ref)] : f.kind === 'ref' ? await refValue(f.ref) : fieldValue(f, key, rng);
85
133
  }
86
134
  else if (required)
87
- out[key] = sampleJson(js.properties?.[key]);
135
+ out[key] = sampleJson(js.properties?.[key], rng);
88
136
  }
89
137
  return schema.safeParse(out).success ? out : null;
90
138
  }
91
139
  /** 拥有全部能力、范围为全部的执行者;流程或外部专用命令用对应的系统身份 */
140
+ /**
141
+ * 按命令合法调用身份准备执行上下文;user 命令用全能力测试用户,流程类命令构造对应系统身份。
142
+ * 只用于隔离测试,不表明生产系统会自动授权或允许客户端选择身份。
143
+ */
92
144
  async function powerActor(c) {
93
145
  if (c.cmd.invokedBy.includes('user'))
94
146
  return (await env.user({ caps: 'all', scopes: { '*': 'all' } })).ctx();
@@ -103,6 +155,9 @@ export function derived(domain) {
103
155
  async teardown() {
104
156
  await env?.close();
105
157
  },
158
+ /**
159
+ * 创建唯独缺少目标能力的用户,核对普通用户命令被拒绝;非 user 入口或无法造输入时跳过。
160
+ */
106
161
  async capabilityDenied(cap) {
107
162
  const c = rc(cap);
108
163
  if (!c.cmd.invokedBy.includes('user'))
@@ -113,6 +168,9 @@ export function derived(domain) {
113
168
  return SKIP;
114
169
  return env.callAs(await env.actorWithout(cap), cap, input);
115
170
  },
171
+ /**
172
+ * 以有足够权限的身份对指定非法状态尝试命令,使断言聚焦状态机拒绝。
173
+ */
116
174
  async invalidTransition(cap, state) {
117
175
  const c = rc(cap);
118
176
  const seeded = await env.insert(c.cmd.agg, { status: state });
@@ -121,6 +179,10 @@ export function derived(domain) {
121
179
  return SKIP;
122
180
  return env.callAs(await powerActor(c), cap, input);
123
181
  },
182
+ /**
183
+ * 执行一次成功命令后读取该对象/命令的写审计数量。
184
+ * 样例被业务规则拒绝时跳过,不能把没走到成功路径解释成审计性质已验证。
185
+ */
124
186
  async auditOnce(cap) {
125
187
  const c = rc(cap);
126
188
  const seeded = c.cmd.from === 'new' ? null : await env.seedFor(cap);
@@ -133,6 +195,10 @@ export function derived(domain) {
133
195
  const rows = await env.audit({ aggregateId: r.data.id, command: cap, kind: 'write' });
134
196
  return { rows: rows.length };
135
197
  },
198
+ /**
199
+ * 使用同一用户身份与幂等键并发执行两次,比较对象 ID、版本和写审计数量。
200
+ * 非 user 或任一次失败返回 SKIP;该检查仅覆盖本次成功样例的幂等行为。
201
+ */
136
202
  async idempotent(cap) {
137
203
  const c = rc(cap);
138
204
  if (!c.cmd.invokedBy.includes('user'))
@@ -141,21 +207,25 @@ export function derived(domain) {
141
207
  const input = await sampleInput(c, seeded);
142
208
  if (input === null)
143
209
  return SKIP;
144
- const ctx = { ...(await powerActor(c)), idempotencyKey: randomUUID() };
210
+ const ctx = { ...(await powerActor(c)), idempotencyKey: uuid() };
145
211
  const [a, b] = await Promise.all([env.callAs(ctx, cap, input), env.callAs(ctx, cap, input)]);
146
212
  if (!a.ok || !b.ok)
147
213
  return SKIP;
148
214
  const rows = await env.audit({ aggregateId: a.data.id, command: cap, kind: 'write' });
149
215
  return { same: a.data.id === b.data.id && a.data.version === b.data.version, rows: rows.length };
150
216
  },
217
+ /**
218
+ * 准备不同归属身份,核对范围外对象在详情、列表和裸安全视图均不可见,并检查基表读取被拒绝。
219
+ * 只覆盖 self/dept 且要求相应范围字段,不穷尽全部角色组合。
220
+ */
151
221
  async scopeHidden(aggName, combinator) {
152
222
  const a = agg(aggName);
153
223
  if (combinator === 'self' && !a.scope.ownerField)
154
224
  return SKIP;
155
225
  if (combinator === 'dept' && (!a.scope.deptField || a.scope.deptField === 'id'))
156
226
  return SKIP;
157
- const deptA = await env.dept(`derived-a-${randomUUID().slice(0, 6)}`);
158
- const deptB = await env.dept(`derived-b-${randomUUID().slice(0, 6)}`);
227
+ const deptA = await env.dept(`derived-a-${uuid().slice(0, 6)}`);
228
+ const deptB = await env.dept(`derived-b-${uuid().slice(0, 6)}`);
159
229
  const owner = await env.user({ caps: [], deptId: deptA });
160
230
  const rec = await env.insert(a, { ownerId: owner.id, ...(a.scope.deptField && a.scope.deptField !== 'id' ? { [a.scope.deptField]: deptA } : {}) });
161
231
  const other = await env.user({ caps: [`${aggName}.read`], scopes: { [aggName]: combinator }, deptId: deptB });
@@ -180,6 +250,10 @@ export function derived(domain) {
180
250
  await db.release();
181
251
  return { get, listed: list.items.some((x) => x.id === rec.id), rawVisible: raw.rows.some((r) => r.id === rec.id), baseDenied };
182
252
  },
253
+ /**
254
+ * 用本人范围身份尝试写入他人的记录,验证能力充足仍不能越过记录范围。
255
+ * 新建命令、非用户入口或无 owner 字段时不适用并返回 SKIP。
256
+ */
183
257
  async outOfScopeWrite(cap) {
184
258
  const c = rc(cap);
185
259
  if (c.cmd.from === 'new' || !c.cmd.invokedBy.includes('user') || !c.cmd.agg.scope.ownerField)
@@ -192,6 +266,9 @@ export function derived(domain) {
192
266
  const other = await env.user({ caps: 'all', scopes: { [c.cmd.agg.name]: 'self' } });
193
267
  return env.callAs(await other.ctx(), cap, input);
194
268
  },
269
+ /**
270
+ * 写入敏感字段样例后以只有读取能力的用户查询,返回原值与可见值供掩码断言。
271
+ */
195
272
  async masked(aggName) {
196
273
  const a = agg(aggName);
197
274
  const sens = Object.entries(a.fields).filter(([, f]) => f.sensitiveKind);
@@ -203,56 +280,108 @@ export function derived(domain) {
203
280
  const got = await env.kernel.read.get(a, rec.id, await reader.ctx());
204
281
  return sens.map(([k]) => ({ field: k, plain: values[k], seen: got[k] }));
205
282
  },
283
+ /**
284
+ * 按固定种子运行有限轮次与命令序列,先核验初始持久快照,随后每步读取真实结果检查全部不变量。
285
+ * 夹具失败立即抛结构化错误;序列第一次观察到不变量失败时保存前缀,不继续污染失败轨迹。
286
+ * 正常业务拒绝仍作为一次尝试记录,不等于框架异常;返回 steps 供判断实际覆盖深度。
287
+ */
206
288
  async invariantsHold(aggName, runs = 8) {
207
289
  const a = agg(aggName);
208
290
  const names = Object.keys(a.invariants);
209
291
  if (names.length === 0)
210
292
  return SKIP;
211
293
  const cmds = env.kernel.registry.commands.filter((c) => c.cmd.agg === a);
294
+ const rng = seededRandom(seed);
295
+ const redact = derivedRedactor(env.kernel.registry.aggregates);
212
296
  const violations = [];
297
+ const traces = [];
213
298
  let steps = 0;
299
+ const failedInvariants = (snapshot) => names.filter((name) => {
300
+ try {
301
+ return !a.invariants[name](snapshot);
302
+ }
303
+ catch {
304
+ return true;
305
+ }
306
+ });
214
307
  for (let run = 0; run < runs; run++) {
215
- // 随机命令序列:每一步之后,库里的数据都必须满足所有不变量
308
+ const trace = { aggregate: aggName, seed, run, phase: 'fixture', initial: null, preparation: [], commands: [], failedInvariants: [], minimalPrefix: [] };
216
309
  let rec = null;
217
- const creators = cmds.filter((c) => c.cmd.from === 'new');
218
- if (creators.length) {
219
- const c = creators[run % creators.length];
220
- const input = await sampleInput(c, null);
221
- if (input) {
222
- const r = await env.callAs(await powerActor(c), c.capability, input);
223
- if (r.ok)
224
- rec = r.data;
310
+ try {
311
+ const fixture = options.fixtures?.[aggName];
312
+ if (typeof fixture === 'function') {
313
+ rec = await fixture({ env, aggregate: a, run, seed, random: rng, uuid: () => seededUuid(rng) });
314
+ }
315
+ else if (fixture) {
316
+ rec = await env.insert(a, { id: seededUuid(rng), ...fixture });
225
317
  }
318
+ else {
319
+ const creators = cmds.filter((c) => c.cmd.from === 'new');
320
+ if (creators.length) {
321
+ const c = creators[run % creators.length];
322
+ const input = await sampleInput(c, null, rng);
323
+ if (input) {
324
+ const result = await env.callAs(await powerActor(c), c.capability, input);
325
+ trace.preparation.push({ step: 0, capability: c.capability, input: redact(input), result: { ok: result.ok, code: result.code, ...(!result.ok ? { domainCode: result.domainCode } : {}) } });
326
+ if (result.ok)
327
+ rec = result.data;
328
+ }
329
+ }
330
+ if (!rec) {
331
+ const values = Object.fromEntries(Object.entries(a.fields)
332
+ .filter(([, field]) => field.kind !== 'ref' && field.kind !== 'hasMany').map(([name, field]) => [name, fieldValue(field, name, rng)]));
333
+ trace.initial = redact(values);
334
+ rec = await env.insert(a, { id: seededUuid(rng), ...values });
335
+ }
336
+ }
337
+ // 必须读取完整持久快照检查初始不变量,不能等第一条业务命令失败才把非法种子算作业务反例。
338
+ const initial = rec?.id ? await loadScoped(env.kernel.app, a, rec.id, env.system(), false) : null;
339
+ if (!initial)
340
+ throw new Error('fixture-record-missing');
341
+ rec = initial;
342
+ trace.initial = redact(initial);
343
+ trace.failedInvariants = failedInvariants(initial);
344
+ if (trace.failedInvariants.length)
345
+ throw new DerivedTestError(trace);
346
+ }
347
+ catch (e) {
348
+ if (e instanceof DerivedTestError)
349
+ throw e;
350
+ trace.failedInvariants = [`fixtureConstruction:${e.code ?? e.name ?? 'Error'}`];
351
+ throw new DerivedTestError(trace);
226
352
  }
227
- rec ??= await env.insert(a);
353
+ trace.phase = 'execution';
228
354
  for (let i = 0; i < 4; i++) {
229
355
  const options = cmds.filter((c) => c.cmd.from !== 'new' && c.cmd.from.includes(rec.status));
230
356
  if (options.length === 0)
231
357
  break;
232
- const c = options[Math.floor(Math.random() * options.length)];
233
- const input = await sampleInput(c, rec);
358
+ const c = options[Math.floor(rng() * options.length)];
359
+ const input = await sampleInput(c, rec, rng);
234
360
  if (!input)
235
361
  continue;
236
- const r = await env.callAs(await powerActor(c), c.capability, input);
362
+ let result;
363
+ try {
364
+ result = await env.callAs(await powerActor(c), c.capability, input);
365
+ }
366
+ catch (e) {
367
+ trace.commands.push({ step: i, capability: c.capability, input: redact(input), result: { ok: false, code: e.code ?? 'INTERNAL' } });
368
+ trace.minimalPrefix = [...trace.commands];
369
+ throw new DerivedTestError(trace);
370
+ }
237
371
  steps++;
238
- const [row] = await env.query(`select * from "${a.table.schema}"."${a.table.name}" where id = $1`, [rec.id]);
239
- const snap = rowToSnapshot(a, row);
240
- for (const n of names) {
241
- let ok = false;
242
- try {
243
- ok = !!a.invariants[n](snap);
244
- }
245
- catch {
246
- ok = false;
247
- }
248
- if (!ok)
249
- violations.push(`${c.capability} 之后 ${aggName}.${n} 不成立`);
372
+ trace.commands.push({ step: i, capability: c.capability, input: redact(input), result: { ok: result.ok, code: result.code, ...(!result.ok ? { domainCode: result.domainCode } : {}) } });
373
+ const snap = (await loadScoped(env.kernel.app, a, rec.id, env.system(), false));
374
+ trace.failedInvariants = snap ? failedInvariants(snap) : ['recordMissing'];
375
+ if (trace.failedInvariants.length) {
376
+ trace.minimalPrefix = [...trace.commands];
377
+ violations.push(`${c.capability} 之后 ${aggName}.${trace.failedInvariants.join(',')} 不成立;${JSON.stringify(trace)}`);
378
+ break;
250
379
  }
251
- if (r.ok)
252
- rec = { ...rec, ...snap };
380
+ rec = snap;
253
381
  }
382
+ traces.push(trace);
254
383
  }
255
- return { steps, violations };
384
+ return { steps, violations, seed, traces };
256
385
  },
257
386
  };
258
387
  }
@@ -1 +1 @@
1
- {"version":3,"file":"derived.js","sourceRoot":"","sources":["../src/derived.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"derived.js","sourceRoot":"","sources":["../src/derived.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 内嵌 PostgreSQL 依赖的进程退出码兼容层,仅供 pg.ts 在加载 embedded-postgres 后安装。
3
+ * embedded-postgres 注册的 async-exit-hook 2.x 将 beforeExit 固定转换为 process.exit(0),
4
+ * 会覆盖 Vitest 已设置的失败状态;本模块保留进入自然退出阶段时的非零码,供最终 exit 恢复。
5
+ * 不替换 process.exit、不移除依赖的异步清理或信号处理,也不启动/停止数据库。
6
+ * 只修正已知的非零状态被改为零:后续显式非零退出仍保留,beforeExit 之后新产生的失败不在此推断。
7
+ */
8
+ /**
9
+ * 安装一次失败退出码保留逻辑,供 startEmbeddedPostgres 紧接依赖加载后调用。
10
+ * Node 自然退出时先传入当前退出码;若其非零,在 exit 阶段仅将上游强制的零恢复为该码。
11
+ * 同步 exit 监听中只设置 process.exitCode,不执行异步 IO;因此数据库清理仍由原有钩子完成。
12
+ * 调用无返回值、不修改公开接口;已有监听不会被删除,显式 process.exit(非零) 的结果不被覆盖。
13
+ */
14
+ export declare function preserveEmbeddedPostgresExitCode(): void;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * 内嵌 PostgreSQL 依赖的进程退出码兼容层,仅供 pg.ts 在加载 embedded-postgres 后安装。
3
+ * embedded-postgres 注册的 async-exit-hook 2.x 将 beforeExit 固定转换为 process.exit(0),
4
+ * 会覆盖 Vitest 已设置的失败状态;本模块保留进入自然退出阶段时的非零码,供最终 exit 恢复。
5
+ * 不替换 process.exit、不移除依赖的异步清理或信号处理,也不启动/停止数据库。
6
+ * 只修正已知的非零状态被改为零:后续显式非零退出仍保留,beforeExit 之后新产生的失败不在此推断。
7
+ */
8
+ /** 同一模块实例的进程级安装标记;多次创建内嵌数据库只注册一组兼容监听。 */
9
+ let installed = false;
10
+ /**
11
+ * 安装一次失败退出码保留逻辑,供 startEmbeddedPostgres 紧接依赖加载后调用。
12
+ * Node 自然退出时先传入当前退出码;若其非零,在 exit 阶段仅将上游强制的零恢复为该码。
13
+ * 同步 exit 监听中只设置 process.exitCode,不执行异步 IO;因此数据库清理仍由原有钩子完成。
14
+ * 调用无返回值、不修改公开接口;已有监听不会被删除,显式 process.exit(非零) 的结果不被覆盖。
15
+ */
16
+ export function preserveEmbeddedPostgresExitCode() {
17
+ if (installed)
18
+ return;
19
+ installed = true;
20
+ process.once('beforeExit', (code) => {
21
+ if (code === 0)
22
+ return;
23
+ // 上游在 nextTick 中调用 process.exit(0),所以此处可先记录真实失败并等待最终退出事件。
24
+ process.once('exit', (actual) => {
25
+ if (actual === 0)
26
+ process.exitCode = code;
27
+ });
28
+ });
29
+ }
30
+ //# sourceMappingURL=embedded-exit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedded-exit.js","sourceRoot":"","sources":["../src/embedded-exit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,yCAAyC;AACzC,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB;;;;;GAKG;AACH,MAAM,UAAU,gCAAgC;IAC9C,IAAI,SAAS;QAAE,OAAO;IACtB,SAAS,GAAG,IAAI,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO;QACvB,0DAA0D;QAC1D,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YAC9B,IAAI,MAAM,KAAK,CAAC;gBAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/env.d.ts CHANGED
@@ -1,6 +1,10 @@
1
1
  import { type AnyAggregate, type Ctx, type Kernel, type Logger } from '@yss123/cage-kernel';
2
2
  import { type MigrationFile } from '@yss123/cage-kernel/db';
3
3
  import { Kysely } from 'kysely';
4
+ /**
5
+ * 测试命令执行结果:ok=true 时包含快照,ok=false 时保留标准 code 与可选 domainCode/detail。
6
+ * 未识别的 INTERNAL 异常仍会抛出,以免测试把实现故障当成预期业务拒绝。
7
+ */
4
8
  export type CallResult = {
5
9
  ok: true;
6
10
  data: Record<string, any>;
@@ -12,12 +16,21 @@ export type CallResult = {
12
16
  detail?: unknown;
13
17
  data?: undefined;
14
18
  };
19
+ /**
20
+ * 通过组织命令创建的测试身份,保存用户/角色 ID 及 username。
21
+ * ctx 每次重新读取授权上下文,便于测试授权变化,不固定缓存创建时的能力集合。
22
+ */
15
23
  export interface TestUser {
16
24
  id: string;
17
25
  username: string;
18
26
  roleId: string;
19
27
  ctx(): Promise<Ctx>;
20
28
  }
29
+ /**
30
+ * 单个临时业务数据库的测试操作集合。kernel 用于真实流水线,system 是测试系统身份。
31
+ * urls 含测试连接信息,仅供测试装配,不应输出到报告;query/audit 为受信任测试诊断捷径。
32
+ * insert/seedFor 绕过业务命令准备夹具,业务成功路径仍须通过 callAs 验证。
33
+ */
21
34
  export interface TestEnv {
22
35
  kernel: Kernel;
23
36
  tenantId: string;
@@ -62,7 +75,7 @@ export interface TestEnv {
62
75
  readConnectionAs(ctx: Ctx): Promise<Kysely<any> & {
63
76
  release(): Promise<void>;
64
77
  }>;
65
- /** 处理 outbox 直到为空 */
78
+ /** 处理当前可领取 outbox;返回处理数量,未来重试/死信或轮数上限不表示业务全部完成。 */
66
79
  drain(): Promise<number>;
67
80
  /** 审计记录(超级用户读取) */
68
81
  audit(where?: {
@@ -73,6 +86,12 @@ export interface TestEnv {
73
86
  query(text: string, params?: unknown[]): Promise<any[]>;
74
87
  close(): Promise<void>;
75
88
  }
89
+ /**
90
+ * 创建随机命名的测试库并返回可执行测试的环境,调用方必须在 teardown 中 close。
91
+ * 先在共同管理库取得角色初始化锁,避免不同测试库并发修改同一集群角色;随后按迁移或声明建结构。
92
+ * domain 必须包含组织模型,否则无法准备用户与部门并报错;logger 默认静默,可注入用于诊断回归。
93
+ * 默认新库测试不等于带旧数据的升级验收,未传 migrations 时也不验证应用迁移文件。
94
+ */
76
95
  export declare function createTestEnv(opts: {
77
96
  domain: object | object[];
78
97
  /** 不传时直接按声明建表(不经过迁移文件) */