@stratal/testing 0.0.4 → 0.0.5

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/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @stratal/testing
2
2
 
3
+ ## 0.0.5
4
+
5
+ ### Patch Changes
6
+
7
+ - [#66](https://github.com/strataljs/stratal/pull/66) [`c8ea964`](https://github.com/strataljs/stratal/commit/c8ea964e272b09ebc6619843e77d2b51178f9423) Thanks [@adesege](https://github.com/adesege)! - Add `actingAs` auth test helper, `TestHttpRequest` builder, ZenStack language mock, and enhanced `TestingModule` utilities with new exports and types.
8
+
9
+ - Updated dependencies [[`c8ea964`](https://github.com/strataljs/stratal/commit/c8ea964e272b09ebc6619843e77d2b51178f9423), [`c8ea964`](https://github.com/strataljs/stratal/commit/c8ea964e272b09ebc6619843e77d2b51178f9423)]:
10
+ - stratal@0.0.5
11
+ - @stratal/framework@0.0.5
12
+
3
13
  ## 0.0.4
4
14
 
5
15
  ### Patch Changes
@@ -0,0 +1,21 @@
1
+ import type { AuthService } from '@stratal/framework/auth';
2
+ /**
3
+ * ActingAs
4
+ *
5
+ * Creates authentication sessions for testing.
6
+ * Uses Better Auth's internalAdapter to create real database sessions.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * const actingAs = new ActingAs(authService)
11
+ * const headers = await actingAs.createSessionForUser({ id: 'user-123' })
12
+ * ```
13
+ */
14
+ export declare class ActingAs {
15
+ private readonly authService;
16
+ constructor(authService: AuthService);
17
+ createSessionForUser(user: {
18
+ id: string;
19
+ }): Promise<Headers>;
20
+ }
21
+ //# sourceMappingURL=acting-as.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acting-as.d.ts","sourceRoot":"","sources":["../../src/auth/acting-as.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAwB1D;;;;;;;;;;;GAWG;AACH,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,WAAW;IAE/C,oBAAoB,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAkCnE"}
@@ -0,0 +1,68 @@
1
+ import { setSessionCookie } from 'better-auth/cookies';
2
+ import { convertSetCookieToCookie } from 'better-auth/test';
3
+ async function makeSignature(value, secret) {
4
+ const algorithm = { name: 'HMAC', hash: 'SHA-256' };
5
+ const secretBuf = new TextEncoder().encode(secret);
6
+ const key = await crypto.subtle.importKey('raw', secretBuf, algorithm, false, ['sign']);
7
+ const signature = await crypto.subtle.sign(algorithm.name, key, new TextEncoder().encode(value));
8
+ return btoa(String.fromCharCode(...new Uint8Array(signature)));
9
+ }
10
+ function buildCookieString(name, value, options = {}) {
11
+ const encodedValue = encodeURIComponent(value);
12
+ let str = `${name}=${encodedValue}`;
13
+ if (options.path)
14
+ str += `; Path=${options.path}`;
15
+ if (options.httpOnly)
16
+ str += '; HttpOnly';
17
+ if (options.secure)
18
+ str += '; Secure';
19
+ if (options.sameSite)
20
+ str += `; SameSite=${options.sameSite}`;
21
+ if (options.maxAge !== undefined)
22
+ str += `; Max-Age=${Math.floor(options.maxAge)}`;
23
+ return str;
24
+ }
25
+ /**
26
+ * ActingAs
27
+ *
28
+ * Creates authentication sessions for testing.
29
+ * Uses Better Auth's internalAdapter to create real database sessions.
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * const actingAs = new ActingAs(authService)
34
+ * const headers = await actingAs.createSessionForUser({ id: 'user-123' })
35
+ * ```
36
+ */
37
+ export class ActingAs {
38
+ authService;
39
+ constructor(authService) {
40
+ this.authService = authService;
41
+ }
42
+ async createSessionForUser(user) {
43
+ const auth = this.authService.auth;
44
+ const ctx = await auth.$context;
45
+ const secret = ctx.secret;
46
+ const session = await ctx.internalAdapter.createSession(user.id, undefined, { ipAddress: '127.0.0.1', userAgent: 'test-client' });
47
+ const dbUser = await ctx.internalAdapter.findUserById(user.id);
48
+ if (!dbUser) {
49
+ throw new Error(`User not found: ${user.id}`);
50
+ }
51
+ const responseHeaders = new Headers();
52
+ const mockCtx = {
53
+ context: ctx,
54
+ getSignedCookie: () => null,
55
+ setSignedCookie: async (name, value, _secret, options = {}) => {
56
+ const signature = await makeSignature(value, secret);
57
+ const signedValue = `${value}.${signature}`;
58
+ responseHeaders.append('Set-Cookie', buildCookieString(name, signedValue, options));
59
+ },
60
+ setCookie: (name, value, options = {}) => {
61
+ responseHeaders.append('Set-Cookie', buildCookieString(name, value, options));
62
+ },
63
+ };
64
+ await setSessionCookie(mockCtx, { session, user: dbUser }, false);
65
+ return convertSetCookieToCookie(responseHeaders);
66
+ }
67
+ }
68
+ //# sourceMappingURL=acting-as.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acting-as.js","sourceRoot":"","sources":["../../src/auth/acting-as.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { ActingAs } from './acting-as';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { ActingAs } from './acting-as';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA"}
@@ -13,6 +13,14 @@ import { TestResponse } from './test-response';
13
13
  * .withHeaders({ 'X-Custom': 'value' })
14
14
  * .send()
15
15
  * ```
16
+ *
17
+ * @example Authenticated request
18
+ * ```typescript
19
+ * const response = await module.http
20
+ * .get('/api/v1/profile')
21
+ * .actingAs({ id: user.id })
22
+ * .send()
23
+ * ```
16
24
  */
17
25
  export declare class TestHttpRequest {
18
26
  private readonly method;
@@ -21,6 +29,7 @@ export declare class TestHttpRequest {
21
29
  private readonly host;
22
30
  private body;
23
31
  private requestHeaders;
32
+ private actingAsUser;
24
33
  constructor(method: string, path: string, headers: Headers, module: TestingModule, host?: string | null);
25
34
  /**
26
35
  * Set the request body
@@ -34,11 +43,18 @@ export declare class TestHttpRequest {
34
43
  * Set Content-Type to application/json
35
44
  */
36
45
  asJson(): this;
46
+ /**
47
+ * Authenticate the request as a specific user
48
+ */
49
+ actingAs(user: {
50
+ id: string;
51
+ }): this;
37
52
  /**
38
53
  * Send the request and return response
39
54
  *
40
55
  * Calls module.fetch() - NOT SELF.fetch()
41
56
  */
42
57
  send(): Promise<TestResponse>;
58
+ private applyAuthentication;
43
59
  }
44
60
  //# sourceMappingURL=test-http-request.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-http-request.d.ts","sourceRoot":"","sources":["../../../src/core/http/test-http-request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAe;IAK1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAErB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IARtB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,cAAc,CAAS;gBAGb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAC7B,OAAO,EAAE,OAAO,EACC,MAAM,EAAE,aAAa,EACrB,IAAI,GAAE,MAAM,GAAG,IAAW;IAK5C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAK7B;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAOlD;;OAEG;IACH,MAAM,IAAI,IAAI;IAKd;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;CAkBnC"}
1
+ {"version":3,"file":"test-http-request.d.ts","sourceRoot":"","sources":["../../../src/core/http/test-http-request.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,eAAe;IAM1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAErB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IATtB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAA8B;gBAGhC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAC7B,OAAO,EAAE,OAAO,EACC,MAAM,EAAE,aAAa,EACrB,IAAI,GAAE,MAAM,GAAG,IAAW;IAK5C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAK7B;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAOlD;;OAEG;IACH,MAAM,IAAI,IAAI;IAKd;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAKpC;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;YAqBrB,mBAAmB;CAajC"}
@@ -1,3 +1,5 @@
1
+ import { AUTH_SERVICE } from '@stratal/framework/auth';
2
+ import { ActingAs } from '../../auth';
1
3
  import { TestResponse } from './test-response';
2
4
  /**
3
5
  * TestHttpRequest
@@ -12,6 +14,14 @@ import { TestResponse } from './test-response';
12
14
  * .withHeaders({ 'X-Custom': 'value' })
13
15
  * .send()
14
16
  * ```
17
+ *
18
+ * @example Authenticated request
19
+ * ```typescript
20
+ * const response = await module.http
21
+ * .get('/api/v1/profile')
22
+ * .actingAs({ id: user.id })
23
+ * .send()
24
+ * ```
15
25
  */
16
26
  export class TestHttpRequest {
17
27
  method;
@@ -20,6 +30,7 @@ export class TestHttpRequest {
20
30
  host;
21
31
  body = null;
22
32
  requestHeaders;
33
+ actingAsUser = null;
23
34
  constructor(method, path, headers, module, host = null) {
24
35
  this.method = method;
25
36
  this.path = path;
@@ -50,12 +61,20 @@ export class TestHttpRequest {
50
61
  this.requestHeaders.set('Content-Type', 'application/json');
51
62
  return this;
52
63
  }
64
+ /**
65
+ * Authenticate the request as a specific user
66
+ */
67
+ actingAs(user) {
68
+ this.actingAsUser = user;
69
+ return this;
70
+ }
53
71
  /**
54
72
  * Send the request and return response
55
73
  *
56
74
  * Calls module.fetch() - NOT SELF.fetch()
57
75
  */
58
76
  async send() {
77
+ await this.applyAuthentication();
59
78
  // Auto-set Content-Type for body
60
79
  if (this.body && !this.requestHeaders.has('Content-Type')) {
61
80
  this.requestHeaders.set('Content-Type', 'application/json');
@@ -71,5 +90,17 @@ export class TestHttpRequest {
71
90
  const response = await this.module.fetch(request);
72
91
  return new TestResponse(response);
73
92
  }
93
+ async applyAuthentication() {
94
+ if (!this.actingAsUser)
95
+ return;
96
+ await this.module.runInRequestScope(async () => {
97
+ const authService = this.module.get(AUTH_SERVICE);
98
+ const actingAs = new ActingAs(authService);
99
+ const authHeaders = this.actingAsUser ? await actingAs.createSessionForUser(this.actingAsUser) : new Headers();
100
+ for (const [key, value] of authHeaders.entries()) {
101
+ this.requestHeaders.set(key, value);
102
+ }
103
+ });
104
+ }
74
105
  }
75
106
  //# sourceMappingURL=test-http-request.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-http-request.js","sourceRoot":"","sources":["../../../src/core/http/test-http-request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,eAAe;IAKT;IACA;IAEA;IACA;IARV,IAAI,GAAY,IAAI,CAAA;IACpB,cAAc,CAAS;IAE/B,YACkB,MAAc,EACd,IAAY,EAC7B,OAAgB,EACC,MAAqB,EACrB,OAAsB,IAAI;QAJ1B,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QAEZ,WAAM,GAAN,MAAM,CAAe;QACrB,SAAI,GAAJ,IAAI,CAAsB;QAE3C,IAAI,CAAC,cAAc,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3C,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAa;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,OAAO,IAAI,CAAA;IACZ,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAA+B;QAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACpC,CAAC;QACD,OAAO,IAAI,CAAA;IACZ,CAAC;IAED;;OAEG;IACH,MAAM;QACL,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;QAC3D,OAAO,IAAI,CAAA;IACZ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI;QACT,iCAAiC;QACjC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;QAC5D,CAAC;QAED,gBAAgB;QAChB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,IAAI,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAA;QACpE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC3C,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,cAAc;YAC5B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;SAClD,CAAC,CAAA;QAEF,wCAAwC;QACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACjD,OAAO,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAA;IAClC,CAAC;CACD"}
1
+ {"version":3,"file":"test-http-request.js","sourceRoot":"","sources":["../../../src/core/http/test-http-request.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
+ import type { ConnectionName, DatabaseService } from '@stratal/framework/database';
1
2
  import type { Application, StratalEnv } from 'stratal';
2
3
  import { type Container } from 'stratal/di';
3
4
  import { type InjectionToken } from 'stratal/module';
4
5
  import type { FakeStorageService } from '../storage';
6
+ import type { Seeder } from '../types';
5
7
  import { TestHttpClient } from './http/test-http-client';
6
8
  /**
7
9
  * TestingModule
@@ -23,6 +25,11 @@ import { TestHttpClient } from './http/test-http-client';
23
25
  * // Access services
24
26
  * const service = module.get(REGISTRATION_TOKENS.RegistrationService)
25
27
  *
28
+ * // Database utilities
29
+ * await module.truncateDb()
30
+ * await module.seed(new UserSeeder())
31
+ * await module.assertDatabaseHas('user', { email: 'test@example.com' })
32
+ *
26
33
  * // Cleanup
27
34
  * await module.close()
28
35
  * ```
@@ -42,15 +49,6 @@ export declare class TestingModule {
42
49
  get http(): TestHttpClient;
43
50
  /**
44
51
  * Get fake storage service for assertions
45
- *
46
- * Provides assertion helpers for testing file storage operations.
47
- *
48
- * @example
49
- * ```typescript
50
- * module.storage.assertExists('path/to/file.pdf')
51
- * module.storage.assertMissing('deleted/file.pdf')
52
- * module.storage.clear() // Reset between tests
53
- * ```
54
52
  */
55
53
  get storage(): FakeStorageService;
56
54
  /**
@@ -63,14 +61,38 @@ export declare class TestingModule {
63
61
  get container(): Container;
64
62
  /**
65
63
  * Execute an HTTP request through RouterService
66
- *
67
- * This is the core method - calls RouterService.fetch() directly, no SELF.fetch()
68
64
  */
69
65
  fetch(request: Request): Promise<Response>;
70
66
  /**
71
67
  * Run callback in request scope (for DB operations, service access)
72
68
  */
73
69
  runInRequestScope<T>(callback: () => T | Promise<T>): Promise<T>;
70
+ /**
71
+ * Get database service instance (resolved in request scope)
72
+ */
73
+ getDb(): Promise<DatabaseService>;
74
+ getDb<K extends ConnectionName>(name: K): Promise<DatabaseService<K>>;
75
+ /**
76
+ * Truncate all non-prisma tables in the database
77
+ */
78
+ truncateDb(name?: ConnectionName): Promise<void>;
79
+ /**
80
+ * Run seeders in a database transaction
81
+ */
82
+ seed(...seeders: Seeder[]): Promise<void>;
83
+ seed(name: ConnectionName, ...seeders: Seeder[]): Promise<void>;
84
+ /**
85
+ * Assert that a record exists in the database
86
+ */
87
+ assertDatabaseHas(table: string, data: Record<string, unknown>, name?: ConnectionName): Promise<void>;
88
+ /**
89
+ * Assert that a record does not exist in the database
90
+ */
91
+ assertDatabaseMissing(table: string, data: Record<string, unknown>, name?: ConnectionName): Promise<void>;
92
+ /**
93
+ * Assert the number of records in a table
94
+ */
95
+ assertDatabaseCount(table: string, expected: number, name?: ConnectionName): Promise<void>;
74
96
  /**
75
97
  * Cleanup - call in afterAll
76
98
  */
@@ -1 +1 @@
1
- {"version":3,"file":"testing-module.d.ts","sourceRoot":"","sources":["../../src/core/testing-module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACtD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAGpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,aAAa;IAItB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJtB,OAAO,CAAC,KAAK,CAA8B;gBAGxB,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,UAAU;IAGlC;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC;IAInC;;OAEG;IACH,IAAI,IAAI,IAAI,cAAc,CAGzB;IAED;;;;;;;;;;;OAWG;IACH,IAAI,OAAO,IAAI,kBAAkB,CAEhC;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,WAAW,CAE7B;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED;;;;OAIG;IACG,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAKhD;;OAEG;IACG,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAKtE;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
1
+ {"version":3,"file":"testing-module.d.ts","sourceRoot":"","sources":["../../src/core/testing-module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAElF,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACtD,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAGpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,aAAa;IAItB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJtB,OAAO,CAAC,KAAK,CAA8B;gBAGxB,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,UAAU;IAGlC;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC;IAInC;;OAEG;IACH,IAAI,IAAI,IAAI,cAAc,CAGzB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,kBAAkB,CAEhC;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,WAAW,CAE7B;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAKhD;;OAEG;IACG,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAKtE;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC;IACjC,KAAK,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAQ3E;;OAEG;IACG,UAAU,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAetD;;OAEG;IACG,IAAI,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBrE;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3G;;OAEG;IACG,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/G;;OAEG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhG;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -1,3 +1,5 @@
1
+ import { connectionSymbol } from '@stratal/framework/database';
2
+ import { DI_TOKENS } from 'stratal/di';
1
3
  import { ROUTER_TOKENS } from 'stratal/router';
2
4
  import { STORAGE_TOKENS } from 'stratal/storage';
3
5
  import { TestHttpClient } from './http/test-http-client';
@@ -21,6 +23,11 @@ import { TestHttpClient } from './http/test-http-client';
21
23
  * // Access services
22
24
  * const service = module.get(REGISTRATION_TOKENS.RegistrationService)
23
25
  *
26
+ * // Database utilities
27
+ * await module.truncateDb()
28
+ * await module.seed(new UserSeeder())
29
+ * await module.assertDatabaseHas('user', { email: 'test@example.com' })
30
+ *
24
31
  * // Cleanup
25
32
  * await module.close()
26
33
  * ```
@@ -48,15 +55,6 @@ export class TestingModule {
48
55
  }
49
56
  /**
50
57
  * Get fake storage service for assertions
51
- *
52
- * Provides assertion helpers for testing file storage operations.
53
- *
54
- * @example
55
- * ```typescript
56
- * module.storage.assertExists('path/to/file.pdf')
57
- * module.storage.assertMissing('deleted/file.pdf')
58
- * module.storage.clear() // Reset between tests
59
- * ```
60
58
  */
61
59
  get storage() {
62
60
  return this.get(STORAGE_TOKENS.StorageService);
@@ -75,8 +73,6 @@ export class TestingModule {
75
73
  }
76
74
  /**
77
75
  * Execute an HTTP request through RouterService
78
- *
79
- * This is the core method - calls RouterService.fetch() directly, no SELF.fetch()
80
76
  */
81
77
  async fetch(request) {
82
78
  const router = this.get(ROUTER_TOKENS.RouterService);
@@ -89,6 +85,89 @@ export class TestingModule {
89
85
  const mockContext = this.app.createMockRouterContext();
90
86
  return this.app.container.runInRequestScope(mockContext, callback);
91
87
  }
88
+ async getDb(name) {
89
+ return this.runInRequestScope(() => {
90
+ const token = name ? connectionSymbol(name) : DI_TOKENS.Database;
91
+ return this.get(token);
92
+ });
93
+ }
94
+ /**
95
+ * Truncate all non-prisma tables in the database
96
+ */
97
+ async truncateDb(name) {
98
+ await this.runInRequestScope(async () => {
99
+ const token = name ? connectionSymbol(name) : DI_TOKENS.Database;
100
+ const db = this.get(token);
101
+ const tables = await db.$queryRaw `
102
+ SELECT tablename::text as tablename FROM pg_tables
103
+ WHERE schemaname = current_schema()
104
+ AND tablename NOT LIKE '_prisma%'
105
+ `;
106
+ if (tables.length === 0)
107
+ return;
108
+ const tableList = tables.map((t) => `"${t.tablename}"`).join(', ');
109
+ await db.$executeRawUnsafe(`TRUNCATE ${tableList} RESTART IDENTITY CASCADE`);
110
+ });
111
+ }
112
+ async seed(...args) {
113
+ let name;
114
+ let seeders;
115
+ if (typeof args[0] === 'string') {
116
+ name = args[0];
117
+ seeders = args.slice(1);
118
+ }
119
+ else {
120
+ seeders = args;
121
+ }
122
+ await this.runInRequestScope(async () => {
123
+ const token = name ? connectionSymbol(name) : DI_TOKENS.Database;
124
+ const db = this.get(token);
125
+ await db.$transaction(async (tx) => {
126
+ for (const seeder of seeders) {
127
+ await seeder.run(tx);
128
+ }
129
+ });
130
+ });
131
+ }
132
+ /**
133
+ * Assert that a record exists in the database
134
+ */
135
+ async assertDatabaseHas(table, data, name) {
136
+ const { expect } = await import('vitest');
137
+ await this.runInRequestScope(async () => {
138
+ const token = name ? connectionSymbol(name) : DI_TOKENS.Database;
139
+ const db = this.get(token);
140
+ const model = db[table];
141
+ const result = await model.findFirst({ where: data });
142
+ expect(result, `Expected ${table} with ${JSON.stringify(data)}`).not.toBeNull();
143
+ });
144
+ }
145
+ /**
146
+ * Assert that a record does not exist in the database
147
+ */
148
+ async assertDatabaseMissing(table, data, name) {
149
+ const { expect } = await import('vitest');
150
+ await this.runInRequestScope(async () => {
151
+ const token = name ? connectionSymbol(name) : DI_TOKENS.Database;
152
+ const db = this.get(token);
153
+ const model = db[table];
154
+ const result = await model.findFirst({ where: data });
155
+ expect(result, `Expected ${table} NOT to have ${JSON.stringify(data)}`).toBeNull();
156
+ });
157
+ }
158
+ /**
159
+ * Assert the number of records in a table
160
+ */
161
+ async assertDatabaseCount(table, expected, name) {
162
+ const { expect } = await import('vitest');
163
+ await this.runInRequestScope(async () => {
164
+ const token = name ? connectionSymbol(name) : DI_TOKENS.Database;
165
+ const db = this.get(token);
166
+ const model = db[table];
167
+ const actual = await model.count();
168
+ expect(actual, `Expected ${table} count ${expected}, got ${actual}`).toBe(expected);
169
+ });
170
+ }
92
171
  /**
93
172
  * Cleanup - call in afterAll
94
173
  */
@@ -1 +1 @@
1
- {"version":3,"file":"testing-module.js","sourceRoot":"","sources":["../../src/core/testing-module.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAsB,MAAM,gBAAgB,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,OAAO,aAAa;IAIL;IACA;IAJX,KAAK,GAA0B,IAAI,CAAA;IAE3C,YACmB,GAAgB,EAChB,GAAe;QADf,QAAG,GAAH,GAAG,CAAa;QAChB,QAAG,GAAH,GAAG,CAAY;IAC9B,CAAC;IAEL;;OAEG;IACH,GAAG,CAAI,KAAwB;QAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC1C,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,IAAI,CAAC,KAAK,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,CAAA;QACvC,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,CAAqB,cAAc,CAAC,cAAc,CAAC,CAAA;IACpE,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAA;IAC3B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,OAAgB;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAgB,aAAa,CAAC,aAAa,CAAC,CAAA;QACnE,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACtD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAI,QAA8B;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAA;QACtD,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IACpE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC;CACF"}
1
+ {"version":3,"file":"testing-module.js","sourceRoot":"","sources":["../../src/core/testing-module.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -7,7 +7,9 @@ export type { MockErrorOptions, MockJsonOptions } from './core/http/fetch-mock.t
7
7
  export { TestHttpClient } from './core/http/test-http-client';
8
8
  export { TestHttpRequest } from './core/http/test-http-request';
9
9
  export { TestResponse } from './core/http/test-response';
10
+ export { ActingAs } from './auth';
10
11
  export { FakeStorageService, type StoredFile } from './storage';
12
+ export { Seeder } from './types';
11
13
  export { getTestEnv } from './core/env';
12
14
  export { TestError, TestSetupError } from './errors';
13
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,KAAK,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACtF,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAG9F,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACnE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAGxD,OAAO,EAAE,kBAAkB,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAA;AAG/D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAGvC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,KAAK,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACtF,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAG9F,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACnE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAGxD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAGjC,OAAO,EAAE,kBAAkB,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAA;AAG/D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAGhC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAGvC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA"}
package/dist/index.js CHANGED
@@ -8,8 +8,12 @@ export { createFetchMock, FetchMock } from './core/http/fetch-mock';
8
8
  export { TestHttpClient } from './core/http/test-http-client';
9
9
  export { TestHttpRequest } from './core/http/test-http-request';
10
10
  export { TestResponse } from './core/http/test-response';
11
+ // Auth
12
+ export { ActingAs } from './auth';
11
13
  // Storage
12
14
  export { FakeStorageService } from './storage';
15
+ // Types
16
+ export { Seeder } from './types';
13
17
  // Environment utilities
14
18
  export { getTestEnv } from './core/env';
15
19
  // Errors
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,uBAAuB,EAA+B,MAAM,iBAAiB,CAAA;AACtF,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAA4B,MAAM,+BAA+B,CAAA;AAE9F,eAAe;AACf,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,UAAU;AACV,OAAO,EAAE,kBAAkB,EAAmB,MAAM,WAAW,CAAA;AAE/D,wBAAwB;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,uBAAuB,EAA+B,MAAM,iBAAiB,CAAA;AACtF,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAA4B,MAAM,+BAA+B,CAAA;AAE9F,eAAe;AACf,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,OAAO;AACP,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,UAAU;AACV,OAAO,EAAE,kBAAkB,EAAmB,MAAM,WAAW,CAAA;AAE/D,QAAQ;AACR,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEhC,wBAAwB;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA"}
@@ -1,4 +1,3 @@
1
- export * from './nodemailer';
2
1
  export { createMock } from '@golevelup/ts-vitest';
3
2
  export type { DeepMocked, PartialFuncReturn } from '@golevelup/ts-vitest';
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mocks/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAG5B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mocks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -1,4 +1,3 @@
1
- export * from './nodemailer';
2
1
  // Deep mocking utilities from @golevelup/ts-vitest
3
2
  export { createMock } from '@golevelup/ts-vitest';
4
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mocks/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAE5B,mDAAmD;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mocks/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Mock for @zenstackhq/language package
3
+ *
4
+ * The @zenstackhq/language package depends on vscode-languageserver which is
5
+ * incompatible with Cloudflare Workers runtime. These exports are only used
6
+ * for schema generation (CLI functionality), not runtime authentication.
7
+ *
8
+ * This mock provides stub implementations to allow tests to run in vitest-pool-workers.
9
+ */
10
+ export declare const formatDocument: (content: string) => string;
11
+ export declare const loadDocument: (_path: string) => {
12
+ success: boolean;
13
+ errors: string[];
14
+ };
15
+ export declare class ZModelCodeGenerator {
16
+ generate(_model: unknown): string;
17
+ }
18
+ export declare const isDataModel: (_item: unknown) => boolean;
19
+ export declare const isAttribute: (_item: unknown) => boolean;
20
+ export declare const isAbstractDeclaration: (_item: unknown) => boolean;
21
+ export declare const isExpression: (_item: unknown) => boolean;
22
+ export declare const isLiteralExpr: (_item: unknown) => boolean;
23
+ export declare const isArrayExpr: (_item: unknown) => boolean;
24
+ export declare const isAttributeArg: (_item: unknown) => boolean;
25
+ export declare const isBinaryExpr: (_item: unknown) => boolean;
26
+ export declare const isBooleanLiteral: (_item: unknown) => boolean;
27
+ export declare const isConfigArrayExpr: (_item: unknown) => boolean;
28
+ export declare const isConfigField: (_item: unknown) => boolean;
29
+ export declare const isDataField: (_item: unknown) => boolean;
30
+ export declare const isDataFieldAttribute: (_item: unknown) => boolean;
31
+ export declare const isDataFieldType: (_item: unknown) => boolean;
32
+ export declare const isDataModelAttribute: (_item: unknown) => boolean;
33
+ export declare const hasAttribute: (_node: unknown, _name?: string) => boolean;
34
+ declare const _default: {
35
+ formatDocument: (content: string) => string;
36
+ loadDocument: (_path: string) => {
37
+ success: boolean;
38
+ errors: string[];
39
+ };
40
+ ZModelCodeGenerator: typeof ZModelCodeGenerator;
41
+ isDataModel: (_item: unknown) => boolean;
42
+ isAttribute: (_item: unknown) => boolean;
43
+ hasAttribute: (_node: unknown, _name?: string) => boolean;
44
+ };
45
+ export default _default;
46
+ //# sourceMappingURL=zenstack-language.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zenstack-language.d.ts","sourceRoot":"","sources":["../../src/mocks/zenstack-language.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,WAAY,CAAA;AAE1D,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM;;;CAGxC,CAAA;AAEF,qBAAa,mBAAmB;IAC/B,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM;CAGjC;AAGD,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC7D,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC7D,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AACvE,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC9D,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC/D,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC7D,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAChE,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC9D,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAClE,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AACnE,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC/D,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAC7D,eAAO,MAAM,oBAAoB,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AACtE,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AACjE,eAAO,MAAM,oBAAoB,GAAI,OAAO,OAAO,KAAG,OAAgB,CAAA;AAGtE,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,EAAE,QAAQ,MAAM,KAAG,OAAgB,CAAA;;8BA/BtC,MAAM;0BAEV,MAAM;;;;;yBAYP,OAAO,KAAG,OAAO;yBACjB,OAAO,KAAG,OAAO;0BAgBhB,OAAO,UAAU,MAAM,KAAG,OAAO;;AAErE,wBAOC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Mock for @zenstackhq/language package
3
+ *
4
+ * The @zenstackhq/language package depends on vscode-languageserver which is
5
+ * incompatible with Cloudflare Workers runtime. These exports are only used
6
+ * for schema generation (CLI functionality), not runtime authentication.
7
+ *
8
+ * This mock provides stub implementations to allow tests to run in vitest-pool-workers.
9
+ */
10
+ // Main exports from @zenstackhq/language
11
+ export const formatDocument = (content) => content;
12
+ export const loadDocument = (_path) => ({
13
+ success: false,
14
+ errors: ['Mock: loadDocument not available in test environment'],
15
+ });
16
+ export class ZModelCodeGenerator {
17
+ generate(_model) {
18
+ return '';
19
+ }
20
+ }
21
+ // AST exports from @zenstackhq/language/ast
22
+ export const isDataModel = (_item) => false;
23
+ export const isAttribute = (_item) => false;
24
+ export const isAbstractDeclaration = (_item) => false;
25
+ export const isExpression = (_item) => false;
26
+ export const isLiteralExpr = (_item) => false;
27
+ export const isArrayExpr = (_item) => false;
28
+ export const isAttributeArg = (_item) => false;
29
+ export const isBinaryExpr = (_item) => false;
30
+ export const isBooleanLiteral = (_item) => false;
31
+ export const isConfigArrayExpr = (_item) => false;
32
+ export const isConfigField = (_item) => false;
33
+ export const isDataField = (_item) => false;
34
+ export const isDataFieldAttribute = (_item) => false;
35
+ export const isDataFieldType = (_item) => false;
36
+ export const isDataModelAttribute = (_item) => false;
37
+ // Utils exports from @zenstackhq/language/utils
38
+ export const hasAttribute = (_node, _name) => false;
39
+ export default {
40
+ formatDocument,
41
+ loadDocument,
42
+ ZModelCodeGenerator,
43
+ isDataModel,
44
+ isAttribute,
45
+ hasAttribute,
46
+ };
47
+ //# sourceMappingURL=zenstack-language.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zenstack-language.js","sourceRoot":"","sources":["../../src/mocks/zenstack-language.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,yCAAyC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAA;AAE1D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,CAAC,sDAAsD,CAAC;CAChE,CAAC,CAAA;AAEF,MAAM,OAAO,mBAAmB;IAC/B,QAAQ,CAAC,MAAe;QACvB,OAAO,EAAE,CAAA;IACV,CAAC;CACD;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC7D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AACvE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC9D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAChE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AACnE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AACtE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAEtE,gDAAgD;AAChD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAE,KAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAE9E,eAAe;IACd,cAAc;IACd,YAAY;IACZ,mBAAmB;IACnB,WAAW;IACX,WAAW;IACX,YAAY;CACZ,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { ConnectionName, DefaultConnectionName, DatabaseService } from '@stratal/framework/database';
2
+ export declare abstract class Seeder<K extends ConnectionName = DefaultConnectionName> {
3
+ abstract run(db: DatabaseService<K>): Promise<void>;
4
+ }
5
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAEzG,8BAAsB,MAAM,CAAC,CAAC,SAAS,cAAc,GAAG,qBAAqB;IAC3E,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CACpD"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ export class Seeder {
2
+ }
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,OAAgB,MAAM;CAE3B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stratal/testing",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "description": "Testing utilities and mocks for Stratal framework applications",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -44,6 +44,10 @@
44
44
  "./mocks/nodemailer": {
45
45
  "types": "./dist/mocks/nodemailer.d.ts",
46
46
  "import": "./dist/mocks/nodemailer.js"
47
+ },
48
+ "./mocks/zenstack-language": {
49
+ "types": "./dist/mocks/zenstack-language.d.ts",
50
+ "import": "./dist/mocks/zenstack-language.js"
47
51
  }
48
52
  },
49
53
  "scripts": {
@@ -53,18 +57,29 @@
53
57
  "lint:fix": "npx eslint --fix ."
54
58
  },
55
59
  "dependencies": {
56
- "@faker-js/faker": "^10.3.0",
57
60
  "@golevelup/ts-vitest": "^2.2.0"
58
61
  },
59
62
  "peerDependencies": {
60
- "stratal": "^0.0.4",
63
+ "@stratal/framework": "^0.0.5",
64
+ "better-auth": "^1.4.9",
65
+ "stratal": "^0.0.5",
61
66
  "vitest": "^3.2.0"
62
67
  },
68
+ "peerDependenciesMeta": {
69
+ "@stratal/framework": {
70
+ "optional": true
71
+ },
72
+ "better-auth": {
73
+ "optional": true
74
+ }
75
+ },
63
76
  "devDependencies": {
64
77
  "@cloudflare/vitest-pool-workers": "^0.12.18",
65
- "@cloudflare/workers-types": "4.20260228.1",
78
+ "@cloudflare/workers-types": "4.20260305.0",
79
+ "@stratal/framework": "0.0.5",
66
80
  "@types/node": "^25.3.2",
67
- "stratal": "0.0.4",
81
+ "better-auth": "^1.5.0",
82
+ "stratal": "0.0.5",
68
83
  "typescript": "^5.9.3",
69
84
  "vitest": "~3.2.0"
70
85
  }