@incdevco/framework
Version:
node.js lambda framework
516 lines (313 loc) • 10.6 kB
JavaScript
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);
});
});
});