You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-06 02:15:48 +03:00
Fix inconsistent command argument handling
Earlier multi.command and client.command diverged a lot in the way they accepted arguments. This is now consistent This will also fix some bugs like using multi.hmset with arrays
This commit is contained in:
@@ -33,6 +33,16 @@ describe("The 'blpop' method", function () {
|
||||
});
|
||||
});
|
||||
|
||||
it('pops value immediately if list contains values using array notation', function (done) {
|
||||
bclient = redis.createClient.apply(redis.createClient, args);
|
||||
client.rpush(["blocking list", "initial value"], helper.isNumber(1));
|
||||
bclient.blpop(["blocking list", 0], function (err, value) {
|
||||
assert.strictEqual(value[0], "blocking list");
|
||||
assert.strictEqual(value[1], "initial value");
|
||||
return done(err);
|
||||
});
|
||||
});
|
||||
|
||||
it('waits for value if list is not yet populated', function (done) {
|
||||
bclient = redis.createClient.apply(redis.createClient, args);
|
||||
bclient.blpop("blocking list 2", 5, function (err, value) {
|
||||
|
@@ -37,8 +37,17 @@ describe("The 'client' method", function () {
|
||||
});
|
||||
});
|
||||
|
||||
it("lists connected clients when invoked with array syntax on client", function (done) {
|
||||
client.multi().client(["list"]).exec(function(err, results) {
|
||||
assert(pattern.test(results[0]), "expected string '" + results + "' to match " + pattern.toString());
|
||||
return done();
|
||||
});
|
||||
});
|
||||
|
||||
it("lists connected clients when invoked with multi's array syntax", function (done) {
|
||||
client.multi().client("list").exec(function(err, results) {
|
||||
client.multi([
|
||||
['client', 'list']
|
||||
]).exec(function(err, results) {
|
||||
assert(pattern.test(results[0]), "expected string '" + results + "' to match " + pattern.toString());
|
||||
return done();
|
||||
});
|
||||
|
@@ -71,7 +71,7 @@ describe("The 'dbsize' method", function () {
|
||||
var oldSize;
|
||||
|
||||
beforeEach(function (done) {
|
||||
client.dbsize([], function (err, res) {
|
||||
client.dbsize(function (err, res) {
|
||||
helper.isType.number()(err, res);
|
||||
assert.strictEqual(res, 0, "Initial db size should be 0");
|
||||
|
||||
|
@@ -36,6 +36,20 @@ describe("The 'del' method", function () {
|
||||
client.get('apple', helper.isNull(done));
|
||||
});
|
||||
|
||||
it('allows multiple keys to be deleted with the array syntax', function (done) {
|
||||
client.mset('foo', 'bar', 'apple', 'banana');
|
||||
client.del(['foo', 'apple'], helper.isNumber(2));
|
||||
client.get('foo', helper.isNull());
|
||||
client.get('apple', helper.isNull(done));
|
||||
});
|
||||
|
||||
it('allows multiple keys to be deleted with the array syntax and no callback', function (done) {
|
||||
client.mset('foo', 'bar', 'apple', 'banana');
|
||||
client.del(['foo', 'apple']);
|
||||
client.get('foo', helper.isNull());
|
||||
client.get('apple', helper.isNull(done));
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
client.end();
|
||||
});
|
||||
|
@@ -24,6 +24,11 @@ describe("The 'exits' method", function () {
|
||||
client.EXISTS('foo', helper.isNumber(1, done));
|
||||
});
|
||||
|
||||
it('returns 1 if the key exists with array syntax', function (done) {
|
||||
client.set('foo', 'bar');
|
||||
client.EXISTS(['foo'], helper.isNumber(1, done));
|
||||
});
|
||||
|
||||
it('returns 0 if the key does not exist', function (done) {
|
||||
client.exists('bar', helper.isNumber(0, done));
|
||||
});
|
||||
|
@@ -20,6 +20,14 @@ describe("The 'expire' method", function () {
|
||||
});
|
||||
|
||||
it('expires key after timeout', function (done) {
|
||||
client.set(['expiry key', 'bar'], helper.isString("OK"));
|
||||
client.EXPIRE("expiry key", "1", helper.isNumber(1));
|
||||
setTimeout(function () {
|
||||
client.exists(["expiry key"], helper.isNumber(0, done));
|
||||
}, 1100);
|
||||
});
|
||||
|
||||
it('expires key after timeout with array syntax', function (done) {
|
||||
client.set(['expiry key', 'bar'], helper.isString("OK"));
|
||||
client.EXPIRE(["expiry key", "1"], helper.isNumber(1));
|
||||
setTimeout(function () {
|
||||
|
@@ -58,36 +58,50 @@ describe("The 'flushdb' method", function () {
|
||||
describe("when there is data in Redis", function () {
|
||||
|
||||
beforeEach(function (done) {
|
||||
var end = helper.callFuncAfter(function () {
|
||||
client.flushdb(helper.isString("OK", done));
|
||||
}, 2);
|
||||
client.mset(key, uuid.v4(), key2, uuid.v4(), helper.isNotError(end));
|
||||
client.mset(key, uuid.v4(), key2, uuid.v4(), helper.isNotError());
|
||||
client.dbsize([], function (err, res) {
|
||||
helper.isType.positiveNumber()(err, res);
|
||||
assert.equal(res, 2, 'Two keys should have been inserted');
|
||||
end();
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it("deletes all the keys", function (done) {
|
||||
client.mget(key, key2, function (err, res) {
|
||||
assert.strictEqual(null, err, "Unexpected error returned");
|
||||
assert.strictEqual(true, Array.isArray(res), "Results object should be an array.");
|
||||
assert.strictEqual(2, res.length, "Results array should have length 2.");
|
||||
assert.strictEqual(null, res[0], "Redis key should have been flushed.");
|
||||
assert.strictEqual(null, res[1], "Redis key should have been flushed.");
|
||||
done(err);
|
||||
client.flushdb(function(err, res) {
|
||||
assert.equal(res, 'OK');
|
||||
client.mget(key, key2, function (err, res) {
|
||||
assert.strictEqual(null, err, "Unexpected error returned");
|
||||
assert.strictEqual(true, Array.isArray(res), "Results object should be an array.");
|
||||
assert.strictEqual(2, res.length, "Results array should have length 2.");
|
||||
assert.strictEqual(null, res[0], "Redis key should have been flushed.");
|
||||
assert.strictEqual(null, res[1], "Redis key should have been flushed.");
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it("results in a db size of zero", function (done) {
|
||||
client.dbsize([], function (err, res) {
|
||||
helper.isNotError()(err, res);
|
||||
helper.isType.number()(err, res);
|
||||
assert.strictEqual(0, res, "Flushing db should result in db size 0");
|
||||
done();
|
||||
client.flushdb(function(err, res) {
|
||||
client.dbsize([], function (err, res) {
|
||||
helper.isNotError()(err, res);
|
||||
helper.isType.number()(err, res);
|
||||
assert.strictEqual(0, res, "Flushing db should result in db size 0");
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it("results in a db size of zero without a callback", function (done) {
|
||||
client.flushdb();
|
||||
setTimeout(function(err, res) {
|
||||
client.dbsize([], function (err, res) {
|
||||
helper.isNotError()(err, res);
|
||||
helper.isType.number()(err, res);
|
||||
assert.strictEqual(0, res, "Flushing db should result in db size 0");
|
||||
done();
|
||||
});
|
||||
}, 25);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@@ -70,6 +70,21 @@ describe("The 'get' method", function () {
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
|
||||
it("gets the value correctly with array syntax and the callback being in the array", function (done) {
|
||||
client.GET([key, function (err, res) {
|
||||
helper.isString(value)(err, res);
|
||||
done(err);
|
||||
}]);
|
||||
});
|
||||
|
||||
it("should not throw on a get without callback (even if it's not useful", function (done) {
|
||||
client.GET(key);
|
||||
client.on('error', function(err) {
|
||||
throw err;
|
||||
});
|
||||
setTimeout(done, 50);
|
||||
});
|
||||
});
|
||||
|
||||
describe("when the key does not exist in Redis", function () {
|
||||
|
@@ -74,6 +74,26 @@ describe("The 'getset' method", function () {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it("gets the value correctly with array syntax", function (done) {
|
||||
client.GETSET([key, value2], function (err, res) {
|
||||
helper.isString(value)(err, res);
|
||||
client.get(key, function (err, res) {
|
||||
helper.isString(value2)(err, res);
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it("gets the value correctly with array syntax style 2", function (done) {
|
||||
client.GETSET(key, [value2], function (err, res) {
|
||||
helper.isString(value)(err, res);
|
||||
client.get(key, function (err, res) {
|
||||
helper.isString(value2)(err, res);
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("when the key does not exist in Redis", function () {
|
||||
|
@@ -67,7 +67,7 @@ describe("The 'hgetall' method", function () {
|
||||
|
||||
it('returns binary results', function (done) {
|
||||
client.hmset(["bhosts", "mjr", "1", "another", "23", "home", "1234", new Buffer([0xAA, 0xBB, 0x00, 0xF0]), new Buffer([0xCC, 0xDD, 0x00, 0xF0])], helper.isString("OK"));
|
||||
client.HGETALL(["bhosts"], function (err, obj) {
|
||||
client.HGETALL(["bhosts", function (err, obj) {
|
||||
assert.strictEqual(4, Object.keys(obj).length);
|
||||
assert.strictEqual("1", obj.mjr.toString());
|
||||
assert.strictEqual("23", obj.another.toString());
|
||||
@@ -75,7 +75,7 @@ describe("The 'hgetall' method", function () {
|
||||
assert.strictEqual((new Buffer([0xAA, 0xBB, 0x00, 0xF0])).toString('binary'), Object.keys(obj)[3]);
|
||||
assert.strictEqual((new Buffer([0xCC, 0xDD, 0x00, 0xF0])).toString('binary'), obj[(new Buffer([0xAA, 0xBB, 0x00, 0xF0])).toString('binary')].toString('binary'));
|
||||
return done(err);
|
||||
});
|
||||
}]);
|
||||
});
|
||||
});
|
||||
|
||||
|
@@ -165,6 +165,23 @@ describe("The 'multi' method", function () {
|
||||
});
|
||||
});
|
||||
|
||||
it('allows multiple commands to work the same as normal to be performed using a chaining API', function (done) {
|
||||
client.multi()
|
||||
.mset(['some', '10', 'keys', '20'])
|
||||
.incr('some')
|
||||
.incr('keys')
|
||||
.mget('some', 'keys')
|
||||
.exec(function (err, replies) {
|
||||
assert.strictEqual(null, err);
|
||||
assert.equal('OK', replies[0]);
|
||||
assert.equal(11, replies[1]);
|
||||
assert.equal(21, replies[2]);
|
||||
assert.equal(11, replies[3][0].toString());
|
||||
assert.equal(21, replies[3][1].toString());
|
||||
return done();
|
||||
});
|
||||
});
|
||||
|
||||
it('allows an array to be provided indicating multiple operations to perform', function (done) {
|
||||
// test nested multi-bulk replies with nulls.
|
||||
client.multi([
|
||||
|
Reference in New Issue
Block a user