Skip to content

Commit

Permalink
by-property controller middleware handles rejected promises (#19)
Browse files Browse the repository at this point in the history
  • Loading branch information
rafalsiwiec authored and kiebzak committed Mar 29, 2019
1 parent bd4ece3 commit 82b9d9a
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 10 deletions.
4 changes: 3 additions & 1 deletion middlewares/controllers/by-property.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,7 @@ const path = require('path')

module.exports = ({dir, propertyName = 'x-swagger-router-controller', delimiter}) => operation => {
const relativePath = delimiter ? operation[propertyName].replace(delimiter, path.sep) : operation[propertyName]
return require(path.join(dir, relativePath))
const controller = require(path.join(dir, relativePath))
return (req, res, next) =>
Promise.resolve(controller(req, res, next)).catch(next)
}
49 changes: 40 additions & 9 deletions test/middlewares/controllers/by-property.spec.js
Original file line number Diff line number Diff line change
@@ -1,27 +1,58 @@
const controller = require('../../../middlewares/controllers/by-property')
const path = require('path')

describe('Controller', () => {

it('should return middleware', () => {
let req, res, next

beforeEach(() => {
req = sinon.spy()
res = sinon.spy()
next = sinon.spy()
})

it('should build middleware', done => {
// given
const operation = {'x-swagger-router-controller': 'example'}
const middleware = controller({dir: __dirname})(operation)

// when
const result = middleware(req, res, next)

// then
result.then(({req: reqArg, res: resArg, next: nextArg}) => {
expect(reqArg).to.eql(req)
expect(resArg).to.eql(res)
expect(nextArg).to.eql(next)
}).then(done)
})

it('should build middleware from nested file', done => {
// given
const operation = {'x-swagger-router-controller': 'package'}
const operation = {'x-swagger-router-controller': 'dir.example'}
const middleware = controller({dir: __dirname, delimiter: /\./g})(operation)

// when
const middleware = controller({dir: path.join(__dirname, '../../..')})(operation)
const result = middleware(req, res, next)

// then
expect(middleware).to.equal(require('../../../package'))
result.then(({req: reqArg, res: resArg, next: nextArg}) => {
expect(reqArg).to.eql(req)
expect(resArg).to.eql(res)
expect(nextArg).to.eql(next)
}).then(done)
})

it('should return middleware', () => {
it('should pass errors from rejected Promises to next', done => {
// given
const operation = {'x-swagger-router-controller': 'test.globals'}
const operation = {'x-swagger-router-controller': 'rejected-promise-controller'}
const middleware = controller({dir: __dirname})(operation)

// when
const middleware = controller({dir: path.join(__dirname, '../../..'), delimiter: /\./g})(operation)
const result = middleware(req, res, next)

// then
expect(middleware).to.equal(require('../../globals'))
result.then(() => {
expect(next.calledOnceWith(sinon.match.instanceOf(Error))).to.be.true
}).then(done)
})
})
3 changes: 3 additions & 0 deletions test/middlewares/controllers/dir/example.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const example = require('../example')

module.exports = example
1 change: 1 addition & 0 deletions test/middlewares/controllers/example.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = (req, res, next) => ({req, res, next})
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = () => Promise.reject(new Error())

0 comments on commit 82b9d9a

Please sign in to comment.