UNPKG

lambda-stash

Version:

AWS Lambda script for shipping data from S3 or other cloud data sources to data stores, like Elasticsearch

266 lines (256 loc) 7.09 kB
/* global beforeEach, describe, it */ var assert = require("assert"); var fs = require("fs"); var index; describe('index.js', function() { describe('#handler()', function() { beforeEach(function() { // Clear the module cache to reset overridden functions. delete require.cache; index = require("../index"); }); it('selects mapping based on S3 bucket and completes with mock', function(done) { var AWS = require('aws-sdk'); AWS.S3 = function() { return { getObject: function(params, callback) { assert.strictEqual(params.Bucket, 'source-bucket', 'S3.getObject invoked with correct S3 bucket'); callback(null, {Body: '{"status": "successful-response"}'}); } }; }; var config = { mappings: [ { bucket: 'non-match-bucket', processors: [ 'parseJson' ] }, { bucket: 'source-bucket', processors: [ 'parseJson' ] } ] }; var event = { Records: [ { eventSource: 'aws:s3', s3: { bucket: { name: 'source-bucket' }, object: { key: 'source/key' } } } ] }; var context; var callback = function(err /* , config */) { assert.ok(!err, 'no error is given'); done(); }; index.handler(config, event, context, callback); }); it('handles a CloudWatch Logs event and completes parsing', function(done) { var config = { mappings: [ { type: 'CloudWatch', processors: [ 'shipElasticsearch' ] } ] }; var dataSource = fs.readFileSync("test/assets/cloudwatch.source.txt"); var dataJson = JSON.parse(fs.readFileSync( "test/assets/cloudwatch.parse.json")); var event = { awslogs: { data: dataSource.toString() } }; var context; var callback = function() {}; var shipElasticsearch = require('../handlers/shipElasticsearch'); shipElasticsearch.process = function(config) { assert.deepStrictEqual(config.data, dataJson, 'CloudWatch Log is parsed'); done(); }; index.handler(config, event, context, callback); }); it('handles a custom handler provided as a function', function(done) { var AWS = require('aws-sdk'); AWS.S3 = function() { return { getObject: function(params, callback) { assert.strictEqual(params.Bucket, 'source-bucket', 'S3.getObject invoked with correct S3 bucket'); callback(null, {Body: '{"status": "successful-response"}'}); } }; }; var ranCustomHandler = false; var customHandler = function(config) { console.log('customHandler'); ranCustomHandler = true; return Promise.resolve(config); }; var config = { mappings: [ { bucket: 'source-bucket', processors: [ customHandler ] } ] }; var event = { Records: [ { eventSource: 'aws:s3', s3: { bucket: { name: 'source-bucket' }, object: { key: 'source/key' } } } ] }; var context = {}; var callback = function(err /* , result */) { assert.ok(!err, 'no error is given'); assert.ok(ranCustomHandler, 'custom handler was run'); done(); }; index.handler(config, event, context, callback); }); it('throws error if a handler throws an error', function(done) { var AWS = require('aws-sdk'); AWS.S3 = function() { return { getObject: function(/* params, callback */) { throw new Error('test error'); } }; }; var config = { mappings: [ { bucket: 'source-bucket' } ] }; var event = { Records: [ { eventSource: 'aws:s3', s3: { bucket: { name: 'source-bucket' }, object: { key: 'source/key' } } } ] }; var context = { fail: function(err) { assert.ok(err, 'error is thrown'); done(); } }; var callback = function() {}; index.handler(config, event, context, callback); }); it('throws error for an invalid processor', function(done) { var AWS = require('aws-sdk'); AWS.S3 = function() { return { getObject: function(params, callback) { callback(null, {Body: 'successful-response'}); } }; }; var config = { mappings: [ { bucket: 'source-bucket', processors: [ 'invalid-processor' ] } ] }; var event = { Records: [ { eventSource: 'aws:s3', s3: { bucket: { name: 'source-bucket' }, object: { key: 'source/key' } } } ] }; var context = { fail: function(err) { assert.ok(err, 'error is thrown'); done(); } }; var callback = function() {}; index.handler(config, event, context, callback); }); it('ends without error if no mapping is found', function(done) { var config = {}; var event = { Records: [ { eventSource: 'aws:s3', s3: { bucket: { name: 'source-bucket' }, object: { key: 'source/key' } } } ] }; var context; var callback = function(err, result) { assert.ok(!err, 'no error is given'); assert.strictEqual(result, 'Event did not match any mappings.', 'invokes callback with status'); done(); }; index.handler(config, event, context, callback); }); }); });