serverless/test/integration/eventBridge.test.js
2020-09-09 11:17:21 +02:00

152 lines
5.0 KiB
JavaScript

'use strict';
const { expect } = require('chai');
const log = require('log').get('serverless:test');
const fixtures = require('../fixtures');
const { confirmCloudWatchLogs } = require('../utils/misc');
const {
createEventBus,
putEvents,
deleteEventBus,
describeEventBus,
} = require('../utils/eventBridge');
const { deployService, removeService, getMarkers } = require('../utils/integration');
describe('AWS - Event Bridge Integration Test', function() {
this.timeout(1000 * 60 * 10); // Involves time-taking deploys
let serviceName;
let stackName;
let servicePath;
let namedEventBusName;
let arnEventBusName;
let arnEventBusArn;
const eventSource = 'serverless.test';
const stage = 'dev';
const putEventEntries = [
{
Source: eventSource,
DetailType: 'ServerlessDetailType',
Detail: '{"Key1":"Value1"}',
},
];
before(async () => {
const serviceData = await fixtures.setup('eventBridge');
({ servicePath } = serviceData);
serviceName = serviceData.serviceConfig.service;
namedEventBusName = `${serviceName}-named-event-bus`;
arnEventBusName = `${serviceName}-arn-event-bus`;
// get default event bus ARN
const defaultEventBusArn = (await describeEventBus('default')).Arn;
stackName = `${serviceName}-${stage}`;
// create an external Event Bus
// NOTE: deployment can only be done once the Event Bus is created
arnEventBusArn = (await createEventBus(arnEventBusName)).EventBusArn;
// update the YAML file with the arn
await serviceData.updateConfig({
functions: {
eventBusDefaultArn: {
events: [
{
eventBridge: {
eventBus: defaultEventBusArn,
pattern: { source: ['serverless.test'] },
},
},
],
},
eventBusArn: {
events: [
{
eventBridge: {
eventBus: arnEventBusArn,
pattern: { source: ['serverless.test'] },
},
},
],
},
},
});
// deploy the service
return deployService(servicePath);
});
after(async () => {
log.notice('Removing service...');
await removeService(servicePath);
log.notice(`Deleting Event Bus "${arnEventBusName}"...`);
return deleteEventBus(arnEventBusName);
});
describe('Default Event Bus', () => {
it('should invoke function when an event is sent to the event bus', () => {
const functionName = 'eventBusDefault';
const markers = getMarkers(functionName);
return confirmCloudWatchLogs(
`/aws/lambda/${stackName}-${functionName}`,
() => putEvents('default', putEventEntries),
{
checkIsComplete: events =>
events.find(event => event.message.includes(markers.start)) &&
events.find(event => event.message.includes(markers.end)),
}
).then(events => {
const logs = events.map(event => event.message).join('\n');
expect(logs).to.include(`"source":"${eventSource}"`);
expect(logs).to.include(`"detail-type":"${putEventEntries[0].DetailType}"`);
expect(logs).to.include(`"detail":${putEventEntries[0].Detail}`);
});
});
});
describe('Custom Event Bus', () => {
it('should invoke function when an event is sent to the event bus', () => {
const functionName = 'eventBusCustom';
const markers = getMarkers(functionName);
return confirmCloudWatchLogs(
`/aws/lambda/${stackName}-${functionName}`,
() => putEvents(namedEventBusName, putEventEntries),
{
checkIsComplete: events =>
events.find(event => event.message.includes(markers.start)) &&
events.find(event => event.message.includes(markers.end)),
}
).then(events => {
const logs = events.map(event => event.message).join('\n');
expect(logs).to.include(`"source":"${eventSource}"`);
expect(logs).to.include(`"detail-type":"${putEventEntries[0].DetailType}"`);
expect(logs).to.include(`"detail":${putEventEntries[0].Detail}`);
});
});
});
describe('Arn Event Bus', () => {
it('should invoke function when an event is sent to the event bus', () => {
const functionName = 'eventBusArn';
const markers = getMarkers(functionName);
return confirmCloudWatchLogs(
`/aws/lambda/${stackName}-${functionName}`,
() => putEvents(arnEventBusName, putEventEntries),
{
checkIsComplete: events =>
events.find(event => event.message.includes(markers.start)) &&
events.find(event => event.message.includes(markers.end)),
}
).then(events => {
const logs = events.map(event => event.message).join('\n');
expect(logs).to.include(`"source":"${eventSource}"`);
expect(logs).to.include(`"detail-type":"${putEventEntries[0].DetailType}"`);
expect(logs).to.include(`"detail":${putEventEntries[0].Detail}`);
});
});
});
});