diff --git a/index.js b/index.js index f81fffb..cd4787f 100644 --- a/index.js +++ b/index.js @@ -46,12 +46,12 @@ internals.Router.prototype.route = function(event, context) { var self = this; return new Promise((resolve, reject) => { if (context == null) { - let error = processError(Boom.badImplementation('context is required')); + let error = this._processError(Boom.badImplementation('context is required')); return reject(error); } var result = Joi.validate(event, eventSchema); if (result.error) { - let error = processError(result.error); + let error = this._processError(result.error); return reject(error); } @@ -63,32 +63,33 @@ internals.Router.prototype.route = function(event, context) { return resolve(response); }) .catch((error) => { - var errorStatus = (error.isBoom) ? error.output.payload : error; - return reject(errorStatus); + let newError = this._processError(error); + return reject(newError); }); } else { - let error = processError(Boom.notImplemented(event.context['http-method'] + ' handler for path [' + event.context['resource-path'] + '] not registered')); + let error = this._processError(Boom.notImplemented(event.context['http-method'] + ' handler for path [' + event.context['resource-path'] + '] not registered')); return reject(error); } } else { - let error = processError(Boom.badImplementation('Request context, method, and path are required')); + let error = this._processError(Boom.badImplementation('Request context, method, and path are required')); return reject(error); } }); }; -function processError(error) { +internals.Router.prototype._processError = function(error) { + var transformed = error; if (error.isJoi) { - error = validationError(error); + transformed = this._validationError(error); } - if (error.isBoom) { - error = error.output.payload; + if (transformed.isBoom) { + transformed = transformed.output.payload; } - return error; + return transformed; } -function validationError(error) { +internals.Router.prototype._validationError = function(error) { var errorValue; errorValue = Boom.badRequest('Invalid request input: ' + error.message); if (error.details) { diff --git a/test/test-router.js b/test/test-router.js index e2d3d68..08f5ea8 100644 --- a/test/test-router.js +++ b/test/test-router.js @@ -4,6 +4,7 @@ var Lambda = require('../index'); var Boom = require('boom'); +var Joi = require('joi'); var router; @@ -198,7 +199,7 @@ describe('Router:@unit', () => { }); - it('should fail when request causes handler to reject', (done) => { + it('should fail when request causes handler reject', (done) => { var route = { path: '/hello', method: 'GET', @@ -229,7 +230,42 @@ describe('Router:@unit', () => { }); - it('should fail with a Boom payload when request causes handler to reject', (done) => { + it('should transform error when handler rejects with a ValidationError', (done) => { + var route = { + path: '/hello', + method: 'GET', + handler: (event, context) => { + return new Promise((resolve, reject) => { + var schema = Joi.string(); + var result = Joi.validate(1, schema); + expect(result.error).to.exist; + return reject(result.error); + }); + } + }; + var event = { + context: { + 'resource-path': '/hello', + 'http-method': 'GET' + } + }; + router.register(route); + router.route(event, context) + .then((response) => { + expect(response).to.not.exist; + context.done(null, response); + done(); + }) + .catch((error) => { + expect(error).to.exist; + expect(error.statusCode).to.equal(400); + context.done(error, null); + done(); + }); + + }); + + it('should fail with a badImplementation error when request causes handler to reject', (done) => { var route = { path: '/hello', method: 'GET', @@ -259,7 +295,7 @@ describe('Router:@unit', () => { done(); }); }); - it('should fail with a Boom payload when request has invalid properties', (done) => { + it('should fail with a badImplementation error when request has invalid properties', (done) => { var route = { path: '/hello', method: 'GET',