@mbc-cqrs-serverless/core 1.0.26 → 1.1.0

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 (37) hide show
  1. package/dist/commands/command.event.handler.d.ts +1 -1
  2. package/dist/commands/command.event.handler.js +1 -1
  3. package/dist/commands/command.event.handler.js.map +1 -1
  4. package/dist/commands/command.service.d.ts +0 -10
  5. package/dist/commands/command.service.js +0 -35
  6. package/dist/commands/command.service.js.map +1 -1
  7. package/dist/constants/tenant.d.ts +21 -1
  8. package/dist/constants/tenant.js +28 -2
  9. package/dist/constants/tenant.js.map +1 -1
  10. package/dist/context/user.d.ts +10 -0
  11. package/dist/context/user.js +17 -2
  12. package/dist/context/user.js.map +1 -1
  13. package/dist/guard/roles.guard.d.ts +53 -0
  14. package/dist/guard/roles.guard.js +79 -4
  15. package/dist/guard/roles.guard.js.map +1 -1
  16. package/dist/helpers/index.d.ts +1 -1
  17. package/dist/helpers/index.js +2 -2
  18. package/dist/helpers/index.js.map +1 -1
  19. package/dist/integration/utilities/aws-error-factory.d.ts +141 -0
  20. package/dist/integration/utilities/aws-error-factory.js +392 -0
  21. package/dist/integration/utilities/aws-error-factory.js.map +1 -0
  22. package/dist/integration/utilities/aws-mock-manager.d.ts +136 -0
  23. package/dist/integration/utilities/aws-mock-manager.js +336 -0
  24. package/dist/integration/utilities/aws-mock-manager.js.map +1 -0
  25. package/dist/integration/utilities/index.d.ts +22 -0
  26. package/dist/integration/utilities/index.js +99 -0
  27. package/dist/integration/utilities/index.js.map +1 -0
  28. package/dist/integration/utilities/test-assertions.d.ts +112 -0
  29. package/dist/integration/utilities/test-assertions.js +345 -0
  30. package/dist/integration/utilities/test-assertions.js.map +1 -0
  31. package/dist/integration/utilities/test-data-builders.d.ts +202 -0
  32. package/dist/integration/utilities/test-data-builders.js +320 -0
  33. package/dist/integration/utilities/test-data-builders.js.map +1 -0
  34. package/dist/interfaces/notification.interface.d.ts +13 -0
  35. package/dist/notifications/email.service.js +16 -4
  36. package/dist/notifications/email.service.js.map +1 -1
  37. package/package.json +2 -2
