qdone 1.7.0 → 2.0.0-alpha

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/test/test.cli.js DELETED
@@ -1,1609 +0,0 @@
1
- /* eslint-env mocha */
2
-
3
- const chai = require('chai')
4
- // const exec = require('child_process').exec
5
- const packageJson = require('../package.json')
6
- const sinon = require('sinon')
7
- const stripAnsi = require('strip-ansi')
8
- const fs = require('fs')
9
- const AWS = require('aws-sdk-mock')
10
- // const mockStdin = require('mock-stdin')
11
-
12
- const expect = chai.expect
13
- chai.should()
14
-
15
- delete process.env.AWS_ACCESS_KEY_ID
16
- delete process.env.AWS_SECRET_ACCESS_KEY
17
-
18
- let sandbox
19
- let clock
20
-
21
- beforeEach(function () {
22
- sandbox = sinon.createSandbox()
23
- sandbox.stub(process.stdout, 'write')
24
- sandbox.stub(process.stderr, 'write')
25
- clock = sandbox.useFakeTimers()
26
- })
27
-
28
- afterEach(function () {
29
- sandbox.restore()
30
- clock.restore()
31
- AWS.restore()
32
- })
33
-
34
- function cliTest (command, success, failure) {
35
- const cli = require('../src/cli')
36
- const qrlCache = require('../src/qrlCache')
37
- function sandboxRestore (value) {
38
- sandbox.restore()
39
- qrlCache.clear()
40
- return value
41
- }
42
- return function (done) {
43
- cli
44
- .run(command)
45
- .then(function (result) {
46
- success = success || (result => result)
47
- const stdout = process.stdout.write.args.reduce((a, b) => a + b, '')
48
- const stderr = process.stderr.write.args.reduce((a, b) => a + b, '')
49
- if (process.env.DEBUG) {
50
- process.nextTick(_ => {
51
- process.stdout.write(stdout)
52
- process.stderr.write(stderr)
53
- })
54
- }
55
- return success(result, stripAnsi(stdout), stripAnsi(stderr))
56
- })
57
- .catch(function (err) {
58
- failure = failure || (err => { throw err })
59
- const stdout = process.stdout.write.args.reduce((a, b) => a + b, '')
60
- const stderr = process.stderr.write.args.reduce((a, b) => a + b, '')
61
- if (process.env.DEBUG) {
62
- process.nextTick(_ => {
63
- process.stdout.write(stdout)
64
- process.stderr.write(stderr)
65
- })
66
- }
67
- return failure(err, stripAnsi(stdout), stripAnsi(stderr))
68
- })
69
- .then(sandboxRestore)
70
- .catch(sandboxRestore)
71
- .then(done)
72
- .catch(done)
73
- }
74
- }
75
-
76
- describe('cli', function () {
77
- // Root command
78
- describe('qdone', function () {
79
- it('should print usage and exit 0',
80
- cliTest([], function (result, stdout, stderr) {
81
- expect(stdout).to.contain('usage: ')
82
- }))
83
- })
84
-
85
- describe('qdone --help', function () {
86
- it('should print usage and exit 0',
87
- cliTest(['--help'], function (result, stdout, stderr) {
88
- expect(stdout).to.contain('usage: ')
89
- }))
90
- })
91
-
92
- describe('qdone --version', function () {
93
- it('should print package.json version and exit 0',
94
- cliTest(['--version'], function (result, stdout, stderr) {
95
- expect(stdout).to.contain(packageJson.version)
96
- }))
97
- })
98
-
99
- describe('qdone --some-invalid-option', function () {
100
- it('should print usage and exit 1',
101
- cliTest(['--some-invalid-option'], null, function (err, stdout, stderr) {
102
- expect(stdout).to.contain('usage: ')
103
- expect(err).to.be.an('error')
104
- }))
105
- })
106
-
107
- // Enqueue
108
- describe('qdone enqueue', function () {
109
- it('should print usage and exit 1 with error',
110
- cliTest(['enqueue', '--verbose'], null, function (err, stdout, stderr) {
111
- expect(stdout).to.contain('usage: ')
112
- expect(stderr).to.contain('<queue>')
113
- expect(err).to.be.an('error')
114
- }))
115
- })
116
-
117
- describe('qdone enqueue --help', function () {
118
- it('should print usage and exit 0',
119
- cliTest(['enqueue', '--help'], function (result, stdout, stderr) {
120
- expect(stdout).to.contain('usage: ')
121
- expect(stdout).to.contain('enqueue')
122
- }))
123
- })
124
-
125
- describe('qdone enqueue onlyQueue', function () {
126
- it('should print usage and exit 1 with error',
127
- cliTest(['enqueue', '--verbose', 'onlyQueue'], null, function (err, stdout, stderr) {
128
- expect(stdout).to.contain('usage: ')
129
- expect(stderr).to.contain('<queue>')
130
- expect(err).to.be.an('error')
131
- }))
132
- })
133
-
134
- describe('qdone enqueue testQueue true # (with no credentials)', function () {
135
- before(function () {
136
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
137
- const err = new Error('Access to the resource https://sqs.us-east-1.amazonaws.com/ is denied.')
138
- err.code = 'AccessDenied'
139
- callback(err)
140
- })
141
- })
142
- it('should print usage and exit 1 with error',
143
- cliTest(['enqueue', 'testQueue', 'true'], null, function (err, stdout, stderr) {
144
- expect(stdout).to.contain('You must provide')
145
- expect(stderr).to.contain('Access to the resource https://sqs.us-east-1.amazonaws.com/ is denied.')
146
- expect(err).to.be.an('error')
147
- }))
148
- })
149
-
150
- describe('qdone enqueue testQueue true # (queue exists)', function () {
151
- before(function () {
152
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
153
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
154
- })
155
- AWS.mock('SQS', 'sendMessage', function (params, callback) {
156
- callback(null, {
157
- MD5OfMessageAttributes: '00484c68...59e48f06',
158
- MD5OfMessageBody: '51b0a325...39163aa0',
159
- MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE'
160
- })
161
- })
162
- })
163
- it('should print id of enqueued message and exit 0',
164
- cliTest(['enqueue', '--verbose', 'testQueue', 'true'], function (result, stdout, stderr) {
165
- expect(stderr).to.contain('Enqueued job da68f62c-0c07-4bee-bf5f-7e856EXAMPLE')
166
- }))
167
- })
168
-
169
- describe('qdone enqueue --fifo testQueue true # (queue exists, fifo mode)', function () {
170
- before(function () {
171
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
172
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
173
- })
174
- AWS.mock('SQS', 'sendMessage', function (params, callback) {
175
- callback(null, {
176
- MD5OfMessageAttributes: '00484c68...59e48f06',
177
- MD5OfMessageBody: '51b0a325...39163aa0',
178
- MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE'
179
- })
180
- })
181
- })
182
- it('should print id of enqueued message and exit 0',
183
- cliTest(['enqueue', '--fifo', 'testQueue', 'true'], function (result, stdout, stderr) {
184
- expect(stderr).to.contain('Enqueued job da68f62c-0c07-4bee-bf5f-7e856EXAMPLE')
185
- }))
186
- })
187
-
188
- describe('qdone enqueue --fifo --group-id gidtest testQueue true # (queue exists, fifo mode, explicit group)', function () {
189
- before(function () {
190
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
191
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
192
- })
193
- AWS.mock('SQS', 'sendMessage', function (params, callback) {
194
- callback(null, {
195
- MD5OfMessageAttributes: '00484c68...59e48f06',
196
- MD5OfMessageBody: '51b0a325...39163aa0',
197
- MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE'
198
- })
199
- })
200
- })
201
- it('should print id of enqueued message and exit 0',
202
- cliTest(['enqueue', '--verbose', '--fifo', '--group-id', 'gidtest', 'testQueue', 'true'], function (result, stdout, stderr) {
203
- expect(stderr).to.contain('Enqueued job da68f62c-0c07-4bee-bf5f-7e856EXAMPLE')
204
- }))
205
- })
206
-
207
- describe('qdone enqueue --quiet testQueue true # (queue exists)', function () {
208
- before(function () {
209
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
210
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
211
- })
212
- AWS.mock('SQS', 'sendMessage', function (params, callback) {
213
- callback(null, {
214
- MD5OfMessageAttributes: '00484c68...59e48f06',
215
- MD5OfMessageBody: '51b0a325...39163aa0',
216
- MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE'
217
- })
218
- })
219
- })
220
- it('should have no output and exit 0',
221
- cliTest(['enqueue', '--quiet', 'testQueue', 'true'], function (result, stdout, stderr) {
222
- expect(stderr).to.equal('')
223
- expect(stdout).to.equal('')
224
- }))
225
- })
226
-
227
- describe('qdone enqueue testQueue true # (queue does not exist)', function () {
228
- before(function () {
229
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
230
- const err = new Error('Queue does not exist.')
231
- err.code = 'AWS.SimpleQueueService.NonExistentQueue'
232
- callback(err)
233
- })
234
- AWS.mock('SQS', 'createQueue', function (params, callback) {
235
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
236
- })
237
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
238
- callback(null, {
239
- Attributes: {
240
- ApproximateNumberOfMessages: '0',
241
- ApproximateNumberOfMessagesDelayed: '0',
242
- ApproximateNumberOfMessagesNotVisible: '0',
243
- CreatedTimestamp: '1442426968',
244
- DelaySeconds: '0',
245
- LastModifiedTimestamp: '1442426968',
246
- MaximumMessageSize: '262144',
247
- MessageRetentionPeriod: '345600',
248
- QueueArn: 'arn:aws:sqs:us-east-1:80398EXAMPLE:MyNewQueue',
249
- ReceiveMessageWaitTimeSeconds: '0',
250
- RedrivePolicy: `{'deadLetterTargetArn':'arn:aws:sqs:us-east-1:80398EXAMPLE:${params.QueueName}','maxReceiveCount':1000}`,
251
- VisibilityTimeout: '30'
252
- }
253
- })
254
- })
255
- AWS.mock('SQS', 'sendMessage', function (params, callback) {
256
- callback(null, {
257
- MD5OfMessageAttributes: '00484c68...59e48f06',
258
- MD5OfMessageBody: '51b0a325...39163aa0',
259
- MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE'
260
- })
261
- })
262
- })
263
- it('should create queues, print the id of enqueued message and exit 0',
264
- cliTest(['enqueue', 'testQueue', 'true'], function (result, stdout, stderr) {
265
- expect(stderr).to.contain('Creating fail queue testQueue_failed')
266
- expect(stderr).to.contain('Creating queue testQueue')
267
- expect(stderr).to.contain('Enqueued job da68f62c-0c07-4bee-bf5f-7e856EXAMPLE')
268
- }))
269
- })
270
-
271
- describe('qdone enqueue --quiet testQueue true # (queue does not exist)', function () {
272
- before(function () {
273
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
274
- const err = new Error('Queue does not exist.')
275
- err.code = 'AWS.SimpleQueueService.NonExistentQueue'
276
- callback(err)
277
- })
278
- AWS.mock('SQS', 'createQueue', function (params, callback) {
279
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
280
- })
281
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
282
- callback(null, {
283
- Attributes: {
284
- ApproximateNumberOfMessages: '0',
285
- ApproximateNumberOfMessagesDelayed: '0',
286
- ApproximateNumberOfMessagesNotVisible: '0',
287
- CreatedTimestamp: '1442426968',
288
- DelaySeconds: '0',
289
- LastModifiedTimestamp: '1442426968',
290
- MaximumMessageSize: '262144',
291
- MessageRetentionPeriod: '345600',
292
- QueueArn: 'arn:aws:sqs:us-east-1:80398EXAMPLE:MyNewQueue',
293
- ReceiveMessageWaitTimeSeconds: '0',
294
- RedrivePolicy: `{'deadLetterTargetArn':'arn:aws:sqs:us-east-1:80398EXAMPLE:${params.QueueName}','maxReceiveCount':1000}`,
295
- VisibilityTimeout: '30'
296
- }
297
- })
298
- })
299
- AWS.mock('SQS', 'sendMessage', function (params, callback) {
300
- callback(null, {
301
- MD5OfMessageAttributes: '00484c68...59e48f06',
302
- MD5OfMessageBody: '51b0a325...39163aa0',
303
- MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE'
304
- })
305
- })
306
- })
307
- it('should create queues, print nothing and exit 0',
308
- cliTest(['enqueue', '--quiet', 'testQueue', 'true'], function (result, stdout, stderr) {
309
- expect(stderr).to.equal('')
310
- expect(stdout).to.equal('')
311
- }))
312
- })
313
-
314
- describe('qdone enqueue testQueue true # (unhandled error on fail queue creation)', function () {
315
- before(function () {
316
- var code = 'AWS.SimpleQueueService.NonExistentQueue'
317
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
318
- const err = new Error('Queue does not exist.')
319
- err.code = code
320
- code = 'AWS.SimpleQueueService.SomeOtherError'
321
- callback(err)
322
- })
323
- AWS.mock('SQS', 'createQueue', function (params, callback) {
324
- // callback(null, {QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}`})
325
- const err = new Error('Some Other Error.')
326
- err.code = 'AWS.SimpleQueueService.SomeOtherError'
327
- callback(err)
328
- })
329
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
330
- callback(null, {
331
- Attributes: {
332
- ApproximateNumberOfMessages: '0',
333
- ApproximateNumberOfMessagesDelayed: '0',
334
- ApproximateNumberOfMessagesNotVisible: '0',
335
- CreatedTimestamp: '1442426968',
336
- DelaySeconds: '0',
337
- LastModifiedTimestamp: '1442426968',
338
- MaximumMessageSize: '262144',
339
- MessageRetentionPeriod: '345600',
340
- QueueArn: 'arn:aws:sqs:us-east-1:80398EXAMPLE:MyNewQueue',
341
- ReceiveMessageWaitTimeSeconds: '0',
342
- RedrivePolicy: `{'deadLetterTargetArn':'arn:aws:sqs:us-east-1:80398EXAMPLE:${params.QueueName}','maxReceiveCount':1000}`,
343
- VisibilityTimeout: '30'
344
- }
345
- })
346
- })
347
- AWS.mock('SQS', 'sendMessage', function (params, callback) {
348
- callback(null, {
349
- MD5OfMessageAttributes: '00484c68...59e48f06',
350
- MD5OfMessageBody: '51b0a325...39163aa0',
351
- MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE'
352
- })
353
- })
354
- })
355
- it('should print traceback and exit 1 with error',
356
- cliTest(['enqueue', '--verbose', 'testQueue', 'true'], null, function (err, stdout, stderr) {
357
- expect(err).to.be.an('error')
358
- }))
359
- })
360
-
361
- // Enqueue batch
362
- describe('qdone enqueue-batch', function () {
363
- it('should print usage and exit 1 with error',
364
- cliTest(['enqueue-batch'], null, function (err, stdout, stderr) {
365
- expect(stdout).to.contain('usage: ')
366
- expect(stderr).to.contain('<file>')
367
- expect(err).to.be.an('error')
368
- }))
369
- })
370
-
371
- describe('qdone enqueue-batch --help', function () {
372
- it('should print usage and exit 0',
373
- cliTest(['enqueue-batch', '--help'], function (result, stdout, stderr) {
374
- expect(stdout).to.contain('usage: ')
375
- expect(stdout).to.contain('enqueue-batch')
376
- }))
377
- })
378
-
379
- describe('qdone enqueue-batch some_non_existent_file', function () {
380
- it('should exit 1 with error',
381
- cliTest(['enqueue-batch', 'some_non_existent_file'], null, function (err, stdout, stderr) {
382
- expect(stderr).to.contain('no such file or directory')
383
- expect(err).to.be.an('error')
384
- }))
385
- })
386
-
387
- describe('qdone enqueue-batch test/fixtures/test-unique01-x24.batch # (with no credentials)', function () {
388
- before(function () {
389
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
390
- const err = new Error('Access to the resource https://sqs.us-east-1.amazonaws.com/ is denied.')
391
- err.code = 'AccessDenied'
392
- callback(err)
393
- })
394
- })
395
- it('should print usage and exit 1 with error',
396
- cliTest(['enqueue-batch', 'test/fixtures/test-unique01-x24.batch'], null, function (err, stdout, stderr) {
397
- expect(stdout).to.contain('You must provide')
398
- expect(stderr).to.contain('Access to the resource https://sqs.us-east-1.amazonaws.com/ is denied.')
399
- expect(err).to.be.an('error')
400
- }))
401
- })
402
-
403
- describe('qdone enqueue-batch test/fixtures/test-unique01-x24.batch # (queue exists)', function () {
404
- before(function () {
405
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
406
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
407
- })
408
- var messageId = 0
409
- AWS.mock('SQS', 'sendMessageBatch', function (params, callback) {
410
- callback(null, {
411
- Failed: [],
412
- Successful: params.Entries.map(message => ({
413
- MD5OfMessageAttributes: '00484c68...59e48f06',
414
- MD5OfMessageBody: '51b0a325...39163aa0',
415
- MessageId: 'da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId++
416
- }))
417
- })
418
- })
419
- })
420
- it('should print id of enqueued messages, use 3 requests, print total count and exit 0',
421
- cliTest(['enqueue-batch', 'test/fixtures/test-unique01-x24.batch'], function (result, stdout, stderr) {
422
- for (var messageId = 0; messageId < 24; messageId++) {
423
- expect(stderr).to.contain('Enqueued job da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId)
424
- }
425
- expect(stderr).to.contain('Enqueued 24 jobs')
426
- expect(stderr).to.contain('request 1')
427
- expect(stderr).to.contain('request 2')
428
- expect(stderr).to.contain('request 3')
429
- }))
430
- })
431
-
432
- describe('qdone enqueue-batch --fifo --group-id-per-message test/fixtures/test-unique01-x24.batch # (queue exists, group ids should be unique)', function () {
433
- let groupIds
434
- before(function () {
435
- groupIds = {}
436
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
437
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
438
- })
439
- var messageId = 0
440
- AWS.mock('SQS', 'sendMessageBatch', function (params, callback) {
441
- params.Entries.forEach(message => {
442
- groupIds[message.MessageGroupId] = true
443
- })
444
- callback(null, {
445
- Failed: [],
446
- Successful: params.Entries.map(message => ({
447
- MD5OfMessageAttributes: '00484c68...59e48f06',
448
- MD5OfMessageBody: '51b0a325...39163aa0',
449
- MessageId: 'da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId++
450
- }))
451
- })
452
- })
453
- })
454
- it('should print id of enqueued messages, use 3 requests, use unique group ids for every message, print total count and exit 0',
455
- cliTest(['enqueue-batch', '--fifo', '--group-id-per-message', 'test/fixtures/test-unique01-x24.batch'], function (result, stdout, stderr) {
456
- for (var messageId = 0; messageId < 24; messageId++) {
457
- expect(stderr).to.contain('Enqueued job da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId)
458
- }
459
- expect(Object.keys(groupIds).length).to.equal(24)
460
- expect(stderr).to.contain('Enqueued 24 jobs')
461
- expect(stderr).to.contain('request 1')
462
- expect(stderr).to.contain('request 2')
463
- expect(stderr).to.contain('request 3')
464
- }))
465
- })
466
-
467
- describe('qdone enqueue-batch test/fixtures/test-unique01-x24.batch # (queue exists, some failures)', function () {
468
- before(function () {
469
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
470
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
471
- })
472
- var messageId = 0
473
- AWS.mock('SQS', 'sendMessageBatch', function (params, callback) {
474
- callback(null, {
475
- Failed: params.Entries.slice(0, 2).map(message => ({
476
- MD5OfMessageAttributes: '00484c68...59e48f06',
477
- MD5OfMessageBody: '51b0a325...39163aa0',
478
- MessageId: 'da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId++
479
- })),
480
- Successful: params.Entries.slice(2).map(message => ({
481
- MD5OfMessageAttributes: '00484c68...59e48f06',
482
- MD5OfMessageBody: '51b0a325...39163aa0',
483
- MessageId: 'da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId++
484
- }))
485
- })
486
- })
487
- })
488
- it('should exit 1 and show which messages failed',
489
- cliTest(['enqueue-batch', '--verbose', 'test/fixtures/test-unique01-x24.batch'], null, function (err, stdout, stderr) {
490
- expect(stderr).to.contain('Error: One or more message failures')
491
- expect(err).to.be.an('error')
492
- // Expect some ids of failed messages
493
- for (var messageId = 0; messageId < 2; messageId++) {
494
- expect(stderr).to.contain('da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId)
495
- }
496
- }))
497
- })
498
-
499
- describe('qdone enqueue-batch --quiet test/fixtures/test-unique01-x24.batch # (queue exists)', function () {
500
- before(function () {
501
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
502
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
503
- })
504
- var messageId = 0
505
- AWS.mock('SQS', 'sendMessageBatch', function (params, callback) {
506
- callback(null, {
507
- Failed: [],
508
- Successful: params.Entries.map(message => ({
509
- MD5OfMessageAttributes: '00484c68...59e48f06',
510
- MD5OfMessageBody: '51b0a325...39163aa0',
511
- MessageId: 'da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId++
512
- }))
513
- })
514
- })
515
- })
516
- it('should have no output and exit 0',
517
- cliTest(['enqueue-batch', '--quiet', 'test/fixtures/test-unique01-x24.batch'], function (result, stdout, stderr) {
518
- expect(stderr).to.equal('')
519
- expect(stdout).to.equal('')
520
- }))
521
- })
522
-
523
- describe('qdone enqueue-batch --fifo test/fixtures/test-fifo01-x24.batch # (queue does not exist)', function () {
524
- before(function () {
525
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
526
- const err = new Error('Queue does not exist.')
527
- err.code = 'AWS.SimpleQueueService.NonExistentQueue'
528
- callback(err)
529
- })
530
- AWS.mock('SQS', 'createQueue', function (params, callback) {
531
- expect(params.QueueName.slice(-'.fifo'.length) === '.fifo')
532
- expect(params.FifoQueue === 'true')
533
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
534
- })
535
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
536
- callback(null, {
537
- Attributes: {
538
- ApproximateNumberOfMessages: '0',
539
- ApproximateNumberOfMessagesDelayed: '0',
540
- ApproximateNumberOfMessagesNotVisible: '0',
541
- CreatedTimestamp: '1442426968',
542
- DelaySeconds: '0',
543
- LastModifiedTimestamp: '1442426968',
544
- MaximumMessageSize: '262144',
545
- MessageRetentionPeriod: '345600',
546
- QueueArn: 'arn:aws:sqs:us-east-1:80398EXAMPLE:MyNewQueue',
547
- ReceiveMessageWaitTimeSeconds: '0',
548
- RedrivePolicy: `{'deadLetterTargetArn':'arn:aws:sqs:us-east-1:80398EXAMPLE:${params.QueueName}','maxReceiveCount':1000}`,
549
- VisibilityTimeout: '30'
550
- }
551
- })
552
- })
553
- var messageId = 0
554
- AWS.mock('SQS', 'sendMessageBatch', function (params, callback) {
555
- callback(null, {
556
- Failed: [],
557
- Successful: params.Entries.map(message => ({
558
- MD5OfMessageAttributes: '00484c68...59e48f06',
559
- MD5OfMessageBody: '51b0a325...39163aa0',
560
- MessageId: 'da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId++
561
- }))
562
- })
563
- })
564
- })
565
- it('should print id of enqueued messages, use 3 requests, print total count and exit 0',
566
- cliTest(['enqueue-batch', '--verbose', '--fifo', 'test/fixtures/test-fifo01-x24.batch'], function (result, stdout, stderr) {
567
- for (var messageId = 0; messageId < 24; messageId++) {
568
- expect(stderr).to.contain('Enqueued job da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId)
569
- }
570
- expect(stderr).to.contain('Enqueued 24 jobs')
571
- expect(stderr).to.contain('request 1')
572
- expect(stderr).to.contain('request 2')
573
- expect(stderr).to.contain('request 3')
574
- expect(stderr).to.not.contain('request 4')
575
- }))
576
- })
577
-
578
- describe('qdone enqueue-batch test/fixtures/test-unique01-x24.batch # (queue does not exist)', function () {
579
- before(function () {
580
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
581
- const err = new Error('Queue does not exist.')
582
- err.code = 'AWS.SimpleQueueService.NonExistentQueue'
583
- callback(err)
584
- })
585
- AWS.mock('SQS', 'createQueue', function (params, callback) {
586
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
587
- })
588
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
589
- callback(null, {
590
- Attributes: {
591
- ApproximateNumberOfMessages: '0',
592
- ApproximateNumberOfMessagesDelayed: '0',
593
- ApproximateNumberOfMessagesNotVisible: '0',
594
- CreatedTimestamp: '1442426968',
595
- DelaySeconds: '0',
596
- LastModifiedTimestamp: '1442426968',
597
- MaximumMessageSize: '262144',
598
- MessageRetentionPeriod: '345600',
599
- QueueArn: 'arn:aws:sqs:us-east-1:80398EXAMPLE:MyNewQueue',
600
- ReceiveMessageWaitTimeSeconds: '0',
601
- RedrivePolicy: `{'deadLetterTargetArn':'arn:aws:sqs:us-east-1:80398EXAMPLE:${params.QueueName}','maxReceiveCount':1000}`,
602
- VisibilityTimeout: '30'
603
- }
604
- })
605
- })
606
- var messageId = 0
607
- AWS.mock('SQS', 'sendMessageBatch', function (params, callback) {
608
- callback(null, {
609
- Failed: [],
610
- Successful: params.Entries.map(message => ({
611
- MD5OfMessageAttributes: '00484c68...59e48f06',
612
- MD5OfMessageBody: '51b0a325...39163aa0',
613
- MessageId: 'da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId++
614
- }))
615
- })
616
- })
617
- })
618
- it('should create queues, print ids of enqueued messages, use 3 requests, print total count and exit 0',
619
- cliTest(['enqueue-batch', 'test/fixtures/test-unique01-x24.batch'], function (result, stdout, stderr) {
620
- expect(stderr).to.contain('Creating fail queue test_failed')
621
- expect(stderr).to.contain('Creating queue test')
622
- for (var messageId = 0; messageId < 24; messageId++) {
623
- expect(stderr).to.contain('Enqueued job da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId)
624
- }
625
- expect(stderr).to.contain('Enqueued 24 jobs')
626
- expect(stderr).to.contain('request 1')
627
- expect(stderr).to.contain('request 2')
628
- expect(stderr).to.contain('request 3')
629
- }))
630
- })
631
-
632
- describe('qdone enqueue-batch test/fixtures/test-unique{01-x24.batch,02-x24.batch,24-x24.batch,24-x240.batch} # (ensemble fixtures, queue exists)', function () {
633
- before(function () {
634
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
635
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
636
- })
637
- var messageId = 0
638
- AWS.mock('SQS', 'sendMessageBatch', function (params, callback) {
639
- callback(null, {
640
- Failed: [],
641
- Successful: params.Entries.map(message => ({
642
- MD5OfMessageAttributes: '00484c68...59e48f06',
643
- MD5OfMessageBody: '51b0a325...39163aa0',
644
- MessageId: 'da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId++
645
- }))
646
- })
647
- })
648
- })
649
- it('should print id of enqueued messages, use 53 requests, print total count and exit 0',
650
- cliTest([
651
- 'enqueue-batch',
652
- 'test/fixtures/test-unique01-x24.batch',
653
- 'test/fixtures/test-unique02-x24.batch',
654
- 'test/fixtures/test-unique24-x24.batch',
655
- 'test/fixtures/test-unique24-x240.batch'
656
- ], function (result, stdout, stderr) {
657
- for (var messageId = 0; messageId < 312; messageId++) {
658
- expect(stderr).to.contain('Enqueued job da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId)
659
- }
660
- expect(stderr).to.contain('Enqueued 312 jobs')
661
- expect(stderr).to.contain('request 1')
662
- expect(stderr).to.contain('request 2')
663
- expect(stderr).to.contain('request 53')
664
- }))
665
- })
666
-
667
- describe('qdone enqueue-batch test/fixtures/test-too-big-1.batch # (messages too big for full batch)', function () {
668
- before(function () {
669
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
670
- const err = new Error('Queue does not exist.')
671
- err.code = 'AWS.SimpleQueueService.NonExistentQueue'
672
- callback(err)
673
- })
674
- AWS.mock('SQS', 'createQueue', function (params, callback) {
675
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
676
- })
677
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
678
- callback(null, {
679
- Attributes: {
680
- ApproximateNumberOfMessages: '0',
681
- ApproximateNumberOfMessagesDelayed: '0',
682
- ApproximateNumberOfMessagesNotVisible: '0',
683
- CreatedTimestamp: '1442426968',
684
- DelaySeconds: '0',
685
- LastModifiedTimestamp: '1442426968',
686
- MaximumMessageSize: '262144',
687
- MessageRetentionPeriod: '345600',
688
- QueueArn: 'arn:aws:sqs:us-east-1:80398EXAMPLE:MyNewQueue',
689
- ReceiveMessageWaitTimeSeconds: '0',
690
- RedrivePolicy: `{'deadLetterTargetArn':'arn:aws:sqs:us-east-1:80398EXAMPLE:${params.QueueName}','maxReceiveCount':1000}`,
691
- VisibilityTimeout: '30'
692
- }
693
- })
694
- })
695
- var messageId = 0
696
- AWS.mock('SQS', 'sendMessageBatch', function (params, callback) {
697
- callback(null, {
698
- Failed: [],
699
- Successful: params.Entries.map(message => ({
700
- MD5OfMessageAttributes: '00484c68...59e48f06',
701
- MD5OfMessageBody: '51b0a325...39163aa0',
702
- MessageId: 'da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId++
703
- }))
704
- })
705
- })
706
- })
707
- it('should print ids of enqueued messages, use 5 requests, print total count and exit 0',
708
- cliTest(['enqueue-batch', 'test/fixtures/test-too-big-1.batch'], function (result, stdout, stderr) {
709
- for (var messageId = 0; messageId < 10; messageId++) {
710
- expect(stderr).to.contain('Enqueued job da68f62c-0c07-4bee-bf5f-56EXAMPLE-' + messageId)
711
- }
712
- expect(stderr).to.contain('Enqueued 10 jobs')
713
- expect(stderr).to.contain('request 1')
714
- expect(stderr).to.contain('request 2')
715
- expect(stderr).to.contain('request 3')
716
- expect(stderr).to.contain('request 4')
717
- expect(stderr).to.contain('request 5')
718
- }))
719
- })
720
-
721
- // Worker
722
- describe('qdone worker', function () {
723
- it('should print usage and exit 1 with error',
724
- cliTest(['worker'], null, function (err, stdout, stderr) {
725
- expect(stdout).to.contain('usage: ')
726
- expect(stderr).to.contain('<queue>')
727
- expect(err).to.be.an('error')
728
- }))
729
- })
730
-
731
- describe('qdone worker --help', function () {
732
- it('should print usage and exit 0',
733
- cliTest(['worker', '--help'], function (result, stdout, stderr) {
734
- expect(stdout).to.contain('usage: ')
735
- expect(stdout).to.contain('worker')
736
- }))
737
- })
738
-
739
- describe('qdone worker some_non_existent_queue --drain', function () {
740
- before(function () {
741
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
742
- const err = new Error('Queue does not exist.')
743
- err.code = 'AWS.SimpleQueueService.NonExistentQueue'
744
- callback(err)
745
- })
746
- })
747
- it('should complain and exit 0',
748
- cliTest(['worker', 'some_non_existent_queue', '--drain'], null, function (result, stdout, stderr) {
749
- expect(stderr).to.contain('AWS.SimpleQueueService.NonExistentQueue')
750
- }))
751
- })
752
-
753
- describe('qdone worker test --drain # (no jobs)', function () {
754
- before(function () {
755
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
756
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
757
- })
758
- AWS.mock('SQS', 'listQueues', function (params, callback) {
759
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
760
- })
761
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
762
- callback(null, {})
763
- })
764
- AWS.mock('SQS', 'deleteMessage', function (params, callback) {
765
- callback(null, {})
766
- })
767
- })
768
- it('should execute the job successfully and exit 0',
769
- cliTest(['worker', 'test', '--drain'], function (result, stdout, stderr) {
770
- expect(stderr).to.contain('Looking for work on test')
771
- expect(stderr).to.contain('Ran 0 jobs: 0 succeeded 0 failed')
772
- }))
773
- })
774
-
775
- describe('qdone worker test --drain # (1 successful job)', function () {
776
- before(function () {
777
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
778
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
779
- })
780
- AWS.mock('SQS', 'listQueues', function (params, callback) {
781
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
782
- })
783
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
784
- callback(null, { Messages: [
785
- { MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE', Body: 'true', ReceiptHandle: 'AQEBzbVv...fqNzFw==' }
786
- ] })
787
- AWS.restore('SQS', 'receiveMessage')
788
- // Subsequent calls return no message
789
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
790
- callback(null, {})
791
- })
792
- })
793
- AWS.mock('SQS', 'deleteMessage', function (params, callback) {
794
- callback(null, {})
795
- })
796
- })
797
- it('should execute the job successfully and exit 0',
798
- cliTest(['worker', 'test', '--drain'], function (result, stdout, stderr) {
799
- expect(stderr).to.contain('Looking for work on test')
800
- expect(stderr).to.contain('Found job da68f62c-0c07-4bee-bf5f-7e856EXAMPLE')
801
- expect(stderr).to.contain('SUCCESS')
802
- expect(stderr).to.contain('Ran 1 jobs: 1 succeeded 0 failed')
803
- }))
804
- })
805
-
806
- describe('qdone worker test --drain --quiet # (1 failed job)', function () {
807
- before(function () {
808
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
809
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
810
- })
811
- AWS.mock('SQS', 'listQueues', function (params, callback) {
812
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
813
- })
814
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
815
- callback(null, { Messages: [
816
- { MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE', Body: 'false', ReceiptHandle: 'AQEBzbVv...fqNzFw==' }
817
- ] })
818
- AWS.restore('SQS', 'receiveMessage')
819
- // Subsequent calls return no message
820
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
821
- callback(null, {})
822
- })
823
- })
824
- AWS.mock('SQS', 'deleteMessage', function (params, callback) {
825
- callback(null, {})
826
- })
827
- })
828
- it('should execute the job successfully and exit 0',
829
- cliTest(['worker', 'test', '--drain', '--quiet'], function (result, stdout, stderr) {
830
- expect(stdout).to.contain('"event":"JOB_FAILED"')
831
- expect(stdout).to.contain('"command":"false"')
832
- expect(stdout).to.contain('"timestamp"')
833
- expect(stdout).to.contain('"job"')
834
- expect(stdout).to.contain('"exitCode"')
835
- }))
836
- })
837
-
838
- describe('qdone worker test --drain --kill-after 1 --wait-time 1 --quiet # (job runs past kill timer)', function () {
839
- before(function () {
840
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
841
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
842
- })
843
- AWS.mock('SQS', 'listQueues', function (params, callback) {
844
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
845
- })
846
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
847
- callback(null, { Messages: [
848
- { MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE', Body: 'bash test/fixtures/test-child-kill-linux.sh', ReceiptHandle: 'AQEBzbVv...fqNzFw==' }
849
- ] })
850
- AWS.restore('SQS', 'receiveMessage')
851
- // Subsequent calls return no message
852
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
853
- callback(null, {})
854
- })
855
- process.nextTick(function () {
856
- clock.tick(1500)
857
- })
858
- })
859
- AWS.mock('SQS', 'deleteMessage', function (params, callback) {
860
- callback(null, {})
861
- })
862
- })
863
- it('should execute the job successfully and exit 0',
864
- cliTest(['worker', 'test', '--drain', '--kill-after', '1', '--wait-time', '1'], function (result, stdout, stderr) {
865
- expect(stderr).to.contain('FAILED')
866
- // Check that file does not continue to be written to
867
- expect(fs.readFileSync('/tmp/qdone-test-child-kill-linux.out').toString()).to.equal('terminated\n')
868
- }))
869
- })
870
-
871
- describe('qdone worker "test*" --drain # (9 queues, 1 successful job per queue)', function () {
872
- before(function () {
873
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
874
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
875
- })
876
- AWS.mock('SQS', 'listQueues', function (params, callback) {
877
- callback(null, { QueueUrls: [
878
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}1`,
879
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}2`,
880
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}3`,
881
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}4`,
882
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}5`,
883
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}6`,
884
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}7`,
885
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}8`,
886
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}9`
887
- ] })
888
- })
889
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
890
- callback(null, { Messages: [
891
- { MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE-' + params.QueueUrl.slice(-1), Body: 'true', ReceiptHandle: 'AQEBzbVv...fqNzFw==' }
892
- ] })
893
- if (params.QueueUrl === params.QueueUrl.slice(0, -1) + '9') {
894
- AWS.restore('SQS', 'receiveMessage')
895
- // Subsequent calls return no message
896
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
897
- callback(null, {})
898
- })
899
- }
900
- })
901
- AWS.mock('SQS', 'deleteMessage', function (params, callback) {
902
- callback(null, {})
903
- })
904
- })
905
- it('should execute the job successfully and exit 0',
906
- cliTest(['worker', 'test*', '--drain'], function (result, stdout, stderr) {
907
- [1, 2, 3, 4, 5, 5, 6, 7, 8, 9].forEach(index => {
908
- expect(stderr).to.contain('Looking for work on test' + index)
909
- expect(stderr).to.contain('Found job da68f62c-0c07-4bee-bf5f-7e856EXAMPLE-' + index)
910
- })
911
- expect(stderr).to.contain('Ran 9 jobs: 9 succeeded 0 failed')
912
- }))
913
- })
914
-
915
- describe('qdone worker test --drain # (1 successful job, time extended)', function () {
916
- before(function () {
917
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
918
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
919
- })
920
- AWS.mock('SQS', 'listQueues', function (params, callback) {
921
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
922
- })
923
- AWS.mock('SQS', 'changeMessageVisibility', function (params, callback) {
924
- callback(null, {})
925
- })
926
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
927
- callback(null, { Messages: [
928
- { MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE', Body: 'sleep 1', ReceiptHandle: 'AQEBzbVv...fqNzFw==' }
929
- ] })
930
- AWS.restore('SQS', 'receiveMessage')
931
- // Subsequent calls return no message
932
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
933
- callback(null, {})
934
- })
935
- process.nextTick(function () {
936
- clock.tick(15000)
937
- })
938
- })
939
- AWS.mock('SQS', 'deleteMessage', function (params, callback) {
940
- callback(null, {})
941
- })
942
- })
943
- it('should execute the job successfully and exit 0',
944
- cliTest(['worker', 'test', '--drain'], function (result, stdout, stderr) {
945
- expect(stderr).to.contain('Looking for work on test')
946
- expect(stderr).to.contain('Found job da68f62c-0c07-4bee-bf5f-7e856EXAMPLE')
947
- expect(stderr).to.contain('seconds, requesting another')
948
- expect(stderr).to.contain('SUCCESS')
949
- expect(stderr).to.contain('Ran 1 jobs: 1 succeeded 0 failed')
950
- }))
951
- })
952
-
953
- describe('qdone worker test --drain --quiet # (1 successful job, time extended)', function () {
954
- before(function () {
955
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
956
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
957
- })
958
- AWS.mock('SQS', 'listQueues', function (params, callback) {
959
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
960
- })
961
- AWS.mock('SQS', 'changeMessageVisibility', function (params, callback) {
962
- callback(null, {})
963
- })
964
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
965
- callback(null, { Messages: [
966
- { MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE', Body: 'sleep 1', ReceiptHandle: 'AQEBzbVv...fqNzFw==' }
967
- ] })
968
- AWS.restore('SQS', 'receiveMessage')
969
- // Subsequent calls return no message
970
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
971
- callback(null, {})
972
- })
973
- process.nextTick(function () {
974
- clock.tick(15000)
975
- })
976
- })
977
- AWS.mock('SQS', 'deleteMessage', function (params, callback) {
978
- callback(null, {})
979
- })
980
- })
981
- it('should have no output and exit 0',
982
- cliTest(['worker', 'test', '--drain', '--quiet'], function (result, stdout, stderr) {
983
- expect(stderr).to.equal('')
984
- expect(stdout).to.equal('')
985
- }))
986
- })
987
-
988
- describe('qdone worker "test*" --drain --active-only # (4 queues, 2 full, 2 empty)', function () {
989
- before(function () {
990
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
991
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
992
- })
993
- AWS.mock('SQS', 'listQueues', function (params, callback) {
994
- callback(null, { QueueUrls: [
995
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}1`,
996
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}2`,
997
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}3`,
998
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}4`
999
- ] })
1000
- })
1001
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
1002
- const lastLetter = params.QueueUrl.slice(-1)
1003
- callback(null, {
1004
- Attributes: {
1005
- ApproximateNumberOfMessages: (lastLetter === '1' || lastLetter === '2') ? '1' : '0',
1006
- ApproximateNumberOfMessagesDelayed: '0',
1007
- ApproximateNumberOfMessagesNotVisible: '0',
1008
- CreatedTimestamp: '1442426968',
1009
- DelaySeconds: '0',
1010
- LastModifiedTimestamp: '1442426968',
1011
- MaximumMessageSize: '262144',
1012
- MessageRetentionPeriod: '345600',
1013
- QueueArn: 'arn:aws:sqs:us-east-1:80398EXAMPLE:MyNewQueue',
1014
- ReceiveMessageWaitTimeSeconds: '0',
1015
- RedrivePolicy: `{'deadLetterTargetArn':'arn:aws:sqs:us-east-1:80398EXAMPLE:${params.QueueName}','maxReceiveCount':1000}`,
1016
- VisibilityTimeout: '30'
1017
- }
1018
- })
1019
- })
1020
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
1021
- callback(null, { Messages: [
1022
- { MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE-' + params.QueueUrl.slice(-1), Body: 'true', ReceiptHandle: 'AQEBzbVv...fqNzFw==' }
1023
- ] })
1024
- if (params.QueueUrl === params.QueueUrl.slice(0, -1) + '2') {
1025
- AWS.restore('SQS', 'receiveMessage')
1026
- // Subsequent calls return no message
1027
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
1028
- callback(null, {})
1029
- })
1030
- }
1031
- })
1032
- AWS.mock('SQS', 'deleteMessage', function (params, callback) {
1033
- callback(null, {})
1034
- })
1035
- })
1036
- it('should execute the job successfully and exit 0',
1037
- cliTest(['worker', 'test*', '--drain', '--active-only'], function (result, stdout, stderr) {
1038
- expect(stderr).to.contain('Found job da68f62c-0c07-4bee-bf5f-7e856EXAMPLE-1')
1039
- expect(stderr).to.contain('Found job da68f62c-0c07-4bee-bf5f-7e856EXAMPLE-2')
1040
- expect(stderr).to.not.contain('Found job da68f62c-0c07-4bee-bf5f-7e856EXAMPLE-3')
1041
- expect(stderr).to.not.contain('Found job da68f62c-0c07-4bee-bf5f-7e856EXAMPLE-4')
1042
- expect(stderr).to.contain('Ran 2 jobs: 2 succeeded 0 failed')
1043
- }))
1044
- })
1045
-
1046
- describe('qdone worker test # (1 successful job + SIGTERM)', function () {
1047
- before(function () {
1048
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1049
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
1050
- })
1051
- AWS.mock('SQS', 'listQueues', function (params, callback) {
1052
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
1053
- })
1054
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
1055
- callback(null, { Messages: [
1056
- { MessageId: 'da68f62c-0c07-4bee-bf5f-7e856EXAMPLE', Body: 'sleep 1', ReceiptHandle: 'AQEBzbVv...fqNzFw==' }
1057
- ] })
1058
- AWS.restore('SQS', 'receiveMessage')
1059
- // Subsequent calls return no message
1060
- AWS.mock('SQS', 'receiveMessage', function (params, callback) {
1061
- callback(null, {})
1062
- })
1063
- // And here we trigger a SIGTERM
1064
- process.kill(process.pid, 'SIGTERM')
1065
- })
1066
- AWS.mock('SQS', 'deleteMessage', function (params, callback) {
1067
- callback(null, {})
1068
- })
1069
- })
1070
- it('should begin executing the job, acknowledge a SIGTERM and successfully and exit 0 after the job completes',
1071
- cliTest(['worker', 'test'], function (result, stdout, stderr) {
1072
- expect(stderr).to.contain('Looking for work on test')
1073
- expect(stderr).to.contain('Found job da68f62c-0c07-4bee-bf5f-7e856EXAMPLE')
1074
- expect(stderr).to.contain('Shutdown requested')
1075
- expect(stderr).to.contain('SUCCESS')
1076
- }))
1077
- })
1078
-
1079
- // Idle queues
1080
-
1081
- describe('qdone idle-queues', function () {
1082
- it('should print usage and exit 1 with error',
1083
- cliTest(['idle-queues'], null, function (err, stdout, stderr) {
1084
- expect(stdout).to.contain('usage: ')
1085
- expect(stderr).to.contain('<queue>')
1086
- expect(err).to.be.an('error')
1087
- }))
1088
- })
1089
-
1090
- describe('qdone idle-queues --help', function () {
1091
- it('should print usage and exit 0',
1092
- cliTest(['idle-queues', '--help'], function (result, stdout, stderr) {
1093
- expect(stdout).to.contain('usage: ')
1094
- expect(stdout).to.contain('idle-queues')
1095
- }))
1096
- })
1097
-
1098
- describe('qdone idle-queues test --include-failed', function () {
1099
- it('should print usage and note about --include-failed and exit 1 with error',
1100
- cliTest(['idle-queues', 'test', '--include-failed'], null, function (err, stdout, stderr) {
1101
- expect(stdout).to.contain('usage: ')
1102
- expect(stderr).to.contain('--include-failed should be used with --unpair')
1103
- expect(err).to.be.an('error')
1104
- }))
1105
- })
1106
-
1107
- describe('qdone idle-queues test # (active queue shortcut via SQS API)', function () {
1108
- before(function () {
1109
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1110
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
1111
- })
1112
- AWS.mock('SQS', 'listQueues', function (params, callback) {
1113
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
1114
- })
1115
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
1116
- callback(null, {
1117
- Attributes: {
1118
- ApproximateNumberOfMessages: '1',
1119
- ApproximateNumberOfMessagesDelayed: '0',
1120
- ApproximateNumberOfMessagesNotVisible: '0'
1121
- }
1122
- })
1123
- })
1124
- })
1125
- it('should make no CloudWatch calls, print nothing to stdout and exit 0',
1126
- cliTest(['idle-queues', 'test'], function (result, stdout, stderr) {
1127
- expect(stderr).to.contain('Queue test has been active in the last 60 minutes.')
1128
- expect(stdout).to.equal('')
1129
- }))
1130
- })
1131
-
1132
- describe('qdone idle-queues test --unpair # (active queue shortcut via SQS API)', function () {
1133
- before(function () {
1134
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1135
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
1136
- })
1137
- AWS.mock('SQS', 'listQueues', function (params, callback) {
1138
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
1139
- })
1140
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
1141
- callback(null, {
1142
- Attributes: {
1143
- ApproximateNumberOfMessages: '1',
1144
- ApproximateNumberOfMessagesDelayed: '0',
1145
- ApproximateNumberOfMessagesNotVisible: '0'
1146
- }
1147
- })
1148
- })
1149
- })
1150
- it('should make no CloudWatch calls, print nothing to stdout and exit 0',
1151
- cliTest(['idle-queues', 'test', '--unpair'], function (result, stdout, stderr) {
1152
- expect(stderr).to.contain('Queue test has been active in the last 60 minutes.')
1153
- expect(stdout).to.equal('')
1154
- }))
1155
- })
1156
-
1157
- describe('qdone idle-queues test --cache-uri redis://localhost # (cached getQueueAttributes call)', function () {
1158
- before(function () {
1159
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1160
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
1161
- })
1162
- AWS.mock('SQS', 'listQueues', function (params, callback) {
1163
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
1164
- })
1165
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
1166
- callback(null, {
1167
- Attributes: {
1168
- ApproximateNumberOfMessages: '1',
1169
- ApproximateNumberOfMessagesDelayed: '0',
1170
- ApproximateNumberOfMessagesNotVisible: '0'
1171
- }
1172
- })
1173
- })
1174
- })
1175
- it('should make one call to getQueueAttributes, print nothing to stdout and exit 0',
1176
- cliTest(['idle-queues', 'test', '--cache-uri', 'redis://localhost'], function (result, stdout, stderr) {
1177
- expect(stderr).to.contain('Queue test has been active in the last 60 minutes.')
1178
- expect(stdout).to.equal('')
1179
- }))
1180
- })
1181
-
1182
- describe('qdone idle-queues test # (active queue, multiple CloudWatch calls)', function () {
1183
- before(function () {
1184
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1185
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
1186
- })
1187
- AWS.mock('SQS', 'listQueues', function (params, callback) {
1188
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
1189
- })
1190
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
1191
- callback(null, {
1192
- Attributes: {
1193
- ApproximateNumberOfMessages: '0',
1194
- ApproximateNumberOfMessagesDelayed: '0',
1195
- ApproximateNumberOfMessagesNotVisible: '0'
1196
- }
1197
- })
1198
- })
1199
- AWS.mock('CloudWatch', 'getMetricStatistics', function (params, callback) {
1200
- if (params.MetricName === 'ApproximateNumberOfMessagesDelayed') {
1201
- callback(null, {
1202
- Label: params.MetricName,
1203
- Datapoints: [
1204
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' },
1205
- { Timestamp: new Date(), Sum: 1, Metric: 'Count' }
1206
- ]
1207
- })
1208
- } else {
1209
- callback(null, {
1210
- Label: params.MetricName,
1211
- Datapoints: [
1212
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' },
1213
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' }
1214
- ]
1215
- })
1216
- }
1217
- })
1218
- })
1219
- it('should make CloudWatch calls, print nothing to stdout and exit 0',
1220
- cliTest(['idle-queues', 'test'], function (result, stdout, stderr) {
1221
- expect(stderr).to.contain('Queue test has been active in the last 60 minutes.')
1222
- expect(stdout).to.equal('')
1223
- }))
1224
- })
1225
-
1226
- describe('qdone idle-queues test # (inactive queue)', function () {
1227
- before(function () {
1228
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1229
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
1230
- })
1231
- AWS.mock('SQS', 'listQueues', function (params, callback) {
1232
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
1233
- })
1234
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
1235
- callback(null, {
1236
- Attributes: {
1237
- ApproximateNumberOfMessages: '0',
1238
- ApproximateNumberOfMessagesDelayed: '0',
1239
- ApproximateNumberOfMessagesNotVisible: '0'
1240
- }
1241
- })
1242
- })
1243
- AWS.mock('CloudWatch', 'getMetricStatistics', function (params, callback) {
1244
- // Always return 0s
1245
- callback(null, {
1246
- Label: params.MetricName,
1247
- Datapoints: [
1248
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' },
1249
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' }
1250
- ]
1251
- })
1252
- })
1253
- })
1254
- it('should print queue name to stdout and exit 0',
1255
- cliTest(['idle-queues', 'test'], function (result, stdout, stderr) {
1256
- expect(stderr).to.contain('Queue test has been idle for the last 60 minutes.')
1257
- expect(stdout).to.contain('test\n')
1258
- }))
1259
- })
1260
-
1261
- describe('qdone idle-queues test --delete # (inactive queue)', function () {
1262
- before(function () {
1263
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1264
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
1265
- })
1266
- AWS.mock('SQS', 'listQueues', function (params, callback) {
1267
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
1268
- })
1269
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
1270
- callback(null, {
1271
- Attributes: {
1272
- ApproximateNumberOfMessages: '0',
1273
- ApproximateNumberOfMessagesDelayed: '0',
1274
- ApproximateNumberOfMessagesNotVisible: '0'
1275
- }
1276
- })
1277
- })
1278
- AWS.mock('CloudWatch', 'getMetricStatistics', function (params, callback) {
1279
- // Always return 0s
1280
- callback(null, {
1281
- Label: params.MetricName,
1282
- Datapoints: [
1283
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' },
1284
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' }
1285
- ]
1286
- })
1287
- })
1288
- AWS.mock('SQS', 'deleteQueue', function (params, callback) {
1289
- callback(null, {})
1290
- })
1291
- })
1292
- it('should print queue name to stdout and exit 0',
1293
- cliTest(['idle-queues', 'test', '--delete'], function (result, stdout, stderr) {
1294
- expect(stderr).to.contain('Queue test has been idle for the last 60 minutes.')
1295
- expect(stderr).to.contain('Deleted test')
1296
- expect(stdout).to.contain('test\n')
1297
- }))
1298
- })
1299
-
1300
- describe('qdone idle-queues test --unpair # (inactive queue)', function () {
1301
- before(function () {
1302
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1303
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
1304
- })
1305
- AWS.mock('SQS', 'listQueues', function (params, callback) {
1306
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
1307
- })
1308
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
1309
- callback(null, {
1310
- Attributes: {
1311
- ApproximateNumberOfMessages: '0',
1312
- ApproximateNumberOfMessagesDelayed: '0',
1313
- ApproximateNumberOfMessagesNotVisible: '0'
1314
- }
1315
- })
1316
- })
1317
- AWS.mock('CloudWatch', 'getMetricStatistics', function (params, callback) {
1318
- // Always return 0s
1319
- callback(null, {
1320
- Label: params.MetricName,
1321
- Datapoints: [
1322
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' },
1323
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' }
1324
- ]
1325
- })
1326
- })
1327
- })
1328
- it('should print queue name to stdout and exit 0',
1329
- cliTest(['idle-queues', 'test', '--unpair'], function (result, stdout, stderr) {
1330
- expect(stderr).to.contain('Queue test has been idle for the last 60 minutes.')
1331
- expect(stdout).to.contain('test\n')
1332
- }))
1333
- })
1334
-
1335
- describe('qdone idle-queues test --unpair --delete # (inactive queue)', function () {
1336
- before(function () {
1337
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1338
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
1339
- })
1340
- AWS.mock('SQS', 'listQueues', function (params, callback) {
1341
- callback(null, { QueueUrls: [`https://q.amazonaws.com/123456789101/${params.QueueName}`] })
1342
- })
1343
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
1344
- callback(null, {
1345
- Attributes: {
1346
- ApproximateNumberOfMessages: '0',
1347
- ApproximateNumberOfMessagesDelayed: '0',
1348
- ApproximateNumberOfMessagesNotVisible: '0'
1349
- }
1350
- })
1351
- })
1352
- AWS.mock('CloudWatch', 'getMetricStatistics', function (params, callback) {
1353
- // Always return 0s
1354
- callback(null, {
1355
- Label: params.MetricName,
1356
- Datapoints: [
1357
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' },
1358
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' }
1359
- ]
1360
- })
1361
- })
1362
- AWS.mock('SQS', 'deleteQueue', function (params, callback) {
1363
- callback(null, {})
1364
- })
1365
- })
1366
- it('should print queue name to stdout and exit 0',
1367
- cliTest(['idle-queues', 'test', '--unpair', '--delete'], function (result, stdout, stderr) {
1368
- expect(stderr).to.contain('Queue test has been idle for the last 60 minutes.')
1369
- expect(stderr).to.contain('Deleted test')
1370
- expect(stdout).to.contain('test\n')
1371
- }))
1372
- })
1373
-
1374
- describe('qdone idle-queues test # (primary queue is idle, failed queue is active)', function () {
1375
- before(function () {
1376
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1377
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
1378
- })
1379
- AWS.mock('SQS', 'listQueues', function (params, callback) {
1380
- callback(null, { QueueUrls: [
1381
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}`,
1382
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}_failed`
1383
- ] })
1384
- })
1385
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
1386
- callback(null, {
1387
- Attributes: {
1388
- ApproximateNumberOfMessages: '0',
1389
- ApproximateNumberOfMessagesDelayed: '0',
1390
- ApproximateNumberOfMessagesNotVisible: '0'
1391
- }
1392
- })
1393
- })
1394
- AWS.mock('CloudWatch', 'getMetricStatistics', function (params, callback) {
1395
- // Always return data for failed queue
1396
- if (params.Dimensions[0].Value === 'qdone_test_failed') {
1397
- callback(null, {
1398
- Label: params.MetricName,
1399
- Datapoints: [
1400
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' },
1401
- { Timestamp: new Date(), Sum: 1, Metric: 'Count' }
1402
- ]
1403
- })
1404
- } else {
1405
- callback(null, {
1406
- Label: params.MetricName,
1407
- Datapoints: [
1408
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' },
1409
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' }
1410
- ]
1411
- })
1412
- }
1413
- })
1414
- })
1415
- it('should print queue name to stdout and exit 0',
1416
- cliTest(['idle-queues', 'test'], function (result, stdout, stderr) {
1417
- expect(stderr).to.contain('Queue test has been idle for the last 60 minutes.')
1418
- expect(stderr).to.contain('Queue test_failed has been active in the last 60 minutes.')
1419
- }))
1420
- })
1421
-
1422
- describe('qdone idle-queues test.fifo # (primary queue is idle and a FIFO, failed queue is active)', function () {
1423
- before(function () {
1424
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1425
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
1426
- })
1427
- AWS.mock('SQS', 'listQueues', function (params, callback) {
1428
- callback(null, { QueueUrls: [
1429
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}`,
1430
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}_failed.fifo`
1431
- ] })
1432
- })
1433
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
1434
- callback(null, {
1435
- Attributes: {
1436
- ApproximateNumberOfMessages: '0',
1437
- ApproximateNumberOfMessagesDelayed: '0',
1438
- ApproximateNumberOfMessagesNotVisible: '0'
1439
- }
1440
- })
1441
- })
1442
- AWS.mock('CloudWatch', 'getMetricStatistics', function (params, callback) {
1443
- // Always return data for failed queue
1444
- if (params.Dimensions[0].Value === 'qdone_test_failed.fifo') {
1445
- callback(null, {
1446
- Label: params.MetricName,
1447
- Datapoints: [
1448
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' },
1449
- { Timestamp: new Date(), Sum: 1, Metric: 'Count' }
1450
- ]
1451
- })
1452
- } else {
1453
- callback(null, {
1454
- Label: params.MetricName,
1455
- Datapoints: [
1456
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' },
1457
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' }
1458
- ]
1459
- })
1460
- }
1461
- })
1462
- })
1463
- it('should print queue name to stdout and exit 0',
1464
- cliTest(['idle-queues', 'test.fifo'], function (result, stdout, stderr) {
1465
- expect(stderr).to.contain('Queue test.fifo has been idle for the last 60 minutes.')
1466
- expect(stderr).to.contain('Queue test_failed.fifo has been active in the last 60 minutes.')
1467
- }))
1468
- })
1469
-
1470
- describe('qdone idle-queues \'test*\' --unpair --include-failed # (inactive queue)', function () {
1471
- before(function () {
1472
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1473
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
1474
- })
1475
- AWS.mock('SQS', 'listQueues', function (params, callback) {
1476
- callback(null, { QueueUrls: [
1477
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}`,
1478
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}_failed`
1479
- ] })
1480
- })
1481
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
1482
- callback(null, {
1483
- Attributes: {
1484
- ApproximateNumberOfMessages: '0',
1485
- ApproximateNumberOfMessagesDelayed: '0',
1486
- ApproximateNumberOfMessagesNotVisible: '0'
1487
- }
1488
- })
1489
- })
1490
- AWS.mock('CloudWatch', 'getMetricStatistics', function (params, callback) {
1491
- // Always return 0s
1492
- callback(null, {
1493
- Label: params.MetricName,
1494
- Datapoints: [
1495
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' },
1496
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' }
1497
- ]
1498
- })
1499
- })
1500
- })
1501
- it('should print queue and fail queue name to stdout and exit 0',
1502
- cliTest(['idle-queues', 'test*', '--unpair', '--include-failed'], function (result, stdout, stderr) {
1503
- expect(stderr).to.contain('Queue test has been idle for the last 60 minutes.')
1504
- expect(stderr).to.contain('Queue test_failed has been idle for the last 60 minutes.')
1505
- expect(stdout).to.contain('test\n')
1506
- expect(stdout).to.contain('test_failed\n')
1507
- }))
1508
- })
1509
-
1510
- describe('qdone idle-queues test # (no queues exist)', function () {
1511
- before(function () {
1512
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1513
- const err = new Error('Queue does not exist.')
1514
- err.code = 'AWS.SimpleQueueService.NonExistentQueue'
1515
- callback(err)
1516
- })
1517
- })
1518
- it('should print nothing to stdout and exit 0',
1519
- cliTest(['idle-queues', 'test'], null, function (result, stdout, stderr) {
1520
- expect(stderr).to.contain('Queue does not exist.')
1521
- }))
1522
- })
1523
-
1524
- describe('qdone idle-queues \'test*\' # (main queue was recently deleted)', function () {
1525
- before(function () {
1526
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1527
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
1528
- })
1529
- AWS.mock('SQS', 'listQueues', function (params, callback) {
1530
- callback(null, { QueueUrls: [
1531
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}`,
1532
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}_failed`
1533
- ] })
1534
- })
1535
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
1536
- const err = new Error('Queue does not exist.')
1537
- err.code = 'AWS.SimpleQueueService.NonExistentQueue'
1538
- callback(err)
1539
- })
1540
- })
1541
- it('should print nothing to stdout and exit 0',
1542
- cliTest(['idle-queues', 'test*'], null, function (result, stdout, stderr) {
1543
- expect(stderr).to.contain('Queue does not exist.')
1544
- expect(stderr).to.contain('This error can occur when you run this command immediately after deleting a queue. Wait 60 seconds and try again.')
1545
- }))
1546
- })
1547
-
1548
- describe('qdone idle-queues --delete \'test*\' # (failed queue was recently deleted)', function () {
1549
- before(function () {
1550
- AWS.mock('SQS', 'getQueueUrl', function (params, callback) {
1551
- if (params.QueueName === 'qdone_test_failed') {
1552
- const err = new Error('Queue does not exist.')
1553
- err.code = 'AWS.SimpleQueueService.NonExistentQueue'
1554
- callback(err, null)
1555
- } else {
1556
- callback(null, { QueueUrl: `https://q.amazonaws.com/123456789101/${params.QueueName}` })
1557
- }
1558
- })
1559
- AWS.mock('SQS', 'listQueues', function (params, callback) {
1560
- callback(null, { QueueUrls: [
1561
- `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}`
1562
- // `https://q.amazonaws.com/123456789101/${params.QueueNamePrefix}_failed`
1563
- ] })
1564
- })
1565
- AWS.mock('SQS', 'deleteQueue', function (params, callback) {
1566
- if (params.QueueUrl === 'https://q.amazonaws.com/123456789101/qdone_test_failed') {
1567
- const err = new Error('Queue does not exist.')
1568
- err.code = 'AWS.SimpleQueueService.NonExistentQueue'
1569
- callback(err)
1570
- callback(err, null)
1571
- } else {
1572
- callback(null, {})
1573
- }
1574
- })
1575
- AWS.mock('SQS', 'getQueueAttributes', function (params, callback) {
1576
- if (params.QueueUrl === 'https://q.amazonaws.com/123456789101/qdone_test_failed') {
1577
- const err = new Error('Queue does not exist.')
1578
- err.code = 'AWS.SimpleQueueService.NonExistentQueue'
1579
- callback(err, null)
1580
- } else {
1581
- callback(null, {
1582
- Attributes: {
1583
- ApproximateNumberOfMessages: '0',
1584
- ApproximateNumberOfMessagesDelayed: '0',
1585
- ApproximateNumberOfMessagesNotVisible: '0'
1586
- }
1587
- })
1588
- }
1589
- })
1590
- AWS.mock('CloudWatch', 'getMetricStatistics', function (params, callback) {
1591
- // Always return 0s
1592
- callback(null, {
1593
- Label: params.MetricName,
1594
- Datapoints: [
1595
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' },
1596
- { Timestamp: new Date(), Sum: 0, Metric: 'Count' }
1597
- ]
1598
- })
1599
- })
1600
- })
1601
- it('should note the missing failed queue, print deleted queue to stdout and exit 0',
1602
- cliTest(['idle-queues', '--delete', 'test*'], function (result, stdout, stderr) {
1603
- expect(stderr).to.contain('Queue test_failed does not exist.')
1604
- expect(stderr).to.contain('Deleted test')
1605
- expect(stdout).to.contain('test\n')
1606
- expect(stdout).to.not.contain('test_failed')
1607
- }))
1608
- })
1609
- })