recacheman-redis
Version:
Redis standalone caching library for Node.JS and also cache engine for Cacheman
304 lines (275 loc) • 8.27 kB
JavaScript
const assert = require('assert')
const redis = require('redis')
const Cache = require('../src')
const uri = 'redis://127.0.0.1:6379/5'
const connection = {
host: '127.0.0.1',
port: 6379,
database: 6
}
describe('cacheman-redis', function () {
this.timeout(10000)
let cache = null
beforeEach((done) => {
cache = new Cache({ prefix: 'cacheman-redis:test' })
done()
})
afterEach((done) => {
cache.clear(done)
})
it('should have main methods', () => {
assert.ok(cache.set)
assert.ok(cache.get)
assert.ok(cache.del)
assert.ok(cache.clear)
assert.ok(cache.scan)
})
it('should store items', (done) => {
cache.set('test1', { a: 1 }, (err) => {
if (err) return done(err)
cache.get('test1', (err, data) => {
if (err) return done(err)
assert.strictEqual(data.a, 1)
done()
})
})
})
it('should store zero', (done) => {
cache.set('test2', 0, (err) => {
if (err) return done(err)
cache.get('test2', (err, data) => {
if (err) return done(err)
assert.strictEqual(data, 0)
done()
})
})
})
it('should store false', (done) => {
cache.set('test3', false, (err) => {
if (err) return done(err)
cache.get('test3', (err, data) => {
if (err) return done(err)
assert.strictEqual(data, false)
done()
})
})
})
it('should store null', (done) => {
cache.set('test4', null, (err) => {
if (err) return done(err)
cache.get('test4', (err, data) => {
if (err) return done(err)
assert.strictEqual(data, null)
done()
})
})
})
it('should delete items', (done) => {
let value = Date.now()
cache.set('test5', value, (err) => {
if (err) return done(err)
cache.get('test5', (err, data) => {
if (err) return done(err)
assert.strictEqual(data, value)
cache.del('test5', (err) => {
if (err) return done(err)
cache.get('test5', (err, data) => {
if (err) return done(err)
assert.strictEqual(data, null)
done()
})
})
})
})
})
it('should clear items', (done) => {
let value = Date.now()
cache.set('test6', value, (err) => {
if (err) return done(err)
cache.get('test6', (err, data) => {
if (err) return done(err)
assert.strictEqual(data, value)
cache.clear((err) => {
if (err) return done(err)
cache.get('test6', (err, data) => {
if (err) return done(err)
assert.strictEqual(data, null)
done()
})
})
})
})
})
it('should expire key', function(done) {
this.timeout(0)
cache.set('test7', { a: 1 }, 1, (err) => {
if (err) return done(err)
setTimeout(() => {
cache.get('test7', (err, data) => {
if (err) return done(err)
assert.strictEqual(data, null)
done()
})
}, 1100)
})
})
it('should not expire key', function(done) {
this.timeout(0)
cache.set('test8', { a: 1 }, -1, (err) => {
if (err) return done(err)
setTimeout(() => {
cache.get('test8', (err, data) => {
if (err) return done(err)
assert.deepStrictEqual(data, { a: 1 })
done()
})
}, 1000)
})
})
it('should get the same value subsequently', (done) => {
let val = 'Test Value'
cache.set('test', 'Test Value', () => {
cache.get('test', (err, data) => {
if (err) return done(err)
assert.strictEqual(data, val)
cache.get('test', (err, data) => {
if (err) return done(err)
assert.strictEqual(data, val)
cache.get('test', (err, data) => {
if (err) return done(err)
assert.strictEqual(data, val)
done()
})
})
})
})
})
it('should allow passing redis connection params as object', (done) => {
cache = new Cache(connection)
cache.set('test9', { a: 1 }, (err) => {
if (err) return done(err)
cache.get('test9', (err, data) => {
if (err) return done(err)
connection.database = 0
cache2 = new Cache(connection)
cache2.get('test9', (err, data2) => {
if (err) return done(err)
assert.strictEqual(data.a, 1) // data exist on database 6
assert.strictEqual(data2, null) // data not exist on database 0 or default database
done()
})
})
})
})
it('should allow passing redis connection string', (done) => {
cache = new Cache(uri)
cache.set('test10', { a: 1 }, (err) => {
if (err) return done(err)
cache.get('test10', (err, data) => {
if (err) return done(err)
connection.database = 0
cache2 = new Cache(connection)
cache2.get('test9', (err, data2) => {
if (err) return done(err)
assert.strictEqual(data.a, 1) // data exist on database 5
assert.strictEqual(data2, null) // data not exist on database 0 or default database
done()
})
})
})
})
it('should allow passing redis client as first argument', (done) => {
let client = redis.createClient()
cache = new Cache(client)
cache.set('test11', { a: 1 }, (err) => {
if (err) return done(err)
cache.get('test11', (err, data) => {
if (err) return done(err)
assert.strictEqual(data.a, 1)
done()
})
})
})
it('should allow passing redis client as connection direct url', (done) => {
cache = new Cache({ url: 'redis://localhost:6379' })
cache.set('test11', { a: 1 }, (err) => {
if (err) return done(err)
cache.get('test11', (err, data) => {
if (err) return done(err)
assert.strictEqual(data.a, 1)
done()
})
})
})
it('should allow passing redis client as connection uri', (done) => {
cache = new Cache({ client: 'redis://localhost:6379' })
cache.set('test11', { a: 1 }, (err) => {
if (err) return done(err)
cache.get('test11', (err, data) => {
if (err) return done(err)
assert.strictEqual(data.a, 1)
done()
})
})
})
it('should allow passing redis client as object', (done) => {
cache = new Cache({ client: { url: 'redis://localhost:6379'} })
cache.set('test11', { a: 1 }, (err) => {
if (err) return done(err)
cache.get('test11', (err, data) => {
if (err) return done(err)
assert.strictEqual(data.a, 1)
done()
})
})
})
it('should allow passing redis client as client in options', (done) => {
let client = redis.createClient()
cache = new Cache({ client: client })
cache.set('test12', { a: 1 }, (err) => {
if (err) return done(err)
cache.get('test12', (err, data) => {
if (err) return done(err)
assert.strictEqual(data.a, 1)
done()
})
})
})
it('should clear an empty cache', (done) => {
cache.clear((err) => {
done(err)
})
})
it('should scan and return results', (done) => {
const items = [
{ key: 'test0', data: { a: 'test0' } },
{ key: 'test1', data: { a: 'test1' } },
{ key: 'test2', data: { a: 'test2' } },
{ key: 'test3', data: { a: 'test3' } },
{ key: 'test4', data: { a: 'test4' } },
{ key: 'test5', data: { a: 'test5' } },
{ key: 'test6', data: { a: 'test6' } },
{ key: 'test7', data: { a: 'test7' } },
{ key: 'test8', data: { a: 'test8' } },
{ key: 'test9', data: { a: 'test9' } }
]
const compare = (a, b) => {
if (a.key < b.key) return -1
else if (a.key > b.key) return 1
else return 0;
}
items.forEach((obj, index) => {
cache.set(obj.key, obj.data, (err) => {
assert.deepStrictEqual(null, err)
})
})
cache.scan(0, 20, (err, result) => {
if(err) return console.log('scanning error', err)
assert.deepStrictEqual(null, err)
assert.strictEqual(result.cursor, 0)
const entries = result.entries.sort(compare)
assert.deepStrictEqual(items, entries)
done()
})
})
})