all files / modules/middleware/session/__tests__/ describeSessionStore.js

100% Statements 70/70
100% Branches 8/8
100% Functions 32/32
100% Lines 70/70
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123     10×                                                                                                      
const assert = require("assert");
const expect = require("expect");
const delay = require("when/delay");
 
const {is} = require("ramda");
 
function describeSessionStore(store, skip) {
    if (!skip) {
        beforeEach(function () {
            if (is(Function, store.purge)) {
                return store.purge();
            }
        });
 
        after(function () {
            if (is(Function, store.destroy)) {
                return store.destroy();
            }
        });
    }
 
    const desc = skip ? describe.skip : describe;
 
    desc("when there is no session with a given value", function () {
        let session;
        beforeEach(function () {
            return store.load("fake-value").then(function (newSession) {
                session = newSession;
            });
        });
 
        it("returns an empty object", function () {
            expect(session).toEqual({});
        });
    });
 
    desc("when a session is saved", function () {
        let value;
        beforeEach(function () {
            const session = {count: 1};
            return store.save(session).then(function (newValue) {
                value = newValue;
            });
        });
 
        it("can be retrieved using the opaque return value", function () {
            return store.load(value).then(function (session) {
                assert(session);
                expect(session.count).toEqual(1);
            });
        });
    });
 
    desc("when it has a TTL", function () {
        beforeEach(function () {
            store.ttl = 30;
        });
 
        afterEach(function () {
            delete store.ttl;
        });
 
        describe("and a session is not expired", function () {
            let value;
            beforeEach(function () {
                const session = {count: 1};
                return store.save(session).then(function (newValue) {
                    value = newValue;
                });
            });
 
            it("loads the session", function () {
                return store.load(value).then(function (session) {
                    assert(session);
                    expect(session.count).toEqual(1);
                });
            });
        });
 
        describe("and a session is expired", function () {
            let value;
            beforeEach(function () {
                const session = {count: 1};
                return store.save(session).then(function (newValue) {
                    value = newValue;
                    return delay(store.ttl + 10);
                });
            });
 
            it("loads a new session", function () {
                return store.load(value).then(function (session) {
                    assert(session);
                    expect(session).toEqual({});
                });
            });
        });
 
        describe("and a session is saved before it expires", function () {
            let value;
            beforeEach(function () {
                const session = {count: 1};
                return store.save(session).then(function () {
                    return delay(store.ttl / 2).then(function () {
                        return store.save(session).then(function (newValue) {
                            value = newValue;
                            return delay(store.ttl / 2);
                        });
                    });
                });
            });
 
            it("loads the session", function () {
                return store.load(value).then(function (session) {
                    assert(session);
                    expect(session.count).toEqual(1);
                });
            });
        });
    });
}
 
module.exports = describeSessionStore;