diff --git a/CHANGELOG.md b/CHANGELOG.md index c5e9d27..68a5878 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ + +## [1.0.4](https://github.com/adonisjs/adonis-session/compare/v1.0.3...v1.0.4) (2017-07-22) + + + ## [1.0.3](https://github.com/adonisjs/adonis-session/compare/v1.0.2...v1.0.3) (2017-07-22) diff --git a/package-lock.json b/package-lock.json index 67fc0a8..2822231 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/session", - "version": "1.0.0", + "version": "1.0.3", "lockfileVersion": 1, "dependencies": { "@adonisjs/fold": { @@ -1203,8 +1203,7 @@ "node-exceptions": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-exceptions/-/node-exceptions-2.0.2.tgz", - "integrity": "sha512-nILccFLvnaOBoKZZtWfZipn/hlThZOT6UJOLX6SA3yLMYPcvLTIF26PXx73sPnAg45p05iYFYw2jvayNHz4rDA==", - "dev": true + "integrity": "sha512-nILccFLvnaOBoKZZtWfZipn/hlThZOT6UJOLX6SA3yLMYPcvLTIF26PXx73sPnAg45p05iYFYw2jvayNHz4rDA==" }, "number-is-nan": { "version": "1.0.1", diff --git a/package.json b/package.json index ec8ff8e..449ce7c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/session", - "version": "1.0.3", + "version": "1.0.4", "description": "This repo is the official session provider for Adonisjs apps. It supports multiple drivers to store session data.", "main": "providers/SessionProvider", "directories": { @@ -42,6 +42,7 @@ "fs-extra": "^4.0.0", "lodash": "^4.17.4", "ms": "^2.0.0", + "node-exceptions": "^2.0.2", "type-of-is": "^3.5.1", "uuid": "^3.1.0" }, diff --git a/src/Exceptions/index.js b/src/Exceptions/index.js new file mode 100644 index 0000000..f53a055 --- /dev/null +++ b/src/Exceptions/index.js @@ -0,0 +1,20 @@ +'use strict' + +/* + * adonis-session + * + * (c) Harminder Virk + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. +*/ + +const NE = require('node-exceptions') + +class InvalidArgumentException extends NE.InvalidArgumentException { + static invalidSessionDriver (name) { + return new this(`${name} is not a valid session provider`, 500, 'E_INVALID_SESSION_DRIVER') + } +} + +module.exports = { InvalidArgumentException } diff --git a/src/Session/Manager.js b/src/Session/Manager.js index 06db247..7d0426a 100644 --- a/src/Session/Manager.js +++ b/src/Session/Manager.js @@ -9,8 +9,9 @@ * file that was distributed with this source code. */ -const drivers = require('./Drivers') const { ioc } = require('@adonisjs/fold') +const drivers = require('./Drivers') +const CE = require('../Exceptions') /** * Session manager class is used by ioc container @@ -54,7 +55,7 @@ class SessionManager { makeDriverInstance (name) { const driver = drivers[name] || this._drivers[name] if (!driver) { - throw new Error(`${name} is not valid session driver`) + throw CE.InvalidArgumentException.invalidSessionDriver(name) } return ioc.make(driver) } diff --git a/src/Session/Middleware.js b/src/Session/Middleware.js index c78d6c4..9789f34 100644 --- a/src/Session/Middleware.js +++ b/src/Session/Middleware.js @@ -46,7 +46,10 @@ class SessionMiddleware { debug('using %s session driver', driver) const driverInstance = this.SessionManager.makeDriverInstance(driver) - driverInstance.setRequest(ctx.request, ctx.response) + + if (typeof (driverInstance.setRequest) === 'function') { + driverInstance.setRequest(ctx.request, ctx.response) + } ctx.session = new Session(ctx.request, ctx.response, driverInstance, this.Config) diff --git a/test/session-manager.spec.js b/test/session-manager.spec.js new file mode 100644 index 0000000..ec78d8e --- /dev/null +++ b/test/session-manager.spec.js @@ -0,0 +1,61 @@ +'use strict' + +/* + * adonis-session + * + * (c) Harminder Virk + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. +*/ + +const test = require('japa') +const path = require('path') +const { ioc } = require('@adonisjs/fold') +const { Config, Helpers } = require('@adonisjs/sink') + +const manager = require('../src/Session/Manager') +const drivers = require('../src/Session/Drivers') + +test.group('Session Manager', (group) => { + group.before(() => { + ioc.singleton('Adonis/Src/Config', () => { + return new Config() + }) + + ioc.singleton('Adonis/Src/Helpers', () => { + return new Helpers(path.join(__dirname)) + }) + + ioc.singleton('Adonis/Addons/RedisFactory', () => { + return class RedisFactory {} + }) + }) + + test('add a new driver', (assert) => { + class Mongo {} + manager.extend('mongo', Mongo) + assert.deepEqual(manager._drivers, { mongo: Mongo }) + }) + + test('get cookie driver instance', (assert) => { + assert.instanceOf(manager.makeDriverInstance('cookie'), drivers.cookie) + }) + + test('get redis driver instance', (assert) => { + assert.instanceOf(manager.makeDriverInstance('redis'), drivers.redis) + }) + + test('get file driver instance', (assert) => { + assert.instanceOf(manager.makeDriverInstance('file'), drivers.file) + }) + + test('get custom driver instance', (assert) => { + assert.isDefined(manager.makeDriverInstance('mongo')) + }) + + test('throw exception when unable to find driver', (assert) => { + const fn = () => manager.makeDriverInstance('foo') + assert.throw(fn, 'E_INVALID_SESSION_DRIVER: foo is not a valid session provider') + }) +}) diff --git a/test/session-middleware.spec.js b/test/session-middleware.spec.js new file mode 100644 index 0000000..0468b76 --- /dev/null +++ b/test/session-middleware.spec.js @@ -0,0 +1,103 @@ +'use strict' + +/* + * adonis-session + * + * (c) Harminder Virk + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. +*/ + +const test = require('japa') +const http = require('http') +const { ioc } = require('@adonisjs/fold') +const supertest = require('supertest') +const { Config } = require('@adonisjs/sink') + +const Session = require('../src/Session') +const SessionManager = require('../src/Session/Manager') +const Middleware = require('../src/Session/Middleware') +const { redis: Redis } = require('../src/Session/Drivers') + +test.group('Middleware', (group) => { + group.beforeEach(() => { + ioc.singleton('Adonis/Src/Config', () => { + return new Config() + }) + + ioc.singleton('Adonis/Addons/RedisFactory', () => { + return class RedisFactory { + expire () {} + } + }) + }) + + test('attach session instance on the http context', async (assert) => { + const server = http.createServer((req, res) => { + const request = { + cookie: () => {} + } + + const response = { + cookie: () => {} + } + + const context = { request, response } + const middleware = new Middleware(ioc.use('Adonis/Src/Config'), SessionManager) + middleware + .handle(context, async function () { + return true + }) + .then(() => { + assert.isDefined(context.session) + assert.instanceOf(context.session, Session) + res.end() + }).catch(({ message }) => { + console.log(message) + res.writeHead(500) + res.write(message) + res.end() + }) + }) + + await supertest(server).get('/').expect(200) + }) + + test('do not call setRequest when driver has not implemented the method', async (assert) => { + ioc.singleton('Adonis/Src/Config', () => { + const config = new Config() + config.set('session.driver', 'redis') + return config + }) + + const server = http.createServer((req, res) => { + const request = { + cookie: () => {} + } + + const response = { + cookie: () => {} + } + + const context = { request, response } + const middleware = new Middleware(ioc.use('Adonis/Src/Config'), SessionManager) + middleware + .handle(context, async function () { + return true + }) + .then(() => { + assert.isDefined(context.session) + assert.instanceOf(context.session._driverInstance, Redis) + res.end() + }).catch(({ message }) => { + console.log(message) + res.writeHead(500) + res.write(message) + res.end() + }) + }) + + await supertest(server).get('/').expect(200) + }) +})