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)
+ })
+})