seven-boom
Version:
A decorator around Boom (HTTP-friendly error objects) to empower it
669 lines (463 loc) • 21.5 kB
JavaScript
;
var _chai = require('chai');
var _chai2 = _interopRequireDefault(_chai);
var _chaiAsPromised = require('chai-as-promised');
var _chaiAsPromised2 = _interopRequireDefault(_chaiAsPromised);
require('regenerator-runtime/runtime');
var _sevenBoom = require('./sevenBoom');
var _sevenBoom2 = _interopRequireDefault(_sevenBoom);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_sevenBoom2.default.init();
_chai2.default.use(_chaiAsPromised2.default);
var expect = _chai2.default.expect;
// Most of this tests are taken from the Boom repo
// In order to make sure that you can just replace all Boom with SevenBoom
describe('Boom backward compatibility', function () {
it('returns the same object when already boom', function (done) {
var error = _sevenBoom2.default.badRequest();
var wrapped = _sevenBoom2.default.wrap(error);
expect(error).to.equal(wrapped);
done();
});
it('should contain boom fields', function (done) {
var error = _sevenBoom2.default.badRequest('Missing data', { type: 'user' });
expect(error.data.type).to.equal('user');
expect(error.output.payload.message).to.equal('Missing data');
done();
});
it('returns an error with info when constructed using another error', function (done) {
var error = new Error('ka-boom');
error.xyz = 123;
var err = _sevenBoom2.default.wrap(error);
expect(err.xyz).to.equal(123);
expect(err.message).to.equal('ka-boom');
expect(err.output.statusCode).to.equal(500);
expect(err.output.payload).to.include({
statusCode: 500,
error: 'Internal Server Error',
message: 'An internal server error occurred'
});
expect(err.data).to.equal(null);
done();
});
it('does not override data when constructed using another error', function (done) {
var error = new Error('ka-boom');
error.data = { useful: 'data' };
var err = _sevenBoom2.default.wrap(error);
expect(err.data).to.equal(error.data);
done();
});
it('sets new message when none exists', function (done) {
var error = new Error();
var wrapped = _sevenBoom2.default.wrap(error, 400, 'something bad');
expect(wrapped.message).to.equal('something bad');
done();
});
it('throws when statusCode is not a number', function (done) {
expect(function () {
_sevenBoom2.default.create('x');
}).to.throw('First argument must be a number (400+): x');
done();
});
it('will cast a number-string to an integer', function (done) {
var codes = [{ input: '404', result: 404 }, { input: '404.1', result: 404 }, { input: 400, result: 400 }, { input: 400.123, result: 400 }];
for (var i = 0; i < codes.length; ++i) {
var code = codes[i];
var err = _sevenBoom2.default.create(code.input);
expect(err.output.statusCode).to.equal(code.result);
}
done();
});
it('throws when statusCode is not finite', function (done) {
expect(function () {
_sevenBoom2.default.create(1 / 0);
}).to.throw('First argument must be a number (400+): null');
done();
});
it('sets error code to unknown', function (done) {
var err = _sevenBoom2.default.create(999);
expect(err.output.payload.error).to.equal('Unknown');
done();
});
describe('isBoom()', function () {
it('returns true for Boom object', function (done) {
expect(_sevenBoom2.default.badRequest().isBoom).to.equal(true);
done();
});
it('returns false for Error object', function (done) {
expect(new Error()).to.not.have.property('isBoom');
done();
});
});
describe('badRequest()', function () {
it('returns a 400 error statusCode', function (done) {
var error = _sevenBoom2.default.badRequest();
expect(error.output.statusCode).to.equal(400);
expect(error.isServer).to.equal(false);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.badRequest('my message').message).to.equal('my message');
done();
});
it('sets the message to HTTP status if none provided', function (done) {
expect(_sevenBoom2.default.badRequest().message).to.equal('Bad Request');
done();
});
});
describe('unauthorized()', function () {
it('returns a 401 error statusCode', function (done) {
var err = _sevenBoom2.default.unauthorized();
expect(err.output.statusCode).to.equal(401);
expect(err.output.headers).to.be.empty;
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.unauthorized('my message').message).to.equal('my message');
done();
});
it('returns a WWW-Authenticate header when passed a scheme', function (done) {
var err = _sevenBoom2.default.unauthorized('boom', 'Test');
expect(err.output.statusCode).to.equal(401);
expect(err.output.headers['WWW-Authenticate']).to.equal('Test error="boom"');
done();
});
it('returns a WWW-Authenticate header set to the schema array value', function (done) {
var err = _sevenBoom2.default.unauthorized(null, ['Test', 'one', 'two']);
expect(err.output.statusCode).to.equal(401);
expect(err.output.headers['WWW-Authenticate']).to.equal('Test, one, two');
done();
});
it('returns a WWW-Authenticate header when passed a scheme and attributes', function (done) {
var err = _sevenBoom2.default.unauthorized('boom', 'Test', { a: 1, b: 'something', c: null, d: 0 });
expect(err.output.statusCode).to.equal(401);
expect(err.output.headers['WWW-Authenticate']).to.equal('Test a="1", b="something", c="", d="0", error="boom"');
expect(err.output.payload.attributes).to.deep.equal({ a: 1, b: 'something', c: '', d: 0, error: 'boom' });
done();
});
it('returns a WWW-Authenticate header when passed attributes, missing error', function (done) {
var err = _sevenBoom2.default.unauthorized(null, 'Test', { a: 1, b: 'something', c: null, d: 0 });
expect(err.output.statusCode).to.equal(401);
expect(err.output.headers['WWW-Authenticate']).to.equal('Test a="1", b="something", c="", d="0"');
expect(err.isMissing).to.equal(true);
done();
});
it('sets the isMissing flag when error message is empty', function (done) {
var err = _sevenBoom2.default.unauthorized('', 'Basic');
expect(err.isMissing).to.equal(true);
done();
});
it('does not set the isMissing flag when error message is not empty', function (done) {
var err = _sevenBoom2.default.unauthorized('message', 'Basic');
expect(err.isMissing).to.equal(undefined);
done();
});
it('sets a WWW-Authenticate when passed as an array', function (done) {
var err = _sevenBoom2.default.unauthorized('message', ['Basic', 'Example e="1"', 'Another x="3", y="4"']);
expect(err.output.headers['WWW-Authenticate']).to.equal('Basic, Example e="1", Another x="3", y="4"');
done();
});
});
describe('paymentRequired()', function () {
it('returns a 402 error statusCode', function (done) {
expect(_sevenBoom2.default.paymentRequired().output.statusCode).to.equal(402);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.paymentRequired('my message').message).to.equal('my message');
done();
});
it('sets the message to HTTP status if none provided', function (done) {
expect(_sevenBoom2.default.paymentRequired().message).to.equal('Payment Required');
done();
});
});
describe('methodNotAllowed()', function () {
it('returns a 405 error statusCode', function (done) {
expect(_sevenBoom2.default.methodNotAllowed().output.statusCode).to.equal(405);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.methodNotAllowed('my message').message).to.equal('my message');
done();
});
it('returns an Allow header when passed a string', function (done) {
var err = _sevenBoom2.default.methodNotAllowed('my message', null, 'GET');
expect(err.output.statusCode).to.equal(405);
expect(err.output.headers.Allow).to.equal('GET');
done();
});
it('returns an Allow header when passed an array', function (done) {
var err = _sevenBoom2.default.methodNotAllowed('my message', null, ['GET', 'POST']);
expect(err.output.statusCode).to.equal(405);
expect(err.output.headers.Allow).to.equal('GET, POST');
done();
});
});
describe('notAcceptable()', function () {
it('returns a 406 error statusCode', function (done) {
expect(_sevenBoom2.default.notAcceptable().output.statusCode).to.equal(406);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.notAcceptable('my message').message).to.equal('my message');
done();
});
});
describe('proxyAuthRequired()', function () {
it('returns a 407 error statusCode', function (done) {
expect(_sevenBoom2.default.proxyAuthRequired().output.statusCode).to.equal(407);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.proxyAuthRequired('my message').message).to.equal('my message');
done();
});
});
describe('clientTimeout()', function () {
it('returns a 408 error statusCode', function (done) {
expect(_sevenBoom2.default.clientTimeout().output.statusCode).to.equal(408);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.clientTimeout('my message').message).to.equal('my message');
done();
});
});
describe('conflict()', function () {
it('returns a 409 error statusCode', function (done) {
expect(_sevenBoom2.default.conflict().output.statusCode).to.equal(409);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.conflict('my message').message).to.equal('my message');
done();
});
});
describe('resourceGone()', function () {
it('returns a 410 error statusCode', function (done) {
expect(_sevenBoom2.default.resourceGone().output.statusCode).to.equal(410);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.resourceGone('my message').message).to.equal('my message');
done();
});
});
describe('lengthRequired()', function () {
it('returns a 411 error statusCode', function (done) {
expect(_sevenBoom2.default.lengthRequired().output.statusCode).to.equal(411);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.lengthRequired('my message').message).to.equal('my message');
done();
});
});
describe('preconditionFailed()', function () {
it('returns a 412 error statusCode', function (done) {
expect(_sevenBoom2.default.preconditionFailed().output.statusCode).to.equal(412);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.preconditionFailed('my message').message).to.equal('my message');
done();
});
});
describe('entityTooLarge()', function () {
it('returns a 413 error statusCode', function (done) {
expect(_sevenBoom2.default.entityTooLarge().output.statusCode).to.equal(413);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.entityTooLarge('my message').message).to.equal('my message');
done();
});
});
describe('uriTooLong()', function () {
it('returns a 414 error statusCode', function (done) {
expect(_sevenBoom2.default.uriTooLong().output.statusCode).to.equal(414);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.uriTooLong('my message').message).to.equal('my message');
done();
});
});
describe('unsupportedMediaType()', function () {
it('returns a 415 error statusCode', function (done) {
expect(_sevenBoom2.default.unsupportedMediaType().output.statusCode).to.equal(415);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.unsupportedMediaType('my message').message).to.equal('my message');
done();
});
});
describe('rangeNotSatisfiable()', function () {
it('returns a 416 error statusCode', function (done) {
expect(_sevenBoom2.default.rangeNotSatisfiable().output.statusCode).to.equal(416);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.rangeNotSatisfiable('my message').message).to.equal('my message');
done();
});
});
describe('expectationFailed()', function () {
it('returns a 417 error statusCode', function (done) {
expect(_sevenBoom2.default.expectationFailed().output.statusCode).to.equal(417);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.expectationFailed('my message').message).to.equal('my message');
done();
});
});
describe('badData()', function () {
it('returns a 422 error statusCode', function (done) {
expect(_sevenBoom2.default.badData().output.statusCode).to.equal(422);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.badData('my message').message).to.equal('my message');
done();
});
});
describe('locked()', function () {
it('returns a 423 error statusCode', function (done) {
expect(_sevenBoom2.default.locked().output.statusCode).to.equal(423);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.locked('my message').message).to.equal('my message');
done();
});
});
describe('preconditionRequired()', function () {
it('returns a 428 error statusCode', function (done) {
expect(_sevenBoom2.default.preconditionRequired().output.statusCode).to.equal(428);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.preconditionRequired('my message').message).to.equal('my message');
done();
});
});
describe('tooManyRequests()', function () {
it('returns a 429 error statusCode', function (done) {
expect(_sevenBoom2.default.tooManyRequests().output.statusCode).to.equal(429);
done();
});
it('sets the message with the passed-in message', function (done) {
expect(_sevenBoom2.default.tooManyRequests('my message').message).to.equal('my message');
done();
});
});
describe('illegal()', function () {
it('returns a 451 error statusCode', function (done) {
expect(_sevenBoom2.default.illegal().output.statusCode).to.equal(451);
done();
});
it('sets the message with the passed-in message', function (done) {
expect(_sevenBoom2.default.illegal('my message').message).to.equal('my message');
done();
});
});
describe('serverUnavailable()', function () {
it('returns a 503 error statusCode', function (done) {
expect(_sevenBoom2.default.serverUnavailable().output.statusCode).to.equal(503);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.serverUnavailable('my message').message).to.equal('my message');
done();
});
});
describe('forbidden()', function () {
it('returns a 403 error statusCode', function (done) {
expect(_sevenBoom2.default.forbidden().output.statusCode).to.equal(403);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.forbidden('my message').message).to.equal('my message');
done();
});
});
describe('notFound()', function () {
it('returns a 404 error statusCode', function (done) {
expect(_sevenBoom2.default.notFound().output.statusCode).to.equal(404);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.notFound('my message').message).to.equal('my message');
done();
});
});
describe('internal()', function () {
it('returns a 500 error statusCode', function (done) {
expect(_sevenBoom2.default.internal().output.statusCode).to.equal(500);
done();
});
it('sets the message with the passed in message', function (done) {
var err = _sevenBoom2.default.internal('my message');
expect(err.message).to.equal('my message');
expect(err.isServer).to.equal(true);
expect(err.output.payload.message).to.equal('An internal server error occurred');
done();
});
it('passes data on the callback if its passed in', function (done) {
expect(_sevenBoom2.default.internal('my message', { my: 'data' }).data.my).to.equal('data');
done();
});
it('returns an error with composite message', function (done) {
try {
x.foo();
} catch (err) {
var boom = _sevenBoom2.default.internal('Someting bad', err);
expect(boom.message).to.equal('Someting bad: x is not defined');
expect(boom.isServer).to.equal(true);
done();
}
});
});
describe('notImplemented()', function () {
it('returns a 501 error statusCode', function (done) {
expect(_sevenBoom2.default.notImplemented().output.statusCode).to.equal(501);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.notImplemented('my message').message).to.equal('my message');
done();
});
});
describe('badGateway()', function () {
it('returns a 502 error statusCode', function (done) {
expect(_sevenBoom2.default.badGateway().output.statusCode).to.equal(502);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.badGateway('my message').message).to.equal('my message');
done();
});
});
describe('gatewayTimeout()', function () {
it('returns a 504 error statusCode', function (done) {
expect(_sevenBoom2.default.gatewayTimeout().output.statusCode).to.equal(504);
done();
});
it('sets the message with the passed in message', function (done) {
expect(_sevenBoom2.default.gatewayTimeout('my message').message).to.equal('my message');
done();
});
});
describe('badImplementation()', function () {
it('returns a 500 error statusCode', function (done) {
var err = _sevenBoom2.default.badImplementation();
expect(err.output.statusCode).to.equal(500);
expect(err.isDeveloperError).to.equal(true);
expect(err.isServer).to.equal(true);
done();
});
});
});