@uniforge/testing 0.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/auth/index.d.cts +177 -0
  2. package/dist/auth/index.d.ts +177 -0
  3. package/dist/auth/index.js +459 -0
  4. package/dist/auth/index.js.map +1 -0
  5. package/dist/auth/index.mjs +418 -0
  6. package/dist/auth/index.mjs.map +1 -0
  7. package/dist/billing/index.d.cts +27 -0
  8. package/dist/billing/index.d.ts +27 -0
  9. package/dist/billing/index.js +208 -0
  10. package/dist/billing/index.js.map +1 -0
  11. package/dist/billing/index.mjs +178 -0
  12. package/dist/billing/index.mjs.map +1 -0
  13. package/dist/database/index.d.cts +399 -0
  14. package/dist/database/index.d.ts +399 -0
  15. package/dist/database/index.js +19054 -0
  16. package/dist/database/index.js.map +1 -0
  17. package/dist/database/index.mjs +19046 -0
  18. package/dist/database/index.mjs.map +1 -0
  19. package/dist/graphql/index.d.cts +23 -0
  20. package/dist/graphql/index.d.ts +23 -0
  21. package/dist/graphql/index.js +18511 -0
  22. package/dist/graphql/index.js.map +1 -0
  23. package/dist/graphql/index.mjs +18505 -0
  24. package/dist/graphql/index.mjs.map +1 -0
  25. package/dist/index.d.cts +10 -0
  26. package/dist/index.d.ts +10 -0
  27. package/dist/index.js +31 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/index.mjs +6 -0
  30. package/dist/index.mjs.map +1 -0
  31. package/dist/multi-store/index.d.cts +66 -0
  32. package/dist/multi-store/index.d.ts +66 -0
  33. package/dist/multi-store/index.js +319 -0
  34. package/dist/multi-store/index.js.map +1 -0
  35. package/dist/multi-store/index.mjs +287 -0
  36. package/dist/multi-store/index.mjs.map +1 -0
  37. package/dist/multi-tenant/index.d.cts +15 -0
  38. package/dist/multi-tenant/index.d.ts +15 -0
  39. package/dist/multi-tenant/index.js +87 -0
  40. package/dist/multi-tenant/index.js.map +1 -0
  41. package/dist/multi-tenant/index.mjs +57 -0
  42. package/dist/multi-tenant/index.mjs.map +1 -0
  43. package/dist/performance/index.d.cts +60 -0
  44. package/dist/performance/index.d.ts +60 -0
  45. package/dist/performance/index.js +280 -0
  46. package/dist/performance/index.js.map +1 -0
  47. package/dist/performance/index.mjs +246 -0
  48. package/dist/performance/index.mjs.map +1 -0
  49. package/dist/platform/index.d.cts +71 -0
  50. package/dist/platform/index.d.ts +71 -0
  51. package/dist/platform/index.js +435 -0
  52. package/dist/platform/index.js.map +1 -0
  53. package/dist/platform/index.mjs +396 -0
  54. package/dist/platform/index.mjs.map +1 -0
  55. package/dist/rbac/index.d.cts +21 -0
  56. package/dist/rbac/index.d.ts +21 -0
  57. package/dist/rbac/index.js +178 -0
  58. package/dist/rbac/index.js.map +1 -0
  59. package/dist/rbac/index.mjs +150 -0
  60. package/dist/rbac/index.mjs.map +1 -0
  61. package/dist/security/index.d.cts +73 -0
  62. package/dist/security/index.d.ts +73 -0
  63. package/dist/security/index.js +246 -0
  64. package/dist/security/index.js.map +1 -0
  65. package/dist/security/index.mjs +211 -0
  66. package/dist/security/index.mjs.map +1 -0
  67. package/dist/shopify-api/index.d.cts +139 -0
  68. package/dist/shopify-api/index.d.ts +139 -0
  69. package/dist/shopify-api/index.js +469 -0
  70. package/dist/shopify-api/index.js.map +1 -0
  71. package/dist/shopify-api/index.mjs +439 -0
  72. package/dist/shopify-api/index.mjs.map +1 -0
  73. package/dist/shopify-compliance/index.d.cts +85 -0
  74. package/dist/shopify-compliance/index.d.ts +85 -0
  75. package/dist/shopify-compliance/index.js +287 -0
  76. package/dist/shopify-compliance/index.js.map +1 -0
  77. package/dist/shopify-compliance/index.mjs +259 -0
  78. package/dist/shopify-compliance/index.mjs.map +1 -0
  79. package/dist/webhooks/index.d.cts +127 -0
  80. package/dist/webhooks/index.d.ts +127 -0
  81. package/dist/webhooks/index.js +18934 -0
  82. package/dist/webhooks/index.js.map +1 -0
  83. package/dist/webhooks/index.mjs +18916 -0
  84. package/dist/webhooks/index.mjs.map +1 -0
  85. package/package.json +112 -0
