From d3c152762b70f1d9a7991b1d52302c734f18ed77 Mon Sep 17 00:00:00 2001 From: Gabe Gorelick Date: Wed, 11 Dec 2019 15:25:58 -0500 Subject: [PATCH] fix: whenCurrentJobsFinished should wait for all jobs See https://github.com/OptimalBits/bull/pull/1542/files#r356810178 --- lib/queue.js | 2 +- test/test_when_current_jobs_finished.js | 49 +++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/lib/queue.js b/lib/queue.js index 30233c070..2c6ab79c6 100755 --- a/lib/queue.js +++ b/lib/queue.js @@ -1191,7 +1191,7 @@ Queue.prototype.whenCurrentJobsFinished = function() { return this.bclient.connect(); }); - return Promise.all([this.processing[0]]).then(() => { + return Promise.all(this.processing).then(() => { return forcedReconnection; }); }; diff --git a/test/test_when_current_jobs_finished.js b/test/test_when_current_jobs_finished.js index 67e3f161c..0e3ed22d4 100644 --- a/test/test_when_current_jobs_finished.js +++ b/test/test_when_current_jobs_finished.js @@ -63,6 +63,55 @@ describe('.whenCurrentJobsFinished', () => { ); }); + it('should wait for all jobs to complete', async () => { + const queue = await utils.newQueue(); + + // add multiple jobs to queue + await queue.add({}); + await queue.add({}); + + let finishJob1; + let finishJob2; + + // wait for all jobs to be active + await new Promise(resolve => { + let callCount = 0; + queue.process(2, () => { + callCount++; + if (callCount === 1) { + return new Promise(resolve => { + finishJob1 = resolve; + }); + } + + resolve(); + return new Promise(resolve => { + finishJob2 = resolve; + }); + }); + }); + + let isFulfilled = false; + const finished = queue.whenCurrentJobsFinished().then(() => { + isFulfilled = true; + }); + + finishJob2(); + await delay(100); + + expect(isFulfilled).to.equal( + false, + 'should not fulfill until all jobs are finished' + ); + + finishJob1(); + await delay(100); + expect(await finished).to.equal( + undefined, + 'whenCurrentJobsFinished should resolve once all jobs are finished' + ); + }); + it('should wait for job to fail', async () => { const queue = await utils.newQueue(); await queue.add({});