ai-tests 2.0.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.
Files changed (47) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/CHANGELOG.md +3 -0
  3. package/README.md +214 -0
  4. package/dist/assertions.d.ts +132 -0
  5. package/dist/assertions.d.ts.map +1 -0
  6. package/dist/assertions.js +384 -0
  7. package/dist/assertions.js.map +1 -0
  8. package/dist/cli.d.ts +13 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +77 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/index.d.ts +16 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +19 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/local.d.ts +31 -0
  17. package/dist/local.d.ts.map +1 -0
  18. package/dist/local.js +63 -0
  19. package/dist/local.js.map +1 -0
  20. package/dist/runner.d.ts +68 -0
  21. package/dist/runner.d.ts.map +1 -0
  22. package/dist/runner.js +215 -0
  23. package/dist/runner.js.map +1 -0
  24. package/dist/types.d.ts +62 -0
  25. package/dist/types.d.ts.map +1 -0
  26. package/dist/types.js +5 -0
  27. package/dist/types.js.map +1 -0
  28. package/dist/worker.d.ts +55 -0
  29. package/dist/worker.d.ts.map +1 -0
  30. package/dist/worker.js +92 -0
  31. package/dist/worker.js.map +1 -0
  32. package/package.json +58 -0
  33. package/src/assertions.ts +465 -0
  34. package/src/cli.ts +87 -0
  35. package/src/index.ts +33 -0
  36. package/src/local.ts +76 -0
  37. package/src/runner.ts +238 -0
  38. package/src/types.ts +68 -0
  39. package/src/worker.ts +112 -0
  40. package/test/assertions.test.ts +607 -0
  41. package/test/index.test.ts +51 -0
  42. package/test/local.test.ts +31 -0
  43. package/test/runner.test.ts +379 -0
  44. package/test/worker.test.ts +198 -0
  45. package/tsconfig.json +23 -0
  46. package/vitest.config.ts +11 -0
  47. package/wrangler.toml +6 -0
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Test runner - describe, it, test, hooks
3
+ *
4
+ * Provides vitest-compatible test runner API via RPC.
5
+ */
6
+ import { RpcTarget } from 'cloudflare:workers';
7
+ import type { TestResults, TestFn, HookFn } from './types.js';
8
+ /**
9
+ * Test runner that collects and runs tests
10
+ */
11
+ export declare class TestRunner extends RpcTarget {
12
+ private tests;
13
+ private currentSuite;
14
+ private beforeEachHooks;
15
+ private afterEachHooks;
16
+ private beforeAllHooks;
17
+ private afterAllHooks;
18
+ /**
19
+ * Define a test suite
20
+ */
21
+ describe(name: string, fn: () => void): void;
22
+ /**
23
+ * Define a test
24
+ */
25
+ it(name: string, fn: TestFn): void;
26
+ /**
27
+ * Alias for it
28
+ */
29
+ test(name: string, fn: TestFn): void;
30
+ /**
31
+ * Skip a test
32
+ */
33
+ skip(name: string, _fn?: TestFn): void;
34
+ /**
35
+ * Run only this test
36
+ */
37
+ only(name: string, fn: TestFn): void;
38
+ /**
39
+ * Register a beforeEach hook
40
+ */
41
+ beforeEach(fn: HookFn): void;
42
+ /**
43
+ * Register an afterEach hook
44
+ */
45
+ afterEach(fn: HookFn): void;
46
+ /**
47
+ * Register a beforeAll hook
48
+ */
49
+ beforeAll(fn: HookFn): void;
50
+ /**
51
+ * Register an afterAll hook
52
+ */
53
+ afterAll(fn: HookFn): void;
54
+ /**
55
+ * Run all registered tests and return results
56
+ */
57
+ run(): Promise<TestResults>;
58
+ /**
59
+ * Clear all registered tests and hooks
60
+ */
61
+ reset(): void;
62
+ private buildResults;
63
+ }
64
+ /**
65
+ * Create a new test runner instance
66
+ */
67
+ export declare function createRunner(): TestRunner;
68
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,EAAE,MAAM,EAAkB,MAAM,YAAY,CAAA;AAEzF;;GAEG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,cAAc,CAAe;IACrC,OAAO,CAAC,cAAc,CAAe;IACrC,OAAO,CAAC,aAAa,CAAe;IAEpC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAgB5C;;OAEG;IACH,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAYlC;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAUtC;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAapC;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI5B;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI3B;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI3B;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI1B;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;IAuFjC;;OAEG;IACH,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,YAAY;CAUrB;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,UAAU,CAEzC"}
package/dist/runner.js ADDED
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Test runner - describe, it, test, hooks
3
+ *
4
+ * Provides vitest-compatible test runner API via RPC.
5
+ */
6
+ import { RpcTarget } from 'cloudflare:workers';
7
+ /**
8
+ * Test runner that collects and runs tests
9
+ */
10
+ export class TestRunner extends RpcTarget {
11
+ tests = [];
12
+ currentSuite = '';
13
+ beforeEachHooks = [];
14
+ afterEachHooks = [];
15
+ beforeAllHooks = [];
16
+ afterAllHooks = [];
17
+ /**
18
+ * Define a test suite
19
+ */
20
+ describe(name, fn) {
21
+ const prevSuite = this.currentSuite;
22
+ const prevBeforeEach = [...this.beforeEachHooks];
23
+ const prevAfterEach = [...this.afterEachHooks];
24
+ this.currentSuite = this.currentSuite ? `${this.currentSuite} > ${name}` : name;
25
+ try {
26
+ fn();
27
+ }
28
+ finally {
29
+ this.currentSuite = prevSuite;
30
+ this.beforeEachHooks = prevBeforeEach;
31
+ this.afterEachHooks = prevAfterEach;
32
+ }
33
+ }
34
+ /**
35
+ * Define a test
36
+ */
37
+ it(name, fn) {
38
+ const fullName = this.currentSuite ? `${this.currentSuite} > ${name}` : name;
39
+ this.tests.push({
40
+ name: fullName,
41
+ fn,
42
+ hooks: {
43
+ before: [...this.beforeEachHooks],
44
+ after: [...this.afterEachHooks]
45
+ }
46
+ });
47
+ }
48
+ /**
49
+ * Alias for it
50
+ */
51
+ test(name, fn) {
52
+ this.it(name, fn);
53
+ }
54
+ /**
55
+ * Skip a test
56
+ */
57
+ skip(name, _fn) {
58
+ const fullName = this.currentSuite ? `${this.currentSuite} > ${name}` : name;
59
+ this.tests.push({
60
+ name: fullName,
61
+ fn: null,
62
+ hooks: { before: [], after: [] },
63
+ skip: true
64
+ });
65
+ }
66
+ /**
67
+ * Run only this test
68
+ */
69
+ only(name, fn) {
70
+ const fullName = this.currentSuite ? `${this.currentSuite} > ${name}` : name;
71
+ this.tests.push({
72
+ name: fullName,
73
+ fn,
74
+ hooks: {
75
+ before: [...this.beforeEachHooks],
76
+ after: [...this.afterEachHooks]
77
+ },
78
+ only: true
79
+ });
80
+ }
81
+ /**
82
+ * Register a beforeEach hook
83
+ */
84
+ beforeEach(fn) {
85
+ this.beforeEachHooks.push(fn);
86
+ }
87
+ /**
88
+ * Register an afterEach hook
89
+ */
90
+ afterEach(fn) {
91
+ this.afterEachHooks.push(fn);
92
+ }
93
+ /**
94
+ * Register a beforeAll hook
95
+ */
96
+ beforeAll(fn) {
97
+ this.beforeAllHooks.push(fn);
98
+ }
99
+ /**
100
+ * Register an afterAll hook
101
+ */
102
+ afterAll(fn) {
103
+ this.afterAllHooks.push(fn);
104
+ }
105
+ /**
106
+ * Run all registered tests and return results
107
+ */
108
+ async run() {
109
+ const startTime = Date.now();
110
+ const results = [];
111
+ // Check for .only tests
112
+ const hasOnly = this.tests.some(t => t.only);
113
+ const testsToRun = hasOnly
114
+ ? this.tests.filter(t => t.only || t.skip)
115
+ : this.tests;
116
+ // Run beforeAll hooks
117
+ for (const hook of this.beforeAllHooks) {
118
+ try {
119
+ await hook();
120
+ }
121
+ catch (e) {
122
+ // If beforeAll fails, fail all tests
123
+ const error = e instanceof Error ? e.message : String(e);
124
+ for (const test of testsToRun) {
125
+ results.push({
126
+ name: test.name,
127
+ passed: false,
128
+ error: `beforeAll hook failed: ${error}`,
129
+ duration: 0
130
+ });
131
+ }
132
+ return this.buildResults(results, startTime);
133
+ }
134
+ }
135
+ // Run each test
136
+ for (const test of testsToRun) {
137
+ if (test.skip) {
138
+ results.push({
139
+ name: test.name,
140
+ passed: true,
141
+ skipped: true,
142
+ duration: 0
143
+ });
144
+ continue;
145
+ }
146
+ const testStart = Date.now();
147
+ try {
148
+ // Run beforeEach hooks
149
+ for (const hook of test.hooks.before) {
150
+ await hook();
151
+ }
152
+ // Run the test
153
+ if (test.fn) {
154
+ await test.fn();
155
+ }
156
+ // Run afterEach hooks
157
+ for (const hook of test.hooks.after) {
158
+ await hook();
159
+ }
160
+ results.push({
161
+ name: test.name,
162
+ passed: true,
163
+ duration: Date.now() - testStart
164
+ });
165
+ }
166
+ catch (e) {
167
+ results.push({
168
+ name: test.name,
169
+ passed: false,
170
+ error: e instanceof Error ? e.message : String(e),
171
+ duration: Date.now() - testStart
172
+ });
173
+ }
174
+ }
175
+ // Run afterAll hooks
176
+ for (const hook of this.afterAllHooks) {
177
+ try {
178
+ await hook();
179
+ }
180
+ catch (e) {
181
+ // Log but don't fail tests
182
+ console.error('afterAll hook failed:', e);
183
+ }
184
+ }
185
+ return this.buildResults(results, startTime);
186
+ }
187
+ /**
188
+ * Clear all registered tests and hooks
189
+ */
190
+ reset() {
191
+ this.tests = [];
192
+ this.currentSuite = '';
193
+ this.beforeEachHooks = [];
194
+ this.afterEachHooks = [];
195
+ this.beforeAllHooks = [];
196
+ this.afterAllHooks = [];
197
+ }
198
+ buildResults(results, startTime) {
199
+ return {
200
+ total: results.length,
201
+ passed: results.filter(r => r.passed && !r.skipped).length,
202
+ failed: results.filter(r => !r.passed).length,
203
+ skipped: results.filter(r => r.skipped).length,
204
+ tests: results,
205
+ duration: Date.now() - startTime
206
+ };
207
+ }
208
+ }
209
+ /**
210
+ * Create a new test runner instance
211
+ */
212
+ export function createRunner() {
213
+ return new TestRunner();
214
+ }
215
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Types for ai-test
3
+ */
4
+ /**
5
+ * Test result for a single test
6
+ */
7
+ export interface TestResult {
8
+ name: string;
9
+ passed: boolean;
10
+ skipped?: boolean;
11
+ error?: string;
12
+ duration: number;
13
+ }
14
+ /**
15
+ * Aggregated test results
16
+ */
17
+ export interface TestResults {
18
+ total: number;
19
+ passed: number;
20
+ failed: number;
21
+ skipped: number;
22
+ tests: TestResult[];
23
+ duration: number;
24
+ }
25
+ /**
26
+ * Test function
27
+ */
28
+ export type TestFn = () => void | Promise<void>;
29
+ /**
30
+ * Hook function (beforeEach, afterEach, etc.)
31
+ */
32
+ export type HookFn = () => void | Promise<void>;
33
+ /**
34
+ * Registered test
35
+ */
36
+ export interface RegisteredTest {
37
+ name: string;
38
+ fn: TestFn | null;
39
+ hooks: {
40
+ before: HookFn[];
41
+ after: HookFn[];
42
+ };
43
+ skip?: boolean;
44
+ only?: boolean;
45
+ }
46
+ /**
47
+ * Test suite context
48
+ */
49
+ export interface SuiteContext {
50
+ name: string;
51
+ beforeEach: HookFn[];
52
+ afterEach: HookFn[];
53
+ beforeAll: HookFn[];
54
+ afterAll: HookFn[];
55
+ }
56
+ /**
57
+ * Environment with test worker binding
58
+ */
59
+ export interface TestEnv {
60
+ TEST?: unknown;
61
+ }
62
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAE/C;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAE/C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACjB,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,EAAE,CAAA;QAChB,KAAK,EAAE,MAAM,EAAE,CAAA;KAChB,CAAA;IACD,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Types for ai-test
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Test Worker - provides test utilities via RPC
3
+ *
4
+ * This worker can be deployed to Cloudflare Workers or run locally via Miniflare.
5
+ * It exposes expect, should, assert, and a test runner via Workers RPC.
6
+ *
7
+ * Uses Cloudflare Workers RPC (WorkerEntrypoint, RpcTarget) for communication.
8
+ */
9
+ import { WorkerEntrypoint, RpcTarget } from 'cloudflare:workers';
10
+ import { Assertion } from './assertions.js';
11
+ import { TestRunner } from './runner.js';
12
+ /**
13
+ * Core test service - extends RpcTarget so it can be passed over RPC
14
+ *
15
+ * Contains all test functionality: assertions (expect, should, assert)
16
+ * and test runner (describe, it, test, hooks)
17
+ */
18
+ export declare class TestServiceCore extends RpcTarget {
19
+ protected runner: TestRunner;
20
+ constructor();
21
+ expect(value: unknown, message?: string): Assertion;
22
+ should(value: unknown): Assertion;
23
+ get assert(): Chai.AssertStatic;
24
+ describe(name: string, fn: () => void): void;
25
+ it(name: string, fn: () => void | Promise<void>): void;
26
+ test(name: string, fn: () => void | Promise<void>): void;
27
+ skip(name: string, fn?: () => void | Promise<void>): void;
28
+ only(name: string, fn: () => void | Promise<void>): void;
29
+ beforeEach(fn: () => void | Promise<void>): void;
30
+ afterEach(fn: () => void | Promise<void>): void;
31
+ beforeAll(fn: () => void | Promise<void>): void;
32
+ afterAll(fn: () => void | Promise<void>): void;
33
+ run(): Promise<import("./types.js").TestResults>;
34
+ reset(): void;
35
+ createRunner(): TestRunner;
36
+ }
37
+ /**
38
+ * Main test service exposed via RPC as WorkerEntrypoint
39
+ *
40
+ * Usage:
41
+ * const tests = await env.TEST.connect()
42
+ * tests.expect(1).to.equal(1)
43
+ * tests.describe('suite', () => { ... })
44
+ * const results = await tests.run()
45
+ */
46
+ export declare class TestService extends WorkerEntrypoint {
47
+ /**
48
+ * Get a test service instance - returns an RpcTarget that can be used directly
49
+ * This avoids boilerplate delegation and allows using `test` method name
50
+ */
51
+ connect(): TestServiceCore;
52
+ }
53
+ export default TestService;
54
+ export { TestService as TestWorker };
55
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,SAAS,EAA0B,MAAM,iBAAiB,CAAA;AACnE,OAAO,EAAE,UAAU,EAAgB,MAAM,aAAa,CAAA;AAEtD;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,SAAS,CAAC,MAAM,EAAE,UAAU,CAAA;;IAO5B,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAInD,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS;IAIjC,IAAI,MAAM,sBAET;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAI5C,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAItD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIxD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIzD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIxD,UAAU,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIhD,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI/C,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI/C,QAAQ,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIxC,GAAG;IAIT,KAAK,IAAI,IAAI;IAIb,YAAY,IAAI,UAAU;CAG3B;AAED;;;;;;;;GAQG;AACH,qBAAa,WAAY,SAAQ,gBAAgB;IAC/C;;;OAGG;IACH,OAAO,IAAI,eAAe;CAG3B;AAGD,eAAe,WAAW,CAAA;AAG1B,OAAO,EAAE,WAAW,IAAI,UAAU,EAAE,CAAA"}
package/dist/worker.js ADDED
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Test Worker - provides test utilities via RPC
3
+ *
4
+ * This worker can be deployed to Cloudflare Workers or run locally via Miniflare.
5
+ * It exposes expect, should, assert, and a test runner via Workers RPC.
6
+ *
7
+ * Uses Cloudflare Workers RPC (WorkerEntrypoint, RpcTarget) for communication.
8
+ */
9
+ import { WorkerEntrypoint, RpcTarget } from 'cloudflare:workers';
10
+ import { Assertion, expect, should, assert } from './assertions.js';
11
+ import { TestRunner, createRunner } from './runner.js';
12
+ /**
13
+ * Core test service - extends RpcTarget so it can be passed over RPC
14
+ *
15
+ * Contains all test functionality: assertions (expect, should, assert)
16
+ * and test runner (describe, it, test, hooks)
17
+ */
18
+ export class TestServiceCore extends RpcTarget {
19
+ runner;
20
+ constructor() {
21
+ super();
22
+ this.runner = createRunner();
23
+ }
24
+ expect(value, message) {
25
+ return expect(value, message);
26
+ }
27
+ should(value) {
28
+ return should(value);
29
+ }
30
+ get assert() {
31
+ return assert;
32
+ }
33
+ describe(name, fn) {
34
+ this.runner.describe(name, fn);
35
+ }
36
+ it(name, fn) {
37
+ this.runner.it(name, fn);
38
+ }
39
+ test(name, fn) {
40
+ this.runner.test(name, fn);
41
+ }
42
+ skip(name, fn) {
43
+ this.runner.skip(name, fn);
44
+ }
45
+ only(name, fn) {
46
+ this.runner.only(name, fn);
47
+ }
48
+ beforeEach(fn) {
49
+ this.runner.beforeEach(fn);
50
+ }
51
+ afterEach(fn) {
52
+ this.runner.afterEach(fn);
53
+ }
54
+ beforeAll(fn) {
55
+ this.runner.beforeAll(fn);
56
+ }
57
+ afterAll(fn) {
58
+ this.runner.afterAll(fn);
59
+ }
60
+ async run() {
61
+ return this.runner.run();
62
+ }
63
+ reset() {
64
+ this.runner.reset();
65
+ }
66
+ createRunner() {
67
+ return createRunner();
68
+ }
69
+ }
70
+ /**
71
+ * Main test service exposed via RPC as WorkerEntrypoint
72
+ *
73
+ * Usage:
74
+ * const tests = await env.TEST.connect()
75
+ * tests.expect(1).to.equal(1)
76
+ * tests.describe('suite', () => { ... })
77
+ * const results = await tests.run()
78
+ */
79
+ export class TestService extends WorkerEntrypoint {
80
+ /**
81
+ * Get a test service instance - returns an RpcTarget that can be used directly
82
+ * This avoids boilerplate delegation and allows using `test` method name
83
+ */
84
+ connect() {
85
+ return new TestServiceCore();
86
+ }
87
+ }
88
+ // Export as default for WorkerEntrypoint pattern
89
+ export default TestService;
90
+ // Export aliases
91
+ export { TestService as TestWorker };
92
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAEtD;;;;;GAKG;AACH,MAAM,OAAO,eAAgB,SAAQ,SAAS;IAClC,MAAM,CAAY;IAE5B;QACE,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,MAAM,GAAG,YAAY,EAAE,CAAA;IAC9B,CAAC;IAED,MAAM,CAAC,KAAc,EAAE,OAAgB;QACrC,OAAO,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC/B,CAAC;IAED,MAAM,CAAC,KAAc;QACnB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,MAAM,CAAA;IACf,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,EAAc;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAChC,CAAC;IAED,EAAE,CAAC,IAAY,EAAE,EAA8B;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC1B,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,EAA8B;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC5B,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,EAA+B;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC5B,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,EAA8B;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC5B,CAAC;IAED,UAAU,CAAC,EAA8B;QACvC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;IAC5B,CAAC;IAED,SAAS,CAAC,EAA8B;QACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IAC3B,CAAC;IAED,SAAS,CAAC,EAA8B;QACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IAC3B,CAAC;IAED,QAAQ,CAAC,EAA8B;QACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,GAAG;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IACrB,CAAC;IAED,YAAY;QACV,OAAO,YAAY,EAAE,CAAA;IACvB,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,WAAY,SAAQ,gBAAgB;IAC/C;;;OAGG;IACH,OAAO;QACL,OAAO,IAAI,eAAe,EAAE,CAAA;IAC9B,CAAC;CACF;AAED,iDAAiD;AACjD,eAAe,WAAW,CAAA;AAE1B,iBAAiB;AACjB,OAAO,EAAE,WAAW,IAAI,UAAU,EAAE,CAAA"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "ai-tests",
3
+ "version": "2.0.1",
4
+ "description": "Test utilities worker - expect, should, assert, describe, it via RPC",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "ai-tests": "./dist/cli.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ },
16
+ "./worker": {
17
+ "import": "./dist/worker.js",
18
+ "types": "./dist/worker.d.ts"
19
+ },
20
+ "./local": {
21
+ "import": "./dist/local.js",
22
+ "types": "./dist/local.d.ts"
23
+ }
24
+ },
25
+ "scripts": {
26
+ "build": "tsc -p tsconfig.json",
27
+ "dev": "tsc -p tsconfig.json --watch",
28
+ "test": "vitest",
29
+ "typecheck": "tsc --noEmit",
30
+ "lint": "eslint .",
31
+ "clean": "rm -rf dist",
32
+ "deploy": "wrangler deploy"
33
+ },
34
+ "dependencies": {
35
+ "chai": "^5.1.0",
36
+ "rpc.do": "^0.1.0"
37
+ },
38
+ "devDependencies": {
39
+ "@cloudflare/vitest-pool-workers": "^0.8.0",
40
+ "@cloudflare/workers-types": "^4.20250109.0",
41
+ "@types/chai": "^5.2.0",
42
+ "vitest": "^2.1.0"
43
+ },
44
+ "optionalDependencies": {
45
+ "miniflare": "^3.20241106.0"
46
+ },
47
+ "keywords": [
48
+ "ai",
49
+ "test",
50
+ "chai",
51
+ "expect",
52
+ "assert",
53
+ "workers",
54
+ "rpc",
55
+ "primitives"
56
+ ],
57
+ "license": "MIT"
58
+ }