1
0
mirror of https://github.com/redis/node-redis.git synced 2025-08-07 13:22:56 +03:00

chore: refactor codebase to promises

This commit is contained in:
Ruben Bridgewater
2017-05-19 06:14:29 +02:00
parent b2613b2270
commit 6be5575c5b
85 changed files with 2081 additions and 3690 deletions

View File

@@ -12,14 +12,12 @@ describe('The \'blpop\' method', () => {
let client
let bclient
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('pops value immediately if list contains values', (done) => {
it('pops value immediately if list contains values', () => {
bclient = redis.createClient.apply(null, args)
redis.debugMode = true
let text = ''
@@ -27,43 +25,42 @@ describe('The \'blpop\' method', () => {
text += data
return ''
})
client.rpush('blocking list', 'initial value', helper.isNumber(1))
const values = ['blocking list', 'initial value']
const promise = client.rpush(values).then(helper.isNumber(1))
unhookIntercept()
assert(/^Send 127\.0\.0\.1:6379 id [0-9]+: \*3\r\n\$5\r\nrpush\r\n\$13\r\nblocking list\r\n\$13\r\ninitial value\r\n\n$/.test(text))
assert(/Send 127\.0\.0\.1:6379 id [0-9]+: \*3\r\n\$5\r\nrpush\r\n\$13\r\nblocking list\r\n\$13\r\ninitial value\r\n\n/.test(text), text)
redis.debugMode = false
bclient.blpop('blocking list', 0, (err, value) => {
assert.strictEqual(value[0], 'blocking list')
assert.strictEqual(value[1], 'initial value')
return done(err)
})
return promise
.then(() => bclient.blpop(values[0], 0))
.then(helper.isDeepEqual(values))
})
it('pops value immediately if list contains values using array notation', (done) => {
it('pops value immediately if list contains values using array notation', () => {
bclient = redis.createClient.apply(null, args)
client.rpush(['blocking list', 'initial value'], helper.isNumber(1))
bclient.blpop(['blocking list', 0], (err, value) => {
assert.strictEqual(value[0], 'blocking list')
assert.strictEqual(value[1], 'initial value')
return done(err)
})
return client.rpush(['blocking list', 'initial value'])
.then(helper.isNumber(1))
.then(() => bclient.blpop(['blocking list', 0]))
.then(helper.isDeepEqual(['blocking list', 'initial value']))
})
it('waits for value if list is not yet populated', (done) => {
it('waits for value if list is not yet populated', () => {
bclient = redis.createClient.apply(null, args)
bclient.blpop('blocking list 2', 5, (err, value) => {
assert.strictEqual(value[0], 'blocking list 2')
assert.strictEqual(value[1], 'initial value')
return done(err)
})
client.rpush('blocking list 2', 'initial value', helper.isNumber(1))
const promises = [
bclient.blpop('blocking list 2', 5).then(helper.isDeepEqual(['blocking list 2', 'initial value']))
]
promises.push(new Promise((resolve, reject) => {
setTimeout(() => {
resolve(client.rpush('blocking list 2', 'initial value').then(helper.isNumber(1)))
}, 100)
}))
return Promise.all(promises)
})
it('times out after specified time', (done) => {
it('times out after specified time', () => {
bclient = redis.createClient.apply(null, args)
bclient.blpop('blocking list', 1, (err, res) => {
assert.strictEqual(res, null)
return done(err)
})
return bclient.blpop('blocking list', 1)
.then(helper.fail)
.catch(helper.isError())
})
afterEach(() => {

View File

@@ -13,11 +13,9 @@ describe('The \'client\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
afterEach(() => {
@@ -25,93 +23,93 @@ describe('The \'client\' method', () => {
})
describe('list', () => {
it('lists connected clients', (done) => {
client.client('LIST', helper.match(pattern, done))
it('lists connected clients', () => {
return client.client('LIST').then(helper.match(pattern))
})
it('lists connected clients when invoked with multi\'s chaining syntax', (done) => {
client.multi().client('list', helper.isType.string()).exec(helper.match(pattern, done))
it('lists connected clients when invoked with multi\'s chaining syntax', () => {
return client.multi().client('list').exec().then(helper.match(pattern))
})
it('lists connected clients when invoked with array syntax on client', (done) => {
client.multi().client(['list']).exec(helper.match(pattern, done))
it('lists connected clients when invoked with array syntax on client', () => {
return client.multi().client(['list']).exec().then(helper.match(pattern))
})
it('lists connected clients when invoked with multi\'s array syntax', (done) => {
client.multi([
it('lists connected clients when invoked with multi\'s array syntax', () => {
return client.multi([
['client', 'list']
]).exec(helper.match(pattern, done))
]).exec().then(helper.match(pattern))
})
})
describe('reply', () => {
describe('as normal command', () => {
it('on', function (done) {
it('on', function () {
helper.serverVersionAtLeast.call(this, client, [3, 2, 0])
assert.strictEqual(client.reply, 'ON')
client.client('reply', 'on', helper.isString('OK'))
const promises = [client.client('reply', 'on').then(helper.isString('OK'))]
assert.strictEqual(client.reply, 'ON')
client.set('foo', 'bar', done)
promises.push(client.set('foo', 'bar'))
return Promise.all(promises)
})
it('off', function (done) {
it('off', function () {
helper.serverVersionAtLeast.call(this, client, [3, 2, 0])
assert.strictEqual(client.reply, 'ON')
client.client(Buffer.from('REPLY'), 'OFF', helper.isUndefined())
const promises = [client.client(Buffer.from('REPLY'), 'OFF').then(helper.isUndefined())]
assert.strictEqual(client.reply, 'OFF')
client.set('foo', 'bar', helper.isUndefined(done))
promises.push(client.set('foo', 'bar').then(helper.isUndefined()))
return Promise.all(promises)
})
it('skip', function (done) {
it('skip', function () {
helper.serverVersionAtLeast.call(this, client, [3, 2, 0])
assert.strictEqual(client.reply, 'ON')
client.client('REPLY', Buffer.from('SKIP'), helper.isUndefined())
const promises = [client.client('REPLY', Buffer.from('SKIP')).then(helper.isUndefined())]
assert.strictEqual(client.reply, 'SKIP_ONE_MORE')
client.set('foo', 'bar', helper.isUndefined())
client.get('foo', helper.isString('bar', done))
promises.push(client.set('foo', 'bar').then(helper.isUndefined()))
promises.push(client.get('foo').then(helper.isString('bar')))
return Promise.all(promises)
})
})
describe('in a batch context', () => {
it('on', function (done) {
it('on', function () {
helper.serverVersionAtLeast.call(this, client, [3, 2, 0])
const batch = client.batch()
assert.strictEqual(client.reply, 'ON')
batch.client('reply', 'on', helper.isString('OK'))
batch.client('reply', 'on')
assert.strictEqual(client.reply, 'ON')
batch.set('foo', 'bar')
batch.exec((err, res) => {
assert.deepEqual(res, ['OK', 'OK'])
done(err)
})
return batch.exec().then(helper.isDeepEqual(['OK', 'OK']))
})
it('off', function (done) {
it('off', function () {
helper.serverVersionAtLeast.call(this, client, [3, 2, 0])
const batch = client.batch()
assert.strictEqual(client.reply, 'ON')
batch.set('hello', 'world')
batch.client(Buffer.from('REPLY'), Buffer.from('OFF'), helper.isUndefined())
batch.set('foo', 'bar', helper.isUndefined())
batch.exec((err, res) => {
batch.client(Buffer.from('REPLY'), Buffer.from('OFF'))
batch.get('hello')
batch.get('hello')
return batch.exec().then((res) => {
assert.strictEqual(client.reply, 'OFF')
assert.deepEqual(res, ['OK', undefined, undefined])
done(err)
assert.deepStrictEqual(res, ['OK', undefined, undefined, undefined])
})
})
it('skip', function (done) {
it('skip', function () {
helper.serverVersionAtLeast.call(this, client, [3, 2, 0])
assert.strictEqual(client.reply, 'ON')
client.batch()
return client.batch()
.set('hello', 'world')
.client('REPLY', 'SKIP', helper.isUndefined())
.set('foo', 'bar', helper.isUndefined())
.client('REPLY', 'SKIP')
.set('foo', 'bar')
.get('foo')
.exec((err, res) => {
.exec()
.then((res) => {
assert.strictEqual(client.reply, 'ON')
assert.deepEqual(res, ['OK', undefined, undefined, 'bar'])
done(err)
assert.deepStrictEqual(res, ['OK', undefined, undefined, 'bar'])
})
})
})
@@ -122,25 +120,23 @@ describe('The \'client\' method', () => {
beforeEach((done) => {
client2 = redis.createClient.apply(null, args)
client2.once('ready', () => {
done()
})
client2.once('ready', done)
})
afterEach(() => {
client2.end(true)
})
it('sets the name', (done) => {
it('sets the name', () => {
// The querys are auto pipelined and the response is a response to all querys of one client
// per chunk. So the execution order is only guaranteed on each client
const end = helper.callFuncAfter(done, 2)
client.client('setname', 'RUTH')
client2.client('setname', ['RENEE'], helper.isString('OK'))
client2.client(['setname', 'MARTIN'], helper.isString('OK'))
client2.client('getname', helper.isString('MARTIN', end))
client.client('getname', helper.isString('RUTH', end))
return Promise.all([
client.client('setname', 'RUTH'),
client2.client('setname', ['RENEE']).then(helper.isString('OK')),
client2.client(['setname', 'MARTIN']).then(helper.isString('OK')),
client2.client('getname').then(helper.isString('MARTIN')),
client.client('getname').then(helper.isString('RUTH'))
])
})
})
})

View File

@@ -19,18 +19,14 @@ describe('The \'dbsize\' method', () => {
describe('when not connected', () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.quit()
})
client.on('end', done)
return client.quit()
})
it('reports an error', (done) => {
client.dbsize([], (err, res) => {
it('reports an error', () => {
return client.dbsize([]).then(helper.fail).catch((err) => {
assert(err.message.match(/The connection is already closed/))
done()
})
})
})
@@ -38,52 +34,34 @@ describe('The \'dbsize\' method', () => {
describe('when connected', () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb((err, res) => {
helper.isString('OK')(err, res)
done()
})
})
return client.flushdb().then(helper.isString('OK'))
})
afterEach(() => {
client.end(true)
})
it('returns a zero db size', (done) => {
client.dbsize([], (err, res) => {
helper.isNotError()(err, res)
helper.isType.number()(err, res)
assert.strictEqual(res, 0, 'Initial db size should be 0')
done()
})
it('returns a zero db size', () => {
return client.dbsize([]).then(helper.isNumber(0))
})
describe('when more data is added to Redis', () => {
let oldSize
beforeEach((done) => {
client.dbsize((err, res) => {
helper.isType.number()(err, res)
assert.strictEqual(res, 0, 'Initial db size should be 0')
beforeEach(() => {
return client.dbsize().then((res) => {
helper.isNumber(0)(res)
oldSize = res
client.set(key, value, (err, res) => {
helper.isNotError()(err, res)
done()
})
return client.set(key, value).then(helper.isString('OK'))
})
})
it('returns a larger db size', (done) => {
client.dbsize([], (err, res) => {
helper.isNotError()(err, res)
helper.isType.positiveNumber()(err, res)
it('returns a larger db size', () => {
return client.dbsize([]).then((res) => {
assert.strictEqual(typeof res, 'number')
assert.strictEqual(true, (oldSize < res), 'Adding data should increase db size.')
done()
})
})
})

View File

@@ -9,42 +9,39 @@ describe('The \'del\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('allows a single key to be deleted', (done) => {
client.set('foo', 'bar')
client.del('foo', helper.isNumber(1))
client.get('foo', helper.isNull(done))
it('allows a single key to be deleted', () => {
return Promise.all([
client.set('foo', 'bar'),
client.del('foo').then(helper.isNumber(1)),
client.get('foo').then(helper.isNull())
])
})
it('allows del to be called on a key that does not exist', (done) => {
client.del('foo', helper.isNumber(0, done))
it('allows del to be called on a key that does not exist', () => {
return client.del('foo').then(helper.isNumber(0))
})
it('allows multiple keys to be deleted', (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', () => {
return Promise.all([
client.mset('foo', 'bar', 'apple', 'banana'),
client.del('foo', 'apple').then(helper.isNumber(2)),
client.get('foo').then(helper.isNull()),
client.get('apple').then(helper.isNull())
])
})
it('allows multiple keys to be deleted with the array syntax', (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', (done) => {
client.mset('foo', 'bar', 'apple', 'banana')
client.del(['foo', 'apple'])
client.get('foo', helper.isNull())
client.get('apple', helper.isNull(done))
it('allows multiple keys to be deleted with the array syntax', () => {
return Promise.all([
client.mset('foo', 'bar', 'apple', 'banana'),
client.del(['foo', 'apple']).then(helper.isNumber(2)),
client.get('foo').then(helper.isNull()),
client.get('apple').then(helper.isNull())
])
})
afterEach(() => {

View File

@@ -12,48 +12,44 @@ describe('The \'eval\' method', () => {
let client
const source = 'return redis.call(\'set\', \'sha\', \'test\')'
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
afterEach(() => {
client.end(true)
})
it('converts a float to an integer when evaluated', (done) => {
client.eval('return 100.5', 0, helper.isNumber(100, done))
it('converts a float to an integer when evaluated', () => {
return client.eval('return 100.5', 0).then(helper.isNumber(100))
})
it('returns a string', (done) => {
client.eval('return \'hello world\'', 0, helper.isString('hello world', done))
it('returns a string', () => {
return client.eval('return \'hello world\'', 0).then(helper.isString('hello world'))
})
it('converts boolean true to integer 1', (done) => {
client.eval('return true', 0, helper.isNumber(1, done))
it('converts boolean true to integer 1', () => {
return client.eval('return true', 0).then(helper.isNumber(1))
})
it('converts boolean false to null', (done) => {
client.eval('return false', 0, helper.isNull(done))
it('converts boolean false to null', () => {
return client.eval('return false', 0).then(helper.isNull())
})
it('converts lua status code to string representation', (done) => {
client.eval('return {ok=\'fine\'}', 0, helper.isString('fine', done))
it('converts lua status code to string representation', () => {
return client.eval('return {ok=\'fine\'}', 0).then(helper.isString('fine'))
})
it('converts lua error to an error response', (done) => {
client.eval('return {err=\'this is an error\'}', 0, (err) => {
it('converts lua error to an error response', () => {
return client.eval('return {err=\'this is an error\'}', 0).then(helper.fail).catch((err) => {
assert(err.code === undefined)
helper.isError()(err)
done()
})
})
it('represents a lua table appropritely', (done) => {
client.eval('return {1,2,3,\'ciao\',{1,2}}', 0, (err, res) => {
assert.strictEqual(err, null)
it('represents a lua table appropriately', () => {
return client.eval('return {1,2,3,\'ciao\',{1,2}}', 0).then((res) => {
assert.strictEqual(5, res.length)
assert.strictEqual(1, res[0])
assert.strictEqual(2, res[1])
@@ -62,134 +58,109 @@ describe('The \'eval\' method', () => {
assert.strictEqual(2, res[4].length)
assert.strictEqual(1, res[4][0])
assert.strictEqual(2, res[4][1])
return done()
})
})
it('populates keys and argv correctly', (done) => {
client.eval('return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}', 2, 'a', 'b', 'c', 'd', helper.isDeepEqual(['a', 'b', 'c', 'd'], done))
it('populates keys and argv correctly', () => {
return client.eval('return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}', 2, 'a', 'b', 'c', 'd').then(helper.isDeepEqual(['a', 'b', 'c', 'd']))
})
it('allows arguments to be provided in array rather than as multiple parameters', (done) => {
client.eval(['return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}', 2, 'a', 'b', 'c', 'd'], helper.isDeepEqual(['a', 'b', 'c', 'd'], done))
})
it('allows a script to be executed that accesses the redis API without callback', (done) => {
client.eval(source, 0)
client.get('sha', helper.isString('test', done))
it('allows arguments to be provided in array rather than as multiple parameters', () => {
return client.eval(['return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}', 2, 'a', 'b', 'c', 'd']).then(helper.isDeepEqual(['a', 'b', 'c', 'd']))
})
describe('evalsha', () => {
const sha = crypto.createHash('sha1').update(source).digest('hex')
it('allows a script to be executed that accesses the redis API', (done) => {
client.eval(source, 0, helper.isString('OK'))
client.get('sha', helper.isString('test', done))
it('allows a script to be executed that accesses the redis API', () => {
return Promise.all([
client.eval(source, 0).then(helper.isString('OK')),
client.get('sha').then(helper.isString('test'))
])
})
it('can execute a script if the SHA exists', (done) => {
client.evalsha(sha, 0, helper.isString('OK'))
client.get('sha', helper.isString('test', done))
it('can execute a script if the SHA exists', () => {
return Promise.all([
client.evalsha(sha, 0).then(helper.isString('OK')),
client.get('sha').then(helper.isString('test'))
])
})
it('returns an error if SHA does not exist', (done) => {
client.evalsha('ffffffffffffffffffffffffffffffffffffffff', 0, helper.isError(done))
})
it('emit an error if SHA does not exist without any callback', (done) => {
client.evalsha('ffffffffffffffffffffffffffffffffffffffff', 0)
client.on('error', (err) => {
assert.strictEqual(err.code, 'NOSCRIPT')
assert(/NOSCRIPT No matching script. Please use EVAL./.test(err.message))
done()
})
})
it('emits an error if SHA does not exist and no callback has been provided', (done) => {
client.on('error', (err) => {
assert.strictEqual(err.message, 'NOSCRIPT No matching script. Please use EVAL.')
done()
})
client.evalsha('ffffffffffffffffffffffffffffffffffffffff', 0)
it('returns an error if SHA does not exist', () => {
return client.evalsha('ffffffffffffffffffffffffffffffffffffffff', 0)
.then(helper.fail)
.catch(helper.isError(/NOSCRIPT No matching script\. Please use EVAL/))
})
})
it('allows a key to be incremented, and performs appropriate conversion from LUA type', (done) => {
client.set('incr key', 0, (err, reply) => {
if (err) return done(err)
client.eval('local foo = redis.call(\'incr\',\'incr key\')\nreturn {type(foo),foo}', 0, (err, res) => {
it('allows a key to be incremented, and performs appropriate conversion from LUA type', () => {
return Promise.all([
client.set('incr key', 0),
client.eval('local foo = redis.call(\'incr\',\'incr key\')\nreturn {type(foo),foo}', 0).then((res) => {
assert.strictEqual(2, res.length)
assert.strictEqual('number', res[0])
assert.strictEqual(1, res[1])
return done(err)
})
})
])
})
it('allows a bulk operation to be performed, and performs appropriate conversion from LUA type', (done) => {
client.set('bulk reply key', 'bulk reply value', (err, res) => {
assert.strictEqual(err, null)
client.eval('local foo = redis.call(\'get\',\'bulk reply key\'); return {type(foo),foo}', 0, (err, res) => {
it('allows a bulk operation to be performed, and performs appropriate conversion from LUA type', () => {
return Promise.all([
client.set('bulk reply key', 'bulk reply value'),
client.eval('local foo = redis.call(\'get\',\'bulk reply key\'); return {type(foo),foo}', 0).then((res) => {
assert.strictEqual(2, res.length)
assert.strictEqual('string', res[0])
assert.strictEqual('bulk reply value', res[1])
return done(err)
})
})
])
})
it('allows a multi mulk operation to be performed, with the appropriate type conversion', (done) => {
client.multi()
it('allows a multi mulk operation to be performed, with the appropriate type conversion', () => {
return client.multi()
.del('mylist')
.rpush('mylist', 'a')
.rpush('mylist', 'b')
.rpush('mylist', 'c')
.exec((err, replies) => {
if (err) return done(err)
client.eval('local foo = redis.call(\'lrange\',\'mylist\',0,-1); return {type(foo),foo[1],foo[2],foo[3],# foo}', 0, (err, res) => {
.exec().then((replies) => {
return client.eval('local foo = redis.call(\'lrange\',\'mylist\',0,-1); return {type(foo),foo[1],foo[2],foo[3],# foo}', 0).then((res) => {
assert.strictEqual(5, res.length)
assert.strictEqual('table', res[0])
assert.strictEqual('a', res[1])
assert.strictEqual('b', res[2])
assert.strictEqual('c', res[3])
assert.strictEqual(3, res[4])
return done(err)
})
})
})
it('returns an appropriate representation of Lua status reply', (done) => {
client.eval('local foo = redis.call(\'set\',\'mykey\',\'myval\'); return {type(foo),foo[\'ok\']}', 0, (err, res) => {
it('returns an appropriate representation of Lua status reply', () => {
return client.eval('local foo = redis.call(\'set\',\'mykey\',\'myval\'); return {type(foo),foo[\'ok\']}', 0).then((res) => {
assert.strictEqual(2, res.length)
assert.strictEqual('table', res[0])
assert.strictEqual('OK', res[1])
return done(err)
})
})
it('returns an appropriate representation of a Lua error reply', (done) => {
client.set('error reply key', 'error reply value', (err, res) => {
if (err) return done(err)
client.eval('local foo = redis.pcall(\'incr\',\'error reply key\'); return {type(foo),foo[\'err\']}', 0, (err, res) => {
it('returns an appropriate representation of a Lua error reply', () => {
return Promise.all([
client.set('error reply key', 'error reply value'),
client.eval('local foo = redis.pcall(\'incr\',\'error reply key\'); return {type(foo),foo[\'err\']}', 0).then((res) => {
assert.strictEqual(2, res.length)
assert.strictEqual('table', res[0])
assert.strictEqual('ERR value is not an integer or out of range', res[1])
return done(err)
})
})
])
})
it('returns an appropriate representation of a Lua nil reply', (done) => {
client.del('nil reply key', (err, res) => {
if (err) return done(err)
client.eval('local foo = redis.call(\'get\',\'nil reply key\'); return {type(foo),foo == false}', 0, (err, res) => {
if (err) throw err
it('returns an appropriate representation of a Lua nil reply', () => {
return Promise.all([
client.del('nil reply key'),
client.eval('local foo = redis.call(\'get\',\'nil reply key\'); return {type(foo),foo == false}', 0).then((res) => {
assert.strictEqual(2, res.length)
assert.strictEqual('boolean', res[0])
assert.strictEqual(1, res[1])
return done(err)
})
})
])
})
})
})

View File

@@ -9,25 +9,27 @@ describe('The \'exists\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('returns 1 if the key exists', (done) => {
client.set('foo', 'bar')
client.exists('foo', helper.isNumber(1, done))
it('returns 1 if the key exists', () => {
return Promise.all([
client.set('foo', 'bar'),
client.exists('foo').then(helper.isNumber(1))
])
})
it('returns 1 if the key exists with array syntax', (done) => {
client.set('foo', 'bar')
client.exists(['foo'], helper.isNumber(1, done))
it('returns 1 if the key exists with array syntax', () => {
return Promise.all([
client.set('foo', 'bar'),
client.exists(['foo']).then(helper.isNumber(1))
])
})
it('returns 0 if the key does not exist', (done) => {
client.exists('bar', helper.isNumber(0, done))
it('returns 0 if the key does not exist', () => {
return client.exists('bar').then(helper.isNumber(0))
})
afterEach(() => {

View File

@@ -9,27 +9,33 @@ describe('The \'expire\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('expires key after timeout', (done) => {
client.set(['expiry key', 'bar'], helper.isString('OK'))
client.expire('expiry key', '1', helper.isNumber(1))
setTimeout(() => {
client.exists(['expiry key'], helper.isNumber(0, done))
}, 1050)
it('expires key after timeout', () => {
return Promise.all([
client.set(['expiry key', 'bar']).then(helper.isString('OK')),
client.expire('expiry key', '1').then(helper.isNumber(1)),
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(client.exists(['expiry key']).then(helper.isNumber(0)))
}, 1050)
})
])
})
it('expires key after timeout with array syntax', (done) => {
client.set(['expiry key', 'bar'], helper.isString('OK'))
client.expire(['expiry key', '1'], helper.isNumber(1))
setTimeout(() => {
client.exists(['expiry key'], helper.isNumber(0, done))
}, 1050)
it('expires key after timeout with array syntax', () => {
return Promise.all([
client.set(['expiry key', 'bar']).then(helper.isString('OK')),
client.expire(['expiry key', '1']).then(helper.isNumber(1)),
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(client.exists(['expiry key']).then(helper.isNumber(0)))
}, 1050)
})
])
})
afterEach(() => {

View File

@@ -1,6 +1,5 @@
'use strict'
const assert = require('assert')
const config = require('../lib/config')
const helper = require('../helper')
const redis = config.redis
@@ -19,19 +18,15 @@ describe('The \'flushdb\' method', () => {
describe('when not connected', () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.quit()
})
client.on('end', done)
return client.quit()
})
it('reports an error', (done) => {
client.flushdb((err, res) => {
assert(err.message.match(/The connection is already closed/))
done()
})
it('reports an error', () => {
return client.flushdb()
.then(helper.fail)
.catch(helper.isError(/The connection is already closed/))
})
})
@@ -40,9 +35,7 @@ describe('The \'flushdb\' method', () => {
beforeEach((done) => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
done()
})
client.once('ready', done)
})
afterEach(() => {
@@ -50,42 +43,25 @@ describe('The \'flushdb\' method', () => {
})
describe('when there is data in Redis', () => {
beforeEach((done) => {
client.mset(key, uuid.v4(), key2, uuid.v4(), helper.isNotError())
client.dbsize([], (err, res) => {
helper.isType.positiveNumber()(err, res)
assert.strictEqual(res, 2, 'Two keys should have been inserted')
done()
})
beforeEach(() => {
return Promise.all([
client.mset(key, uuid.v4(), key2, uuid.v4()).then(helper.isString('OK')),
client.dbsize([]).then(helper.isNumber(2))
])
})
it('deletes all the keys', (done) => {
client.flushdb((err, res) => {
assert.strictEqual(err, null)
assert.strictEqual(res, 'OK')
client.mget(key, key2, (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('deletes all the keys', () => {
return Promise.all([
client.flushdb().then(helper.isString('OK')),
client.mget(key, key2).then(helper.isDeepEqual([null, null]))
])
})
it('results in a db size of zero', (done) => {
client.flushdb((err, res) => {
assert.strictEqual(err, null)
client.dbsize([], helper.isNumber(0, done))
})
})
it('results in a db size of zero without a callback', (done) => {
client.flushdb()
setTimeout(() => {
client.dbsize(helper.isNumber(0, done))
}, 25)
it('results in a db size of zero', () => {
return Promise.all([
client.flushdb(),
client.dbsize([]).then(helper.isNumber(0))
])
})
})
})

View File

@@ -9,20 +9,14 @@ describe('The \'geoadd\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('returns 1 if the key exists', function (done) {
it('returns 1 if the key exists', function () {
helper.serverVersionAtLeast.call(this, client, [3, 2, 0])
client.geoadd('mycity:21:0:location', '13.361389', '38.115556', 'COR', (err, res) => {
console.log(err, res)
// geoadd is still in the unstable branch. As soon as it reaches the stable one, activate this test
done()
})
return client.geoadd('mycity:21:0:location', '13.361389', '38.115556', 'COR')
})
afterEach(() => {

View File

@@ -1,6 +1,5 @@
'use strict'
const assert = require('assert')
const config = require('../lib/config')
const helper = require('../helper')
const redis = config.redis
@@ -19,25 +18,15 @@ describe('The \'get\' method', () => {
describe('when not connected', () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.quit()
})
client.on('end', done)
return client.quit()
})
it('reports an error', (done) => {
client.get(key, (err, res) => {
assert(err.message.match(/The connection is already closed/))
done()
})
})
it('reports an error promisified', () => {
return client.getAsync(key).then(assert, (err) => {
assert(err.message.match(/The connection is already closed/))
})
it('reports an error', () => {
return client.get(key)
.then(helper.fail)
.catch(helper.isError(/The connection is already closed/))
})
})
@@ -46,9 +35,7 @@ describe('The \'get\' method', () => {
beforeEach((done) => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
done()
})
client.once('ready', done)
})
afterEach(() => {
@@ -56,35 +43,18 @@ describe('The \'get\' method', () => {
})
describe('when the key exists in Redis', () => {
beforeEach((done) => {
client.set(key, value, (err, res) => {
helper.isNotError()(err, res)
done()
})
beforeEach(() => {
return client.set(key, value).then(helper.isString('OK'))
})
it('gets the value correctly', (done) => {
client.get(key, (err, res) => {
helper.isString(value)(err, res)
done(err)
})
})
it('should not throw on a get without callback (even if it\'s not useful)', (done) => {
client.get(key)
client.on('error', (err) => {
throw err
})
setTimeout(done, 25)
it('gets the value correctly', () => {
return client.get(key).then(helper.isString(value))
})
})
describe('when the key does not exist in Redis', () => {
it('gets a null value', (done) => {
client.get(key, (err, res) => {
helper.isNull()(err, res)
done(err)
})
it('gets a null value', () => {
return client.get(key).then(helper.isNull())
})
})
})

View File

@@ -1,6 +1,5 @@
'use strict'
const assert = require('assert')
const config = require('../lib/config')
const helper = require('../helper')
const redis = config.redis
@@ -20,19 +19,15 @@ describe('The \'getset\' method', () => {
describe('when not connected', () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.quit()
})
client.on('end', done)
return client.quit()
})
it('reports an error', (done) => {
client.get(key, (err, res) => {
assert(err.message.match(/The connection is already closed/))
done()
})
it('reports an error', () => {
return client.get(key)
.then(helper.fail)
.catch(helper.isError(/The connection is already closed/))
})
})
@@ -41,9 +36,7 @@ describe('The \'getset\' method', () => {
beforeEach((done) => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
done()
})
client.once('ready', done)
})
afterEach(() => {
@@ -51,50 +44,35 @@ describe('The \'getset\' method', () => {
})
describe('when the key exists in Redis', () => {
beforeEach((done) => {
client.set(key, value, (err, res) => {
helper.isNotError()(err, res)
done()
})
beforeEach(() => {
return client.set(key, value).then(helper.isString('OK'))
})
it('gets the value correctly', (done) => {
client.getset(key, value2, (err, res) => {
helper.isString(value)(err, res)
client.get(key, (err, res) => {
helper.isString(value2)(err, res)
done(err)
})
})
it('gets the value correctly', () => {
return Promise.all([
client.getset(key, value2).then(helper.isString(value)),
client.get(key).then(helper.isString(value2))
])
})
it('gets the value correctly with array syntax', (done) => {
client.getset([key, value2], (err, res) => {
helper.isString(value)(err, res)
client.get(key, (err, res) => {
helper.isString(value2)(err, res)
done(err)
})
})
it('gets the value correctly with array syntax', () => {
return Promise.all([
client.getset([key, value2]).then(helper.isString(value)),
client.get(key).then(helper.isString(value2))
])
})
it('gets the value correctly with array syntax style 2', (done) => {
client.getset(key, [value2], (err, res) => {
helper.isString(value)(err, res)
client.get(key, (err, res) => {
helper.isString(value2)(err, res)
done(err)
})
})
it('gets the value correctly with array syntax style 2', () => {
return Promise.all([
client.getset(key, [value2]).then(helper.isString(value)),
client.get(key).then(helper.isString(value2))
])
})
})
describe('when the key does not exist in Redis', () => {
it('gets a null value', (done) => {
client.getset(key, value, (err, res) => {
helper.isNull()(err, res)
done(err)
})
it('gets a null value', () => {
return client.getset(key, value).then(helper.isNull())
})
})
})

View File

@@ -8,69 +8,62 @@ const redis = config.redis
describe('The \'hgetall\' method', () => {
helper.allTests((ip, args) => {
let client
describe(`using ${ip}`, () => {
let client
describe('regular client', () => {
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('handles simple keys and values', (done) => {
client.hmset(['hosts', 'hasOwnProperty', '1', 'another', '23', 'home', '1234'], helper.isString('OK'))
client.hgetall(['hosts'], (err, obj) => {
assert.strictEqual(3, Object.keys(obj).length)
assert.strictEqual('1', obj.hasOwnProperty.toString())
assert.strictEqual('23', obj.another.toString())
assert.strictEqual('1234', obj.home.toString())
done(err)
})
it('handles simple keys and values', () => {
return Promise.all([
client.hmset(['hosts', 'hasOwnProperty', '1', 'another', '23', 'home', '1234']).then(helper.isString('OK')),
client.hgetall(['hosts']).then(helper.isDeepEqual({
hasOwnProperty: '1',
another: '23',
home: '1234'
}))
])
})
it('handles fetching keys set using an object', (done) => {
client.batch().hmset('msgTest', { message: 'hello' }, undefined).exec()
client.hgetall('msgTest', (err, obj) => {
assert.strictEqual(1, Object.keys(obj).length)
assert.strictEqual(obj.message, 'hello')
done(err)
})
it('handles fetching keys set using an object', () => {
return Promise.all([
client.batch().hmset('msgTest', { message: 'hello' }).exec(),
client.hgetall('msgTest').then(helper.isDeepEqual({ message: 'hello' }))
])
})
it('handles fetching a messing key', (done) => {
client.hgetall('missing', (err, obj) => {
assert.strictEqual(null, obj)
done(err)
})
it('handles fetching a messing key', () => {
return client.hgetall('missing').then(helper.isNull())
})
})
describe('binary client', () => {
let client
const args = config.configureClient(ip, {
returnBuffers: true
})
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('returns binary results', (done) => {
client.hmset(['bhosts', 'mjr', '1', 'another', '23', 'home', '1234', Buffer.from([0xAA, 0xBB, 0x00, 0xF0]), Buffer.from([0xCC, 0xDD, 0x00, 0xF0])], helper.isString('OK'))
client.hgetall('bhosts', (err, obj) => {
assert.strictEqual(4, Object.keys(obj).length)
assert.strictEqual('1', obj.mjr.toString())
assert.strictEqual('23', obj.another.toString())
assert.strictEqual('1234', obj.home.toString())
assert.strictEqual((Buffer.from([0xAA, 0xBB, 0x00, 0xF0])).toString('binary'), Object.keys(obj)[3])
assert.strictEqual((Buffer.from([0xCC, 0xDD, 0x00, 0xF0])).toString('binary'), obj[(Buffer.from([0xAA, 0xBB, 0x00, 0xF0])).toString('binary')].toString('binary'))
return done(err)
})
it('returns binary results', () => {
const weirdKey = Buffer.from([0xAA, 0xBB, 0x00, 0xF0])
const weirdValue = Buffer.from([0xCC, 0xDD, 0x00, 0xF0])
return Promise.all([
client.hmset(['bhosts', 'mjr', '1', 'another', '23', 'home', '1234', weirdKey, weirdValue]).then(helper.isString('OK')),
client.hgetall('bhosts').then((obj) => {
assert.strictEqual(4, Object.keys(obj).length)
assert.strictEqual('1', obj.mjr.toString())
assert.strictEqual('23', obj.another.toString())
assert.strictEqual('1234', obj.home.toString())
assert.strictEqual(weirdKey.toString('binary'), Object.keys(obj)[3])
assert.strictEqual(weirdValue.toString('binary'), obj[weirdKey.toString('binary')].toString('binary'))
})
])
})
})

View File

@@ -10,24 +10,19 @@ describe('The \'hincrby\' method', () => {
let client
const hash = 'test hash'
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('increments a key that has already been set', (done) => {
it('increments a key that has already been set', () => {
const field = 'field 1'
client.hset(hash, field, 33)
client.hincrby(hash, field, 10, helper.isNumber(43, done))
return client.hincrby(hash, field, 10).then(helper.isNumber(43))
})
it('increments a key that has not been set', (done) => {
const field = 'field 2'
client.hincrby(hash, field, 10, helper.isNumber(10, done))
it('increments a key that has not been set', () => {
return client.hincrby(hash, 'field 2', 10).then(helper.isNumber(10))
})
afterEach(() => {

View File

@@ -10,23 +10,21 @@ describe('The \'hlen\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('reports the count of keys', (done) => {
it('reports the count of keys', () => {
const hash = 'test hash'
const field1 = Buffer.from('0123456789')
const value1 = Buffer.from('abcdefghij')
const field2 = Buffer.from('')
const value2 = Buffer.from('')
client.hset(hash, field1, value1, helper.isNumber(1))
client.hset(hash, field2, value2, helper.isNumber(1))
client.hlen(hash, helper.isNumber(2, done))
client.hset(hash, field1, value1).then(helper.isNumber(1))
client.hset(hash, field2, value2).then(helper.isNumber(1))
return client.hlen(hash).then(helper.isNumber(2))
})
afterEach(() => {

View File

@@ -1,6 +1,5 @@
'use strict'
const assert = require('assert')
const config = require('../lib/config')
const helper = require('../helper')
const redis = config.redis
@@ -11,54 +10,36 @@ describe('The \'hmget\' method', () => {
let client
const hash = 'test hash'
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('error', done)
client.once('ready', () => {
client.flushdb()
client.hmset(hash, {'0123456789': 'abcdefghij', 'some manner of key': 'a type of value'}, helper.isString('OK', done))
})
client.flushdb()
return client.hmset(hash, {'0123456789': 'abcdefghij', 'some manner of key': 'a type of value'})
.then(helper.isString('OK'))
})
it('allows keys to be specified using multiple arguments', (done) => {
client.hmget(hash, '0123456789', 'some manner of key', (err, reply) => {
assert.strictEqual('abcdefghij', reply[0].toString())
assert.strictEqual('a type of value', reply[1].toString())
return done(err)
})
it('allows keys to be specified using multiple arguments', () => {
return client.hmget(hash, '0123456789', 'some manner of key')
.then(helper.isDeepEqual(['abcdefghij', 'a type of value']))
})
it('allows keys to be specified by passing an array without manipulating the array', (done) => {
it('allows keys to be specified by passing an array without manipulating the array', () => {
const data = ['0123456789', 'some manner of key']
client.hmget(hash, data, (err, reply) => {
assert.strictEqual(data.length, 2)
assert.strictEqual('abcdefghij', reply[0].toString())
assert.strictEqual('a type of value', reply[1].toString())
return done(err)
})
return client.hmget(hash, data)
.then(helper.isDeepEqual(['abcdefghij', 'a type of value']))
})
it('allows keys to be specified by passing an array as first argument', (done) => {
client.hmget([hash, '0123456789', 'some manner of key'], (err, reply) => {
assert.strictEqual('abcdefghij', reply[0].toString())
assert.strictEqual('a type of value', reply[1].toString())
return done(err)
})
it('allows keys to be specified by passing an array as first argument', () => {
return client.hmget([hash, '0123456789', 'some manner of key'])
.then(helper.isDeepEqual(['abcdefghij', 'a type of value']))
})
it('allows a single key to be specified in an array', (done) => {
client.hmget(hash, ['0123456789'], (err, reply) => {
assert.strictEqual('abcdefghij', reply[0].toString())
return done(err)
})
it('allows a single key to be specified in an array', () => {
return client.hmget(hash, ['0123456789']).then(helper.isDeepEqual(['abcdefghij']))
})
it('allows keys to be specified that have not yet been set', (done) => {
client.hmget(hash, 'missing thing', 'another missing thing', (err, reply) => {
assert.strictEqual(null, reply[0])
assert.strictEqual(null, reply[1])
return done(err)
})
it('allows keys to be specified that have not yet been set', () => {
return client.hmget(hash, 'missing thing', 'another missing thing')
.then(helper.isDeepEqual([null, null]))
})
afterEach(() => {

View File

@@ -1,6 +1,5 @@
'use strict'
const assert = require('assert')
const config = require('../lib/config')
const helper = require('../helper')
const redis = config.redis
@@ -11,100 +10,57 @@ describe('The \'hmset\' method', () => {
let client
const hash = 'test hash'
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('handles redis-style syntax', (done) => {
client.hmset(hash, '0123456789', 'abcdefghij', 'some manner of key', 'a type of value', 'otherTypes', 555, helper.isString('OK'))
client.hgetall(hash, (err, obj) => {
assert.strictEqual(obj['0123456789'], 'abcdefghij')
assert.strictEqual(obj['some manner of key'], 'a type of value')
return done(err)
})
it('handles redis-style syntax', () => {
client.hmset(hash, '0123456789', 'abcdefghij', 'some manner of key', 'a type of value', 'otherTypes', 555).then(helper.isString('OK'))
return client.hgetall(hash).then(helper.isDeepEqual({
'0123456789': 'abcdefghij',
'some manner of key': 'a type of value',
'otherTypes': '555'
}))
})
it('handles object-style syntax', (done) => {
client.hmset(hash, {'0123456789': 'abcdefghij', 'some manner of key': 'a type of value', 'otherTypes': 555}, helper.isString('OK'))
client.hgetall(hash, (err, obj) => {
assert.strictEqual(obj['0123456789'], 'abcdefghij')
assert.strictEqual(obj['some manner of key'], 'a type of value')
return done(err)
})
it('handles object-style syntax', () => {
client.hmset(hash, {'0123456789': 'abcdefghij', 'some manner of key': 'a type of value', 'otherTypes': 555}).then(helper.isString('OK'))
return client.hgetall(hash).then(helper.isDeepEqual({
'0123456789': 'abcdefghij',
'some manner of key': 'a type of value',
'otherTypes': '555'
}))
})
it('handles object-style syntax and the key being a number', (done) => {
client.hmset(231232, {'0123456789': 'abcdefghij', 'some manner of key': 'a type of value', 'otherTypes': 555}, undefined)
client.hgetall(231232, (err, obj) => {
assert.strictEqual(obj['0123456789'], 'abcdefghij')
assert.strictEqual(obj['some manner of key'], 'a type of value')
return done(err)
})
it('handles object-style syntax and the key being a number', () => {
client.hmset(231232, {'0123456789': 'abcdefghij', 'some manner of key': 'a type of value', 'otherTypes': 555})
return client.hgetall(231232).then(helper.isDeepEqual({
'0123456789': 'abcdefghij',
'some manner of key': 'a type of value',
'otherTypes': '555'
}))
})
it('allows a numeric key', (done) => {
client.hmset(hash, 99, 'banana', helper.isString('OK'))
client.hgetall(hash, (err, obj) => {
assert.strictEqual(obj['99'], 'banana')
return done(err)
})
it('allows a numeric key', () => {
client.hmset(hash, 99, 'banana').then(helper.isString('OK'))
return client.hgetall(hash).then(helper.isDeepEqual({ 99: 'banana' }))
})
it('allows a numeric key without callback', (done) => {
client.hmset(hash, 99, 'banana', 'test', 25)
client.hgetall(hash, (err, obj) => {
assert.strictEqual(obj['99'], 'banana')
assert.strictEqual(obj.test, '25')
return done(err)
})
it('allows an array', () => {
client.hmset([hash, 99, 'banana', 'test', 25]).then(helper.isString('OK'))
return client.hgetall(hash).then(helper.isDeepEqual({
99: 'banana',
test: '25'
}))
})
it('allows an array without callback', (done) => {
client.hmset([hash, 99, 'banana', 'test', 25])
client.hgetall(hash, (err, obj) => {
assert.strictEqual(obj['99'], 'banana')
assert.strictEqual(obj.test, '25')
return done(err)
})
})
it('allows an array and a callback', (done) => {
client.hmset([hash, 99, 'banana', 'test', 25], helper.isString('OK'))
client.hgetall(hash, (err, obj) => {
assert.strictEqual(obj['99'], 'banana')
assert.strictEqual(obj.test, '25')
return done(err)
})
})
it('allows a key plus array without callback', (done) => {
client.hmset(hash, [99, 'banana', 'test', 25])
client.hgetall(hash, (err, obj) => {
assert.strictEqual(obj['99'], 'banana')
assert.strictEqual(obj.test, '25')
return done(err)
})
})
it('allows a key plus array and a callback', (done) => {
client.hmset(hash, [99, 'banana', 'test', 25], helper.isString('OK'))
client.hgetall(hash, (err, obj) => {
assert.strictEqual(obj['99'], 'banana')
assert.strictEqual(obj.test, '25')
return done(err)
})
})
it('handles object-style syntax without callback', (done) => {
client.hmset(hash, {'0123456789': 'abcdefghij', 'some manner of key': 'a type of value'})
client.hgetall(hash, (err, obj) => {
assert.strictEqual(obj['0123456789'], 'abcdefghij')
assert.strictEqual(obj['some manner of key'], 'a type of value')
return done(err)
})
it('allows a key plus array', () => {
client.hmset(hash, [99, 'banana', 'test', 25]).then(helper.isString('OK'))
return client.hgetall(hash).then(helper.isDeepEqual({
99: 'banana',
test: '25'
}))
})
afterEach(() => {

View File

@@ -12,66 +12,51 @@ describe('The \'hset\' method', () => {
let client
const hash = 'test hash'
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('allows a value to be set in a hash', (done) => {
it('allows a value to be set in a hash', () => {
const field = Buffer.from('0123456789')
const value = Buffer.from('abcdefghij')
client.hset(hash, field, value, helper.isNumber(1))
client.hget(hash, field, helper.isString(value.toString(), done))
client.hset(hash, field, value).then(helper.isNumber(1))
return client.hget(hash, field).then(helper.isString(value.toString()))
})
it('handles an empty value', (done) => {
it('handles an empty value', () => {
const field = Buffer.from('0123456789')
const value = Buffer.from('')
client.hset(hash, field, value, helper.isNumber(1))
client.hget([hash, field], helper.isString('', done))
client.hset(hash, field, value).then(helper.isNumber(1))
return client.hget([hash, field]).then(helper.isString(''))
})
it('handles empty key and value', (done) => {
it('handles empty key and value', () => {
const field = Buffer.from('')
const value = Buffer.from('')
client.hset([hash, field, value], (err, res) => {
assert.strictEqual(err, null)
assert.strictEqual(res, 1)
client.hset(hash, field, value, helper.isNumber(0, done))
})
client.hset([hash, field, value]).then(helper.isNumber(1))
return client.hset(hash, field, value).then(helper.isNumber(0))
})
it('warns if someone passed a array either as field or as value', (done) => {
it('warns if someone passed a array either as field or as value', () => {
const hash = 'test hash'
const field = 'array'
// This would be converted to "array contents" but if you use more than one entry,
// it'll result in e.g. "array contents,second content" and this is not supported and considered harmful
const value = ['array contents']
client.hmset(hash, field, value, helper.isError(done))
return client.hmset(hash, field, value).then(assert, helper.isError())
})
it('does not error when a buffer and date are set as values on the same hash', (done) => {
const hash = 'test hash'
const field1 = 'buffer'
const value1 = Buffer.from('abcdefghij')
const field2 = 'date'
const value2 = new Date()
client.hmset(hash, field1, value1, field2, value2, helper.isString('OK', done))
it('does not error when a buffer and date are set as values on the same hash', () => {
return client.hmset('test hash', 'buffer', Buffer.from('abcdefghij'), 'data', new Date())
.then(helper.isString('OK'))
})
it('does not error when a buffer and date are set as fields on the same hash', (done) => {
const hash = 'test hash'
const value1 = 'buffer'
const field1 = Buffer.from('abcdefghij')
const value2 = 'date'
const field2 = new Date()
client.hmset(hash, field1, value1, field2, value2, helper.isString('OK', done))
it('does not error when a buffer and date are set as fields on the same hash', () => {
return client.hmset('test hash', Buffer.from('abcdefghij'), 'buffer', new Date(), 'date')
.then(helper.isString('OK'))
})
afterEach(() => {

View File

@@ -1,6 +1,5 @@
'use strict'
const assert = require('assert')
const config = require('../lib/config')
const helper = require('../helper')
const redis = config.redis
@@ -17,53 +16,47 @@ describe('The \'incr\' method', () => {
})
/*
Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1 === 9007199254740991
Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1 === 9007199254740991
9007199254740992 -> 9007199254740992
9007199254740993 -> 9007199254740992
9007199254740994 -> 9007199254740994
9007199254740995 -> 9007199254740996
9007199254740996 -> 9007199254740996
9007199254740997 -> 9007199254740996
...
*/
it('count above the safe integers as numbers', (done) => {
9007199254740992 -> 9007199254740992
9007199254740993 -> 9007199254740992
9007199254740994 -> 9007199254740994
9007199254740995 -> 9007199254740996
9007199254740996 -> 9007199254740996
9007199254740997 -> 9007199254740996
...
*/
it('count above the safe integers as numbers', () => {
client = redis.createClient.apply(null, args)
// Set a value to the maximum safe allowed javascript number (2^53) - 1
client.set(key, Number.MAX_SAFE_INTEGER, helper.isNotError())
client.incr(key, helper.isNumber(Number.MAX_SAFE_INTEGER + 1))
client.incr(key, helper.isNumber(Number.MAX_SAFE_INTEGER + 2))
client.incr(key, helper.isNumber(Number.MAX_SAFE_INTEGER + 3))
client.incr(key, helper.isNumber(Number.MAX_SAFE_INTEGER + 4))
client.incr(key, helper.isNumber(Number.MAX_SAFE_INTEGER + 5))
client.incr(key, (err, res) => {
helper.isNumber(Number.MAX_SAFE_INTEGER + 6)(err, res)
assert.strictEqual(typeof res, 'number')
})
client.incr(key, helper.isNumber(Number.MAX_SAFE_INTEGER + 7))
client.incr(key, helper.isNumber(Number.MAX_SAFE_INTEGER + 8))
client.incr(key, helper.isNumber(Number.MAX_SAFE_INTEGER + 9))
client.incr(key, helper.isNumber(Number.MAX_SAFE_INTEGER + 10, done))
client.set(key, Number.MAX_SAFE_INTEGER).then(helper.isString('OK'))
client.incr(key).then(helper.isNumber(Number.MAX_SAFE_INTEGER + 1))
client.incr(key).then(helper.isNumber(Number.MAX_SAFE_INTEGER + 2))
client.incr(key).then(helper.isNumber(Number.MAX_SAFE_INTEGER + 3))
client.incr(key).then(helper.isNumber(Number.MAX_SAFE_INTEGER + 4))
client.incr(key).then(helper.isNumber(Number.MAX_SAFE_INTEGER + 5))
client.incr(key).then(helper.isNumber(Number.MAX_SAFE_INTEGER + 6))
client.incr(key).then(helper.isNumber(Number.MAX_SAFE_INTEGER + 7))
client.incr(key).then(helper.isNumber(Number.MAX_SAFE_INTEGER + 8))
client.incr(key).then(helper.isNumber(Number.MAX_SAFE_INTEGER + 9))
return client.incr(key).then(helper.isNumber(Number.MAX_SAFE_INTEGER + 10))
})
it('count above the safe integers as strings', (done) => {
it('count above the safe integers as strings', () => {
args[2].stringNumbers = true
client = redis.createClient.apply(null, args)
// Set a value to the maximum safe allowed javascript number (2^53)
client.set(key, Number.MAX_SAFE_INTEGER, helper.isNotError())
client.incr(key, helper.isString('9007199254740992'))
client.incr(key, helper.isString('9007199254740993'))
client.incr(key, helper.isString('9007199254740994'))
client.incr(key, helper.isString('9007199254740995'))
client.incr(key, helper.isString('9007199254740996'))
client.incr(key, (err, res) => {
helper.isString('9007199254740997')(err, res)
assert.strictEqual(typeof res, 'string')
})
client.incr(key, helper.isString('9007199254740998'))
client.incr(key, helper.isString('9007199254740999'))
client.incr(key, helper.isString('9007199254741000'))
client.incr(key, helper.isString('9007199254741001', done))
client.set(key, Number.MAX_SAFE_INTEGER).then(helper.isString('OK'))
client.incr(key).then(helper.isString('9007199254740992'))
client.incr(key).then(helper.isString('9007199254740993'))
client.incr(key).then(helper.isString('9007199254740994'))
client.incr(key).then(helper.isString('9007199254740995'))
client.incr(key).then(helper.isString('9007199254740996'))
client.incr(key).then(helper.isString('9007199254740997'))
client.incr(key).then(helper.isString('9007199254740998'))
client.incr(key).then(helper.isString('9007199254740999'))
client.incr(key).then(helper.isString('9007199254741000'))
return client.incr(key).then(helper.isString('9007199254741001'))
})
})
})

View File

@@ -10,68 +10,50 @@ describe('The \'info\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushall(done)
})
return client.flushall()
})
afterEach(() => {
client.end(true)
})
it('update serverInfo after a info command', (done) => {
it('update serverInfo after a info command', () => {
client.set('foo', 'bar')
client.info()
client.select(2, () => {
return client.info().then(() => {
assert.strictEqual(client.serverInfo.db2, undefined)
client.select(2)
client.set('foo', 'bar')
return client.info().then(() => {
assert.strictEqual(typeof client.serverInfo.db2, 'object')
})
})
client.set('foo', 'bar')
client.info()
setTimeout(() => {
assert.strictEqual(typeof client.serverInfo.db2, 'object')
done()
}, 30)
})
it('works with optional section provided with and without callback', (done) => {
it('works with optional section provided', () => {
client.set('foo', 'bar')
client.info('keyspace')
client.select(2, () => {
return client.select(2).then(() => {
assert.strictEqual(Object.keys(client.serverInfo).length, 2, 'Key length should be three')
assert.strictEqual(typeof client.serverInfo.db0, 'object', 'db0 keyspace should be an object')
})
client.info(['keyspace'])
client.set('foo', 'bar')
client.info('all', (err, res) => {
assert.strictEqual(err, null)
assert(Object.keys(client.serverInfo).length > 3, 'Key length should be way above three')
assert.strictEqual(typeof client.serverInfo.redis_version, 'string')
assert.strictEqual(typeof client.serverInfo.db2, 'object')
done()
client.info(['keyspace'])
client.set('foo', 'bar')
return client.info('all').then((res) => {
assert(Object.keys(client.serverInfo).length > 3, 'Key length should be way above three')
assert.strictEqual(typeof client.serverInfo.redis_version, 'string')
assert.strictEqual(typeof client.serverInfo.db2, 'object')
})
})
})
it('check redis v.2.4 support', (done) => {
const end = helper.callFuncAfter(done, 2)
client.internalSendCommand = function (commandObj) {
assert.strictEqual(commandObj.args.length, 0)
assert.strictEqual(commandObj.command, 'info')
end()
}
client.info()
client.info(() => {})
})
it('emit error after a failure', (done) => {
client.info()
client.once('error', (err) => {
it('return error after a failure', () => {
const promise = client.info().then(helper.fail).catch((err) => {
assert.strictEqual(err.code, 'UNCERTAIN_STATE')
assert.strictEqual(err.command, 'INFO')
done()
})
client.stream.destroy()
return promise
})
})
})

View File

@@ -11,24 +11,21 @@ describe('The \'keys\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushall(done)
})
return client.flushall()
})
it('returns matching keys', (done) => {
client.mset(['test keys 1', 'test val 1', 'test keys 2', 'test val 2'], helper.isString('OK'))
client.keys('test keys*', (err, results) => {
it('returns matching keys', () => {
client.mset(['test keys 1', 'test val 1', 'test keys 2', 'test val 2']).then(helper.isString('OK'))
return client.keys('test keys*').then((results) => {
assert.strictEqual(2, results.length)
assert.ok(~results.indexOf('test keys 1'))
assert.ok(~results.indexOf('test keys 2'))
return done(err)
})
})
it('handles a large packet size', (done) => {
it('handles a large packet size', () => {
const keysValues = []
for (let i = 0; i < 200; i++) {
@@ -39,24 +36,15 @@ describe('The \'keys\' method', () => {
keysValues.push(keyValue)
}
client.mset(keysValues.reduce((a, b) => {
return a.concat(b)
}), helper.isString('OK'))
client.mset(keysValues.reduce((a, b) => a.concat(b))).then(helper.isString('OK'))
client.keys('multibulk:*', (err, results) => {
assert.deepEqual(keysValues.map((val) => {
return val[0]
}).sort(), results.sort())
return done(err)
return client.keys('multibulk:*').then((results) => {
assert.deepStrictEqual(keysValues.map((val) => val[0]).sort(), results.sort())
})
})
it('handles an empty response', (done) => {
client.keys(['users:*'], (err, results) => {
assert.strictEqual(results.length, 0)
assert.ok(Array.isArray(results))
return done(err)
})
it('handles an empty response', () => {
return client.keys(['users:*']).then(helper.isDeepEqual([]))
})
afterEach(() => {

View File

@@ -1,6 +1,5 @@
'use strict'
const assert = require('assert')
const config = require('../lib/config')
const helper = require('../helper')
const redis = config.redis
@@ -10,54 +9,29 @@ describe('The \'mget\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('error', done)
client.once('ready', () => {
client.flushdb()
client.mset(['mget keys 1', 'mget val 1', 'mget keys 2', 'mget val 2', 'mget keys 3', 'mget val 3'], done)
})
client.flushdb()
return client.mset(['mget keys 1', 'mget val 1', 'mget keys 2', 'mget val 2', 'mget keys 3', 'mget val 3'])
})
it('handles fetching multiple keys in argument form', (done) => {
client.mset(['mget keys 1', 'mget val 1', 'mget keys 2', 'mget val 2', 'mget keys 3', 'mget val 3'], helper.isString('OK'))
client.mget('mget keys 1', 'mget keys 2', 'mget keys 3', (err, results) => {
assert.strictEqual(3, results.length)
assert.strictEqual('mget val 1', results[0].toString())
assert.strictEqual('mget val 2', results[1].toString())
assert.strictEqual('mget val 3', results[2].toString())
return done(err)
})
it('handles fetching multiple keys in argument form', () => {
client.mset(['mget keys 1', 'mget val 1', 'mget keys 2', 'mget val 2', 'mget keys 3', 'mget val 3']).then(helper.isString('OK'))
return client.mget('mget keys 1', 'mget keys 2', 'mget keys 3').then(helper.isDeepEqual([
'mget val 1', 'mget val 2', 'mget val 3'
]))
})
it('handles fetching multiple keys via an array', (done) => {
client.mget(['mget keys 1', 'mget keys 2', 'mget keys 3'], (err, results) => {
assert.strictEqual('mget val 1', results[0].toString())
assert.strictEqual('mget val 2', results[1].toString())
assert.strictEqual('mget val 3', results[2].toString())
return done(err)
})
it('handles fetching multiple keys via an array', () => {
return client.mget(['mget keys 1', 'mget keys 2', 'mget keys 3']).then(helper.isDeepEqual([
'mget val 1', 'mget val 2', 'mget val 3'
]))
})
it('handles fetching multiple keys, when some keys do not exist', (done) => {
client.mget('mget keys 1', ['some random shit', 'mget keys 2', 'mget keys 3'], (err, results) => {
assert.strictEqual(4, results.length)
assert.strictEqual('mget val 1', results[0].toString())
assert.strictEqual(null, results[1])
assert.strictEqual('mget val 2', results[2].toString())
assert.strictEqual('mget val 3', results[3].toString())
return done(err)
})
})
it('handles fetching multiple keys, when some keys do not exist promisified', () => {
return client.mgetAsync('mget keys 1', ['some random shit', 'mget keys 2', 'mget keys 3']).then((results) => {
assert.strictEqual(4, results.length)
assert.strictEqual('mget val 1', results[0].toString())
assert.strictEqual(null, results[1])
assert.strictEqual('mget val 2', results[2].toString())
assert.strictEqual('mget val 3', results[3].toString())
})
it('handles fetching multiple keys, when some keys do not exist', () => {
return client.mget('mget keys 1', ['some random shit', 'mget keys 2', 'mget keys 3']).then(helper.isDeepEqual([
'mget val 1', null, 'mget val 2', 'mget val 3'
]))
})
afterEach(() => {

View File

@@ -15,11 +15,9 @@ describe('The \'monitor\' method', () => {
client.end(true)
})
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('connect', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('monitors commands on all redis clients and works in the correct order', (done) => {
@@ -38,8 +36,7 @@ describe('The \'monitor\' method', () => {
monitorClient.set('foo', 'bar')
monitorClient.flushdb()
monitorClient.monitor((err, res) => {
assert.strictEqual(err, null)
monitorClient.monitor().then((res) => {
assert.strictEqual(res, 'OK')
client.mget('some', 'keys', 'foo', 'bar')
client.set('json', JSON.stringify({
@@ -48,33 +45,28 @@ describe('The \'monitor\' method', () => {
another: false
}))
client.eval('return redis.call(\'set\', \'sha\', \'test\')', 0)
monitorClient.get('baz', (err, res) => {
monitorClient.get('baz').then((res) => {
assert.strictEqual(res, null)
end(err)
end()
})
monitorClient.set('foo', 'bar" "s are " " good!"', (err, res) => {
monitorClient.set('foo', 'bar" "s are " " good!"').then((res) => {
assert.strictEqual(res, 'OK')
end(err)
end()
})
monitorClient.mget('foo', 'baz', (err, res) => {
monitorClient.mget('foo', 'baz').then((res) => {
assert.strictEqual(res[0], 'bar" "s are " " good!"')
assert.strictEqual(res[1], null)
end(err)
})
monitorClient.subscribe('foo', 'baz', (err, res) => {
// The return value might change in v.3
// assert.strictEqual(res, 'baz');
// TODO: Fix the return value of subscribe calls
end(err)
end()
})
monitorClient.subscribe('foo', 'baz').then(() => end())
})
monitorClient.on('monitor', (time, args, rawOutput) => {
assert.strictEqual(monitorClient.monitoring, true)
assert.deepEqual(args, responses.shift())
assert.deepStrictEqual(args, responses.shift())
assert(utils.monitorRegex.test(rawOutput), rawOutput)
if (responses.length === 0) {
monitorClient.quit(end)
monitorClient.quit().then(() => end())
}
})
})
@@ -88,8 +80,7 @@ describe('The \'monitor\' method', () => {
path: '/tmp/redis.sock'
})
monitorClient.monitor((err, res) => {
assert.strictEqual(err, null)
monitorClient.monitor().then((res) => {
assert.strictEqual(monitorClient.monitoring, true)
assert.strictEqual(res.inspect(), Buffer.from('OK').inspect())
monitorClient.mget('hello', Buffer.from('world'))
@@ -98,20 +89,20 @@ describe('The \'monitor\' method', () => {
monitorClient.on('monitor', (time, args, rawOutput) => {
assert.strictEqual(typeof rawOutput, 'string')
assert(utils.monitorRegex.test(rawOutput), rawOutput)
assert.deepEqual(args, ['mget', 'hello', 'world'])
assert.deepStrictEqual(args, ['mget', 'hello', 'world'])
// Quit immediately ends monitoring mode and therefore does not stream back the quit command
monitorClient.quit(done)
monitorClient.quit().then(() => done())
})
})
it('monitors reconnects properly and works with the offline queue', (done) => {
let called = false
client.monitor(helper.isString('OK'))
client.monitor().then(helper.isString('OK'))
client.mget('hello', 'world')
client.on('monitor', (time, args, rawOutput) => {
assert.strictEqual(client.monitoring, true)
assert(utils.monitorRegex.test(rawOutput), rawOutput)
assert.deepEqual(args, ['mget', 'hello', 'world'])
assert.deepStrictEqual(args, ['mget', 'hello', 'world'])
if (called) {
// End after a reconnect
return done()
@@ -125,13 +116,13 @@ describe('The \'monitor\' method', () => {
it('monitors reconnects properly and works with the offline queue in a batch statement', (done) => {
let called = false
const multi = client.batch()
multi.monitor(helper.isString('OK'))
multi.monitor()
multi.mget('hello', 'world')
multi.exec(helper.isDeepEqual(['OK', [null, null]]))
multi.exec().then(helper.isDeepEqual(['OK', [null, null]]))
client.on('monitor', (time, args, rawOutput) => {
assert.strictEqual(client.monitoring, true)
assert(utils.monitorRegex.test(rawOutput), rawOutput)
assert.deepEqual(args, ['mget', 'hello', 'world'])
assert.deepStrictEqual(args, ['mget', 'hello', 'world'])
if (called) {
// End after a reconnect
return done()
@@ -143,7 +134,7 @@ describe('The \'monitor\' method', () => {
})
it('monitor activates even if the command could not be processed properly after a reconnect', (done) => {
client.monitor((err, res) => {
client.monitor().then(assert, (err) => {
assert.strictEqual(err.code, 'UNCERTAIN_STATE')
})
client.on('error', () => {}) // Ignore error here
@@ -154,8 +145,7 @@ describe('The \'monitor\' method', () => {
end()
})
client.on('reconnecting', () => {
client.get('foo', (err, res) => {
assert(!err)
client.get('foo').then((res) => {
assert.strictEqual(client.monitoring, true)
end()
})
@@ -174,10 +164,9 @@ describe('The \'monitor\' method', () => {
]
const pub = redis.createClient()
pub.on('ready', () => {
client.monitor((err, res) => {
assert.strictEqual(err, null)
client.monitor().then((res) => {
assert.strictEqual(res, 'OK')
pub.get('foo', helper.isNull())
pub.get('foo').then(helper.isNull())
})
client.subscribe('/foo', '/bar')
client.unsubscribe('/bar')
@@ -186,21 +175,22 @@ describe('The \'monitor\' method', () => {
client.once('ready', () => {
pub.publish('/foo', 'hello world')
})
client.set('foo', 'bar', helper.isError())
client.set('foo', 'bar')
.then(assert, helper.isError(/ERR only \(P\)SUBSCRIBE \/ \(P\)UNSUBSCRIBE/))
client.subscribe('baz')
client.unsubscribe('baz')
}, 150)
let called = false
client.on('monitor', (time, args, rawOutput) => {
assert.deepEqual(args, responses.shift())
assert.deepStrictEqual(args, responses.shift())
assert(utils.monitorRegex.test(rawOutput), rawOutput)
if (responses.length === 0) {
// The publish is called right after the reconnect and the monitor is called before the message is emitted.
// Therefore we have to wait till the next tick
process.nextTick(() => {
assert(called)
client.quit(done)
pub.end(false)
client.quit().then(() => done())
})
}
})

View File

@@ -21,19 +21,14 @@ describe('The \'mset\' method', () => {
describe('when not connected', () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.quit()
})
client.on('end', done)
return client.quit()
})
it('reports an error', (done) => {
client.mset(key, value, key2, value2, (err, res) => {
assert(err.message.match(/The connection is already closed/))
done()
})
it('reports an error', () => {
return client.mset(key, value, key2, value2)
.then(assert, helper.isError(/The connection is already closed/))
})
})
@@ -42,63 +37,18 @@ describe('The \'mset\' method', () => {
beforeEach((done) => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
done()
})
client.once('ready', done)
})
afterEach(() => {
client.end(true)
})
describe('and a callback is specified', () => {
describe('with valid parameters', () => {
it('sets the value correctly', (done) => {
client.mset(key, value, key2, value2, (err) => {
if (err) {
return done(err)
}
client.get(key, helper.isString(value))
client.get(key2, helper.isString(value2, done))
})
})
})
describe('with undefined \'key\' parameter and missing \'value\' parameter', () => {
it('reports an error', (done) => {
client.mset(undefined, (err, res) => {
helper.isError()(err, null)
done()
})
})
})
})
describe('and no callback is specified', () => {
describe('with valid parameters', () => {
it('sets the value correctly', (done) => {
client.mset(key, value2, key2, value)
client.get(key, helper.isString(value2))
client.get(key2, helper.isString(value, done))
})
it('sets the value correctly with array syntax', (done) => {
client.mset([key, value2, key2, value])
client.get(key, helper.isString(value2))
client.get(key2, helper.isString(value, done))
})
})
describe('with undefined \'key\' and missing \'value\' parameter', () => {
// this behavior is different from the 'set' behavior.
it('emits an error', (done) => {
client.on('error', (err) => {
assert.strictEqual(err.message, 'ERR wrong number of arguments for \'mset\' command')
assert.strictEqual(err.name, 'ReplyError')
done()
})
client.mset()
describe('with valid parameters', () => {
it('sets the value correctly', () => {
return client.mset(key, value, key2, value2).then(() => {
client.get(key).then(helper.isString(value))
return client.get(key2).then(helper.isString(value2))
})
})
})

View File

@@ -9,23 +9,21 @@ describe('The \'msetnx\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('if any keys exist entire operation fails', (done) => {
client.mset(['mset1', 'val1', 'mset2', 'val2', 'mset3', 'val3'], helper.isString('OK'))
client.msetnx(['mset3', 'val3', 'mset4', 'val4'], helper.isNumber(0))
client.exists(['mset4'], helper.isNumber(0, done))
it('if any keys exist entire operation fails', () => {
client.mset(['mset1', 'val1', 'mset2', 'val2', 'mset3', 'val3']).then(helper.isString('OK'))
client.msetnx(['mset3', 'val3', 'mset4', 'val4']).then(helper.isNumber(0))
return client.exists(['mset4']).then(helper.isNumber(0))
})
it('sets multiple keys if all keys are not set', (done) => {
client.msetnx(['mset3', 'val3', 'mset4', 'val4'], helper.isNumber(1))
client.exists(['mset3'], helper.isNumber(1))
client.exists(['mset3'], helper.isNumber(1, done))
it('sets multiple keys if all keys are not set', () => {
client.msetnx(['mset3', 'val3', 'mset4', 'val4']).then(helper.isNumber(1))
client.exists(['mset3']).then(helper.isNumber(1))
return client.exists(['mset3']).then(helper.isNumber(1))
})
afterEach(() => {

View File

@@ -10,18 +10,15 @@ describe('The \'randomkey\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('returns a random key', (done) => {
client.mset(['test keys 1', 'test val 1', 'test keys 2', 'test val 2'], helper.isString('OK'))
client.randomkey([], (err, results) => {
it('returns a random key', () => {
client.mset(['test keys 1', 'test val 1', 'test keys 2', 'test val 2']).then(helper.isString('OK'))
return client.randomkey([]).then((results) => {
assert.strictEqual(true, /test keys.+/.test(results))
return done(err)
})
})

View File

@@ -9,23 +9,21 @@ describe('The \'rename\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('populates the new key', (done) => {
client.set(['foo', 'bar'], helper.isString('OK'))
client.rename(['foo', 'new foo'], helper.isString('OK'))
client.exists(['new foo'], helper.isNumber(1, done))
it('populates the new key', () => {
client.set(['foo', 'bar']).then(helper.isString('OK'))
client.rename(['foo', 'new foo']).then(helper.isString('OK'))
return client.exists(['new foo']).then(helper.isNumber(1))
})
it('removes the old key', (done) => {
client.set(['foo', 'bar'], helper.isString('OK'))
client.rename(['foo', 'new foo'], helper.isString('OK'))
client.exists(['foo'], helper.isNumber(0, done))
it('removes the old key', () => {
client.set(['foo', 'bar']).then(helper.isString('OK'))
client.rename(['foo', 'new foo']).then(helper.isString('OK'))
return client.exists(['foo']).then(helper.isNumber(0))
})
afterEach(() => {

View File

@@ -9,26 +9,24 @@ describe('The \'renamenx\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('renames the key if target does not yet exist', (done) => {
client.set('foo', 'bar', helper.isString('OK'))
client.renamenx('foo', 'foo2', helper.isNumber(1))
client.exists('foo', helper.isNumber(0))
client.exists(['foo2'], helper.isNumber(1, done))
it('renames the key if target does not yet exist', () => {
client.set('foo', 'bar').then(helper.isString('OK'))
client.renamenx('foo', 'foo2').then(helper.isNumber(1))
client.exists('foo').then(helper.isNumber(0))
return client.exists(['foo2']).then(helper.isNumber(1))
})
it('does not rename the key if the target exists', (done) => {
client.set('foo', 'bar', helper.isString('OK'))
client.set('foo2', 'apple', helper.isString('OK'))
client.renamenx('foo', 'foo2', helper.isNumber(0))
client.exists('foo', helper.isNumber(1))
client.exists(['foo2'], helper.isNumber(1, done))
it('does not rename the key if the target exists', () => {
client.set('foo', 'bar').then(helper.isString('OK'))
client.set('foo2', 'apple').then(helper.isString('OK'))
client.renamenx('foo', 'foo2').then(helper.isNumber(0))
client.exists('foo').then(helper.isNumber(1))
return client.exists(['foo2']).then(helper.isNumber(1))
})
afterEach(() => {

View File

@@ -3,27 +3,21 @@
const config = require('../lib/config')
const helper = require('../helper')
const redis = config.redis
const assert = require('assert')
describe('The \'rpush\' command', () => {
helper.allTests((ip, args) => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('inserts multiple values at a time into a list', (done) => {
client.rpush('test', ['list key', 'should be a list'])
client.lrange('test', 0, -1, (err, res) => {
assert.strictEqual(res[0], 'list key')
assert.strictEqual(res[1], 'should be a list')
done(err)
})
it('inserts multiple values at a time into a list', () => {
const list = ['list key', 'should be a list']
client.rpush('test', list)
return client.lrange('test', 0, -1).then(helper.isDeepEqual(list))
})
afterEach(() => {

View File

@@ -10,45 +10,40 @@ describe('The \'sadd\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('allows a single value to be added to the set', (done) => {
client.sadd('set0', 'member0', helper.isNumber(1))
client.smembers('set0', (err, res) => {
it('allows a single value to be added to the set', () => {
client.sadd('set0', 'member0').then(helper.isNumber(1))
return client.smembers('set0').then((res) => {
assert.ok(~res.indexOf('member0'))
return done(err)
})
})
it('does not add the same value to the set twice', (done) => {
client.sadd('set0', 'member0', helper.isNumber(1))
client.sadd('set0', 'member0', helper.isNumber(0, done))
it('does not add the same value to the set twice', () => {
client.sadd('set0', 'member0').then(helper.isNumber(1))
return client.sadd('set0', 'member0').then(helper.isNumber(0))
})
it('allows multiple values to be added to the set', (done) => {
client.sadd('set0', ['member0', 'member1', 'member2'], helper.isNumber(3))
client.smembers('set0', (err, res) => {
it('allows multiple values to be added to the set', () => {
client.sadd('set0', ['member0', 'member1', 'member2']).then(helper.isNumber(3))
return client.smembers('set0').then((res) => {
assert.strictEqual(res.length, 3)
assert.ok(~res.indexOf('member0'))
assert.ok(~res.indexOf('member1'))
assert.ok(~res.indexOf('member2'))
return done(err)
})
})
it('allows multiple values to be added to the set with a different syntax', (done) => {
client.sadd(['set0', 'member0', 'member1', 'member2'], helper.isNumber(3))
client.smembers('set0', (err, res) => {
it('allows multiple values to be added to the set with a different syntax', () => {
client.sadd(['set0', 'member0', 'member1', 'member2']).then(helper.isNumber(3))
return client.smembers('set0').then((res) => {
assert.strictEqual(res.length, 3)
assert.ok(~res.indexOf('member0'))
assert.ok(~res.indexOf('member1'))
assert.ok(~res.indexOf('member2'))
return done(err)
})
})

View File

@@ -9,16 +9,14 @@ describe('The \'scard\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('returns the number of values in a set', (done) => {
client.sadd('foo', [1, 2, 3], helper.isNumber(3))
client.scard('foo', helper.isNumber(3, done))
it('returns the number of values in a set', () => {
client.sadd('foo', [1, 2, 3]).then(helper.isNumber(3))
return client.scard('foo').then(helper.isNumber(3))
})
afterEach(() => {

View File

@@ -13,31 +13,29 @@ describe('The \'script\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
afterEach(() => {
client.end(true)
})
it('loads script with client.script(\'load\')', (done) => {
client.script('load', command, helper.isString(commandSha, done))
it('loads script with client.script(\'load\')', () => {
return client.script('load', command).then(helper.isString(commandSha))
})
it('allows a loaded script to be evaluated', (done) => {
client.evalsha(commandSha, 0, helper.isNumber(99, done))
it('allows a loaded script to be evaluated', () => {
return client.evalsha(commandSha, 0).then(helper.isNumber(99))
})
it('allows a script to be loaded as part of a chained transaction', (done) => {
client.multi().script('load', command).exec(helper.isDeepEqual([commandSha], done))
it('allows a script to be loaded as part of a chained transaction', () => {
return client.multi().script('load', command).exec(helper.isDeepEqual([commandSha]))
})
it('allows a script to be loaded using a transaction\'s array syntax', (done) => {
client.multi([['script', 'load', command]]).exec(helper.isDeepEqual([commandSha], done))
it('allows a script to be loaded using a transaction\'s array syntax', () => {
return client.multi([['script', 'load', command]]).exec(helper.isDeepEqual([commandSha]))
})
})
})

View File

@@ -10,30 +10,25 @@ describe('The \'sdiff\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('returns set difference', (done) => {
client.sadd('foo', 'x', helper.isNumber(1))
client.sadd('foo', ['a'], helper.isNumber(1))
client.sadd('foo', 'b', helper.isNumber(1))
client.sadd(['foo', 'c'], helper.isNumber(1))
it('returns set difference', () => {
client.sadd('foo', 'x').then(helper.isNumber(1))
client.sadd('foo', ['a']).then(helper.isNumber(1))
client.sadd('foo', 'b').then(helper.isNumber(1))
client.sadd(['foo', 'c']).then(helper.isNumber(1))
client.sadd(['bar', 'c']).then(helper.isNumber(1))
client.sadd('baz', 'a').then(helper.isNumber(1))
client.sadd('baz', 'd').then(helper.isNumber(1))
client.sadd(['bar', 'c', helper.isNumber(1)])
client.sadd('baz', 'a', helper.isNumber(1))
client.sadd('baz', 'd', helper.isNumber(1))
client.sdiff('foo', 'bar', 'baz', (err, values) => {
return client.sdiff('foo', 'bar', 'baz').then((values) => {
values.sort()
assert.strictEqual(values.length, 2)
assert.strictEqual(values[0], 'b')
assert.strictEqual(values[1], 'x')
return done(err)
})
})

View File

@@ -10,30 +10,25 @@ describe('The \'sdiffstore\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('calculates set difference ands stores it in a key', (done) => {
client.sadd('foo', 'x', helper.isNumber(1))
client.sadd('foo', 'a', helper.isNumber(1))
client.sadd('foo', 'b', helper.isNumber(1))
client.sadd('foo', 'c', helper.isNumber(1))
it('calculates set difference ands stores it in a key', () => {
client.sadd('foo', 'x').then(helper.isNumber(1))
client.sadd('foo', 'a').then(helper.isNumber(1))
client.sadd('foo', 'b').then(helper.isNumber(1))
client.sadd('foo', 'c').then(helper.isNumber(1))
client.sadd('bar', 'c').then(helper.isNumber(1))
client.sadd('baz', 'a').then(helper.isNumber(1))
client.sadd('baz', 'd').then(helper.isNumber(1))
client.sadd('bar', 'c', helper.isNumber(1))
client.sdiffstore('quux', 'foo', 'bar', 'baz').then(helper.isNumber(2))
client.sadd('baz', 'a', helper.isNumber(1))
client.sadd('baz', 'd', helper.isNumber(1))
client.sdiffstore('quux', 'foo', 'bar', 'baz', helper.isNumber(2))
client.smembers('quux', (err, values) => {
return client.smembers('quux').then((values) => {
const members = values.sort()
assert.deepEqual(members, [ 'b', 'x' ])
return done(err)
assert.deepStrictEqual(members, [ 'b', 'x' ])
})
})

View File

@@ -11,104 +11,60 @@ describe('The \'select\' method', () => {
describe('when not connected', () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.quit()
})
client.on('end', done)
return client.quit()
})
it('returns an error if redis is not connected', (done) => {
client.select(1, (err, res) => {
assert(err.message.match(/The connection is already closed/))
done()
})
it('returns an error if redis is not connected', () => {
return client.select(1).then(assert, helper.isError(/The connection is already closed/))
})
})
describe('when connected', () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
afterEach(() => {
client.end(true)
})
it('changes the database and calls the callback', (done) => {
it('changes the database', () => {
// default value of null means database 0 will be used.
assert.strictEqual(client.selectedDb, undefined, 'default db should be undefined')
client.select(1, (err, res) => {
helper.isNotError()(err, res)
return client.select(1).then((res) => {
assert.strictEqual(client.selectedDb, 1, 'db should be 1 after select')
done()
})
})
describe('and a callback is specified', () => {
describe('with a valid db index', () => {
it('selects the appropriate database', (done) => {
assert.strictEqual(client.selectedDb, undefined, 'default db should be undefined')
client.select(1, (err) => {
assert.strictEqual(err, null)
assert.strictEqual(client.selectedDb, 1, 'we should have selected the new valid DB')
done()
})
})
})
describe('with an invalid db index', () => {
it('returns an error', (done) => {
assert.strictEqual(client.selectedDb, undefined, 'default db should be undefined')
client.select(9999, (err) => {
assert.strictEqual(err.code, 'ERR')
assert.strictEqual(err.message, 'ERR invalid DB index')
done()
})
describe('with a valid db index', () => {
it('selects the appropriate database', () => {
assert.strictEqual(client.selectedDb, undefined, 'default db should be undefined')
return client.select(1).then(() => {
assert.strictEqual(client.selectedDb, 1, 'we should have selected the new valid DB')
})
})
})
describe('and no callback is specified', () => {
describe('with a valid db index', () => {
it('selects the appropriate database', (done) => {
assert.strictEqual(client.selectedDb, undefined, 'default db should be undefined')
client.select(1)
setTimeout(() => {
assert.strictEqual(client.selectedDb, 1, 'we should have selected the new valid DB')
done()
}, 25)
})
})
describe('with an invalid db index', () => {
it('emits an error when callback not provided', (done) => {
assert.strictEqual(client.selectedDb, undefined, 'default db should be undefined')
client.on('error', (err) => {
assert.strictEqual(err.command, 'SELECT')
assert.strictEqual(err.message, 'ERR invalid DB index')
done()
})
client.select(9999)
describe('with an invalid db index', () => {
it('returns an error', () => {
assert.strictEqual(client.selectedDb, undefined, 'default db should be undefined')
return client.select(9999).then(assert, (err) => {
assert.strictEqual(err.code, 'ERR')
assert.strictEqual(err.message, 'ERR invalid DB index')
})
})
})
describe('reconnection occurs', () => {
describe('reconnecting', () => {
it('selects the appropriate database after a reconnect', (done) => {
assert.strictEqual(client.selectedDb, undefined, 'default db should be undefined')
client.select(3)
client.set('foo', 'bar', () => {
client.stream.destroy()
})
client.set('foo', 'bar').then(() => client.stream.destroy())
client.once('ready', () => {
assert.strictEqual(client.selectedDb, 3)
assert(typeof client.serverInfo.db3 === 'object')

View File

@@ -19,145 +19,65 @@ describe('The \'set\' method', () => {
describe('when not connected', () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.quit()
})
client.on('end', done)
return client.quit()
})
it('reports an error', (done) => {
client.set(key, value, (err, res) => {
assert(err.message.match(/The connection is already closed/))
done()
})
it('reports an error', () => {
return client.set(key, value).then(assert, helper.isError(/The connection is already closed/))
})
})
describe('when connected', () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
afterEach(() => {
client.end(true)
})
describe('and a callback is specified', () => {
describe('with valid parameters', () => {
it('sets the value correctly', (done) => {
client.set(key, value, (err, res) => {
helper.isNotError()(err, res)
client.get(key, (err, res) => {
helper.isString(value)(err, res)
done()
})
})
})
describe('with valid parameters', () => {
it('sets the value correctly', () => {
client.set(key, value)
return client.get(key).then(helper.isString(value))
})
it('set expire date in seconds', (done) => {
client.set('foo', 'bar', 'ex', 10, helper.isString('OK'))
client.pttl('foo', (err, res) => {
assert(res >= 10000 - 50) // Max 50 ms should have passed
assert(res <= 10000) // Max possible should be 10.000
done(err)
})
})
it('set expire date in milliseconds', (done) => {
client.set('foo', 'bar', 'px', 100, helper.isString('OK'))
client.pttl('foo', (err, res) => {
assert(res >= 50) // Max 50 ms should have passed
assert(res <= 100) // Max possible should be 100
done(err)
})
})
it('only set the key if (not) already set', (done) => {
client.set('foo', 'bar', 'NX', helper.isString('OK'))
client.set('foo', 'bar', 'nx', helper.isNull())
client.set('foo', 'bar', 'EX', '10', 'XX', helper.isString('OK'))
client.ttl('foo', (err, res) => {
assert(res >= 9) // Min 9s should be left
assert(res <= 10) // Max 10s should be left
done(err)
})
it('set expire date in seconds', () => {
client.set('foo', 'bar', 'ex', 10).then(helper.isString('OK'))
return client.pttl('foo').then((res) => {
assert(res >= 10000 - 50) // Max 50 ms should have passed
assert(res <= 10000) // Max possible should be 10.000
})
})
describe('reports an error with invalid parameters', () => {
it('undefined \'key\' and missing \'value\' parameter', (done) => {
client.set(undefined, (err, res) => {
helper.isError()(err, null)
assert.strictEqual(err.command, 'SET')
done()
})
it('set expire date in milliseconds', () => {
client.set('foo', 'bar', 'px', 100).then(helper.isString('OK'))
return client.pttl('foo').then((res) => {
assert(res >= 50) // Max 50 ms should have passed
assert(res <= 100) // Max possible should be 100
})
})
it('empty array as second parameter', (done) => {
client.set('foo', [], (err, res) => {
assert.strictEqual(err.message, 'ERR wrong number of arguments for \'set\' command')
done()
})
it('only set the key if (not) already set', () => {
client.set('foo', 'bar', 'NX').then(helper.isString('OK'))
client.set('foo', 'bar', 'nx').then(helper.isNull())
client.set('foo', 'bar', 'EX', '10', 'XX').then(helper.isString('OK'))
return client.ttl('foo').then((res) => {
assert(res >= 9) // Min 9s should be left
assert(res <= 10) // Max 10s should be left
})
})
})
describe('and no callback is specified', () => {
describe('with valid parameters', () => {
it('sets the value correctly', (done) => {
client.set(key, value)
client.get(key, helper.isString(value, done))
})
it('sets the value correctly even if the callback is explicitly set to undefined', (done) => {
client.set(key, value, undefined)
client.get(key, helper.isString(value, done))
})
it('sets the value correctly with the array syntax', (done) => {
client.set([key, value])
client.get(key, helper.isString(value, done))
})
})
describe('with undefined \'key\' and missing \'value\' parameter', () => {
it('emits an error without callback', (done) => {
client.on('error', (err) => {
assert.strictEqual(err.message, 'ERR wrong number of arguments for \'set\' command')
assert.strictEqual(err.command, 'SET')
done()
})
client.set(undefined)
})
})
it('returns an error on \'null\'', (done) => {
client.set('foo', null, helper.isError(done))
})
it('emit an error with only the key set', (done) => {
client.on('error', (err) => {
assert.strictEqual(err.message, 'ERR wrong number of arguments for \'set\' command')
done()
})
client.set('foo')
})
it('emit an error without any parameters', (done) => {
client.once('error', (err) => {
assert.strictEqual(err.message, 'ERR wrong number of arguments for \'set\' command')
assert.strictEqual(err.command, 'SET')
done()
})
client.set()
describe('reports an error with invalid parameters', () => {
it('empty array as second parameter', () => {
return client.set('foo', [])
.then(assert, helper.isError(/ERR wrong number of arguments for 'set' command/))
})
})
})

View File

@@ -10,21 +10,15 @@ describe('The \'setex\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('sets a key with an expiry', (done) => {
client.setex(['setex key', '100', 'setex val'], helper.isString('OK'))
client.exists(['setex key'], helper.isNumber(1))
client.ttl(['setex key'], (err, ttl) => {
assert.strictEqual(err, null)
assert(ttl > 0)
return done()
})
it('sets a key with an expiry', () => {
client.setex(['setex key', '100', 'setex val']).then(helper.isString('OK'))
client.exists(['setex key']).then(helper.isNumber(1))
return client.ttl(['setex key']).then(assert)
})
afterEach(() => {

View File

@@ -9,22 +9,20 @@ describe('The \'setnx\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('sets key if it does not have a value', (done) => {
client.setnx('foo', 'banana', helper.isNumber(1))
client.get('foo', helper.isString('banana', done))
it('sets key if it does not have a value', () => {
client.setnx('foo', 'banana').then(helper.isNumber(1))
return client.get('foo').then(helper.isString('banana'))
})
it('does not set key if it already has a value', (done) => {
client.set('foo', 'bar', helper.isString('OK'))
client.setnx('foo', 'banana', helper.isNumber(0))
client.get('foo', helper.isString('bar', done))
it('does not set key if it already has a value', () => {
client.set('foo', 'bar').then(helper.isString('OK'))
client.setnx('foo', 'banana').then(helper.isNumber(0))
return client.get('foo').then(helper.isString('bar'))
})
afterEach(() => {

View File

@@ -10,46 +10,42 @@ describe('The \'sinter\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('handles two sets being intersected', (done) => {
client.sadd('sa', 'a', helper.isNumber(1))
client.sadd('sa', 'b', helper.isNumber(1))
client.sadd('sa', 'c', helper.isNumber(1))
it('handles two sets being intersected', () => {
client.sadd('sa', 'a').then(helper.isNumber(1))
client.sadd('sa', 'b').then(helper.isNumber(1))
client.sadd('sa', 'c').then(helper.isNumber(1))
client.sadd('sb', 'b', helper.isNumber(1))
client.sadd('sb', 'c', helper.isNumber(1))
client.sadd('sb', 'd', helper.isNumber(1))
client.sadd('sb', 'b').then(helper.isNumber(1))
client.sadd('sb', 'c').then(helper.isNumber(1))
client.sadd('sb', 'd').then(helper.isNumber(1))
client.sinter('sa', 'sb', (err, intersection) => {
return client.sinter('sa', 'sb').then((intersection) => {
assert.strictEqual(intersection.length, 2)
assert.deepEqual(intersection.sort(), [ 'b', 'c' ])
return done(err)
assert.deepStrictEqual(intersection.sort(), [ 'b', 'c' ])
})
})
it('handles three sets being intersected', (done) => {
client.sadd('sa', 'a', helper.isNumber(1))
client.sadd('sa', 'b', helper.isNumber(1))
client.sadd('sa', 'c', helper.isNumber(1))
it('handles three sets being intersected', () => {
client.sadd('sa', 'a').then(helper.isNumber(1))
client.sadd('sa', 'b').then(helper.isNumber(1))
client.sadd('sa', 'c').then(helper.isNumber(1))
client.sadd('sb', 'b', helper.isNumber(1))
client.sadd('sb', 'c', helper.isNumber(1))
client.sadd('sb', 'd', helper.isNumber(1))
client.sadd('sb', 'b').then(helper.isNumber(1))
client.sadd('sb', 'c').then(helper.isNumber(1))
client.sadd('sb', 'd').then(helper.isNumber(1))
client.sadd('sc', 'c', helper.isNumber(1))
client.sadd('sc', 'd', helper.isNumber(1))
client.sadd('sc', 'e', helper.isNumber(1))
client.sadd('sc', 'c').then(helper.isNumber(1))
client.sadd('sc', 'd').then(helper.isNumber(1))
client.sadd('sc', 'e').then(helper.isNumber(1))
client.sinter('sa', 'sb', 'sc', (err, intersection) => {
return client.sinter('sa', 'sb', 'sc').then((intersection) => {
assert.strictEqual(intersection.length, 1)
assert.strictEqual(intersection[0], 'c')
return done(err)
})
})

View File

@@ -1,6 +1,5 @@
'use strict'
const assert = require('assert')
const config = require('../lib/config')
const helper = require('../helper')
const redis = config.redis
@@ -10,32 +9,27 @@ describe('The \'sinterstore\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('calculates set intersection and stores it in a key', (done) => {
client.sadd('sa', 'a', helper.isNumber(1))
client.sadd('sa', 'b', helper.isNumber(1))
client.sadd('sa', 'c', helper.isNumber(1))
it('calculates set intersection and stores it in a key', () => {
client.sadd('sa', 'a').then(helper.isNumber(1))
client.sadd('sa', 'b').then(helper.isNumber(1))
client.sadd('sa', 'c').then(helper.isNumber(1))
client.sadd('sb', 'b', helper.isNumber(1))
client.sadd('sb', 'c', helper.isNumber(1))
client.sadd('sb', 'd', helper.isNumber(1))
client.sadd('sb', 'b').then(helper.isNumber(1))
client.sadd('sb', 'c').then(helper.isNumber(1))
client.sadd('sb', 'd').then(helper.isNumber(1))
client.sadd('sc', 'c', helper.isNumber(1))
client.sadd('sc', 'd', helper.isNumber(1))
client.sadd('sc', 'e', helper.isNumber(1))
client.sadd('sc', 'c').then(helper.isNumber(1))
client.sadd('sc', 'd').then(helper.isNumber(1))
client.sadd('sc', 'e').then(helper.isNumber(1))
client.sinterstore('foo', 'sa', 'sb', 'sc', helper.isNumber(1))
client.sinterstore('foo', 'sa', 'sb', 'sc').then(helper.isNumber(1))
client.smembers('foo', (err, members) => {
assert.deepEqual(members, [ 'c' ])
return done(err)
})
return client.smembers('foo').then(helper.isDeepEqual(['c']))
})
afterEach(() => {

View File

@@ -9,20 +9,18 @@ describe('The \'sismember\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('returns 0 if the value is not in the set', (done) => {
client.sismember('foo', 'banana', helper.isNumber(0, done))
it('returns 0 if the value is not in the set', () => {
return client.sismember('foo', 'banana').then(helper.isNumber(0))
})
it('returns 1 if the value is in the set', (done) => {
client.sadd('foo', 'banana', helper.isNumber(1))
client.sismember('foo', 'banana', helper.isNumber(1, done))
it('returns 1 if the value is in the set', () => {
client.sadd('foo', 'banana').then(helper.isNumber(1))
return client.sismember('foo', 'banana').then(helper.isNumber(1))
})
afterEach(() => {

View File

@@ -10,24 +10,21 @@ describe('The \'slowlog\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('logs operations in slowlog', (done) => {
client.config('set', 'slowlog-log-slower-than', 0, helper.isString('OK'))
client.slowlog('reset', helper.isString('OK'))
client.set('foo', 'bar', helper.isString('OK'))
client.get('foo', helper.isString('bar'))
client.slowlog('get', (err, res) => {
it('logs operations in slowlog', () => {
client.config('set', 'slowlog-log-slower-than', 0).then(helper.isString('OK'))
client.slowlog('reset').then(helper.isString('OK'))
client.set('foo', 'bar').then(helper.isString('OK'))
client.get('foo').then(helper.isString('bar'))
return client.slowlog('get').then((res) => {
assert.strictEqual(res.length, 3)
assert.strictEqual(res[0][3].length, 2)
assert.deepEqual(res[1][3], ['set', 'foo', 'bar'])
assert.deepEqual(res[2][3], ['slowlog', 'reset'])
return done(err)
assert.deepStrictEqual(res[1][3], ['set', 'foo', 'bar'])
assert.deepStrictEqual(res[2][3], ['slowlog', 'reset'])
})
})

View File

@@ -10,21 +10,18 @@ describe('The \'smembers\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('returns all values in a set', (done) => {
client.sadd('foo', 'x', helper.isNumber(1))
client.sadd('foo', 'y', helper.isNumber(1))
client.smembers('foo', (err, values) => {
it('returns all values in a set', () => {
client.sadd('foo', 'x').then(helper.isNumber(1))
client.sadd('foo', 'y').then(helper.isNumber(1))
return client.smembers('foo').then((values) => {
assert.strictEqual(values.length, 2)
const members = values.sort()
assert.deepEqual(members, [ 'x', 'y' ])
return done(err)
assert.deepStrictEqual(members, [ 'x', 'y' ])
})
})

View File

@@ -9,25 +9,23 @@ describe('The \'smove\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('moves a value to a set that does not yet exist', (done) => {
client.sadd('foo', 'x', helper.isNumber(1))
client.smove('foo', 'bar', 'x', helper.isNumber(1))
client.sismember('foo', 'x', helper.isNumber(0))
client.sismember('bar', 'x', helper.isNumber(1, done))
it('moves a value to a set that does not yet exist', () => {
client.sadd('foo', 'x').then(helper.isNumber(1))
client.smove('foo', 'bar', 'x').then(helper.isNumber(1))
client.sismember('foo', 'x').then(helper.isNumber(0))
return client.sismember('bar', 'x').then(helper.isNumber(1))
})
it('does not move a value if it does not exist in the first set', (done) => {
client.sadd('foo', 'x', helper.isNumber(1))
client.smove('foo', 'bar', 'y', helper.isNumber(0))
client.sismember('foo', 'y', helper.isNumber(0))
client.sismember('bar', 'y', helper.isNumber(0, done))
it('does not move a value if it does not exist in the first set', () => {
client.sadd('foo', 'x').then(helper.isNumber(1))
client.smove('foo', 'bar', 'y').then(helper.isNumber(0))
client.sismember('foo', 'y').then(helper.isNumber(0))
return client.sismember('bar', 'y').then(helper.isNumber(0))
})
afterEach(() => {

View File

@@ -1,11 +1,10 @@
'use strict'
const assert = require('assert')
const config = require('../lib/config')
const helper = require('../helper')
const redis = config.redis
function setupData (client, done) {
function setupData (client) {
client.rpush('y', 'd')
client.rpush('y', 'b')
client.rpush('y', 'a')
@@ -29,7 +28,7 @@ function setupData (client, done) {
client.set('p2', 'qux')
client.set('p3', 'bux')
client.set('p4', 'lux')
client.set('p9', 'tux', done)
return client.set('p9', 'tux')
}
describe('The \'sort\' method', () => {
@@ -37,85 +36,57 @@ describe('The \'sort\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('error', done)
client.once('connect', () => {
client.flushdb()
setupData(client, done)
})
client.flushdb()
return setupData(client)
})
describe('alphabetical', () => {
it('sorts in ascending alphabetical order', (done) => {
client.sort('y', 'asc', 'alpha', (err, sorted) => {
assert.deepEqual(sorted, ['a', 'b', 'c', 'd'])
return done(err)
})
it('sorts in ascending alphabetical order', () => {
return client.sort('y', 'asc', 'alpha').then(helper.isDeepEqual(['a', 'b', 'c', 'd']))
})
it('sorts in descending alphabetical order', (done) => {
client.sort('y', 'desc', 'alpha', (err, sorted) => {
assert.deepEqual(sorted, ['d', 'c', 'b', 'a'])
return done(err)
})
it('sorts in descending alphabetical order', () => {
return client.sort('y', 'desc', 'alpha').then(helper.isDeepEqual(['d', 'c', 'b', 'a']))
})
})
describe('numeric', () => {
it('sorts in ascending numeric order', (done) => {
client.sort('x', 'asc', (err, sorted) => {
assert.deepEqual(sorted, [2, 3, 4, 9])
return done(err)
})
it('sorts in ascending numeric order', () => {
return client.sort('x', 'asc').then(helper.isDeepEqual(['2', '3', '4', '9']))
})
it('sorts in descending numeric order', (done) => {
client.sort('x', 'desc', (err, sorted) => {
assert.deepEqual(sorted, [9, 4, 3, 2])
return done(err)
})
it('sorts in descending numeric order', () => {
return client.sort('x', 'desc').then(helper.isDeepEqual(['9', '4', '3', '2']))
})
})
describe('pattern', () => {
it('handles sorting with a pattern', (done) => {
client.sort('x', 'by', 'w*', 'asc', (err, sorted) => {
assert.deepEqual(sorted, [3, 9, 4, 2])
return done(err)
})
it('handles sorting with a pattern', () => {
return client.sort('x', 'by', 'w*', 'asc').then(helper.isDeepEqual(['3', '9', '4', '2']))
})
it('handles sorting with a \'by\' pattern and 1 \'get\' pattern', (done) => {
client.sort('x', 'by', 'w*', 'asc', 'get', 'o*', (err, sorted) => {
assert.deepEqual(sorted, ['foo', 'bar', 'baz', 'buz'])
return done(err)
})
it('handles sorting with a \'by\' pattern and 1 \'get\' pattern', () => {
return client.sort('x', 'by', 'w*', 'asc', 'get', 'o*')
.then(helper.isDeepEqual(['foo', 'bar', 'baz', 'buz']))
})
it('handles sorting with a \'by\' pattern and 2 \'get\' patterns', (done) => {
client.sort('x', 'by', 'w*', 'asc', 'get', 'o*', 'get', 'p*', (err, sorted) => {
assert.deepEqual(sorted, ['foo', 'bux', 'bar', 'tux', 'baz', 'lux', 'buz', 'qux'])
return done(err)
})
it('handles sorting with a \'by\' pattern and 2 \'get\' patterns', () => {
return client.sort('x', 'by', 'w*', 'asc', 'get', 'o*', 'get', 'p*')
.then(helper.isDeepEqual(['foo', 'bux', 'bar', 'tux', 'baz', 'lux', 'buz', 'qux']))
})
it('handles sorting with a \'by\' pattern and 2 \'get\' patterns with the array syntax', (done) => {
client.sort(['x', 'by', 'w*', 'asc', 'get', 'o*', 'get', 'p*'], (err, sorted) => {
assert.deepEqual(sorted, ['foo', 'bux', 'bar', 'tux', 'baz', 'lux', 'buz', 'qux'])
return done(err)
})
it('handles sorting with a \'by\' pattern and 2 \'get\' patterns with the array syntax', () => {
return client.sort(['x', 'by', 'w*', 'asc', 'get', 'o*', 'get', 'p*'])
.then(helper.isDeepEqual(['foo', 'bux', 'bar', 'tux', 'baz', 'lux', 'buz', 'qux']))
})
it('sorting with a \'by\' pattern and 2 \'get\' patterns and stores results', (done) => {
client.sort('x', 'by', 'w*', 'asc', 'get', 'o*', 'get', 'p*', 'store', 'bacon', (err) => {
if (err) return done(err)
})
it('sorting with a \'by\' pattern and 2 \'get\' patterns and stores results', () => {
client.sort('x', 'by', 'w*', 'asc', 'get', 'o*', 'get', 'p*', 'store', 'bacon')
client.lrange('bacon', 0, -1, (err, values) => {
assert.deepEqual(values, ['foo', 'bux', 'bar', 'tux', 'baz', 'lux', 'buz', 'qux'])
return done(err)
})
return client.lrange('bacon', 0, -1)
.then(helper.isDeepEqual(['foo', 'bux', 'bar', 'tux', 'baz', 'lux', 'buz', 'qux']))
})
})

View File

@@ -1,6 +1,5 @@
'use strict'
const assert = require('assert')
const config = require('../lib/config')
const helper = require('../helper')
const redis = config.redis
@@ -10,22 +9,16 @@ describe('The \'spop\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('returns a random element from the set', (done) => {
client.sadd('zzz', 'member0', helper.isNumber(1))
client.scard('zzz', helper.isNumber(1))
client.spop('zzz', (err, value) => {
if (err) return done(err)
assert.strictEqual(value, 'member0')
client.scard('zzz', helper.isNumber(0, done))
})
it('returns a random element from the set', () => {
client.sadd('zzz', 'member0').then(helper.isNumber(1))
client.scard('zzz').then(helper.isNumber(1))
client.spop('zzz').then(helper.isString('member0'))
return client.scard('zzz').then(helper.isNumber(0))
})
afterEach(() => {

View File

@@ -10,52 +10,47 @@ describe('The \'srem\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('removes a value', (done) => {
client.sadd('set0', 'member0', helper.isNumber(1))
client.srem('set0', 'member0', helper.isNumber(1))
client.scard('set0', helper.isNumber(0, done))
it('removes a value', () => {
client.sadd('set0', 'member0').then(helper.isNumber(1))
client.srem('set0', 'member0').then(helper.isNumber(1))
return client.scard('set0').then(helper.isNumber(0))
})
it('handles attempting to remove a missing value', (done) => {
client.srem('set0', 'member0', helper.isNumber(0, done))
it('handles attempting to remove a missing value', () => {
return client.srem('set0', 'member0').then(helper.isNumber(0))
})
it('allows multiple values to be removed', (done) => {
client.sadd('set0', ['member0', 'member1', 'member2'], helper.isNumber(3))
client.srem('set0', ['member1', 'member2'], helper.isNumber(2))
client.smembers('set0', (err, res) => {
it('allows multiple values to be removed', () => {
client.sadd('set0', ['member0', 'member1', 'member2']).then(helper.isNumber(3))
client.srem('set0', ['member1', 'member2']).then(helper.isNumber(2))
return client.smembers('set0').then((res) => {
assert.strictEqual(res.length, 1)
assert.ok(~res.indexOf('member0'))
return done(err)
})
})
it('allows multiple values to be removed with sendCommand', (done) => {
client.sendCommand('sadd', ['set0', 'member0', 'member1', 'member2'], helper.isNumber(3))
client.sendCommand('srem', ['set0', 'member1', 'member2'], helper.isNumber(2))
client.smembers('set0', (err, res) => {
it('allows multiple values to be removed with sendCommand', () => {
client.sendCommand('sadd', ['set0', 'member0', 'member1', 'member2']).then(helper.isNumber(3))
client.sendCommand('srem', ['set0', 'member1', 'member2']).then(helper.isNumber(2))
return client.smembers('set0').then((res) => {
assert.strictEqual(res.length, 1)
assert.ok(~res.indexOf('member0'))
return done(err)
})
})
it('handles a value missing from the set of values being removed', (done) => {
client.sadd(['set0', 'member0', 'member1', 'member2'], helper.isNumber(3))
client.srem(['set0', 'member3', 'member4'], helper.isNumber(0))
client.smembers('set0', (err, res) => {
it('handles a value missing from the set of values being removed', () => {
client.sadd(['set0', 'member0', 'member1', 'member2']).then(helper.isNumber(3))
client.srem(['set0', 'member3', 'member4']).then(helper.isNumber(0))
return client.smembers('set0').then((res) => {
assert.strictEqual(res.length, 3)
assert.ok(~res.indexOf('member0'))
assert.ok(~res.indexOf('member1'))
assert.ok(~res.indexOf('member2'))
return done(err)
})
})

View File

@@ -10,29 +10,26 @@ describe('The \'sunion\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('returns the union of a group of sets', (done) => {
client.sadd('sa', 'a', helper.isNumber(1))
client.sadd('sa', 'b', helper.isNumber(1))
client.sadd('sa', 'c', helper.isNumber(1))
it('returns the union of a group of sets', () => {
client.sadd('sa', 'a').then(helper.isNumber(1))
client.sadd('sa', 'b').then(helper.isNumber(1))
client.sadd('sa', 'c').then(helper.isNumber(1))
client.sadd('sb', 'b', helper.isNumber(1))
client.sadd('sb', 'c', helper.isNumber(1))
client.sadd('sb', 'd', helper.isNumber(1))
client.sadd('sb', 'b').then(helper.isNumber(1))
client.sadd('sb', 'c').then(helper.isNumber(1))
client.sadd('sb', 'd').then(helper.isNumber(1))
client.sadd('sc', 'c', helper.isNumber(1))
client.sadd('sc', 'd', helper.isNumber(1))
client.sadd('sc', 'e', helper.isNumber(1))
client.sadd('sc', 'c').then(helper.isNumber(1))
client.sadd('sc', 'd').then(helper.isNumber(1))
client.sadd('sc', 'e').then(helper.isNumber(1))
client.sunion('sa', 'sb', 'sc', (err, union) => {
assert.deepEqual(union.sort(), ['a', 'b', 'c', 'd', 'e'])
return done(err)
return client.sunion('sa', 'sb', 'sc').then((union) => {
assert.deepStrictEqual(union.sort(), ['a', 'b', 'c', 'd', 'e'])
})
})

View File

@@ -10,32 +10,29 @@ describe('The \'sunionstore\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('stores the result of a union', (done) => {
client.sadd('sa', 'a', helper.isNumber(1))
client.sadd('sa', 'b', helper.isNumber(1))
client.sadd('sa', 'c', helper.isNumber(1))
it('stores the result of a union', () => {
client.sadd('sa', 'a').then(helper.isNumber(1))
client.sadd('sa', 'b').then(helper.isNumber(1))
client.sadd('sa', 'c').then(helper.isNumber(1))
client.sadd('sb', 'b', helper.isNumber(1))
client.sadd('sb', 'c', helper.isNumber(1))
client.sadd('sb', 'd', helper.isNumber(1))
client.sadd('sb', 'b').then(helper.isNumber(1))
client.sadd('sb', 'c').then(helper.isNumber(1))
client.sadd('sb', 'd').then(helper.isNumber(1))
client.sadd('sc', 'c', helper.isNumber(1))
client.sadd('sc', 'd', helper.isNumber(1))
client.sadd('sc', 'e', helper.isNumber(1))
client.sadd('sc', 'c').then(helper.isNumber(1))
client.sadd('sc', 'd').then(helper.isNumber(1))
client.sadd('sc', 'e').then(helper.isNumber(1))
client.sunionstore('foo', 'sa', 'sb', 'sc', helper.isNumber(5))
client.sunionstore('foo', 'sa', 'sb', 'sc').then(helper.isNumber(5))
client.smembers('foo', (err, members) => {
return client.smembers('foo').then((members) => {
assert.strictEqual(members.length, 5)
assert.deepEqual(members.sort(), ['a', 'b', 'c', 'd', 'e'])
return done(err)
assert.deepStrictEqual(members.sort(), ['a', 'b', 'c', 'd', 'e'])
})
})

View File

@@ -10,20 +10,17 @@ describe('The \'ttl\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('returns the current ttl on a key', (done) => {
client.set(['ttl key', 'ttl val'], helper.isString('OK'))
client.expire(['ttl key', '100'], helper.isNumber(1))
client.ttl(['ttl key'], (err, ttl) => {
it('returns the current ttl on a key', () => {
client.set(['ttl key', 'ttl val']).then(helper.isString('OK'))
client.expire(['ttl key', '100']).then(helper.isNumber(1))
return client.ttl(['ttl key']).then((ttl) => {
assert(ttl >= 99)
assert(ttl <= 100)
done(err)
})
})

View File

@@ -9,40 +9,38 @@ describe('The \'type\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('reports string type', (done) => {
client.set(['string key', 'should be a string'], helper.isString('OK'))
client.type(['string key'], helper.isString('string', done))
it('reports string type', () => {
client.set(['string key', 'should be a string']).then(helper.isString('OK'))
return client.type(['string key']).then(helper.isString('string'))
})
it('reports list type', (done) => {
client.rpush(['list key', 'should be a list'], helper.isNumber(1))
client.type(['list key'], helper.isString('list', done))
it('reports list type', () => {
client.rpush(['list key', 'should be a list']).then(helper.isNumber(1))
return client.type(['list key']).then(helper.isString('list'))
})
it('reports set type', (done) => {
client.sadd(['set key', 'should be a set'], helper.isNumber(1))
client.type(['set key'], helper.isString('set', done))
it('reports set type', () => {
client.sadd(['set key', 'should be a set']).then(helper.isNumber(1))
return client.type(['set key']).then(helper.isString('set'))
})
it('reports zset type', (done) => {
client.zadd('zset key', ['10.0', 'should be a zset'], helper.isNumber(1))
client.type(['zset key'], helper.isString('zset', done))
it('reports zset type', () => {
client.zadd('zset key', ['10.0', 'should be a zset']).then(helper.isNumber(1))
return client.type(['zset key']).then(helper.isString('zset'))
})
it('reports hash type', (done) => {
client.hset('hash key', 'hashtest', 'should be a hash', helper.isNumber(1))
client.type(['hash key'], helper.isString('hash', done))
it('reports hash type', () => {
client.hset('hash key', 'hashtest', 'should be a hash').then(helper.isNumber(1))
return client.type(['hash key']).then(helper.isString('hash'))
})
it('reports none for null key', (done) => {
client.type('not here yet', helper.isString('none', done))
it('reports none for null key', () => {
return client.type('not here yet').then(helper.isString('none'))
})
afterEach(() => {

View File

@@ -12,37 +12,34 @@ describe('The \'watch\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
afterEach(() => {
client.end(true)
})
it('does not execute transaction if watched key was modified prior to execution', (done) => {
it('does not execute transaction if watched key was modified prior to execution', () => {
client.watch(watched)
client.incr(watched)
const multi = client.multi()
multi.incr(watched)
multi.exec(helper.isNull(done))
return multi.exec().then(helper.isNull())
})
it('successfully modifies other keys independently of transaction', (done) => {
it('successfully modifies other keys independently of transaction', () => {
client.set('unwatched', 200)
client.set(watched, 0)
client.watch(watched)
client.incr(watched)
client.multi().incr(watched).exec((err, replies) => {
assert.strictEqual(err, null)
return client.multi().incr(watched).exec().then((replies) => {
assert.strictEqual(replies, null, 'Aborted transaction multi-bulk reply should be null.')
client.get('unwatched', helper.isString('200', done))
return client.get('unwatched').then(helper.isString('200'))
})
})
})

View File

@@ -10,31 +10,27 @@ describe('The \'zadd\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('reports an error', function (done) {
it('reports an error', function () {
if (helper.redisProcess().spawnFailed()) this.skip()
client.zadd('infinity', [+'5t', 'should not be possible'], helper.isError(done))
return client.zadd('infinity', [+'5t', 'should not be possible']).then(assert, helper.isError())
})
it('return inf / -inf', function (done) {
it('return inf / -inf', function () {
if (helper.redisProcess().spawnFailed()) this.skip()
helper.serverVersionAtLeast.call(this, client, [3, 0, 2])
client.zadd('infinity', [+Infinity, 'should be inf'], helper.isNumber(1))
client.zadd('infinity', ['inf', 'should be also be inf'], helper.isNumber(1))
client.zadd('infinity', -Infinity, 'should be negative inf', helper.isNumber(1))
client.zadd('infinity', [99999999999999999999999, 'should not be inf'], helper.isNumber(1))
client.zrange('infinity', 0, -1, 'WITHSCORES', (err, res) => {
assert.strictEqual(err, null)
client.zadd('infinity', [+Infinity, 'should be inf']).then(helper.isNumber(1))
client.zadd('infinity', ['inf', 'should be also be inf']).then(helper.isNumber(1))
client.zadd('infinity', -Infinity, 'should be negative inf').then(helper.isNumber(1))
client.zadd('infinity', [99999999999999999999999, 'should not be inf']).then(helper.isNumber(1))
return client.zrange('infinity', 0, -1, 'WITHSCORES').then((res) => {
assert.strictEqual(res[5], 'inf')
assert.strictEqual(res[1], '-inf')
assert.strictEqual(res[3], '9.9999999999999992e+22')
done()
})
})

View File

@@ -10,14 +10,12 @@ describe('The \'zscan\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('return values', function (done) {
it('return values', function () {
if (helper.redisProcess().spawnFailed()) this.skip()
helper.serverVersionAtLeast.call(this, client, [2, 8, 0])
const hash = {}
@@ -31,11 +29,9 @@ describe('The \'zscan\' method', () => {
client.hmset('hash:1', hash)
client.sadd('set:1', set)
client.zadd(zset)
client.zscan('zset:1', 0, 'MATCH', '*', 'COUNT', 500, (err, res) => {
assert(!err)
return client.zscan('zset:1', 0, 'MATCH', '*', 'COUNT', 500).then((res) => {
assert.strictEqual(res.length, 2)
assert.strictEqual(res[1].length, 1000)
done()
})
})

View File

@@ -9,16 +9,14 @@ describe('The \'zscore\' method', () => {
describe(`using ${ip}`, () => {
let client
beforeEach((done) => {
beforeEach(() => {
client = redis.createClient.apply(null, args)
client.once('ready', () => {
client.flushdb(done)
})
return client.flushdb()
})
it('should return the score of member in the sorted set at key', (done) => {
it('should return the score of member in the sorted set at key', () => {
client.zadd('myzset', 1, 'one')
client.zscore('myzset', 'one', helper.isString('1', done))
return client.zscore('myzset', 'one').then(helper.isString('1'))
})
afterEach(() => {