From 6f7ac7eace5c76989ff2cb9f2324398bc5c0991f Mon Sep 17 00:00:00 2001 From: Fred Hart Date: Sun, 7 Feb 2021 00:39:10 -0600 Subject: [PATCH 1/6] Fix RedisClient.del so that it properly handles multiple keys. Add unit test provided in https://github.com/yeahoffline/redis-mock/issues/135. --- lib/client/redis-client.js | 3 + test/client/redis-mock.multi.test.js | 87 ++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/lib/client/redis-client.js b/lib/client/redis-client.js index a6952f0..cb91fd7 100644 --- a/lib/client/redis-client.js +++ b/lib/client/redis-client.js @@ -237,6 +237,9 @@ const getKeysVarArgs = function (args) { }; RedisClient.prototype.del = RedisClient.prototype.DEL = function (keys, callback) { + const args = getKeysVarArgs(arguments); + keys = args.keys; + callback = args.callback; this._selectedDb.del(keys, callback); }; diff --git a/test/client/redis-mock.multi.test.js b/test/client/redis-mock.multi.test.js index cc4c8ac..aa91733 100644 --- a/test/client/redis-mock.multi.test.js +++ b/test/client/redis-mock.multi.test.js @@ -90,6 +90,93 @@ describe("multi()", function () { }); }); + it("should handle del with multiple keys", async function () { + const cmds = [ + [ + 'del', + 'mediasoup:rooms:wipe-room-state-restart:routers:30070704-f47a-40bd-ab44-36534e56b4cc' + ], + [ + 'srem', + 'mediasoup:rooms:wipe-room-state-restart:servers', + 'b5ZizudER5rxZffc6RUrG' + ], + [ + 'hdel', + 'mediasoup:rooms:wipe-room-state-restart:producers:b55b81d8-0dfb-4bb8-846d-55e9474d12b6', + 'router' + ], + [ + 'srem', + 'mediasoup:rooms:wipe-room-state-restart:producers', + 'b55b81d8-0dfb-4bb8-846d-55e9474d12b6' + ], + [ + 'hdel', + 'mediasoup:rooms:wipe-room-state-restart:producers:c5d11e21-c69d-4b1f-a083-c98efc03a74c', + 'router' + ], + [ + 'srem', + 'mediasoup:rooms:wipe-room-state-restart:producers', + 'c5d11e21-c69d-4b1f-a083-c98efc03a74c' + ], + [ + 'hdel', + 'mediasoup:rooms:wipe-room-state-restart:producers:532fcd12-2a8b-47fb-8070-d2f89f9b4da3', + 'router' + ], + [ + 'srem', + 'mediasoup:rooms:wipe-room-state-restart:producers', + '532fcd12-2a8b-47fb-8070-d2f89f9b4da3' + ], + [ + 'hdel', + 'mediasoup:rooms:wipe-room-state-restart:producers:ac517e34-9ca5-4439-95a7-1e0a9ca10439', + 'router' + ], + [ + 'srem', + 'mediasoup:rooms:wipe-room-state-restart:producers', + 'ac517e34-9ca5-4439-95a7-1e0a9ca10439' + ], + [ + 'del', + 'mediasoup:servers:b5ZizudER5rxZffc6RUrG:address', + 'mediasoup:servers:b5ZizudER5rxZffc6RUrG:rooms', + 'mediasoup:servers:b5ZizudER5rxZffc6RUrG:routers', + 'mediasoup:servers:b5ZizudER5rxZffc6RUrG:routers:30070704-f47a-40bd-ab44-36534e56b4cc:room', + 'mediasoup:servers:b5ZizudER5rxZffc6RUrG:producers', + 'mediasoup:servers:b5ZizudER5rxZffc6RUrG:producers:b55b81d8-0dfb-4bb8-846d-55e9474d12b6:room', + 'mediasoup:servers:b5ZizudER5rxZffc6RUrG:producers:c5d11e21-c69d-4b1f-a083-c98efc03a74c:room', + 'mediasoup:servers:b5ZizudER5rxZffc6RUrG:producers:532fcd12-2a8b-47fb-8070-d2f89f9b4da3:room', + 'mediasoup:servers:b5ZizudER5rxZffc6RUrG:producers:ac517e34-9ca5-4439-95a7-1e0a9ca10439:room' + ], + [ + 'sadd', + 'mediasoup:servers', + 'b5ZizudER5rxZffc6RUrG' + ], + [ + 'set', + 'mediasoup:servers:b5ZizudER5rxZffc6RUrG:address', + '["1.0.0.0","2.0.0.0","127.0.0.1","JwX7Cju07gNJIII1K7bXc"]' + ] + ] + return new Promise((resolve, reject) => { + console.log(`My Test`) + r.multi(cmds).exec((err, result) => { + console.log(`My Test Callback`) + if (err) { + return reject(err) + } + resolve(result) + }) + }) + done() + }); + it("should handle extraneous callbacks", function (done) { var multi = r.multi(); multi.get('foo1').incr('foo1', function (err, result) { From e56035dd5a14f7a768ec38d3dda099b84ace550a Mon Sep 17 00:00:00 2001 From: Fred Hart Date: Sun, 7 Feb 2021 02:03:10 -0600 Subject: [PATCH 2/6] Fixed test and lint failures --- lib/client/redis-client.js | 2 +- test/client/redis-mock.multi.test.js | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/client/redis-client.js b/lib/client/redis-client.js index cb91fd7..43a2bd0 100644 --- a/lib/client/redis-client.js +++ b/lib/client/redis-client.js @@ -233,7 +233,7 @@ const getKeysVarArgs = function (args) { keys.push(args[i]); } var callback = hasCallback ? args[args.length - 1] : undefined; - return {keys: keys, callback: callback}; + return {keys: keys.flat(), callback: callback}; }; RedisClient.prototype.del = RedisClient.prototype.DEL = function (keys, callback) { diff --git a/test/client/redis-mock.multi.test.js b/test/client/redis-mock.multi.test.js index aa91733..b36db5e 100644 --- a/test/client/redis-mock.multi.test.js +++ b/test/client/redis-mock.multi.test.js @@ -90,7 +90,7 @@ describe("multi()", function () { }); }); - it("should handle del with multiple keys", async function () { + it("should handle del with multiple keys", function () { const cmds = [ [ 'del', @@ -163,18 +163,15 @@ describe("multi()", function () { 'mediasoup:servers:b5ZizudER5rxZffc6RUrG:address', '["1.0.0.0","2.0.0.0","127.0.0.1","JwX7Cju07gNJIII1K7bXc"]' ] - ] + ]; return new Promise((resolve, reject) => { - console.log(`My Test`) r.multi(cmds).exec((err, result) => { - console.log(`My Test Callback`) if (err) { - return reject(err) + return reject(err); } - resolve(result) - }) - }) - done() + resolve(result); + }); + }); }); it("should handle extraneous callbacks", function (done) { From b21e7da8c472d7cf8ba84e2f9e0128579321376d Mon Sep 17 00:00:00 2001 From: Fred Hart Date: Sun, 7 Feb 2021 02:20:45 -0600 Subject: [PATCH 3/6] Change approach to not use flatten which is not available in node 6 --- lib/client/redis-client.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/client/redis-client.js b/lib/client/redis-client.js index 43a2bd0..605eb76 100644 --- a/lib/client/redis-client.js +++ b/lib/client/redis-client.js @@ -229,11 +229,15 @@ RedisClient.prototype.batch = function (commands) { const getKeysVarArgs = function (args) { var keys = []; var hasCallback = typeof(args[args.length - 1]) === 'function'; - for (var i = 0; i < (hasCallback ? args.length - 1 : args.length); i++) { - keys.push(args[i]); + if (args[0] instanceof Array && hasCallback) { + keys = args[0]; + } else { + for (var i = 0; i < (hasCallback ? args.length - 1 : args.length); i++) { + keys.push(args[i]); + } } var callback = hasCallback ? args[args.length - 1] : undefined; - return {keys: keys.flat(), callback: callback}; + return { keys: keys, callback: callback }; }; RedisClient.prototype.del = RedisClient.prototype.DEL = function (keys, callback) { From 0dd0d1f8896e3f062c98f6d982a89eb1650e531c Mon Sep 17 00:00:00 2001 From: Fred Hart Date: Mon, 8 Feb 2021 21:07:46 -0600 Subject: [PATCH 4/6] Add code to handle the case where arguments to multi functions are passed as a single array --- lib/client/multi.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/client/multi.js b/lib/client/multi.js index 0bca11a..00445bd 100644 --- a/lib/client/multi.js +++ b/lib/client/multi.js @@ -24,6 +24,10 @@ class Multi { * Add a new command to the queue */ _command(name, argList) { + if (argList.length === 1 && argList[0] instanceof Array) { + argList = argList[0] + } + console.log(`_command(${name},`,argList,`)`) const index = this._commands.length; let callBack; From 265a9781ea6e373e7c2347b488b9c6c4ea972fdc Mon Sep 17 00:00:00 2001 From: Fred Hart Date: Mon, 8 Feb 2021 21:12:04 -0600 Subject: [PATCH 5/6] Add missing semicolon --- lib/client/multi.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/client/multi.js b/lib/client/multi.js index 00445bd..fda3bd8 100644 --- a/lib/client/multi.js +++ b/lib/client/multi.js @@ -25,7 +25,7 @@ class Multi { */ _command(name, argList) { if (argList.length === 1 && argList[0] instanceof Array) { - argList = argList[0] + argList = argList[0]; } console.log(`_command(${name},`,argList,`)`) const index = this._commands.length; From 3681d1e57146af69ec0c28c1119b4237e8244aaf Mon Sep 17 00:00:00 2001 From: Fred Hart Date: Mon, 8 Feb 2021 21:13:10 -0600 Subject: [PATCH 6/6] Remove console.log --- lib/client/multi.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/client/multi.js b/lib/client/multi.js index fda3bd8..0a2f35d 100644 --- a/lib/client/multi.js +++ b/lib/client/multi.js @@ -27,7 +27,6 @@ class Multi { if (argList.length === 1 && argList[0] instanceof Array) { argList = argList[0]; } - console.log(`_command(${name},`,argList,`)`) const index = this._commands.length; let callBack;