From 82b9d9a01f383daeb02f9acd7ac08c80ed11c0ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Siwiec?= Date: Fri, 29 Mar 2019 15:02:34 +0100 Subject: [PATCH] by-property controller middleware handles rejected promises (#19) --- middlewares/controllers/by-property.js | 4 +- .../controllers/by-property.spec.js | 49 +++++++++++++++---- test/middlewares/controllers/dir/example.js | 3 ++ test/middlewares/controllers/example.js | 1 + .../rejected-promise-controller.js | 1 + 5 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 test/middlewares/controllers/dir/example.js create mode 100644 test/middlewares/controllers/example.js create mode 100644 test/middlewares/controllers/rejected-promise-controller.js diff --git a/middlewares/controllers/by-property.js b/middlewares/controllers/by-property.js index bd84006..6f99d7c 100644 --- a/middlewares/controllers/by-property.js +++ b/middlewares/controllers/by-property.js @@ -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) } diff --git a/test/middlewares/controllers/by-property.spec.js b/test/middlewares/controllers/by-property.spec.js index dc0a2f5..fdd1cb3 100644 --- a/test/middlewares/controllers/by-property.spec.js +++ b/test/middlewares/controllers/by-property.spec.js @@ -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) }) }) diff --git a/test/middlewares/controllers/dir/example.js b/test/middlewares/controllers/dir/example.js new file mode 100644 index 0000000..aeaf6f5 --- /dev/null +++ b/test/middlewares/controllers/dir/example.js @@ -0,0 +1,3 @@ +const example = require('../example') + +module.exports = example diff --git a/test/middlewares/controllers/example.js b/test/middlewares/controllers/example.js new file mode 100644 index 0000000..e0767ef --- /dev/null +++ b/test/middlewares/controllers/example.js @@ -0,0 +1 @@ +module.exports = (req, res, next) => ({req, res, next}) diff --git a/test/middlewares/controllers/rejected-promise-controller.js b/test/middlewares/controllers/rejected-promise-controller.js new file mode 100644 index 0000000..8805e04 --- /dev/null +++ b/test/middlewares/controllers/rejected-promise-controller.js @@ -0,0 +1 @@ +module.exports = () => Promise.reject(new Error())