@yss123/cage-testkit 0.4.0 → 0.4.1
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/README.md +16 -70
- package/package.json +8 -8
package/README.md
CHANGED
|
@@ -1,87 +1,33 @@
|
|
|
1
1
|
# @yss123/cage-testkit
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
开发测试工具:纯 handler 假依赖、独立真实 PostgreSQL、测试主体与授权、outbox 驱动及声明派生测试。它不作为生产业务写入口或日常数据库管理工具。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 配置
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
安装 pnpm add -D @yss123/cage-testkit vitest,使用 Node.js 24+ 与同版本内核。在 Vitest 配置 globalSetup: ['@yss123/cage-testkit/global-setup'],并给数据库启动留出 hookTimeout。
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
pnpm add -D @yss123/cage-testkit vitest
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
domain 应已安装 Cage 内核,并从根入口导出组织模型 `@yss123/cage-admin/domain`。
|
|
14
|
-
|
|
15
|
-
## 配置真实数据库测试
|
|
16
|
-
|
|
17
|
-
在执行测试的包中创建 `vitest.config.ts`:
|
|
18
|
-
|
|
19
|
-
```ts
|
|
20
|
-
/** 测试集群由 globalSetup 管理;每个 createTestEnv 仍创建独立临时库。 */
|
|
21
|
-
import { defineConfig } from 'vitest/config';
|
|
22
|
-
|
|
23
|
-
export default defineConfig({
|
|
24
|
-
test: {
|
|
25
|
-
globalSetup: ['@yss123/cage-testkit/global-setup'],
|
|
26
|
-
testTimeout: 60_000,
|
|
27
|
-
hookTimeout: 120_000,
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
```
|
|
9
|
+
CAGE_TEST_DATABASE_URL 可提供可丢弃独立测试集群;缺省时 setup 尝试内嵌真实 PostgreSQL。环境会创建角色和临时库,不能指向生产或普通业务集群。
|
|
31
10
|
|
|
32
|
-
|
|
11
|
+
## 验证真实流水线
|
|
33
12
|
|
|
34
|
-
|
|
13
|
+
以下是测试函数中的片段,domain 已包含 Note.create 与组织声明:
|
|
35
14
|
|
|
36
15
|
```ts
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
import { createTestEnv, type TestEnv } from '@yss123/cage-testkit';
|
|
40
|
-
import * as domain from './index.js';
|
|
41
|
-
|
|
42
|
-
let env: TestEnv;
|
|
43
|
-
|
|
44
|
-
beforeAll(async () => {
|
|
45
|
-
env = await createTestEnv({ domain });
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
afterAll(async () => {
|
|
49
|
-
if (env) await env.close();
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
test('没有创建便笺能力时拒绝创建', async () => {
|
|
16
|
+
const env = await createTestEnv({ domain });
|
|
17
|
+
try {
|
|
53
18
|
const user = await env.user({ caps: [], scopes: { Note: 'all' } });
|
|
54
|
-
const result = await env.callAs(await user.ctx(), 'Note.create', {
|
|
55
|
-
title: '无权限的写入',
|
|
56
|
-
});
|
|
19
|
+
const result = await env.callAs(await user.ctx(), 'Note.create', { title: '无权创建' });
|
|
57
20
|
expect(result.ok).toBe(false);
|
|
58
21
|
if (!result.ok) expect(result.code).toBe('FORBIDDEN');
|
|
59
|
-
}
|
|
22
|
+
} finally {
|
|
23
|
+
await env.close();
|
|
24
|
+
}
|
|
60
25
|
```
|
|
61
26
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
## 选择测试层次
|
|
65
|
-
|
|
66
|
-
| 入口 | 用途与边界 |
|
|
67
|
-
| --- | --- |
|
|
68
|
-
| `fakeRepo`、`draftOf`、`handlerCtx` | 纯 handler 计算测试,跳过权限、状态、数据库、审计和事务 |
|
|
69
|
-
| `sampleRecord`、`sampleValue` | 按字段形状构造样例,不保证满足业务不变量 |
|
|
70
|
-
| `arbitraryOf`、`arbitrarySnapshot` | fast-check 候选数据,用于探索输入和不变量边界 |
|
|
71
|
-
| `createTestEnv` | 独立 PostgreSQL 数据库、真实内核、安全读侧和测试身份 |
|
|
72
|
-
| `env.user`、`env.actorWithout`、`env.callAs` | 明确能力/范围后执行完整命令流水线 |
|
|
73
|
-
| `env.insert`、`env.seedFor` | 绕过命令准备夹具,仅测试可用,不能当业务写入示例 |
|
|
74
|
-
| `env.drain`、`env.audit` | 驱动当前可领取 outbox 与检查审计;未来重试/死信不等于已完成 |
|
|
75
|
-
| `derived`、`SKIP`、`DerivedTestError` | 执行声明派生测试并区分跳过与失败 |
|
|
76
|
-
| `@yss123/cage-testkit/global-setup` | 整轮 Vitest 的测试集群启停 |
|
|
77
|
-
| `@yss123/cage-testkit/pg` | 内嵌 PostgreSQL 与测试连接辅助工具 |
|
|
78
|
-
|
|
79
|
-
`env.close()` 关闭连接并尝试删除本次临时库,必须放在 teardown。外部测试集群不会由 globalSetup 停止。fake 成功、派生测试通过和真实第三方联调是不同证据;跳过项需要单独报告,不能计为通过。
|
|
27
|
+
createTestEnv 从本包导入,expect 来自测试库,domain 来自被测入口。默认按当前声明建库;历史升级要传实际 migrations 并准备旧数据,默认测试不证明迁移历史正确。
|
|
80
28
|
|
|
81
|
-
|
|
29
|
+
fakeRepo/draftOf/handlerCtx 只测计算,跳过权限、事务与数据库。env.insert/seedFor 是测试夹具通道;env.drain 驱动可领取消息,不代表未来重试或死信已完成。
|
|
82
30
|
|
|
83
|
-
|
|
84
|
-
- [采购业务测试示例](https://github.com/shunshunyue/cage/blob/main/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.test.ts)
|
|
85
|
-
- [架构与权限模型](https://github.com/shunshunyue/cage/blob/main/docs/development/getting-started/architecture.md)
|
|
31
|
+
derived 证明通用性质,不能凭空推断所有业务合法输入。跳过、失败与通过分别报告,fake 和真实第三方联调也分别取得证据。
|
|
86
32
|
|
|
87
|
-
|
|
33
|
+
[验证参考](https://github.com/shunshunyue/cage/blob/main/docs/development/reference/verification.md) · [采购业务测试](https://github.com/shunshunyue/cage/blob/main/examples/purchase-admin/packages/domain/src/modules/purchase/purchase-order.test.ts)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yss123/cage-testkit",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "派生测试运行器、fake 仓储、测试数据库",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -30,17 +30,17 @@
|
|
|
30
30
|
"zod": "^4.1.5"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"@yss123/cage-kernel": "0.4.
|
|
33
|
+
"@yss123/cage-kernel": "0.4.1"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/pg": "^8.15.5",
|
|
37
37
|
"vitest": "^4.1.12",
|
|
38
|
-
"@yss123/cage-
|
|
39
|
-
"@yss123/cage-kernel": "0.4.
|
|
40
|
-
"@yss123/cage-admin": "0.4.
|
|
41
|
-
"@yss123/cage-
|
|
42
|
-
"@yss123/cage-
|
|
43
|
-
"@yss123/cage-
|
|
38
|
+
"@yss123/cage-http": "0.4.1",
|
|
39
|
+
"@yss123/cage-kernel": "0.4.1",
|
|
40
|
+
"@yss123/cage-admin": "0.4.1",
|
|
41
|
+
"@yss123/cage-ai": "0.4.1",
|
|
42
|
+
"@yss123/cage-approval": "0.4.1",
|
|
43
|
+
"@yss123/cage-connectors": "0.4.1"
|
|
44
44
|
},
|
|
45
45
|
"license": "MIT",
|
|
46
46
|
"repository": {
|