@@ -0,0 +1,399 @@
1
+ import * as vitest from 'vitest';
2
+ import { vi } from 'vitest';
3
+
4
+ /**
5
+ * Mock PrismaClient for unit testing.
6
+ *
7
+ * Provides vi.fn() stubs for all Prisma model methods used in the codebase.
8
+ */
9
+ declare function createMockPrismaClient(): {
10
+ shop: {
11
+ findUnique: vitest.Mock<(...args: any[]) => any>;
12
+ findFirst: vitest.Mock<(...args: any[]) => any>;
13
+ findMany: vitest.Mock<(...args: any[]) => any>;
14
+ create: vitest.Mock<(...args: any[]) => any>;
15
+ update: vitest.Mock<(...args: any[]) => any>;
16
+ upsert: vitest.Mock<(...args: any[]) => any>;
17
+ delete: vitest.Mock<(...args: any[]) => any>;
18
+ deleteMany: vitest.Mock<(...args: any[]) => any>;
19
+ count: vitest.Mock<(...args: any[]) => any>;
20
+ };
21
+ session: {
22
+ findUnique: vitest.Mock<(...args: any[]) => any>;
23
+ findFirst: vitest.Mock<(...args: any[]) => any>;
24
+ findMany: vitest.Mock<(...args: any[]) => any>;
25
+ create: vitest.Mock<(...args: any[]) => any>;
26
+ update: vitest.Mock<(...args: any[]) => any>;
27
+ upsert: vitest.Mock<(...args: any[]) => any>;
28
+ delete: vitest.Mock<(...args: any[]) => any>;
29
+ deleteMany: vitest.Mock<(...args: any[]) => any>;
30
+ count: vitest.Mock<(...args: any[]) => any>;
31
+ };
32
+ account: {
33
+ findUnique: vitest.Mock<(...args: any[]) => any>;
34
+ findFirst: vitest.Mock<(...args: any[]) => any>;
35
+ findMany: vitest.Mock<(...args: any[]) => any>;
36
+ create: vitest.Mock<(...args: any[]) => any>;
37
+ update: vitest.Mock<(...args: any[]) => any>;
38
+ upsert: vitest.Mock<(...args: any[]) => any>;
39
+ delete: vitest.Mock<(...args: any[]) => any>;
40
+ deleteMany: vitest.Mock<(...args: any[]) => any>;
41
+ count: vitest.Mock<(...args: any[]) => any>;
42
+ };
43
+ accountStore: {
44
+ findUnique: vitest.Mock<(...args: any[]) => any>;
45
+ findFirst: vitest.Mock<(...args: any[]) => any>;
46
+ findMany: vitest.Mock<(...args: any[]) => any>;
47
+ create: vitest.Mock<(...args: any[]) => any>;
48
+ update: vitest.Mock<(...args: any[]) => any>;
49
+ upsert: vitest.Mock<(...args: any[]) => any>;
50
+ delete: vitest.Mock<(...args: any[]) => any>;
51
+ deleteMany: vitest.Mock<(...args: any[]) => any>;
52
+ count: vitest.Mock<(...args: any[]) => any>;
53
+ };
54
+ accountMember: {
55
+ findUnique: vitest.Mock<(...args: any[]) => any>;
56
+ findFirst: vitest.Mock<(...args: any[]) => any>;
57
+ findMany: vitest.Mock<(...args: any[]) => any>;
58
+ create: vitest.Mock<(...args: any[]) => any>;
59
+ update: vitest.Mock<(...args: any[]) => any>;
60
+ upsert: vitest.Mock<(...args: any[]) => any>;
61
+ delete: vitest.Mock<(...args: any[]) => any>;
62
+ deleteMany: vitest.Mock<(...args: any[]) => any>;
63
+ count: vitest.Mock<(...args: any[]) => any>;
64
+ };
65
+ accountSharedSetting: {
66
+ findUnique: vitest.Mock<(...args: any[]) => any>;
67
+ findFirst: vitest.Mock<(...args: any[]) => any>;
68
+ findMany: vitest.Mock<(...args: any[]) => any>;
69
+ create: vitest.Mock<(...args: any[]) => any>;
70
+ update: vitest.Mock<(...args: any[]) => any>;
71
+ upsert: vitest.Mock<(...args: any[]) => any>;
72
+ delete: vitest.Mock<(...args: any[]) => any>;
73
+ deleteMany: vitest.Mock<(...args: any[]) => any>;
74
+ count: vitest.Mock<(...args: any[]) => any>;
75
+ };
76
+ $connect: vitest.Mock<(...args: any[]) => any>;
77
+ $disconnect: vitest.Mock<(...args: any[]) => any>;
78
+ $transaction: vitest.Mock<(...args: any[]) => any>;
79
+ };
80
+ type MockPrismaClient = ReturnType<typeof createMockPrismaClient>;
81
+
82
+ /**
83
+ * Enhanced Mock PrismaClient with query recording.
84
+ *
85
+ * Wraps vi.fn() stubs with recording to track all queries made during tests.
86
+ */
87
+
88
+ interface RecordedQuery {
89
+ model: string;
90
+ operation: string;
91
+ args: unknown;
92
+ timestamp: Date;
93
+ }
94
+ declare const MODEL_OPERATIONS: readonly ["findUnique", "findFirst", "findMany", "create", "update", "upsert", "delete", "deleteMany", "count"];
95
+ type ModelOperation = (typeof MODEL_OPERATIONS)[number];
96
+ type MockModel = Record<ModelOperation, ReturnType<typeof vi.fn>>;
97
+ interface EnhancedMockPrismaClient {
98
+ shop: MockModel;
99
+ session: MockModel;
100
+ account: MockModel;
101
+ accountStore: MockModel;
102
+ accountMember: MockModel;
103
+ accountSharedSetting: MockModel;
104
+ $connect: ReturnType<typeof vi.fn>;
105
+ $disconnect: ReturnType<typeof vi.fn>;
106
+ $transaction: ReturnType<typeof vi.fn>;
107
+ _getQueries(): RecordedQuery[];
108
+ _getLastQuery(): RecordedQuery | undefined;
109
+ _getQueriesByModel(model: string): RecordedQuery[];
110
+ _getQueriesByOperation(operation: string): RecordedQuery[];
111
+ _clearQueries(): void;
112
+ _whenShopFindUnique(result: unknown): void;
113
+ _whenSessionFindUnique(result: unknown): void;
114
+ _whenAccountFindUnique(result: unknown): void;
115
+ _reset(): void;
116
+ }
117
+ declare function createEnhancedMockPrismaClient(): EnhancedMockPrismaClient;
118
+
119
+ /**
120
+ * Data seeder for generating complete test data patterns.
121
+ *
122
+ * All data is generated in-memory with no database calls.
123
+ */
124
+ interface ShopSeedOptions {
125
+ shopDomain?: string;
126
+ isInstalled?: boolean;
127
+ scopes?: string;
128
+ includeOfflineSession?: boolean;
129
+ includeOnlineSession?: boolean;
130
+ onlineUserId?: number;
131
+ accessToken?: string;
132
+ }
133
+ interface ShopSeedResult {
134
+ shop: {
135
+ shopDomain: string;
136
+ isInstalled: boolean;
137
+ installedAt: Date | null;
138
+ uninstalledAt: Date | null;
139
+ scopes: string;
140
+ shopifyPlan: string | null;
141
+ createdAt: Date;
142
+ updatedAt: Date;
143
+ };
144
+ offlineSession?: {
145
+ id: string;
146
+ shop: string;
147
+ state: string;
148
+ isOnline: boolean;
149
+ scope: string;
150
+ expires: Date | null;
151
+ accessToken: string;
152
+ createdAt: Date;
153
+ updatedAt: Date;
154
+ };
155
+ onlineSession?: {
156
+ id: string;
157
+ shop: string;
158
+ state: string;
159
+ isOnline: boolean;
160
+ scope: string;
161
+ expires: Date;
162
+ accessToken: string;
163
+ onlineAccessInfo: {
164
+ expiresIn: number;
165
+ associatedUserScope: string;
166
+ associatedUser: {
167
+ id: number;
168
+ firstName: string;
169
+ lastName: string;
170
+ email: string;
171
+ emailVerified: boolean;
172
+ accountOwner: boolean;
173
+ locale: string;
174
+ collaborator: boolean;
175
+ };
176
+ };
177
+ createdAt: Date;
178
+ updatedAt: Date;
179
+ };
180
+ }
181
+ interface BillingSeedOptions extends ShopSeedOptions {
182
+ planName?: string;
183
+ subscriptionStatus?: string;
184
+ trialDays?: number;
185
+ }
186
+ interface BillingSeedResult extends ShopSeedResult {
187
+ subscription: {
188
+ id: string;
189
+ shopDomain: string;
190
+ shopifySubscriptionId: string | null;
191
+ planName: string;
192
+ status: string;
193
+ currentPeriodEnd: Date | null;
194
+ trialEndsAt: Date | null;
195
+ confirmationUrl: string | null;
196
+ createdAt: Date;
197
+ updatedAt: Date;
198
+ };
199
+ }
200
+ interface MemberSeedOptions extends ShopSeedOptions {
201
+ members?: Array<{
202
+ userId?: number;
203
+ email?: string;
204
+ role?: string;
205
+ }>;
206
+ }
207
+ interface MemberSeedResult extends ShopSeedResult {
208
+ members: Array<{
209
+ id: string;
210
+ shopDomain: string;
211
+ userId: number;
212
+ email: string;
213
+ role: string;
214
+ customPermissions: string[] | null;
215
+ createdAt: Date;
216
+ updatedAt: Date;
217
+ }>;
218
+ }
219
+ interface AccountSeedOptions {
220
+ accountName?: string;
221
+ accountType?: string;
222
+ stores?: Array<{
223
+ shopDomain?: string;
224
+ storeName?: string;
225
+ }>;
226
+ members?: Array<{
227
+ email?: string;
228
+ role?: string;
229
+ }>;
230
+ }
231
+ interface AccountSeedResult {
232
+ account: {
233
+ id: string;
234
+ name: string;
235
+ type: string;
236
+ isActive: boolean;
237
+ createdAt: Date;
238
+ updatedAt: Date;
239
+ };
240
+ stores: Array<{
241
+ id: string;
242
+ accountId: string;
243
+ shopDomain: string;
244
+ storeName: string;
245
+ isActive: boolean;
246
+ isPrimary: boolean;
247
+ createdAt: Date;
248
+ updatedAt: Date;
249
+ }>;
250
+ members: Array<{
251
+ id: string;
252
+ accountId: string;
253
+ userEmail: string;
254
+ role: string;
255
+ allStoresAccess: boolean;
256
+ permissions: string[];
257
+ createdAt: Date;
258
+ updatedAt: Date;
259
+ }>;
260
+ }
261
+ declare class DataSeeder {
262
+ private shopResults;
263
+ private accountResults;
264
+ private shopCounter;
265
+ private userCounter;
266
+ seedShop(options?: ShopSeedOptions): ShopSeedResult;
267
+ seedShopWithBilling(options?: BillingSeedOptions): BillingSeedResult;
268
+ seedShopWithMembers(options?: MemberSeedOptions): MemberSeedResult;
269
+ seedAccount(options?: AccountSeedOptions): AccountSeedResult;
270
+ getAllShops(): ShopSeedResult['shop'][];
271
+ getAllSessions(): Array<NonNullable<ShopSeedResult['offlineSession']> | NonNullable<ShopSeedResult['onlineSession']>>;
272
+ reset(): void;
273
+ }
274
+
275
+ /**
276
+ * Fluent API for building complex test scenarios.
277
+ *
278
+ * Builds complete, interconnected test data with a chainable interface.
279
+ */
280
+ interface TestScenario {
281
+ shops: Array<{
282
+ shopDomain: string;
283
+ isInstalled: boolean;
284
+ installedAt: Date | null;
285
+ uninstalledAt: Date | null;
286
+ scopes: string;
287
+ shopifyPlan: string | null;
288
+ createdAt: Date;
289
+ updatedAt: Date;
290
+ }>;
291
+ sessions: Array<{
292
+ id: string;
293
+ shop: string;
294
+ isOnline: boolean;
295
+ scope: string;
296
+ accessToken: string;
297
+ expires: Date | null;
298
+ createdAt: Date;
299
+ updatedAt: Date;
300
+ }>;
301
+ subscriptions: Array<{
302
+ id: string;
303
+ shopDomain: string;
304
+ planName: string;
305
+ status: string;
306
+ createdAt: Date;
307
+ updatedAt: Date;
308
+ }>;
309
+ members: Array<{
310
+ id: string;
311
+ shopDomain: string;
312
+ userId: number;
313
+ email: string;
314
+ role: string;
315
+ createdAt: Date;
316
+ updatedAt: Date;
317
+ }>;
318
+ accounts: Array<{
319
+ id: string;
320
+ name: string;
321
+ type: string;
322
+ isActive: boolean;
323
+ createdAt: Date;
324
+ updatedAt: Date;
325
+ }>;
326
+ stores: Array<{
327
+ id: string;
328
+ accountId: string;
329
+ shopDomain: string;
330
+ storeName: string;
331
+ createdAt: Date;
332
+ updatedAt: Date;
333
+ }>;
334
+ accountMembers: Array<{
335
+ id: string;
336
+ accountId: string;
337
+ userEmail: string;
338
+ role: string;
339
+ allStoresAccess: boolean;
340
+ permissions: string[];
341
+ createdAt: Date;
342
+ updatedAt: Date;
343
+ }>;
344
+ getShop(domain: string): TestScenario['shops'][0] | undefined;
345
+ getSessionsForShop(domain: string): TestScenario['sessions'];
346
+ getSubscription(shopDomain: string): TestScenario['subscriptions'][0] | undefined;
347
+ getMembersForShop(domain: string): TestScenario['members'];
348
+ getAccount(id: string): TestScenario['accounts'][0] | undefined;
349
+ getStoresForAccount(accountId: string): TestScenario['stores'];
350
+ getAccountMembers(accountId: string): TestScenario['accountMembers'];
351
+ }
352
+ declare class ScenarioBuilder {
353
+ private shops;
354
+ private sessions;
355
+ private subscriptions;
356
+ private scenarioMembers;
357
+ private scenarioAccounts;
358
+ private scenarioStores;
359
+ private scenarioAccountMembers;
360
+ private currentShopDomain;
361
+ private currentAccountId;
362
+ private shopCounter;
363
+ private userCounter;
364
+ static create(): ScenarioBuilder;
365
+ withShop(shopDomain?: string): this;
366
+ withOfflineSession(accessToken?: string): this;
367
+ withOnlineSession(userId?: number, accessToken?: string): this;
368
+ withSubscription(planName?: string, status?: string): this;
369
+ withMember(role?: string, email?: string, userId?: number): this;
370
+ withAccount(name?: string, type?: string): this;
371
+ withAccountStore(shopDomain?: string, storeName?: string): this;
372
+ withAccountMember(email?: string, role?: string): this;
373
+ build(): TestScenario;
374
+ }
375
+
376
+ /**
377
+ * Test database lifecycle manager.
378
+ *
379
+ * Manages setup/teardown of mock database state for test suites.
380
+ */
381
+
382
+ interface TestDatabaseConfig {
383
+ databaseUrl?: string;
384
+ tables?: string[];
385
+ }
386
+ declare class TestDatabaseManager {
387
+ private client;
388
+ private ready;
389
+ private tables;
390
+ constructor(config?: TestDatabaseConfig);
391
+ setup(): Promise<void>;
392
+ teardown(): Promise<void>;
393
+ getClient(): EnhancedMockPrismaClient;
394
+ resetAll(): Promise<void>;
395
+ isReady(): boolean;
396
+ getTableNames(): string[];
397
+ }
398
+
399
+ export { type AccountSeedOptions, type AccountSeedResult, type BillingSeedOptions, type BillingSeedResult, DataSeeder, type EnhancedMockPrismaClient, type MemberSeedOptions, type MemberSeedResult, type MockPrismaClient, type RecordedQuery, ScenarioBuilder, type ShopSeedOptions, type ShopSeedResult, type TestDatabaseConfig, TestDatabaseManager, type TestScenario, createEnhancedMockPrismaClient, createMockPrismaClient };