rabbitmq-with-retry-and-dlq 1.0.24 → 1.0.26

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/test.js DELETED
@@ -1,446 +0,0 @@
1
- "use strict";
2
- /**
3
- * Comprehensive Test Suite for rabbitmq-with-retry-and-dlq
4
- *
5
- * Usage:
6
- * 1. Set RABBITMQ_URL environment variable (or modify the URL in this file)
7
- * 2. Run: npm test
8
- *
9
- * Tests:
10
- * ✓ Connection with correct URL
11
- * ✓ Connection with wrong URL (error handling)
12
- * ✓ Connection status checks
13
- * ✓ Assert queues with retry config
14
- * ✓ Publish to queue
15
- * ✓ Publish to exchange
16
- * ✓ Consumer with retry mechanism
17
- * ✓ Graceful shutdown
18
- */
19
- Object.defineProperty(exports, "__esModule", { value: true });
20
- const rabbitmq_with_retry_and_dlq_1 = require("rabbitmq-with-retry-and-dlq");
21
- // ============================================
22
- // CONFIGURATION
23
- // ============================================
24
- const RABBITMQ_URL = process.env.RABBITMQ_URL || 'amqp://localhost:5672';
25
- const TEST_QUEUE = 'test_orders_' + Date.now();
26
- const TEST_EXCHANGE = 'test_exchange_' + Date.now();
27
- // Test counters
28
- let testsRun = 0;
29
- let testsPassed = 0;
30
- let testsFailed = 0;
31
- // ============================================
32
- // HELPER FUNCTIONS
33
- // ============================================
34
- function log(message) {
35
- console.log(`\n${'='.repeat(60)}`);
36
- console.log(message);
37
- console.log('='.repeat(60));
38
- }
39
- function pass(testName) {
40
- testsRun++;
41
- testsPassed++;
42
- console.log(`✓ PASS: ${testName}`);
43
- }
44
- function fail(testName, error) {
45
- testsRun++;
46
- testsFailed++;
47
- console.error(`✗ FAIL: ${testName}`);
48
- console.error(` Error: ${error.message || error}`);
49
- }
50
- async function sleep(ms) {
51
- return new Promise(resolve => setTimeout(resolve, ms));
52
- }
53
- // ============================================
54
- // TEST 1: Connection with Wrong URL
55
- // ============================================
56
- async function testWrongURL() {
57
- log('TEST 1: Connection with Wrong URL (Should Fail)');
58
- try {
59
- // This should timeout and throw error
60
- await (0, rabbitmq_with_retry_and_dlq_1.initializeRabbitMQ)('amqp://wronghost:9999');
61
- fail('Wrong URL should throw error', new Error('Connection succeeded but should have failed'));
62
- }
63
- catch (error) {
64
- // Expected to fail
65
- if ((0, rabbitmq_with_retry_and_dlq_1.isPublisherConnected)() === false && (0, rabbitmq_with_retry_and_dlq_1.isConsumerConnected)() === false) {
66
- pass('Wrong URL properly rejected');
67
- }
68
- else {
69
- fail('Wrong URL - connection status should be false', error);
70
- }
71
- }
72
- }
73
- // ============================================
74
- // TEST 2: Connection with Correct URL
75
- // ============================================
76
- async function testCorrectURL() {
77
- log('TEST 2: Connection with Correct URL');
78
- try {
79
- console.log(`Connecting to: ${RABBITMQ_URL}`);
80
- await (0, rabbitmq_with_retry_and_dlq_1.initializeRabbitMQ)(RABBITMQ_URL);
81
- // Check connection status
82
- const pubConnected = (0, rabbitmq_with_retry_and_dlq_1.isPublisherConnected)();
83
- const conConnected = (0, rabbitmq_with_retry_and_dlq_1.isConsumerConnected)();
84
- console.log(` Publisher connected: ${pubConnected}`);
85
- console.log(` Consumer connected: ${conConnected}`);
86
- if (pubConnected && conConnected) {
87
- pass('Connection established successfully');
88
- }
89
- else {
90
- fail('Connection status check', new Error('Status should be true after connection'));
91
- }
92
- }
93
- catch (error) {
94
- fail('Connection with correct URL', error);
95
- throw error; // Stop tests if connection fails
96
- }
97
- }
98
- // ============================================
99
- // TEST 3: Assert Queues with Retry Config
100
- // ============================================
101
- async function testAssertQueues() {
102
- log('TEST 3: Assert Queues with Retry Config');
103
- try {
104
- await rabbitmq_with_retry_and_dlq_1.publisher.assertQueues(TEST_QUEUE, {
105
- durable: true,
106
- retryConfig: {
107
- maxRetries: 3,
108
- retryDelayMs: 1000,
109
- backoffStrategy: 'exponential',
110
- jitterMs: 500,
111
- },
112
- });
113
- console.log(` Queue asserted: ${TEST_QUEUE}`);
114
- console.log(` Retry config: 3 retries, exponential backoff`);
115
- pass('Assert queues with retry config');
116
- }
117
- catch (error) {
118
- fail('Assert queues', error);
119
- }
120
- }
121
- // ============================================
122
- // TEST 4: Assert Multiple Queues
123
- // ============================================
124
- async function testAssertMultipleQueues() {
125
- log('TEST 4: Assert Multiple Queues');
126
- try {
127
- const queues = [`${TEST_QUEUE}_multi1`, `${TEST_QUEUE}_multi2`, `${TEST_QUEUE}_multi3`];
128
- await rabbitmq_with_retry_and_dlq_1.publisher.assertQueues(queues, {
129
- retryConfig: {
130
- maxRetries: 2,
131
- },
132
- });
133
- console.log(` Queues asserted: ${queues.length}`);
134
- pass('Assert multiple queues');
135
- }
136
- catch (error) {
137
- fail('Assert multiple queues', error);
138
- }
139
- }
140
- // ============================================
141
- // TEST 5: Assert Queue with Exchange
142
- // ============================================
143
- async function testAssertQueueWithExchange() {
144
- log('TEST 5: Assert Queue with Exchange');
145
- try {
146
- await rabbitmq_with_retry_and_dlq_1.publisher.assertQueues(`${TEST_QUEUE}_exchange`, {
147
- exchangeName: TEST_EXCHANGE,
148
- exchangeType: 'direct',
149
- routingKey: 'test.order.created',
150
- retryConfig: {
151
- maxRetries: 3,
152
- },
153
- });
154
- console.log(` Exchange asserted: ${TEST_EXCHANGE}`);
155
- console.log(` Queue bound with routing key: test.order.created`);
156
- pass('Assert queue with exchange');
157
- }
158
- catch (error) {
159
- fail('Assert queue with exchange', error);
160
- }
161
- }
162
- // ============================================
163
- // TEST 6: Publish to Queue
164
- // ============================================
165
- async function testPublishToQueue() {
166
- log('TEST 6: Publish to Queue');
167
- try {
168
- const message = {
169
- orderId: 'ORDER-TEST-001',
170
- amount: 99.99,
171
- timestamp: new Date().toISOString(),
172
- };
173
- const result = await rabbitmq_with_retry_and_dlq_1.publisher.publishToQueue({
174
- queueName: TEST_QUEUE,
175
- message,
176
- options: {
177
- persistent: true,
178
- priority: 5,
179
- },
180
- });
181
- if (result) {
182
- console.log(` Message published: ${message.orderId}`);
183
- pass('Publish to queue');
184
- }
185
- else {
186
- fail('Publish to queue', new Error('Publish returned false'));
187
- }
188
- }
189
- catch (error) {
190
- fail('Publish to queue', error);
191
- }
192
- }
193
- // ============================================
194
- // TEST 7: Publish to Exchange
195
- // ============================================
196
- async function testPublishToExchange() {
197
- log('TEST 7: Publish to Exchange');
198
- try {
199
- const message = {
200
- orderId: 'ORDER-EXCHANGE-001',
201
- customer: 'John Doe',
202
- timestamp: new Date().toISOString(),
203
- };
204
- const result = await rabbitmq_with_retry_and_dlq_1.publisher.publishToExchange({
205
- exchangeName: TEST_EXCHANGE,
206
- exchangeType: 'direct',
207
- queueName: `${TEST_QUEUE}_exchange`,
208
- routingKey: 'test.order.created',
209
- message,
210
- options: {
211
- persistent: true,
212
- },
213
- });
214
- if (result) {
215
- console.log(` Message published to exchange: ${message.orderId}`);
216
- pass('Publish to exchange');
217
- }
218
- else {
219
- fail('Publish to exchange', new Error('Publish returned false'));
220
- }
221
- }
222
- catch (error) {
223
- fail('Publish to exchange', error);
224
- }
225
- }
226
- // ============================================
227
- // TEST 8: Publish Multiple Messages
228
- // ============================================
229
- async function testPublishMultipleMessages() {
230
- log('TEST 8: Publish Multiple Messages');
231
- try {
232
- const messages = [
233
- { orderId: 'BATCH-001', amount: 10 },
234
- { orderId: 'BATCH-002', amount: 20 },
235
- { orderId: 'BATCH-003', amount: 30 },
236
- ];
237
- for (const msg of messages) {
238
- await rabbitmq_with_retry_and_dlq_1.publisher.publishToQueue({
239
- queueName: TEST_QUEUE,
240
- message: msg,
241
- });
242
- }
243
- console.log(` Published ${messages.length} messages`);
244
- pass('Publish multiple messages');
245
- }
246
- catch (error) {
247
- fail('Publish multiple messages', error);
248
- }
249
- }
250
- // ============================================
251
- // TEST 9: Consumer with Success
252
- // ============================================
253
- async function testConsumerSuccess() {
254
- log('TEST 9: Consumer with Success');
255
- try {
256
- let messagesProcessed = 0;
257
- const targetMessages = 3;
258
- // Set up error handler
259
- rabbitmq_with_retry_and_dlq_1.consumer.on('error', (errorEvent) => {
260
- console.error(' Consumer error:', errorEvent.type);
261
- });
262
- // Start consumer
263
- await rabbitmq_with_retry_and_dlq_1.consumer.consumeQueue({
264
- queueName: TEST_QUEUE,
265
- onMessage: async (message) => {
266
- console.log(` Processing message: ${message.orderId || message.id || JSON.stringify(message).substring(0, 50)}`);
267
- messagesProcessed++;
268
- // Successfully process (no error = auto-ack)
269
- },
270
- options: {
271
- prefetch: 5,
272
- },
273
- });
274
- console.log(' Consumer started, waiting for messages...');
275
- // Wait for messages to be processed
276
- await sleep(2000);
277
- if (messagesProcessed >= targetMessages) {
278
- console.log(` Processed ${messagesProcessed} messages`);
279
- pass('Consumer processed messages successfully');
280
- }
281
- else {
282
- console.log(` Processed ${messagesProcessed} messages (expected at least ${targetMessages})`);
283
- pass('Consumer started (may need more time to process all)');
284
- }
285
- }
286
- catch (error) {
287
- fail('Consumer with success', error);
288
- }
289
- }
290
- // ============================================
291
- // TEST 10: Consumer with Retry (Simulated Failure)
292
- // ============================================
293
- async function testConsumerWithRetry() {
294
- log('TEST 10: Consumer with Retry (Simulated Failure)');
295
- try {
296
- const retryQueue = `${TEST_QUEUE}_retry_test`;
297
- // Assert queue with retry
298
- await rabbitmq_with_retry_and_dlq_1.publisher.assertQueues(retryQueue, {
299
- retryConfig: {
300
- maxRetries: 2,
301
- retryDelayMs: 500,
302
- backoffStrategy: 'exponential',
303
- },
304
- });
305
- // Publish a message that will fail
306
- await rabbitmq_with_retry_and_dlq_1.publisher.publishToQueue({
307
- queueName: retryQueue,
308
- message: { orderId: 'WILL-FAIL', shouldFail: true },
309
- });
310
- let attemptCount = 0;
311
- // Start consumer that fails first 2 times, succeeds on 3rd
312
- await rabbitmq_with_retry_and_dlq_1.consumer.consumeQueue({
313
- queueName: retryQueue,
314
- onMessage: async (message) => {
315
- attemptCount++;
316
- console.log(` Attempt ${attemptCount}: ${message.orderId}`);
317
- if (attemptCount < 3 && message.shouldFail) {
318
- throw new Error('Simulated processing failure');
319
- }
320
- // Success on 3rd attempt
321
- console.log(` Success after ${attemptCount} attempts`);
322
- },
323
- });
324
- // Wait for retries
325
- await sleep(3000);
326
- console.log(` Total attempts: ${attemptCount}`);
327
- pass('Consumer with retry mechanism');
328
- }
329
- catch (error) {
330
- fail('Consumer with retry', error);
331
- }
332
- }
333
- // ============================================
334
- // TEST 11: Delete Queues
335
- // ============================================
336
- async function testDeleteQueues() {
337
- log('TEST 11: Delete Queues (Cleanup)');
338
- try {
339
- // Delete test queues
340
- await rabbitmq_with_retry_and_dlq_1.publisher.deleteQueues([
341
- TEST_QUEUE,
342
- `${TEST_QUEUE}_multi1`,
343
- `${TEST_QUEUE}_multi2`,
344
- `${TEST_QUEUE}_multi3`,
345
- `${TEST_QUEUE}_exchange`,
346
- `${TEST_QUEUE}_retry_test`,
347
- ], {
348
- includeRetry: true,
349
- includeDLQ: true,
350
- });
351
- console.log(' Test queues deleted');
352
- pass('Delete queues');
353
- }
354
- catch (error) {
355
- // Queue deletion might fail if they don't exist, that's ok
356
- console.log(' Queue deletion completed (some may not exist)');
357
- pass('Delete queues (best effort)');
358
- }
359
- }
360
- // ============================================
361
- // TEST 12: Graceful Shutdown
362
- // ============================================
363
- async function testGracefulShutdown() {
364
- log('TEST 12: Graceful Shutdown');
365
- try {
366
- await (0, rabbitmq_with_retry_and_dlq_1.closeRabbitMQ)();
367
- // Check connection status after close
368
- const pubConnected = (0, rabbitmq_with_retry_and_dlq_1.isPublisherConnected)();
369
- const conConnected = (0, rabbitmq_with_retry_and_dlq_1.isConsumerConnected)();
370
- console.log(` Publisher connected: ${pubConnected}`);
371
- console.log(` Consumer connected: ${conConnected}`);
372
- if (!pubConnected && !conConnected) {
373
- pass('Graceful shutdown');
374
- }
375
- else {
376
- fail('Graceful shutdown', new Error('Connections should be closed'));
377
- }
378
- }
379
- catch (error) {
380
- fail('Graceful shutdown', error);
381
- }
382
- }
383
- // ============================================
384
- // MAIN TEST RUNNER
385
- // ============================================
386
- async function runAllTests() {
387
- console.log('\n');
388
- console.log('╔════════════════════════════════════════════════════════════╗');
389
- console.log('║ RabbitMQ with Retry and DLQ - Test Suite ║');
390
- console.log('╚════════════════════════════════════════════════════════════╝');
391
- console.log(`\nRabbitMQ URL: ${RABBITMQ_URL}`);
392
- console.log(`Test Queue: ${TEST_QUEUE}`);
393
- console.log(`Test Exchange: ${TEST_EXCHANGE}\n`);
394
- try {
395
- // Run tests in sequence
396
- await testWrongURL();
397
- await sleep(500);
398
- await testCorrectURL();
399
- await sleep(500);
400
- await testAssertQueues();
401
- await sleep(300);
402
- await testAssertMultipleQueues();
403
- await sleep(300);
404
- await testAssertQueueWithExchange();
405
- await sleep(300);
406
- await testPublishToQueue();
407
- await sleep(300);
408
- await testPublishToExchange();
409
- await sleep(300);
410
- await testPublishMultipleMessages();
411
- await sleep(500);
412
- await testConsumerSuccess();
413
- await sleep(500);
414
- await testConsumerWithRetry();
415
- await sleep(500);
416
- await testDeleteQueues();
417
- await sleep(300);
418
- await testGracefulShutdown();
419
- }
420
- catch (error) {
421
- console.error('\n❌ Test suite aborted due to critical error:', error);
422
- }
423
- // Print summary
424
- console.log('\n');
425
- console.log('╔════════════════════════════════════════════════════════════╗');
426
- console.log('║ TEST SUMMARY ║');
427
- console.log('╚════════════════════════════════════════════════════════════╝');
428
- console.log(`\nTotal Tests: ${testsRun}`);
429
- console.log(`✓ Passed: ${testsPassed}`);
430
- console.log(`✗ Failed: ${testsFailed}`);
431
- console.log(`Success Rate: ${testsRun > 0 ? ((testsPassed / testsRun) * 100).toFixed(1) : 0}%\n`);
432
- if (testsFailed === 0) {
433
- console.log('🎉 All tests passed!\n');
434
- process.exit(0);
435
- }
436
- else {
437
- console.log('❌ Some tests failed. Please review the output above.\n');
438
- process.exit(1);
439
- }
440
- }
441
- // Run tests
442
- runAllTests().catch((error) => {
443
- console.error('\n❌ Fatal error running tests:', error);
444
- process.exit(1);
445
- });
446
- //# sourceMappingURL=test.js.map
package/dist/test.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../test.ts"],"names":[],"mappings":"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"}