sessitoken
Version:
Handles session or token based storing with sliding expiration
107 lines (93 loc) • 3.31 kB
JavaScript
;
/* jshint expr: true */
var chai = require('chai'),
expect = chai.expect,
sinon = require('sinon'),
proxyquire = require('proxyquire');
var sinonPromise = require('sinon-promise');
chai.use(require('sinon-chai'));
describe('MongoStore', function () {
var MongoStore, store, sandbox, promisedMongo, sessionCollection, mongoData;
before(function() {
sinonPromise(sinon);
});
after(function() {
sinonPromise.restore();
});
beforeEach(function () {
sessionCollection = {
findOne: sinon.promise(),
save: sinon.promise(),
remove: sinon.promise(),
ensureIndex: sinon.promise()
};
promisedMongo = {
collection: sinon.stub().returns(sessionCollection)
};
sandbox = sinon.sandbox.create();
MongoStore = proxyquire('../lib/mongostore', { 'promised-mongo': sinon.stub().returns(promisedMongo) });
store = new MongoStore({ connectionString: 'foo' });
mongoData = {
foo: {
expires: Date.now() + 21 * 60 * 10000,
data: { herp: 'derp', token: 'foo' }
},
bar: {
expires: Date.now() - 10,
data: { baz: true, token: 'bar' }
}
};
});
afterEach(function () {
sandbox.restore();
});
describe('#get', function () {
it('calls sessionCollection find', function () {
store.get('foo');
expect(sessionCollection.findOne).calledOnce;
expect(sessionCollection.findOne).calledWith({ 'data.token': 'foo' });
});
it('returns an object corresponding to the passed key', function () {
var listener = sinon.spy();
store.get('foo').then(listener);
sessionCollection.findOne.resolve(mongoData.foo);
expect(listener).calledWith(mongoData.foo);
});
it('returns an empty object if session has expired', function () {
var listener = sinon.spy();
store.get('bar').then(listener);
sessionCollection.findOne.resolve(mongoData.bar);
sessionCollection.remove.resolve({});
expect(listener).calledWith({});
});
it('returns an empty object if session does not exist in database', function () {
var listener = sinon.spy();
store.get('baz').then(listener);
sessionCollection.findOne.resolve();
expect(listener).calledWith({});
});
});
describe('#update', function () {
it('does nothing if no change and no session', function () {
store.update('baz');
sessionCollection.findOne.resolve();
expect(sessionCollection.save).not.called;
});
it('updates data and writes to database if changed', function () {
mongoData.foo.data.herp = 'doge';
store.update('foo', mongoData.foo.data);
sessionCollection.findOne.resolve(mongoData.foo);
expect(sessionCollection.save).calledOnce;
expect(sessionCollection.save).calledWith(mongoData.foo);
});
it('updates expires and writes to database if time to expiry < activeDuration', function () {
sandbox.stub(Date, 'now').returns(1000);
mongoData.foo.expires = 1100;
store.update('foo');
sessionCollection.findOne.resolve(mongoData.foo);
expect(sessionCollection.save).calledOnce;
mongoData.foo.expires = 5 * 60 * 1000 + 1100;
expect(sessionCollection.save).calledWith(mongoData.foo);
});
});
});