@@ -0,0 +1,141 @@
1
+ /**
2
+ * AWS Error Factory
3
+ *
4
+ * Provides standardized factory functions for creating AWS SDK errors
5
+ * used in integration tests. This eliminates code duplication across
6
+ * test files and ensures consistent error structure.
7
+ *
8
+ * Usage:
9
+ * import { createDynamoDBError, createS3Error } from './utilities/aws-error-factory'
10
+ *
11
+ * const error = createDynamoDBError('ProvisionedThroughputExceededException', {
12
+ * message: 'Rate exceeded',
13
+ * httpStatusCode: 400,
14
+ * throttling: true,
15
+ * })
16
+ */
17
+ /**
18
+ * Base AWS error structure used across all AWS SDK errors
19
+ */
20
+ export interface AWSErrorMetadata {
21
+ httpStatusCode?: number;
22
+ requestId?: string;
23
+ extendedRequestId?: string;
24
+ cfId?: string;
25
+ attempts?: number;
26
+ totalRetryDelay?: number;
27
+ }
28
+ /**
29
+ * Extended error type that matches AWS SDK v3 error structure
30
+ */
31
+ export interface AWSError extends Error {
32
+ name: string;
33
+ $metadata: AWSErrorMetadata;
34
+ $fault?: 'client' | 'server';
35
+ $retryable?: {
36
+ throttling?: boolean;
37
+ };
38
+ $service?: string;
39
+ code?: string;
40
+ retryAfterSeconds?: number;
41
+ time?: Date;
42
+ }
43
+ /**
44
+ * Options for creating AWS errors
45
+ */
46
+ export interface CreateAWSErrorOptions {
47
+ message?: string;
48
+ httpStatusCode?: number;
49
+ requestId?: string;
50
+ throttling?: boolean;
51
+ fault?: 'client' | 'server';
52
+ retryAfterSeconds?: number;
53
+ code?: string;
54
+ }
55
+ /**
56
+ * Common DynamoDB error names
57
+ */
58
+ export type DynamoDBErrorName = 'ProvisionedThroughputExceededException' | 'ResourceNotFoundException' | 'ConditionalCheckFailedException' | 'ValidationException' | 'TransactionCanceledException' | 'TransactionConflictException' | 'ItemCollectionSizeLimitExceededException' | 'RequestLimitExceeded' | 'InternalServerError' | 'ServiceUnavailable' | 'ThrottlingException' | 'AccessDeniedException';
59
+ /**
60
+ * Creates a DynamoDB-specific error
61
+ */
62
+ export declare function createDynamoDBError(name: DynamoDBErrorName, options?: CreateAWSErrorOptions): AWSError;
63
+ /**
64
+ * Common S3 error names
65
+ */
66
+ export type S3ErrorName = 'NoSuchKey' | 'NoSuchBucket' | 'BucketNotEmpty' | 'BucketAlreadyExists' | 'BucketAlreadyOwnedByYou' | 'AccessDenied' | 'InvalidAccessKeyId' | 'SignatureDoesNotMatch' | 'EntityTooLarge' | 'EntityTooSmall' | 'InvalidPart' | 'InvalidPartOrder' | 'NoSuchUpload' | 'SlowDown' | 'InternalError' | 'ServiceUnavailable';
67
+ /**
68
+ * Creates an S3-specific error
69
+ */
70
+ export declare function createS3Error(name: S3ErrorName, options?: CreateAWSErrorOptions): AWSError;
71
+ /**
72
+ * Common SQS error names
73
+ */
74
+ export type SQSErrorName = 'QueueDoesNotExist' | 'QueueDeletedRecently' | 'QueueNameExists' | 'InvalidMessageContents' | 'MessageNotInflight' | 'ReceiptHandleIsInvalid' | 'PurgeQueueInProgress' | 'BatchEntryIdsNotDistinct' | 'BatchRequestTooLong' | 'EmptyBatchRequest' | 'InvalidBatchEntryId' | 'TooManyEntriesInBatchRequest' | 'OverLimit' | 'ThrottlingException' | 'AccessDeniedException';
75
+ /**
76
+ * Creates an SQS-specific error
77
+ */
78
+ export declare function createSQSError(name: SQSErrorName, options?: CreateAWSErrorOptions): AWSError;
79
+ /**
80
+ * Common SNS error names
81
+ */
82
+ export type SNSErrorName = 'NotFoundException' | 'TopicLimitExceededException' | 'SubscriptionLimitExceededException' | 'InvalidParameterException' | 'InvalidParameterValueException' | 'EndpointDisabledException' | 'PlatformApplicationDisabledException' | 'AuthorizationErrorException' | 'ThrottledException' | 'InternalErrorException';
83
+ /**
84
+ * Creates an SNS-specific error
85
+ */
86
+ export declare function createSNSError(name: SNSErrorName, options?: CreateAWSErrorOptions): AWSError;
87
+ /**
88
+ * Common Step Functions error names
89
+ */
90
+ export type SFNErrorName = 'ExecutionDoesNotExist' | 'ExecutionAlreadyExists' | 'ExecutionLimitExceeded' | 'InvalidArn' | 'InvalidDefinition' | 'InvalidExecutionInput' | 'InvalidName' | 'InvalidToken' | 'StateMachineDoesNotExist' | 'StateMachineLimitExceeded' | 'TaskDoesNotExist' | 'TaskTimedOut' | 'ActivityDoesNotExist' | 'ActivityLimitExceeded' | 'ResourceNotFound' | 'ThrottlingException' | 'ServiceQuotaExceededException';
91
+ /**
92
+ * Creates a Step Functions-specific error
93
+ */
94
+ export declare function createSFNError(name: SFNErrorName, options?: CreateAWSErrorOptions): AWSError;
95
+ /**
96
+ * Common SES error names
97
+ */
98
+ export type SESErrorName = 'MessageRejected' | 'MailFromDomainNotVerifiedException' | 'ConfigurationSetDoesNotExistException' | 'AccountSendingPausedException' | 'LimitExceededException' | 'NotFoundException' | 'TooManyRequestsException' | 'BadRequestException';
99
+ /**
100
+ * Creates an SES-specific error
101
+ */
102
+ export declare function createSESError(name: SESErrorName, options?: CreateAWSErrorOptions): AWSError;
103
+ /**
104
+ * Network error codes
105
+ */
106
+ export type NetworkErrorCode = 'ECONNRESET' | 'ECONNREFUSED' | 'ETIMEDOUT' | 'ENETUNREACH' | 'ENOTFOUND' | 'EPIPE' | 'EAI_AGAIN';
107
+ /**
108
+ * Creates a network-level error
109
+ */
110
+ export declare function createNetworkError(code: NetworkErrorCode, message?: string): Error & {
111
+ code: string;
112
+ };
113
+ /**
114
+ * Creates a timeout error
115
+ */
116
+ export declare function createTimeoutError(message?: string): Error & {
117
+ name: string;
118
+ code?: string;
119
+ };
120
+ /**
121
+ * Creates an error for a specific HTTP status code
122
+ */
123
+ export declare function createHttpStatusError(statusCode: number, options?: {
124
+ name?: string;
125
+ message?: string;
126
+ requestId?: string;
127
+ }): AWSError;
128
+ /**
129
+ * Checks if an error is retriable based on AWS SDK v3 patterns
130
+ */
131
+ export declare function isRetriableAWSError(error: AWSError): boolean;
132
+ /**
133
+ * Checks if an error is a throttling error
134
+ */
135
+ export declare function isThrottlingError(error: AWSError): boolean;
136
+ /**
137
+ * Checks if an error is a network error
138
+ */
139
+ export declare function isNetworkError(error: Error & {
140
+ code?: string;
141
+ }): boolean;
@@ -0,0 +1,392 @@
1
+ "use strict";
2
+ /**
3
+ * AWS Error Factory
4
+ *
5
+ * Provides standardized factory functions for creating AWS SDK errors
6
+ * used in integration tests. This eliminates code duplication across
7
+ * test files and ensures consistent error structure.
8
+ *
9
+ * Usage:
10
+ * import { createDynamoDBError, createS3Error } from './utilities/aws-error-factory'
11
+ *
12
+ * const error = createDynamoDBError('ProvisionedThroughputExceededException', {
13
+ * message: 'Rate exceeded',
14
+ * httpStatusCode: 400,
15
+ * throttling: true,
16
+ * })
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.createDynamoDBError = createDynamoDBError;
20
+ exports.createS3Error = createS3Error;
21
+ exports.createSQSError = createSQSError;
22
+ exports.createSNSError = createSNSError;
23
+ exports.createSFNError = createSFNError;
24
+ exports.createSESError = createSESError;
25
+ exports.createNetworkError = createNetworkError;
26
+ exports.createTimeoutError = createTimeoutError;
27
+ exports.createHttpStatusError = createHttpStatusError;
28
+ exports.isRetriableAWSError = isRetriableAWSError;
29
+ exports.isThrottlingError = isThrottlingError;
30
+ exports.isNetworkError = isNetworkError;
31
+ /**
32
+ * Creates a base AWS error with the standard structure
33
+ */
34
+ function createBaseAWSError(name, options = {}) {
35
+ const { message = name, httpStatusCode = 400, requestId = `test-request-${Date.now()}`, throttling, fault = httpStatusCode >= 500 ? 'server' : 'client', retryAfterSeconds, code, } = options;
36
+ const error = new Error(message);
37
+ error.name = name;
38
+ error.$metadata = {
39
+ httpStatusCode,
40
+ requestId,
41
+ };
42
+ error.$fault = fault;
43
+ if (throttling !== undefined) {
44
+ error.$retryable = { throttling };
45
+ }
46
+ if (retryAfterSeconds !== undefined) {
47
+ error.retryAfterSeconds = retryAfterSeconds;
48
+ }
49
+ if (code !== undefined) {
50
+ error.code = code;
51
+ }
52
+ return error;
53
+ }
54
+ /**
55
+ * Creates a DynamoDB-specific error
56
+ */
57
+ function createDynamoDBError(name, options = {}) {
58
+ const defaultOptions = {};
59
+ // Set default properties based on error type
60
+ switch (name) {
61
+ case 'ProvisionedThroughputExceededException':
62
+ case 'ThrottlingException':
63
+ case 'RequestLimitExceeded':
64
+ defaultOptions.throttling = true;
65
+ defaultOptions.httpStatusCode = 400;
66
+ break;
67
+ case 'InternalServerError':
68
+ defaultOptions.httpStatusCode = 500;
69
+ defaultOptions.fault = 'server';
70
+ break;
71
+ case 'ServiceUnavailable':
72
+ defaultOptions.httpStatusCode = 503;
73
+ defaultOptions.fault = 'server';
74
+ break;
75
+ case 'ValidationException':
76
+ case 'ConditionalCheckFailedException':
77
+ case 'ResourceNotFoundException':
78
+ defaultOptions.httpStatusCode = 400;
79
+ defaultOptions.fault = 'client';
80
+ break;
81
+ case 'TransactionCanceledException':
82
+ case 'TransactionConflictException':
83
+ defaultOptions.httpStatusCode = 400;
84
+ break;
85
+ case 'ItemCollectionSizeLimitExceededException':
86
+ defaultOptions.httpStatusCode = 400;
87
+ break;
88
+ case 'AccessDeniedException':
89
+ defaultOptions.httpStatusCode = 403;
90
+ break;
91
+ }
92
+ const error = createBaseAWSError(name, { ...defaultOptions, ...options });
93
+ error.$service = 'DynamoDB';
94
+ return error;
95
+ }
96
+ /**
97
+ * Creates an S3-specific error
98
+ */
99
+ function createS3Error(name, options = {}) {
100
+ const defaultOptions = {};
101
+ switch (name) {
102
+ case 'NoSuchKey':
103
+ case 'NoSuchBucket':
104
+ case 'NoSuchUpload':
105
+ defaultOptions.httpStatusCode = 404;
106
+ break;
107
+ case 'AccessDenied':
108
+ case 'InvalidAccessKeyId':
109
+ case 'SignatureDoesNotMatch':
110
+ defaultOptions.httpStatusCode = 403;
111
+ break;
112
+ case 'EntityTooLarge':
113
+ defaultOptions.httpStatusCode = 400;
114
+ break;
115
+ case 'SlowDown':
116
+ defaultOptions.httpStatusCode = 503;
117
+ defaultOptions.throttling = true;
118
+ break;
119
+ case 'InternalError':
120
+ defaultOptions.httpStatusCode = 500;
121
+ defaultOptions.fault = 'server';
122
+ break;
123
+ case 'ServiceUnavailable':
124
+ defaultOptions.httpStatusCode = 503;
125
+ defaultOptions.fault = 'server';
126
+ break;
127
+ case 'BucketNotEmpty':
128
+ case 'BucketAlreadyExists':
129
+ case 'BucketAlreadyOwnedByYou':
130
+ defaultOptions.httpStatusCode = 409;
131
+ break;
132
+ }
133
+ const error = createBaseAWSError(name, { ...defaultOptions, ...options });
134
+ error.$service = 'S3';
135
+ return error;
136
+ }
137
+ /**
138
+ * Creates an SQS-specific error
139
+ */
140
+ function createSQSError(name, options = {}) {
141
+ const defaultOptions = {};
142
+ switch (name) {
143
+ case 'QueueDoesNotExist':
144
+ defaultOptions.httpStatusCode = 400;
145
+ break;
146
+ case 'ThrottlingException':
147
+ case 'OverLimit':
148
+ defaultOptions.throttling = true;
149
+ defaultOptions.httpStatusCode = 400;
150
+ break;
151
+ case 'AccessDeniedException':
152
+ defaultOptions.httpStatusCode = 403;
153
+ break;
154
+ case 'InvalidMessageContents':
155
+ case 'BatchEntryIdsNotDistinct':
156
+ case 'BatchRequestTooLong':
157
+ case 'EmptyBatchRequest':
158
+ case 'InvalidBatchEntryId':
159
+ case 'TooManyEntriesInBatchRequest':
160
+ defaultOptions.httpStatusCode = 400;
161
+ break;
162
+ case 'MessageNotInflight':
163
+ case 'ReceiptHandleIsInvalid':
164
+ defaultOptions.httpStatusCode = 400;
165
+ break;
166
+ }
167
+ const error = createBaseAWSError(name, { ...defaultOptions, ...options });
168
+ error.$service = 'SQS';
169
+ return error;
170
+ }
171
+ /**
172
+ * Creates an SNS-specific error
173
+ */
174
+ function createSNSError(name, options = {}) {
175
+ const defaultOptions = {};
176
+ switch (name) {
177
+ case 'NotFoundException':
178
+ defaultOptions.httpStatusCode = 404;
179
+ break;
180
+ case 'TopicLimitExceededException':
181
+ case 'SubscriptionLimitExceededException':
182
+ case 'ThrottledException':
183
+ defaultOptions.throttling = true;
184
+ defaultOptions.httpStatusCode = 400;
185
+ break;
186
+ case 'AuthorizationErrorException':
187
+ defaultOptions.httpStatusCode = 403;
188
+ break;
189
+ case 'InternalErrorException':
190
+ defaultOptions.httpStatusCode = 500;
191
+ defaultOptions.fault = 'server';
192
+ break;
193
+ case 'InvalidParameterException':
194
+ case 'InvalidParameterValueException':
195
+ defaultOptions.httpStatusCode = 400;
196
+ break;
197
+ }
198
+ const error = createBaseAWSError(name, { ...defaultOptions, ...options });
199
+ error.$service = 'SNS';
200
+ return error;
201
+ }
202
+ /**
203
+ * Creates a Step Functions-specific error
204
+ */
205
+ function createSFNError(name, options = {}) {
206
+ const defaultOptions = {};
207
+ switch (name) {
208
+ case 'ExecutionDoesNotExist':
209
+ case 'StateMachineDoesNotExist':
210
+ case 'TaskDoesNotExist':
211
+ case 'ActivityDoesNotExist':
212
+ case 'ResourceNotFound':
213
+ defaultOptions.httpStatusCode = 400;
214
+ break;
215
+ case 'ExecutionAlreadyExists':
216
+ defaultOptions.httpStatusCode = 400;
217
+ break;
218
+ case 'ThrottlingException':
219
+ case 'ExecutionLimitExceeded':
220
+ case 'StateMachineLimitExceeded':
221
+ case 'ActivityLimitExceeded':
222
+ case 'ServiceQuotaExceededException':
223
+ defaultOptions.throttling = true;
224
+ defaultOptions.httpStatusCode = 400;
225
+ break;
226
+ case 'InvalidArn':
227
+ case 'InvalidDefinition':
228
+ case 'InvalidExecutionInput':
229
+ case 'InvalidName':
230
+ case 'InvalidToken':
231
+ defaultOptions.httpStatusCode = 400;
232
+ break;
233
+ case 'TaskTimedOut':
234
+ defaultOptions.httpStatusCode = 400;
235
+ break;
236
+ }
237
+ const error = createBaseAWSError(name, { ...defaultOptions, ...options });
238
+ error.$service = 'StepFunctions';
239
+ return error;
240
+ }
241
+ /**
242
+ * Creates an SES-specific error
243
+ */
244
+ function createSESError(name, options = {}) {
245
+ const defaultOptions = {};
246
+ switch (name) {
247
+ case 'MessageRejected':
248
+ defaultOptions.httpStatusCode = 400;
249
+ break;
250
+ case 'MailFromDomainNotVerifiedException':
251
+ defaultOptions.httpStatusCode = 400;
252
+ break;
253
+ case 'ConfigurationSetDoesNotExistException':
254
+ case 'NotFoundException':
255
+ defaultOptions.httpStatusCode = 404;
256
+ break;
257
+ case 'AccountSendingPausedException':
258
+ defaultOptions.httpStatusCode = 400;
259
+ break;
260
+ case 'LimitExceededException':
261
+ case 'TooManyRequestsException':
262
+ defaultOptions.throttling = true;
263
+ defaultOptions.httpStatusCode = 429;
264
+ break;
265
+ case 'BadRequestException':
266
+ defaultOptions.httpStatusCode = 400;
267
+ break;
268
+ }
269
+ const error = createBaseAWSError(name, { ...defaultOptions, ...options });
270
+ error.$service = 'SES';
271
+ return error;
272
+ }
273
+ /**
274
+ * Creates a network-level error
275
+ */
276
+ function createNetworkError(code, message) {
277
+ const defaultMessages = {
278
+ ECONNRESET: 'read ECONNRESET',
279
+ ECONNREFUSED: 'connect ECONNREFUSED',
280
+ ETIMEDOUT: 'connect ETIMEDOUT',
281
+ ENETUNREACH: 'network unreachable',
282
+ ENOTFOUND: 'getaddrinfo ENOTFOUND',
283
+ EPIPE: 'write EPIPE',
284
+ EAI_AGAIN: 'getaddrinfo EAI_AGAIN',
285
+ };
286
+ const error = new Error(message || defaultMessages[code]);
287
+ error.code = code;
288
+ return error;
289
+ }
290
+ /**
291
+ * Creates a timeout error
292
+ */
293
+ function createTimeoutError(message = 'Request timeout') {
294
+ const error = new Error(message);
295
+ error.name = 'TimeoutError';
296
+ error.code = 'ETIMEDOUT';
297
+ return error;
298
+ }
299
+ // ============================================================================
300
+ // Generic HTTP Status Errors
301
+ // ============================================================================
302
+ /**
303
+ * Creates an error for a specific HTTP status code
304
+ */
305
+ function createHttpStatusError(statusCode, options = {}) {
306
+ const statusMessages = {
307
+ 400: 'Bad Request',
308
+ 401: 'Unauthorized',
309
+ 403: 'Forbidden',
310
+ 404: 'Not Found',
311
+ 408: 'Request Timeout',
312
+ 429: 'Too Many Requests',
313
+ 500: 'Internal Server Error',
314
+ 502: 'Bad Gateway',
315
+ 503: 'Service Unavailable',
316
+ 504: 'Gateway Timeout',
317
+ };
318
+ const name = options.name || statusMessages[statusCode] || 'UnknownError';
319
+ const message = options.message || statusMessages[statusCode] || 'Error';
320
+ return createBaseAWSError(name, {
321
+ message,
322
+ httpStatusCode: statusCode,
323
+ requestId: options.requestId,
324
+ fault: statusCode >= 500 ? 'server' : 'client',
325
+ throttling: statusCode === 429,
326
+ });
327
+ }
328
+ // ============================================================================
329
+ // Utility Functions
330
+ // ============================================================================
331
+ /**
332
+ * Checks if an error is retriable based on AWS SDK v3 patterns
333
+ */
334
+ function isRetriableAWSError(error) {
335
+ // Check $retryable flag
336
+ if (error.$retryable) {
337
+ return true;
338
+ }
339
+ // Check HTTP status codes
340
+ const statusCode = error.$metadata?.httpStatusCode;
341
+ if (statusCode) {
342
+ // 5xx errors are retriable
343
+ if (statusCode >= 500 && statusCode < 600) {
344
+ return true;
345
+ }
346
+ // 429 Too Many Requests
347
+ if (statusCode === 429) {
348
+ return true;
349
+ }
350
+ }
351
+ // Check error names
352
+ const retriableErrorNames = [
353
+ 'ProvisionedThroughputExceededException',
354
+ 'ThrottlingException',
355
+ 'InternalServerError',
356
+ 'ServiceUnavailable',
357
+ 'RequestLimitExceeded',
358
+ 'SlowDown',
359
+ 'TooManyRequestsException',
360
+ ];
361
+ return retriableErrorNames.includes(error.name);
362
+ }
363
+ /**
364
+ * Checks if an error is a throttling error
365
+ */
366
+ function isThrottlingError(error) {
367
+ return error.$retryable?.throttling === true;
368
+ }
369
+ /**
370
+ * Checks if an error is a network error
371
+ */
372
+ function isNetworkError(error) {
373
+ const networkErrorCodes = [
374
+ 'ECONNRESET',
375
+ 'ECONNREFUSED',
376
+ 'ETIMEDOUT',
377
+ 'ENETUNREACH',
378
+ 'ENOTFOUND',
379
+ 'EPIPE',
380
+ 'EAI_AGAIN',
381
+ ];
382
+ if (error.code &&
383
+ networkErrorCodes.includes(error.code)) {
384
+ return true;
385
+ }
386
+ const message = error.message.toLowerCase();
387
+ return (message.includes('socket hang up') ||
388
+ message.includes('network error') ||
389
+ message.includes('connection reset') ||
390
+ message.includes('connection refused'));
391
+ }
392
+ //# sourceMappingURL=aws-error-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-error-factory.js","sourceRoot":"","sources":["../../../src/integration/utilities/aws-error-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * AWS Mock Manager
3
+ *
4
+ * Provides standardized setup and teardown for AWS SDK mock clients
5
+ * in integration tests. This eliminates repetitive mock configuration
6
+ * across test files and ensures consistent mock behavior.
7
+ *
8
+ * Usage:
9
+ * import { AWSMockManager, createDynamoDBMock } from './utilities/aws-mock-manager'
10
+ *
11
+ * // Option 1: Use individual mock creators
12
+ * const { mock, client, reset, restore } = createDynamoDBMock()
13
+ *
14
+ * // Option 2: Use the manager for multiple services
15
+ * const manager = new AWSMockManager()
16
+ * const dynamoDB = manager.getDynamoDB()
17
+ * const s3 = manager.getS3()
18
+ *
19
+ * beforeEach(() => manager.resetAll())
20
+ * afterAll(() => manager.restoreAll())
21
+ */
22
+ import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
23
+ import { S3Client } from '@aws-sdk/client-s3';
24
+ import { SESv2Client } from '@aws-sdk/client-sesv2';
25
+ import { SFNClient } from '@aws-sdk/client-sfn';
26
+ import { SNSClient } from '@aws-sdk/client-sns';
27
+ import { SQSClient } from '@aws-sdk/client-sqs';
28
+ import { AwsClientStub } from 'aws-sdk-client-mock';
29
+ /**
30
+ * Configuration options for mock clients
31
+ */
32
+ export interface MockClientOptions {
33
+ region?: string;
34
+ maxAttempts?: number;
35
+ retryMode?: 'standard' | 'adaptive';
36
+ }
37
+ /**
38
+ * Result from creating a mock client
39
+ */
40
+ export interface MockClientResult<TClient> {
41
+ /** The mock client stub for configuring responses */
42
+ mock: AwsClientStub<TClient>;
43
+ /** The actual client instance configured with the mock */
44
+ client: TClient;
45
+ /** Reset the mock to clear all configured behaviors */
46
+ reset: () => void;
47
+ /** Restore the mock and destroy the client */
48
+ restore: () => void;
49
+ }
50
+ /**
51
+ * Creates a mocked DynamoDB client
52
+ */
53
+ export declare function createDynamoDBMock(options?: MockClientOptions): MockClientResult<DynamoDBClient>;
54
+ /**
55
+ * Creates a mocked S3 client
56
+ */
57
+ export declare function createS3Mock(options?: MockClientOptions): MockClientResult<S3Client>;
58
+ /**
59
+ * Creates a mocked SQS client
60
+ */
61
+ export declare function createSQSMock(options?: MockClientOptions): MockClientResult<SQSClient>;
62
+ /**
63
+ * Creates a mocked SNS client
64
+ */
65
+ export declare function createSNSMock(options?: MockClientOptions): MockClientResult<SNSClient>;
66
+ /**
67
+ * Creates a mocked Step Functions client
68
+ */
69
+ export declare function createSFNMock(options?: MockClientOptions): MockClientResult<SFNClient>;
70
+ /**
71
+ * Creates a mocked SES v2 client
72
+ */
73
+ export declare function createSESMock(options?: MockClientOptions): MockClientResult<SESv2Client>;
74
+ /**
75
+ * Manages multiple AWS mock clients for test suites
76
+ */
77
+ export declare class AWSMockManager {
78
+ private dynamoDB?;
79
+ private s3?;
80
+ private sqs?;
81
+ private sns?;
82
+ private sfn?;
83
+ private ses?;
84
+ private options;
85
+ constructor(options?: MockClientOptions);
86
+ /**
87
+ * Gets or creates the DynamoDB mock
88
+ */
89
+ getDynamoDB(): MockClientResult<DynamoDBClient>;
90
+ /**
91
+ * Gets or creates the S3 mock
92
+ */
93
+ getS3(): MockClientResult<S3Client>;
94
+ /**
95
+ * Gets or creates the SQS mock
96
+ */
97
+ getSQS(): MockClientResult<SQSClient>;
98
+ /**
99
+ * Gets or creates the SNS mock
100
+ */
101
+ getSNS(): MockClientResult<SNSClient>;
102
+ /**
103
+ * Gets or creates the Step Functions mock
104
+ */
105
+ getSFN(): MockClientResult<SFNClient>;
106
+ /**
107
+ * Gets or creates the SES mock
108
+ */
109
+ getSES(): MockClientResult<SESv2Client>;
110
+ /**
111
+ * Resets all active mocks
112
+ */
113
+ resetAll(): void;
114
+ /**
115
+ * Restores all mocks and destroys clients
116
+ */
117
+ restoreAll(): void;
118
+ }
119
+ /**
120
+ * Creates a standard test setup with beforeEach/afterAll hooks
121
+ * for use with Jest describe blocks
122
+ */
123
+ export declare function setupAWSMocks(services: Array<'dynamodb' | 's3' | 'sqs' | 'sns' | 'sfn' | 'ses'>, options?: MockClientOptions): {
124
+ manager: AWSMockManager;
125
+ beforeEachHook: () => void;
126
+ afterAllHook: () => void;
127
+ };
128
+ /**
129
+ * Quick setup function that returns individual mocks for common patterns
130
+ */
131
+ export declare function createTestMocks<T extends Array<'dynamodb' | 's3' | 'sqs' | 'sns' | 'sfn' | 'ses'>>(services: T, options?: MockClientOptions): {
132
+ [K in T[number]]: K extends 'dynamodb' ? MockClientResult<DynamoDBClient> : K extends 's3' ? MockClientResult<S3Client> : K extends 'sqs' ? MockClientResult<SQSClient> : K extends 'sns' ? MockClientResult<SNSClient> : K extends 'sfn' ? MockClientResult<SFNClient> : K extends 'ses' ? MockClientResult<SESv2Client> : never;
133
+ } & {
134
+ resetAll: () => void;
135
+ restoreAll: () => void;
136
+ };