Skip to content

Instantly share code, notes, and snippets.

@OssiPesonen
Created November 14, 2020 15:25
Show Gist options
  • Save OssiPesonen/1e0909903f5efec734e152a6cc81e688 to your computer and use it in GitHub Desktop.
Save OssiPesonen/1e0909903f5efec734e152a6cc81e688 to your computer and use it in GitHub Desktop.
Lambda SES bounce event handler unit test
'use strict';
const AWS = require('aws-sdk-mock');
const assert = require('assert');
const testFn = require('lambda-tester');
const receiver = require('../index').handler;
const complaintNotification = require('./resources/complaintNotification.json');
const missingHeaders = require('./resources/missingHeaders.json');
const missingTargetArn = require('./resources/missingTargetArnHeader.json');
const bounceNotification = require('./resources/bounceNotification.json');
process.env.DLQ_URL = 'http://localhost';
describe('Testing Lambda handler', async (done) => {
describe('Test non-Bounce message', function () {
it('Should return 200 and return not a bounce message', async function () {
AWS.mock('SQS', 'sendMessage', (params) => {
assert.strictEqual(params.MessageBody, JSON.stringify(complaintNotification));
assert.strictEqual(params.QueueUrl, 'http://localhost');
return Promise.resolve('Success');
});
let params = {
Records: [{
Sns: {
Message: JSON.stringify(complaintNotification)
}
}]
};
await testFn(receiver)
.event(params)
.expectResolve((result) => {
assert.strictEqual(result.statusCode, 200);
assert.strictEqual(result.body, '{"message":"Not a bounce message"}');
});
AWS.restore('SQS', 'sendMessage');
});
it('Should return 200, with original headers missing message', async function () {
AWS.mock('SQS', 'sendMessage', (params) => {
assert.strictEqual(params.MessageBody, JSON.stringify(missingHeaders));
assert.strictEqual(params.QueueUrl, 'http://localhost');
return Promise.resolve('Success');
});
let params = {
Records: [{
Sns: {
Message: JSON.stringify(missingHeaders)
}
}]
};
await testFn(receiver)
.event(params)
.expectResolve((result) => {
assert.strictEqual(result.statusCode, 200);
assert.strictEqual(result.body, '{"message":"Original message headers missing"}');
});
AWS.restore('SQS', 'sendMessage');
});
it('Should return 200, with TargetArn header message missing', async function () {
AWS.mock('SQS', 'sendMessage', (params) => {
assert.strictEqual(params.MessageBody, JSON.stringify(missingTargetArn));
assert.strictEqual(params.QueueUrl, 'http://localhost');
return Promise.resolve('Success');
});
let params = {
Records: [{
Sns: {
Message: JSON.stringify(missingTargetArn)
}
}]
};
await testFn(receiver)
.event(params)
.expectResolve((result) => {
assert.strictEqual(result.statusCode, 200);
assert.strictEqual(result.body, '{"message":"Missing TargetArn header"}');
});
AWS.restore('SQS', 'sendMessage');
});
});
describe('Test successful message delivery', function () {
it('Should return 200, with successful SNS call', async function () {
AWS.mock('SNS', 'publish', (params) => {
assert.strictEqual(params.Message, '{"messageId":"00000138111222aa-33322211-cccc-cccc-cccc-ddddaaaa0680-000000","bounceType":"Permanent","bounceSubType":"General","timestamp":"2016-01-27T14:59:38.237Z","bouncedRecipients":[{"emailAddress":"jane@example.com"}]}');
assert.strictEqual(params.Subject, 'Here is a bounced email notification')
assert.strictEqual(params.TargetArn, 'arn:sns:batman:is:bruce:wayne');
return Promise.resolve('Success');
});
let params = {
Records: [{
Sns: {
Message: JSON.stringify(bounceNotification)
}
}]
};
await testFn(receiver)
.event(params)
.expectResolve((result) => {
assert.strictEqual(result.statusCode, 200);
assert.strictEqual(result.body, '{"message":"ok"}');
});
AWS.restore('SNS', 'publish');
});
});
done();
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment