@stratal/testing 0.0.14 → 0.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index-D-Q2cR2v.d.mts +118 -0
- package/dist/index-D-Q2cR2v.d.mts.map +1 -0
- package/dist/index.d.mts +73 -127
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +117 -217
- package/dist/index.mjs.map +1 -1
- package/dist/storage/index.d.mts +2 -0
- package/dist/storage/index.mjs +2 -0
- package/dist/storage-PcJUKxwp.mjs +206 -0
- package/dist/storage-PcJUKxwp.mjs.map +1 -0
- package/package.json +9 -3
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { DownloadResult, PresignedUrlResult, StorageConfig, StorageManagerService, StorageService, StreamingBlobPayloadInputTypes, UploadOptions, UploadResult } from "stratal/storage";
|
|
2
|
+
|
|
3
|
+
//#region src/storage/fake-storage.service.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Stored file representation in memory
|
|
6
|
+
*/
|
|
7
|
+
interface StoredFile {
|
|
8
|
+
content: Uint8Array;
|
|
9
|
+
mimeType: string;
|
|
10
|
+
size: number;
|
|
11
|
+
metadata?: Record<string, string>;
|
|
12
|
+
uploadedAt: Date;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* FakeStorageService
|
|
16
|
+
*
|
|
17
|
+
* In-memory storage implementation for testing.
|
|
18
|
+
* Registered by default in TestingModuleBuilder.
|
|
19
|
+
*
|
|
20
|
+
* Similar to Laravel's Storage::fake() - stores files in memory
|
|
21
|
+
* and provides assertion helpers for testing.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // Access via TestingModule
|
|
26
|
+
* module.storage.assertExists('path/to/file.pdf')
|
|
27
|
+
* module.storage.assertMissing('deleted/file.pdf')
|
|
28
|
+
* module.storage.clear() // Reset between tests
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
declare class FakeStorageService extends StorageService {
|
|
32
|
+
protected readonly storageManager: StorageManagerService;
|
|
33
|
+
protected readonly options: StorageConfig;
|
|
34
|
+
private files;
|
|
35
|
+
constructor(storageManager: StorageManagerService, options: StorageConfig);
|
|
36
|
+
/**
|
|
37
|
+
* Upload content to fake storage
|
|
38
|
+
*/
|
|
39
|
+
upload(body: StreamingBlobPayloadInputTypes, relativePath: string, options: UploadOptions, disk?: string): Promise<UploadResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Download a file from fake storage
|
|
42
|
+
*/
|
|
43
|
+
download(path: string): Promise<DownloadResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Delete a file from fake storage
|
|
46
|
+
*/
|
|
47
|
+
delete(path: string): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Check if a file exists in fake storage
|
|
50
|
+
*/
|
|
51
|
+
exists(path: string): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Generate a fake presigned download URL
|
|
54
|
+
*/
|
|
55
|
+
getPresignedDownloadUrl(path: string, expiresIn?: number): Promise<PresignedUrlResult>;
|
|
56
|
+
/**
|
|
57
|
+
* Generate a fake presigned upload URL
|
|
58
|
+
*/
|
|
59
|
+
getPresignedUploadUrl(path: string, expiresIn?: number): Promise<PresignedUrlResult>;
|
|
60
|
+
/**
|
|
61
|
+
* Generate a fake presigned delete URL
|
|
62
|
+
*/
|
|
63
|
+
getPresignedDeleteUrl(path: string, expiresIn?: number): Promise<PresignedUrlResult>;
|
|
64
|
+
/**
|
|
65
|
+
* Chunked upload (same as regular upload for fake)
|
|
66
|
+
*/
|
|
67
|
+
chunkedUpload(body: StreamingBlobPayloadInputTypes, path: string, options: Omit<UploadOptions, 'size'> & {
|
|
68
|
+
size?: number;
|
|
69
|
+
}, disk?: string): Promise<UploadResult>;
|
|
70
|
+
/**
|
|
71
|
+
* Assert that a file exists at the given path
|
|
72
|
+
*
|
|
73
|
+
* @param path - Path to check
|
|
74
|
+
* @throws AssertionError if file does not exist
|
|
75
|
+
*/
|
|
76
|
+
assertExists(path: string): void;
|
|
77
|
+
/**
|
|
78
|
+
* Assert that a file does NOT exist at the given path
|
|
79
|
+
*
|
|
80
|
+
* @param path - Path to check
|
|
81
|
+
* @throws AssertionError if file exists
|
|
82
|
+
*/
|
|
83
|
+
assertMissing(path: string): void;
|
|
84
|
+
/**
|
|
85
|
+
* Assert storage is empty
|
|
86
|
+
*
|
|
87
|
+
* @throws AssertionError if any files exist
|
|
88
|
+
*/
|
|
89
|
+
assertEmpty(): void;
|
|
90
|
+
/**
|
|
91
|
+
* Assert storage has exactly N files
|
|
92
|
+
*
|
|
93
|
+
* @param count - Expected number of files
|
|
94
|
+
* @throws AssertionError if count doesn't match
|
|
95
|
+
*/
|
|
96
|
+
assertCount(count: number): void;
|
|
97
|
+
/**
|
|
98
|
+
* Get all stored files (for inspection)
|
|
99
|
+
*/
|
|
100
|
+
getStoredFiles(): Map<string, StoredFile>;
|
|
101
|
+
/**
|
|
102
|
+
* Get all stored file paths
|
|
103
|
+
*/
|
|
104
|
+
getStoredPaths(): string[];
|
|
105
|
+
/**
|
|
106
|
+
* Get a specific file by path
|
|
107
|
+
*/
|
|
108
|
+
getFile(path: string): StoredFile | undefined;
|
|
109
|
+
/**
|
|
110
|
+
* Clear all stored files (call in beforeEach for test isolation)
|
|
111
|
+
*/
|
|
112
|
+
clear(): void;
|
|
113
|
+
private createPresignedUrl;
|
|
114
|
+
private bodyToUint8Array;
|
|
115
|
+
}
|
|
116
|
+
//#endregion
|
|
117
|
+
export { StoredFile as n, FakeStorageService as t };
|
|
118
|
+
//# sourceMappingURL=index-D-Q2cR2v.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-D-Q2cR2v.d.mts","names":[],"sources":["../src/storage/fake-storage.service.ts"],"mappings":";;;;;AAkBA;UAAiB,UAAA;EACf,OAAA,EAAS,UAAA;EACT,QAAA;EACA,IAAA;EACA,QAAA,GAAW,MAAA;EACX,UAAA,EAAY,IAAA;AAAA;;;;;;;;;;;AAoBd;;;;;;;cACa,kBAAA,SAA2B,cAAA;EAAA,mBAKjB,cAAA,EAAgB,qBAAA;EAAA,mBAEhB,OAAA,EAAS,aAAA;EAAA,QANtB,KAAA;cAIa,cAAA,EAAgB,qBAAA,EAEhB,OAAA,EAAS,aAAA;EAsCN;;;EA9BlB,MAAA,CACJ,IAAA,EAAM,8BAAA,EACN,YAAA,UACA,OAAA,EAAS,aAAA,EACT,IAAA,YACC,OAAA,CAAQ,YAAA;EAoER;;;EA3CH,QAAA,CAAS,IAAA,WAAe,OAAA,CAAQ,cAAA;EA+D7B;;;EAtCH,MAAA,CAAO,IAAA,WAAe,OAAA;EAkDX;;;EA1CX,MAAA,CAAO,IAAA,WAAe,OAAA;EAyHC;;;EAlHvB,uBAAA,CACE,IAAA,UACA,SAAA,YACC,OAAA,CAAQ,kBAAA;EAxF2B;;;EA+FtC,qBAAA,CACE,IAAA,UACA,SAAA,YACC,OAAA,CAAQ,kBAAA;EA3FmB;;;EAkG9B,qBAAA,CACE,IAAA,UACA,SAAA,YACC,OAAA,CAAQ,kBAAA;EAvGU;;;EA8Gf,aAAA,CACJ,IAAA,EAAM,8BAAA,EACN,IAAA,UACA,OAAA,EAAS,IAAA,CAAK,aAAA;IAA2B,IAAA;EAAA,GACzC,IAAA,YACC,OAAA,CAAQ,YAAA;EAvGT;;;;;;EAwHF,YAAA,CAAa,IAAA;EA5FJ;;;;;;EAyGT,aAAA,CAAc,IAAA;EAxEP;;;;;EAoFP,WAAA,CAAA;EA1EW;;;;;;EAuFX,WAAA,CAAY,KAAA;EArEV;;;EA+EF,cAAA,CAAA,GAAkB,GAAA,SAAY,UAAA;EAtExB;;;EA6EN,cAAA,CAAA;EA1EW;;;EAiFX,OAAA,CAAQ,IAAA,WAAe,UAAA;EAhFrB;;;EAuFF,KAAA,CAAA;EAAA,QAQQ,kBAAA;EAAA,QAeM,gBAAA;AAAA"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,130 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { t as FakeStorageService } from "./index-D-Q2cR2v.mjs";
|
|
2
|
+
import { Application, ApplicationConfig, Constructor, StratalEnv } from "stratal";
|
|
2
3
|
import { DynamicModule, InjectionToken, ModuleClass, ModuleOptions } from "stratal/module";
|
|
3
|
-
import { DownloadResult, PresignedUrlResult, StorageConfig, StorageManagerService, StorageService, StreamingBlobPayloadInputTypes, UploadOptions, UploadResult } from "stratal/storage";
|
|
4
4
|
import { Container } from "stratal/di";
|
|
5
|
-
import { ConnectionName, DatabaseService
|
|
5
|
+
import { ConnectionName, DatabaseService } from "@stratal/framework/database";
|
|
6
|
+
import { Seeder } from "stratal/seeder";
|
|
6
7
|
import { AuthService } from "@stratal/framework/auth";
|
|
7
8
|
import { HttpResponse, RequestHandler, http } from "msw";
|
|
9
|
+
import { CommandInput, CommandResult } from "stratal/quarry";
|
|
8
10
|
|
|
9
|
-
//#region src/storage/fake-storage.service.d.ts
|
|
10
|
-
/**
|
|
11
|
-
* Stored file representation in memory
|
|
12
|
-
*/
|
|
13
|
-
interface StoredFile {
|
|
14
|
-
content: Uint8Array;
|
|
15
|
-
mimeType: string;
|
|
16
|
-
size: number;
|
|
17
|
-
metadata?: Record<string, string>;
|
|
18
|
-
uploadedAt: Date;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* FakeStorageService
|
|
22
|
-
*
|
|
23
|
-
* In-memory storage implementation for testing.
|
|
24
|
-
* Registered by default in TestingModuleBuilder.
|
|
25
|
-
*
|
|
26
|
-
* Similar to Laravel's Storage::fake() - stores files in memory
|
|
27
|
-
* and provides assertion helpers for testing.
|
|
28
|
-
*
|
|
29
|
-
* @example
|
|
30
|
-
* ```typescript
|
|
31
|
-
* // Access via TestingModule
|
|
32
|
-
* module.storage.assertExists('path/to/file.pdf')
|
|
33
|
-
* module.storage.assertMissing('deleted/file.pdf')
|
|
34
|
-
* module.storage.clear() // Reset between tests
|
|
35
|
-
* ```
|
|
36
|
-
*/
|
|
37
|
-
declare class FakeStorageService extends StorageService {
|
|
38
|
-
protected readonly storageManager: StorageManagerService;
|
|
39
|
-
protected readonly options: StorageConfig;
|
|
40
|
-
private files;
|
|
41
|
-
constructor(storageManager: StorageManagerService, options: StorageConfig);
|
|
42
|
-
/**
|
|
43
|
-
* Upload content to fake storage
|
|
44
|
-
*/
|
|
45
|
-
upload(body: StreamingBlobPayloadInputTypes, relativePath: string, options: UploadOptions, disk?: string): Promise<UploadResult>;
|
|
46
|
-
/**
|
|
47
|
-
* Download a file from fake storage
|
|
48
|
-
*/
|
|
49
|
-
download(path: string): Promise<DownloadResult>;
|
|
50
|
-
/**
|
|
51
|
-
* Delete a file from fake storage
|
|
52
|
-
*/
|
|
53
|
-
delete(path: string): Promise<void>;
|
|
54
|
-
/**
|
|
55
|
-
* Check if a file exists in fake storage
|
|
56
|
-
*/
|
|
57
|
-
exists(path: string): Promise<boolean>;
|
|
58
|
-
/**
|
|
59
|
-
* Generate a fake presigned download URL
|
|
60
|
-
*/
|
|
61
|
-
getPresignedDownloadUrl(path: string, expiresIn?: number): Promise<PresignedUrlResult>;
|
|
62
|
-
/**
|
|
63
|
-
* Generate a fake presigned upload URL
|
|
64
|
-
*/
|
|
65
|
-
getPresignedUploadUrl(path: string, expiresIn?: number): Promise<PresignedUrlResult>;
|
|
66
|
-
/**
|
|
67
|
-
* Generate a fake presigned delete URL
|
|
68
|
-
*/
|
|
69
|
-
getPresignedDeleteUrl(path: string, expiresIn?: number): Promise<PresignedUrlResult>;
|
|
70
|
-
/**
|
|
71
|
-
* Chunked upload (same as regular upload for fake)
|
|
72
|
-
*/
|
|
73
|
-
chunkedUpload(body: StreamingBlobPayloadInputTypes, path: string, options: Omit<UploadOptions, 'size'> & {
|
|
74
|
-
size?: number;
|
|
75
|
-
}, disk?: string): Promise<UploadResult>;
|
|
76
|
-
/**
|
|
77
|
-
* Assert that a file exists at the given path
|
|
78
|
-
*
|
|
79
|
-
* @param path - Path to check
|
|
80
|
-
* @throws AssertionError if file does not exist
|
|
81
|
-
*/
|
|
82
|
-
assertExists(path: string): void;
|
|
83
|
-
/**
|
|
84
|
-
* Assert that a file does NOT exist at the given path
|
|
85
|
-
*
|
|
86
|
-
* @param path - Path to check
|
|
87
|
-
* @throws AssertionError if file exists
|
|
88
|
-
*/
|
|
89
|
-
assertMissing(path: string): void;
|
|
90
|
-
/**
|
|
91
|
-
* Assert storage is empty
|
|
92
|
-
*
|
|
93
|
-
* @throws AssertionError if any files exist
|
|
94
|
-
*/
|
|
95
|
-
assertEmpty(): void;
|
|
96
|
-
/**
|
|
97
|
-
* Assert storage has exactly N files
|
|
98
|
-
*
|
|
99
|
-
* @param count - Expected number of files
|
|
100
|
-
* @throws AssertionError if count doesn't match
|
|
101
|
-
*/
|
|
102
|
-
assertCount(count: number): void;
|
|
103
|
-
/**
|
|
104
|
-
* Get all stored files (for inspection)
|
|
105
|
-
*/
|
|
106
|
-
getStoredFiles(): Map<string, StoredFile>;
|
|
107
|
-
/**
|
|
108
|
-
* Get all stored file paths
|
|
109
|
-
*/
|
|
110
|
-
getStoredPaths(): string[];
|
|
111
|
-
/**
|
|
112
|
-
* Get a specific file by path
|
|
113
|
-
*/
|
|
114
|
-
getFile(path: string): StoredFile | undefined;
|
|
115
|
-
/**
|
|
116
|
-
* Clear all stored files (call in beforeEach for test isolation)
|
|
117
|
-
*/
|
|
118
|
-
clear(): void;
|
|
119
|
-
private createPresignedUrl;
|
|
120
|
-
private bodyToUint8Array;
|
|
121
|
-
}
|
|
122
|
-
//#endregion
|
|
123
|
-
//#region src/types.d.ts
|
|
124
|
-
declare abstract class Seeder<K extends ConnectionName = DefaultConnectionName> {
|
|
125
|
-
abstract run(db: DatabaseService<K>): Promise<void>;
|
|
126
|
-
}
|
|
127
|
-
//#endregion
|
|
128
11
|
//#region src/core/http/test-response.d.ts
|
|
129
12
|
/**
|
|
130
13
|
* TestResponse
|
|
@@ -399,6 +282,66 @@ declare class TestHttpClient {
|
|
|
399
282
|
private createRequest;
|
|
400
283
|
}
|
|
401
284
|
//#endregion
|
|
285
|
+
//#region src/core/quarry/test-command-result.d.ts
|
|
286
|
+
/**
|
|
287
|
+
* Fluent assertion wrapper for command results.
|
|
288
|
+
*
|
|
289
|
+
* @example
|
|
290
|
+
* ```typescript
|
|
291
|
+
* const result = await module
|
|
292
|
+
* .quarry('users:create')
|
|
293
|
+
* .withInput({ email: 'test@example.com' })
|
|
294
|
+
* .run()
|
|
295
|
+
*
|
|
296
|
+
* result.assertSuccessful()
|
|
297
|
+
* result.assertOutputContains('User created')
|
|
298
|
+
* ```
|
|
299
|
+
*/
|
|
300
|
+
declare class TestCommandResult {
|
|
301
|
+
private readonly result;
|
|
302
|
+
constructor(result: CommandResult);
|
|
303
|
+
get exitCode(): number;
|
|
304
|
+
get output(): string[];
|
|
305
|
+
get errors(): string[];
|
|
306
|
+
assertSuccessful(): this;
|
|
307
|
+
assertFailed(exitCode?: number): this;
|
|
308
|
+
assertExitCode(code: number): this;
|
|
309
|
+
assertOutputContains(text: string): this;
|
|
310
|
+
assertOutputMissing(text: string): this;
|
|
311
|
+
assertErrorContains(text: string): this;
|
|
312
|
+
assertErrorMissing(text: string): this;
|
|
313
|
+
}
|
|
314
|
+
//#endregion
|
|
315
|
+
//#region src/core/quarry/test-command-request.d.ts
|
|
316
|
+
/**
|
|
317
|
+
* Fluent builder for testing Quarry commands.
|
|
318
|
+
*
|
|
319
|
+
* @example
|
|
320
|
+
* ```typescript
|
|
321
|
+
* const result = await module
|
|
322
|
+
* .quarry('users:create')
|
|
323
|
+
* .withInput({ email: 'test@example.com', admin: true })
|
|
324
|
+
* .run()
|
|
325
|
+
*
|
|
326
|
+
* result.assertSuccessful()
|
|
327
|
+
* result.assertOutputContains('User created')
|
|
328
|
+
* ```
|
|
329
|
+
*/
|
|
330
|
+
declare class TestCommandRequest {
|
|
331
|
+
private readonly commandName;
|
|
332
|
+
private readonly module;
|
|
333
|
+
private _input;
|
|
334
|
+
constructor(commandName: string, module: TestingModule);
|
|
335
|
+
/**
|
|
336
|
+
* Set the flat input for the command.
|
|
337
|
+
*/
|
|
338
|
+
withInput(input: CommandInput): this;
|
|
339
|
+
/**
|
|
340
|
+
* Execute the command and return a TestCommandResult for assertions.
|
|
341
|
+
*/
|
|
342
|
+
run(): Promise<TestCommandResult>;
|
|
343
|
+
}
|
|
344
|
+
//#endregion
|
|
402
345
|
//#region src/core/sse/test-sse-connection.d.ts
|
|
403
346
|
/**
|
|
404
347
|
* Represents a parsed SSE event
|
|
@@ -622,7 +565,7 @@ declare class TestWsRequest {
|
|
|
622
565
|
*
|
|
623
566
|
* // Database utilities
|
|
624
567
|
* await module.truncateDb()
|
|
625
|
-
* await module.seed(
|
|
568
|
+
* await module.seed(UserSeeder)
|
|
626
569
|
* await module.assertDatabaseHas('user', { email: 'test@example.com' })
|
|
627
570
|
*
|
|
628
571
|
* // Cleanup
|
|
@@ -656,6 +599,10 @@ declare class TestingModule {
|
|
|
656
599
|
* Create an SSE test request builder for the given path
|
|
657
600
|
*/
|
|
658
601
|
sse(path: string): TestSseRequest;
|
|
602
|
+
/**
|
|
603
|
+
* Create a Quarry command test request builder
|
|
604
|
+
*/
|
|
605
|
+
quarry(name: string): TestCommandRequest;
|
|
659
606
|
/**
|
|
660
607
|
* Get Application instance
|
|
661
608
|
*/
|
|
@@ -682,10 +629,9 @@ declare class TestingModule {
|
|
|
682
629
|
*/
|
|
683
630
|
truncateDb(name?: ConnectionName): Promise<void>;
|
|
684
631
|
/**
|
|
685
|
-
* Run seeders in
|
|
632
|
+
* Run seeders by class constructor in the request-scoped container
|
|
686
633
|
*/
|
|
687
|
-
seed(...
|
|
688
|
-
seed(name: ConnectionName, ...seeders: Seeder[]): Promise<void>;
|
|
634
|
+
seed(...SeederClasses: Constructor<Seeder>[]): Promise<void>;
|
|
689
635
|
/**
|
|
690
636
|
* Assert that a record exists in the database
|
|
691
637
|
*/
|
|
@@ -1066,5 +1012,5 @@ declare class TestSetupError extends TestError {
|
|
|
1066
1012
|
constructor(message: string, cause?: Error);
|
|
1067
1013
|
}
|
|
1068
1014
|
//#endregion
|
|
1069
|
-
export { ActingAs,
|
|
1015
|
+
export { ActingAs, HttpResponse, type MockErrorOptions, MockFetch, type MockJsonOptions, ProviderOverrideBuilder, type ProviderOverrideConfig, Test, TestCommandRequest, TestCommandResult, TestError, TestHttpClient, TestHttpRequest, TestResponse, TestSetupError, TestSseConnection, type TestSseEvent, TestSseRequest, TestWsConnection, TestWsRequest, TestingModule, TestingModuleBuilder, type TestingModuleConfig, createMockFetch, getTestEnv, http };
|
|
1070
1016
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/core/http/test-response.ts","../src/core/http/test-http-request.ts","../src/core/http/test-http-client.ts","../src/core/quarry/test-command-result.ts","../src/core/quarry/test-command-request.ts","../src/core/sse/test-sse-connection.ts","../src/core/sse/test-sse-request.ts","../src/core/ws/test-ws-connection.ts","../src/core/ws/test-ws-request.ts","../src/core/testing-module.ts","../src/core/testing-module-builder.ts","../src/core/override/provider-override-builder.ts","../src/core/test.ts","../src/core/http/fetch-mock.types.ts","../src/core/http/mock-fetch.ts","../src/auth/acting-as.ts","../src/core/env/test-env.ts","../src/errors/test-error.ts","../src/errors/setup-error.ts"],"mappings":"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"}
|