UNPKG

@incdevco/framework

Version:
516 lines (313 loc) 10.6 kB
var Expect = require('chai').expect; var Mock = require('../../mock'); var sinon = require('sinon'); var ApiLambda = require('./index'); var Request = require('./request'); var sandbox = sinon.sandbox.create(); describe('lambda api', function () { 'use strict'; var config, lambda, mock; beforeEach(function () { config = {}; lambda = new ApiLambda(config); mock = new Mock(); sandbox.stub(lambda, 'log'); }); afterEach(function () { mock.restore(); sandbox.verifyAndRestore(); }); describe('handleException', function() { it('should log exception and return generic error response', function () { var event, exception = new Error('Not Generic Error'), request, response; response = { statusCode: 200, body: {} }; mock.mock(lambda).expect('log') .with(exception, exception.stack) .willReturn(true); try { lambda.handleException(exception, event, request, response); } catch (e) { Expect(e.message).to.equal('An Error Occurred', 'e.message'); } }); it('should should convert body to object if string', function () { var event, exception = new Error('Not Generic Error'), request, response; response = { statusCode: 200, body: '' }; mock.mock(lambda).expect('log') .with(exception, exception.stack) .willReturn(true); try { lambda.handleException(exception, event, request, response); } catch (e) { Expect(e.message).to.equal('An Error Occurred', 'e.message'); Expect(typeof response.body).to.equal('object', 'response.body'); } }); }); describe('handler', function() { it('should call handler and receive successful response', function (done) { var context, event, expected; event = { httpMethod: 'POST', path: '/test' }; expected = 'test'; context = { fail: done, succeed: function (result) { Expect(result).to.deep.equal(expected, 'result'); mock.done(done); } }; lambda.register(event.path, event.httpMethod, function (event, request, response) { response.statusCode = expected.statusCode; response.body = expected; return true; }); lambda.register(event.path, 'Not Method', function (event, request, response) { response.statusCode = expected.statusCode; response.body = 'Not Method'; return true; }); lambda.register('Not Path', event.httpMethod, function (event, request, response) { response.statusCode = expected.statusCode; response.body = 'Not Path'; return true; }); lambda.handler(event, context); }); it('should return string when response.body is not a string', function (done) { var context, event, expected; event = { httpMethod: 'POST', path: '/test' }; expected = { "key":"value" }; context = { fail: done, succeed: function (result) { Expect(result).to.deep.equal(expected, 'result'); mock.done(done); } }; lambda.register(event.path, event.httpMethod, function (event, request, response) { response.statusCode = expected.statusCode; response.body = { key: 'value' }; return true; }); lambda.handler(event, context); }); it('should call handler and receive not found response', function (done) { var context, event, expected; event = { httpMethod: 'POST', path: '/test' }; expected = new Error('Not Found'); lambda.logger = { log: function () { } }; context = { succeed: done, fail: function (result) { try { Expect(result).to.deep.equal(expected, 'result'); mock.done(done); } catch (e) { done(e); } } }; lambda.handler(event, context); }); it('should catch any exception thrown by handleException', function(done) { var context, event, expected; event = { httpMethod: 'POST', path: '/test' }; expected = 'expected'; lambda.logger = { log: function () { } }; context = { fail: function (exception) { Expect(exception).to.equal(expected, 'exception'); mock.done(done); }, succeed: done }; mock.mock(lambda).expect('handleException') .willReject(expected); lambda.handler(event, context); }); }); describe('pre', function() { it('should', function (done) { var event = 'event'; var request = 'request'; var response = 'response'; lambda.pre(event, request, response) .then(function (result) { Expect(result).to.equal(true, 'result'); return mock.done(done); }) .catch(done); }); }); describe('post', function() { it('should', function (done) { var event = 'event'; var request = 'request'; var response = 'response'; lambda.post(event, request, response) .then(function (result) { Expect(result).to.equal(true, 'result'); return mock.done(done); }) .catch(done); }); }); describe('register', function() { it('should', function () { var path = '/users/:id'; var httpMethod = 'GET'; var handler = 'handler'; lambda.register(path, httpMethod, handler); Expect(lambda.routes[0].regex.toString()).to.equal('/^\\/users\\/([a-zA-Z0-9-%]+)$/i', 'regex'); Expect(lambda.routes[0].handler).to.equal(handler, 'handler'); }); }); describe('route', function() { it('should route id with dash correctly', function (done) { var event, expected, handler, request; event = { httpMethod: 'GET', params: { path: { id: '12345-12345' } }, path: '/cameras/{id}' }; expected = 'test'; handler = function (event, request, response) { response.statusCode = expected.statusCode; response.body = expected; return true; }; request = new Request({}, event); lambda.register('/cameras/:id', 'GET', handler); lambda.route(event, request) .then(function () { Expect(request.handler).to.deep.equal(handler, 'handler'); done(); }) .catch(done); }); it('should route id with "%3A" correctly', function (done) { var event, expected, handler, request; event = { httpMethod: 'GET', params: { path: { id: '12345%3A12345' } }, path: '/cameras/{id}' }; expected = 'test'; handler = function (event, request, response) { response.statusCode = expected.statusCode; response.body = expected; return true; }; request = new Request({}, event); lambda.register('/cameras/:id', 'GET', handler); lambda.route(event, request) .then(function () { Expect(request.handler).to.deep.equal(handler, 'handler'); done(); }) .catch(done); }); }); describe('routeWithOriginalPath', function() { beforeEach(function() { config.useOriginalPath = true; lambda = new ApiLambda(config); }); it('should route id with dash correctly', function (done) { var event, expected, handler, request; event = { httpMethod: 'GET', params: { path: { id: '12345-12345' } }, originalPath: '/cameras/{id}', path: '/cameras/12345-12345' }; expected = 'test'; handler = function (event, request, response) { response.statusCode = expected.statusCode; response.body = expected; return true; }; request = new Request({}, event); lambda.register('/cameras/{id}', 'GET', handler); lambda.route(event, request) .then(function () { Expect(request.handler).to.deep.equal(handler, 'handler'); done(); }) .catch(done); }); it('should route id with "%3A" correctly', function (done) { var event, expected, handler, request; event = { httpMethod: 'GET', params: { path: { id: '12345%3A12345' } }, originalPath: '/cameras/{id}', path: '/cameras/12345%3A12345' }; expected = 'test'; handler = function (event, request, response) { response.statusCode = expected.statusCode; response.body = expected; return true; }; request = new Request({}, event); lambda.register('/cameras/{id}', 'GET', handler); lambda.route(event, request) .then(function () { Expect(request.handler).to.deep.equal(handler, 'handler'); done(); }) .catch(done); }); }); });