Skip to content

Commit

Permalink
more error handling changes
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeff Mackay committed Apr 29, 2016
1 parent cf60a36 commit 128f5c5
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 15 deletions.
25 changes: 13 additions & 12 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand All @@ -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) {
Expand Down
42 changes: 39 additions & 3 deletions test/test-router.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

var Lambda = require('../index');
var Boom = require('boom');
var Joi = require('joi');

var router;

Expand Down Expand Up @@ -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',
Expand Down Expand Up @@ -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',
Expand Down Expand Up @@ -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',
Expand Down

0 comments on commit 128f5c5

Please sign in to comment.