Benjamin Coe
9 years ago
13 changed files with 311 additions and 81 deletions
@ -1,9 +1,9 @@ |
|||
var async = require('async'); |
|||
var assert = require('assert'); |
|||
var config = require("../lib/config"); |
|||
var nodeAssert = require('../lib/nodeify-assertions'); |
|||
var config = require("../../lib/config"); |
|||
var nodeAssert = require('../../lib/nodeify-assertions'); |
|||
var redis = config.redis; |
|||
var RedisProcess = require("../lib/redis-process"); |
|||
var RedisProcess = require("../../lib/redis-process"); |
|||
var uuid = require('uuid'); |
|||
|
|||
describe("The 'dbsize' method", function () { |
@ -1,9 +1,9 @@ |
|||
var async = require('async'); |
|||
var assert = require('assert'); |
|||
var config = require("../lib/config"); |
|||
var nodeAssert = require('../lib/nodeify-assertions'); |
|||
var config = require("../../lib/config"); |
|||
var nodeAssert = require('../../lib/nodeify-assertions'); |
|||
var redis = config.redis; |
|||
var RedisProcess = require("../lib/redis-process"); |
|||
var RedisProcess = require("../../lib/redis-process"); |
|||
var uuid = require('uuid'); |
|||
|
|||
describe("The 'flushdb' method", function () { |
@ -1,9 +1,9 @@ |
|||
var async = require('async'); |
|||
var assert = require('assert'); |
|||
var config = require("../lib/config"); |
|||
var nodeAssert = require('../lib/nodeify-assertions'); |
|||
var config = require("../../lib/config"); |
|||
var nodeAssert = require('../../lib/nodeify-assertions'); |
|||
var redis = config.redis; |
|||
var RedisProcess = require("../lib/redis-process"); |
|||
var RedisProcess = require("../../lib/redis-process"); |
|||
var uuid = require('uuid'); |
|||
|
|||
describe("The 'get' method", function () { |
@ -1,9 +1,9 @@ |
|||
var async = require('async'); |
|||
var assert = require('assert'); |
|||
var config = require("../lib/config"); |
|||
var nodeAssert = require('../lib/nodeify-assertions'); |
|||
var config = require("../../lib/config"); |
|||
var nodeAssert = require('../../lib/nodeify-assertions'); |
|||
var redis = config.redis; |
|||
var RedisProcess = require("../lib/redis-process"); |
|||
var RedisProcess = require("../../lib/redis-process"); |
|||
var uuid = require('uuid'); |
|||
|
|||
describe("The 'getset' method", function () { |
@ -1,9 +1,9 @@ |
|||
var async = require('async'); |
|||
var assert = require('assert'); |
|||
var config = require("../lib/config"); |
|||
var nodeAssert = require('../lib/nodeify-assertions'); |
|||
var config = require("../../lib/config"); |
|||
var nodeAssert = require('../../lib/nodeify-assertions'); |
|||
var redis = config.redis; |
|||
var RedisProcess = require("../lib/redis-process"); |
|||
var RedisProcess = require("../../lib/redis-process"); |
|||
var uuid = require('uuid'); |
|||
|
|||
describe("The 'incr' method", function () { |
@ -1,9 +1,9 @@ |
|||
var async = require('async'); |
|||
var assert = require('assert'); |
|||
var config = require("../lib/config"); |
|||
var nodeAssert = require('../lib/nodeify-assertions'); |
|||
var config = require("../../lib/config"); |
|||
var nodeAssert = require('../../lib/nodeify-assertions'); |
|||
var redis = config.redis; |
|||
var RedisProcess = require("../lib/redis-process"); |
|||
var RedisProcess = require("../../lib/redis-process"); |
|||
var uuid = require('uuid'); |
|||
|
|||
describe("The 'mset' method", function () { |
@ -0,0 +1,269 @@ |
|||
var async = require('async'); |
|||
var assert = require('assert'); |
|||
var config = require("../../lib/config"); |
|||
var nodeAssert = require('../../lib/nodeify-assertions'); |
|||
var redis = config.redis; |
|||
var RedisProcess = require("../../lib/redis-process"); |
|||
var uuid = require('uuid'); |
|||
|
|||
describe("The 'multi' method", function () { |
|||
|
|||
var rp; |
|||
before(function (done) { |
|||
RedisProcess.start(function (err, _rp) { |
|||
rp = _rp; |
|||
return done(err); |
|||
}); |
|||
}) |
|||
|
|||
function removeMochaListener () { |
|||
var mochaListener = process.listeners('uncaughtException').pop(); |
|||
process.removeListener('uncaughtException', mochaListener); |
|||
return mochaListener; |
|||
} |
|||
|
|||
function allTests(parser, ip) { |
|||
var args = config.configureClient(parser, ip); |
|||
|
|||
describe("using " + parser + " and " + ip, function () { |
|||
var key, value; |
|||
|
|||
beforeEach(function () { |
|||
key = uuid.v4(); |
|||
value = uuid.v4(); |
|||
}); |
|||
|
|||
describe("when not connected", function () { |
|||
var client; |
|||
|
|||
beforeEach(function (done) { |
|||
client = redis.createClient.apply(redis.createClient, args); |
|||
client.once("error", done); |
|||
client.once("connect", function () { |
|||
client.quit(); |
|||
}); |
|||
client.on('end', function () { |
|||
return done(); |
|||
}); |
|||
}); |
|||
|
|||
it("reports an error", function (done) { |
|||
client.multi(); |
|||
client.exec(function (err, res) { |
|||
assert.equal(err.message, 'Redis connection gone from end event.'); |
|||
done(); |
|||
}); |
|||
}); |
|||
}); |
|||
|
|||
describe("when connected", function () { |
|||
var client; |
|||
|
|||
beforeEach(function (done) { |
|||
client = redis.createClient.apply(redis.createClient, args); |
|||
client.once("error", done); |
|||
client.once("connect", function () { |
|||
client.del('multifoo', 'multibar', 'multifoo_8', 'multibar_8', function (err) { |
|||
return done(err); |
|||
}) |
|||
}); |
|||
}); |
|||
|
|||
afterEach(function () { |
|||
client.end(); |
|||
}); |
|||
|
|||
it('roles back a transaction when one command in a sequence of commands fails', function (done) { |
|||
var name = "MULTI_1", multi1, multi2; |
|||
|
|||
// Provoke an error at queue time
|
|||
multi1 = client.multi(); |
|||
multi1.mset("multifoo", "10", "multibar", "20", nodeAssert.isString("OK")); |
|||
multi1.set("foo2", nodeAssert.isError()); |
|||
multi1.incr("multifoo", nodeAssert.isNumber(11)); |
|||
multi1.incr("multibar", nodeAssert.isNumber(21)); |
|||
multi1.exec(function () { |
|||
// Redis 2.6.5+ will abort transactions with errors
|
|||
// see: http://redis.io/topics/transactions
|
|||
var multibar_expected = 22; |
|||
var multifoo_expected = 12; |
|||
if (nodeAssert.serverVersionAtLeast(client, [2, 6, 5])) { |
|||
multibar_expected = 1; |
|||
multifoo_expected = 1; |
|||
} |
|||
|
|||
// Confirm that the previous command, while containing an error, still worked.
|
|||
multi2 = client.multi(); |
|||
multi2.incr("multibar", nodeAssert.isNumber(multibar_expected)); |
|||
multi2.incr("multifoo", nodeAssert.isNumber(multifoo_expected)); |
|||
multi2.exec(function (err, replies) { |
|||
assert.strictEqual(multibar_expected, replies[0]); |
|||
assert.strictEqual(multifoo_expected, replies[1]); |
|||
return done(); |
|||
}); |
|||
}); |
|||
}); |
|||
|
|||
// I'm unclear as to the difference between this test in the test above,
|
|||
// perhaps @mranney can clarify?
|
|||
it('roles back a transaction when an error was provoked at queue time', function (done) { |
|||
multi1 = client.multi(); |
|||
multi1.mset("multifoo_8", "10", "multibar_8", "20", nodeAssert.isString("OK")); |
|||
multi1.set("foo2", nodeAssert.isError()); |
|||
multi1.set("foo3", nodeAssert.isError()); |
|||
multi1.incr("multifoo_8", nodeAssert.isNumber(11)); |
|||
multi1.incr("multibar_8", nodeAssert.isNumber(21)); |
|||
multi1.exec(function () { |
|||
// Redis 2.6.5+ will abort transactions with errors
|
|||
// see: http://redis.io/topics/transactions
|
|||
var multibar_expected = 22; |
|||
var multifoo_expected = 12; |
|||
if (nodeAssert.serverVersionAtLeast(client, [2, 6, 5])) { |
|||
multibar_expected = 1; |
|||
multifoo_expected = 1; |
|||
} |
|||
|
|||
// Confirm that the previous command, while containing an error, still worked.
|
|||
multi2 = client.multi(); |
|||
multi2.incr("multibar_8", nodeAssert.isNumber(multibar_expected)); |
|||
multi2.incr("multifoo_8", nodeAssert.isNumber(multifoo_expected)); |
|||
multi2.exec(function (err, replies) { |
|||
assert.strictEqual(multibar_expected, replies[0]); |
|||
assert.strictEqual(multifoo_expected, replies[1]); |
|||
return done(); |
|||
}); |
|||
}); |
|||
}); |
|||
|
|||
it('roles back a transaction when one command in an array of commands fails', function (done) { |
|||
// test nested multi-bulk replies
|
|||
client.multi([ |
|||
["mget", "multifoo", "multibar", function (err, res) { |
|||
assert.strictEqual(2, res.length); |
|||
assert.strictEqual("0", res[0].toString()); |
|||
assert.strictEqual("0", res[1].toString()); |
|||
}], |
|||
["set", "foo2", nodeAssert.isError()], |
|||
["incr", "multifoo", nodeAssert.isNumber(1)], |
|||
["incr", "multibar", nodeAssert.isNumber(1)] |
|||
]).exec(function (err, replies) { |
|||
if (nodeAssert.serverVersionAtLeast(client, [2, 6, 5])) { |
|||
assert.notEqual(err, null); |
|||
assert.equal(replies, undefined); |
|||
} else { |
|||
assert.strictEqual(2, replies[0].length); |
|||
assert.strictEqual("0", replies[0][0].toString()); |
|||
assert.strictEqual("0", replies[0][1].toString()); |
|||
|
|||
assert.strictEqual("1", replies[1].toString()); |
|||
assert.strictEqual("1", replies[2].toString()); |
|||
} |
|||
|
|||
return done(); |
|||
}); |
|||
}); |
|||
|
|||
it('handles multiple operations being applied to a set', function (done) { |
|||
client.sadd("some set", "mem 1"); |
|||
client.sadd("some set", "mem 2"); |
|||
client.sadd("some set", "mem 3"); |
|||
client.sadd("some set", "mem 4"); |
|||
|
|||
// make sure empty mb reply works
|
|||
client.del("some missing set"); |
|||
client.smembers("some missing set", function (err, reply) { |
|||
// make sure empty mb reply works
|
|||
assert.strictEqual(0, reply.length); |
|||
}); |
|||
|
|||
// test nested multi-bulk replies with empty mb elements.
|
|||
client.multi([ |
|||
["smembers", "some set"], |
|||
["del", "some set"], |
|||
["smembers", "some set"] |
|||
]) |
|||
.scard("some set") |
|||
.exec(function (err, replies) { |
|||
assert.strictEqual(4, replies[0].length); |
|||
assert.strictEqual(0, replies[2].length); |
|||
return done(); |
|||
}); |
|||
}); |
|||
|
|||
it('allows multiple operations 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([ |
|||
["mget", ["multifoo", "some", "random value", "keys"]], |
|||
["incr", "multifoo"] |
|||
]) |
|||
.exec(function (err, replies) { |
|||
assert.strictEqual(replies.length, 2); |
|||
assert.strictEqual(replies[0].length, 4); |
|||
return done(); |
|||
}); |
|||
}); |
|||
|
|||
it('allows multiple operations to be performed on a hash', function (done) { |
|||
client.multi() |
|||
.hmset("multihash", "a", "foo", "b", 1) |
|||
.hmset("multihash", { |
|||
extra: "fancy", |
|||
things: "here" |
|||
}) |
|||
.hgetall("multihash") |
|||
.exec(function (err, replies) { |
|||
assert.strictEqual(null, err); |
|||
assert.equal("OK", replies[0]); |
|||
assert.equal(Object.keys(replies[2]).length, 4); |
|||
assert.equal("foo", replies[2].a); |
|||
assert.equal("1", replies[2].b); |
|||
assert.equal("fancy", replies[2].extra); |
|||
assert.equal("here", replies[2].things); |
|||
return done(); |
|||
}); |
|||
}); |
|||
|
|||
it('reports multiple exceptions when they occur', function (done) { |
|||
if (!nodeAssert.serverVersionAtLeast(client, [2, 6, 5])) return done(); |
|||
|
|||
client.multi().set("foo").exec(function (err, reply) { |
|||
assert(Array.isArray(err), "err should be an array"); |
|||
assert.equal(2, err.length, "err should have 2 items"); |
|||
assert(err[0].message.match(/ERR/), "First error message should contain ERR"); |
|||
assert(err[1].message.match(/EXECABORT/), "First error message should contain EXECABORT"); |
|||
return done(); |
|||
}); |
|||
}); |
|||
|
|||
}); |
|||
}); |
|||
} |
|||
|
|||
['javascript', 'hiredis'].forEach(function (parser) { |
|||
allTests(parser, "/tmp/redis.sock"); |
|||
['IPv4', 'IPv6'].forEach(function (ip) { |
|||
allTests(parser, ip); |
|||
}) |
|||
}); |
|||
|
|||
after(function (done) { |
|||
if (rp) rp.stop(done); |
|||
}); |
|||
}); |
@ -1,9 +1,9 @@ |
|||
var async = require('async'); |
|||
var assert = require('assert'); |
|||
var config = require("../lib/config"); |
|||
var nodeAssert = require('../lib/nodeify-assertions'); |
|||
var config = require("../../lib/config"); |
|||
var nodeAssert = require('../../lib/nodeify-assertions'); |
|||
var redis = config.redis; |
|||
var RedisProcess = require("../lib/redis-process"); |
|||
var RedisProcess = require("../../lib/redis-process"); |
|||
|
|||
describe("The 'select' method", function () { |
|||
|
Loading…
Reference in new issue