@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 +10 -0
- package/dist/auth/acting-as.d.ts +21 -0
- package/dist/auth/acting-as.d.ts.map +1 -0
- package/dist/auth/acting-as.js +68 -0
- package/dist/auth/acting-as.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/core/http/test-http-request.d.ts +16 -0
- package/dist/core/http/test-http-request.d.ts.map +1 -1
- package/dist/core/http/test-http-request.js +31 -0
- package/dist/core/http/test-http-request.js.map +1 -1
- package/dist/core/testing-module.d.ts +33 -11
- package/dist/core/testing-module.d.ts.map +1 -1
- package/dist/core/testing-module.js +90 -11
- package/dist/core/testing-module.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mocks/index.d.ts +0 -1
- package/dist/mocks/index.d.ts.map +1 -1
- package/dist/mocks/index.js +0 -1
- package/dist/mocks/index.js.map +1 -1
- package/dist/mocks/zenstack-language.d.ts +46 -0
- package/dist/mocks/zenstack-language.d.ts.map +1 -0
- package/dist/mocks/zenstack-language.js +47 -0
- package/dist/mocks/zenstack-language.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +20 -5
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 @@
|
|
|
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 @@
|
|
|
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":"
|
|
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
|
|
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,
|
|
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":"
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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"}
|
package/dist/mocks/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mocks/index.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/mocks/index.js
CHANGED
package/dist/mocks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mocks/index.ts"],"names":[],"mappings":"AAAA,
|
|
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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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.
|
|
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.
|
|
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.
|
|
78
|
+
"@cloudflare/workers-types": "4.20260305.0",
|
|
79
|
+
"@stratal/framework": "0.0.5",
|
|
66
80
|
"@types/node": "^25.3.2",
|
|
67
|
-
"
|
|
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
|
}
|