forked from dachan/dach
305 lines
8.6 KiB
JavaScript
305 lines
8.6 KiB
JavaScript
|
var assert = require('assert')
|
||
|
|
||
|
// express-session way
|
||
|
var MemoryStore = require('../')({Store: function () {}})
|
||
|
var session = {MemoryStore: MemoryStore}
|
||
|
|
||
|
describe('MemoryStore', function (done) {
|
||
|
afterEach(function () {
|
||
|
// runs after each test in this block
|
||
|
this.store.stopInterval()
|
||
|
})
|
||
|
|
||
|
it('constructor should use default options', function (done) {
|
||
|
this.store = new session.MemoryStore()
|
||
|
var store = this.store
|
||
|
assert.ok(store.options, 'should have an option object')
|
||
|
assert.equal(store.options.max, Infinity, 'max option should be Infinity')
|
||
|
assert.equal(store.options.checkPeriod, undefined, 'checkPeriod undefined by default')
|
||
|
assert.ok(store.store, 'should have the LRU cache store')
|
||
|
assert.equal(store._checkInterval, undefined, 'should not have the pruning loop')
|
||
|
done()
|
||
|
})
|
||
|
|
||
|
it('should set options', function (done) {
|
||
|
this.store = new session.MemoryStore({
|
||
|
max: 10,
|
||
|
checkPeriod: 10 * 1000,
|
||
|
ttl: 36000,
|
||
|
dispose: null,
|
||
|
stale: true
|
||
|
})
|
||
|
var store = this.store
|
||
|
assert.equal(store.options.max, 10, 'should set the max option')
|
||
|
assert.equal(store.options.checkPeriod, 10 * 1000, 'should set checkPeriod')
|
||
|
assert.equal(store.options.ttl, 36000, 'should set the TTL')
|
||
|
assert.equal(store.options.dispose, null, 'should set dispose')
|
||
|
assert.equal(store.options.stale, true, 'should set stale')
|
||
|
done()
|
||
|
})
|
||
|
|
||
|
it('should not set the interval to check for expired entries by default', function (done) {
|
||
|
this.store = new session.MemoryStore()
|
||
|
var store = this.store
|
||
|
assert.equal(store._checkInterval, undefined, 'should not exists')
|
||
|
done()
|
||
|
})
|
||
|
|
||
|
it('should only contain 10 items', function (done) {
|
||
|
this.store = new session.MemoryStore({max: 10})
|
||
|
var store = this.store
|
||
|
|
||
|
for (var i = 0; i < 15; i++) {
|
||
|
store.set(i, {cookie: { expires: new Date((new Date()).valueOf() + 60 * 10 * 1000) }})
|
||
|
}
|
||
|
|
||
|
store.length(function (err, length) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(length, 10)
|
||
|
done()
|
||
|
})
|
||
|
})
|
||
|
|
||
|
it('should delete the first item', function (done) {
|
||
|
this.store = new session.MemoryStore({max: 10})
|
||
|
var store = this.store
|
||
|
|
||
|
for (var i = 0; i < 15; i++) {
|
||
|
store.set(i, {cookie: { expires: new Date((new Date()).valueOf() + 60 * 10 * 1000) }})
|
||
|
}
|
||
|
|
||
|
store.destroy(14)
|
||
|
|
||
|
store.length(function (err, length) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(length, 9)
|
||
|
done()
|
||
|
})
|
||
|
})
|
||
|
|
||
|
it('should delete the last item', function (done) {
|
||
|
this.store = new session.MemoryStore({max: 10})
|
||
|
var store = this.store
|
||
|
|
||
|
for (var i = 0; i < 10; i++) {
|
||
|
store.set(i, {cookie: { expires: new Date((new Date()).valueOf() + 60 * 10 * 1000) }})
|
||
|
}
|
||
|
|
||
|
store.destroy(0)
|
||
|
store.destroy(1)
|
||
|
|
||
|
store.length(function (err, length) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(length, 8)
|
||
|
})
|
||
|
|
||
|
for (i = 10; i < 12; i++) {
|
||
|
store.set(i, {cookie: { expires: new Date((new Date()).valueOf() + 60 * 10 * 1000) }})
|
||
|
}
|
||
|
|
||
|
store.length(function (err, length) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(length, 10)
|
||
|
done()
|
||
|
})
|
||
|
})
|
||
|
|
||
|
it('should set and get a sample entry', function (done) {
|
||
|
this.store = new session.MemoryStore()
|
||
|
var store = this.store
|
||
|
|
||
|
store.set('hello', {cookie: {}, sample: true})
|
||
|
store.get('hello', function (err, val) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(val.sample, true, 'set and got expected value')
|
||
|
done()
|
||
|
})
|
||
|
})
|
||
|
|
||
|
it('should set TTL from cookie.maxAge', function (done) {
|
||
|
this.store = new session.MemoryStore()
|
||
|
var store = this.store
|
||
|
|
||
|
store.set('hello', {cookie: {maxAge: 400}, sample: true})
|
||
|
store.get('hello', function (err, val) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(val.sample, true, 'entry should be valid')
|
||
|
})
|
||
|
setTimeout(function () {
|
||
|
store.get('hello', function (err, val) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(val, undefined, 'entry should be expired')
|
||
|
done()
|
||
|
})
|
||
|
}, 500)
|
||
|
})
|
||
|
|
||
|
it('should not get empty entry', function (done) {
|
||
|
this.store = new session.MemoryStore()
|
||
|
var store = this.store
|
||
|
|
||
|
store.get('', function (err, val) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(val, undefined)
|
||
|
done()
|
||
|
})
|
||
|
})
|
||
|
|
||
|
it('should not get a deleted entry', function (done) {
|
||
|
this.store = new session.MemoryStore()
|
||
|
var store = this.store
|
||
|
|
||
|
store.set('foo', {cookie: {}})
|
||
|
store.get('foo', function (err, val) {
|
||
|
if (err) return done(err)
|
||
|
assert.ok(val, 'entry exists')
|
||
|
store.destroy('foo')
|
||
|
store.get('foo', function (err, val) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(val, undefined, 'entry actually deleted')
|
||
|
done()
|
||
|
})
|
||
|
})
|
||
|
})
|
||
|
|
||
|
it('should not get an expired entry', function (done) {
|
||
|
this.store = new session.MemoryStore()
|
||
|
var store = this.store
|
||
|
|
||
|
store.set('hello', {cookie: {maxAge: 200}, sample: true})
|
||
|
setTimeout(function () {
|
||
|
store.get('hello', function (err, val) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(val, undefined, 'entry should be expired')
|
||
|
done()
|
||
|
})
|
||
|
}, 300)
|
||
|
})
|
||
|
|
||
|
it('should enable automatic prune for expired entries', function (done) {
|
||
|
this.store = new session.MemoryStore({checkPeriod: 300})
|
||
|
var store = this.store
|
||
|
|
||
|
store.set('foo', {cookie: {maxAge: 150}})
|
||
|
store.set('bar', {cookie: {maxAge: 150}})
|
||
|
store.length(function (err, count) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(count, 2, 'should count 2 entries')
|
||
|
})
|
||
|
setTimeout(function () {
|
||
|
store.length(function (err, count) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(count, 0, 'expired entries should be pruned')
|
||
|
done()
|
||
|
})
|
||
|
}, 500)
|
||
|
})
|
||
|
|
||
|
it('automatic check for expired entries should be disabled', function (done) {
|
||
|
this.store = new session.MemoryStore()
|
||
|
var store = this.store
|
||
|
|
||
|
store.set('foo', {cookie: {maxAge: 150}})
|
||
|
store.set('bar', {cookie: {maxAge: 150}})
|
||
|
store.length(function (err, count) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(count, 2, 'should count 2 entries')
|
||
|
})
|
||
|
setTimeout(function () {
|
||
|
store.length(function (err, count) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(count, 2, 'expired entries should not be pruned')
|
||
|
done()
|
||
|
})
|
||
|
}, 500)
|
||
|
})
|
||
|
|
||
|
it('should touch a given entry', function (done) {
|
||
|
this.store = new session.MemoryStore()
|
||
|
var store = this.store
|
||
|
|
||
|
store.set('hei', {cookie: {maxAge: 50}})
|
||
|
store.touch('hei', {cookie: {maxAge: 300}})
|
||
|
setTimeout(function () {
|
||
|
store.get('hei', function (err, val) {
|
||
|
if (err) return done(err)
|
||
|
assert.ok(val, 'entry should be touched')
|
||
|
done()
|
||
|
})
|
||
|
}, 200)
|
||
|
})
|
||
|
|
||
|
it('should fetch all entries Ids', function (done) {
|
||
|
this.store = new session.MemoryStore()
|
||
|
var store = this.store
|
||
|
|
||
|
var k = 10
|
||
|
var i = 0
|
||
|
for (i = 0; i < k; i++) { store.set('sess' + i, {cookie: {maxAge: 1000}}) }
|
||
|
|
||
|
store.ids(function (err, ids) {
|
||
|
if (err) return done(err)
|
||
|
assert.ok(Array.isArray(ids), 'ids should be an Array')
|
||
|
i = 10
|
||
|
ids.forEach(function (sid) {
|
||
|
assert.equal(sid, 'sess' + (--i), 'got expected key')
|
||
|
})
|
||
|
done()
|
||
|
})
|
||
|
})
|
||
|
|
||
|
it('should fetch all entries values', function (done) {
|
||
|
this.store = new session.MemoryStore()
|
||
|
var store = this.store
|
||
|
|
||
|
var k = 10
|
||
|
var i = 0
|
||
|
for (i = 0; i < k; i++) { store.set('sess-' + i, {cookie: {maxAge: 1000}, i: i}) }
|
||
|
|
||
|
store.all(function (err, all) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(typeof all, 'object', 'all should be an Object')
|
||
|
Object.keys(all).forEach(function (sid) {
|
||
|
var v = sid.split('-')[1]
|
||
|
assert.equal(all[sid].i, v, 'got expected value')
|
||
|
})
|
||
|
done()
|
||
|
})
|
||
|
})
|
||
|
|
||
|
it('should count all entries in the store', function (done) {
|
||
|
this.store = new session.MemoryStore()
|
||
|
var store = this.store
|
||
|
|
||
|
var k = 10
|
||
|
var i = 0
|
||
|
for (i = 0; i < k; i++) { store.set(i, {cookie: {maxAge: 1000}}) }
|
||
|
|
||
|
store.length(function (err, n) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(n, k, 'Got expected lenght')
|
||
|
done()
|
||
|
})
|
||
|
})
|
||
|
|
||
|
it('should delete all entries from the store', function (done) {
|
||
|
this.store = new session.MemoryStore()
|
||
|
var store = this.store
|
||
|
|
||
|
var k = 10
|
||
|
var i = 0
|
||
|
for (i = 0; i < k; i++) { store.set(i, {cookie: {maxAge: 1000}}) }
|
||
|
|
||
|
store.length(function (err, n) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(n, k, 'store is not empty')
|
||
|
})
|
||
|
store.clear()
|
||
|
store.length(function (err, n) {
|
||
|
if (err) return done(err)
|
||
|
assert.equal(n, 0, 'store should be empty')
|
||
|
done()
|
||
|
})
|
||
|
})
|
||
|
})
|