diff --git a/lib/utils.js b/lib/utils.js index b46b08b199..f5a5c902e1 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -91,7 +91,8 @@ function callbackOrEmit (self, callback, err, res) { } function replyInOrder (self, callback, err, res) { - var command_obj = self.command_queue.peekBack() || self.offline_queue.peekBack(); + // The offline queue has to be checked first, as there might be commands in both queues at the same time + var command_obj = self.offline_queue.peekBack() || self.command_queue.peekBack(); if (!command_obj) { process.nextTick(function () { callbackOrEmit(self, callback, err, res); diff --git a/test/utils.spec.js b/test/utils.spec.js index 17aaf89a84..094640066b 100644 --- a/test/utils.spec.js +++ b/test/utils.spec.js @@ -107,7 +107,7 @@ describe('utils.js', function () { emitted = false; }); - it('no elements in either queue. Reply in the next tick', function (done) { + it('no elements in either queue. Reply in the next tick with callback', function (done) { var called = false; utils.reply_in_order(clientMock, function () { called = true; @@ -116,7 +116,7 @@ describe('utils.js', function () { assert(!called); }); - it('no elements in either queue. Reply in the next tick', function (done) { + it('no elements in either queue. Reply in the next tick without callback', function (done) { assert(!emitted); utils.reply_in_order(clientMock, null, new Error('tada')); assert(!emitted); @@ -153,16 +153,21 @@ describe('utils.js', function () { } }); - it('elements in the offline queue. Reply after the offline queue is empty and respect the command_obj', function (done) { - clientMock.command_queue.push(create_command_obj(), {}); - utils.reply_in_order(clientMock, function () { + it('elements in the offline queue and the command_queue. Reply all other commands got handled respect the command_obj', function (done) { + clientMock.command_queue.push(create_command_obj(), create_command_obj()); + clientMock.offline_queue.push(create_command_obj(), {}); + utils.reply_in_order(clientMock, function (err, res) { assert.strictEqual(clientMock.command_queue.length, 0); + assert.strictEqual(clientMock.offline_queue.length, 0); assert(!emitted); - assert.strictEqual(res_count, 1); + assert.strictEqual(res_count, 3); done(); }, null, null); + while (clientMock.offline_queue.length) { + clientMock.command_queue.push(clientMock.offline_queue.shift()); + } while (clientMock.command_queue.length) { - clientMock.command_queue.shift().callback(null, 'bar'); + clientMock.command_queue.shift().callback(null, 'hello world'); } }); });