serverless/test/integration/apiGatewayExternal.test.js
2021-04-16 13:32:13 +02:00

78 lines
2.7 KiB
JavaScript

'use strict';
const { expect } = require('chai');
const log = require('log').get('serverless:test');
const awsRequest = require('@serverless/test/aws-request');
const fixtures = require('../fixtures/programmatic');
const { deployService, removeService, fetch } = require('../utils/integration');
const { createRestApi, deleteRestApi, getResources } = require('../utils/apiGateway');
describe('AWS - API Gateway with External REST API Integration Test', function () {
this.timeout(1000 * 60 * 10); // Involves time-taking deploys
let endpoint;
let updateConfig;
let stackName;
let serviceDir;
let isDeployed = false;
let restApiId;
const stage = 'dev';
const resolveEndpoint = async () => {
const result = await awsRequest('CloudFormation', 'describeStacks', { StackName: stackName });
const endpointOutput = result.Stacks[0].Outputs.find(
(output) => output.OutputKey === 'ServiceEndpoint'
).OutputValue;
endpoint = endpointOutput.match(/https:\/\/.+\.execute-api\..+\.amazonaws\.com.+/)[0];
};
before(async () => {
const serviceData = await fixtures.setup('apiGateway');
({ servicePath: serviceDir, updateConfig } = serviceData);
const serviceName = serviceData.serviceConfig.service;
const externalRestApiName = `${stage}-${serviceName}-ext-api`;
const restApiMeta = await createRestApi(externalRestApiName);
restApiId = restApiMeta.id;
const resources = await getResources(restApiId);
const restApiRootResourceId = resources[0].id;
log.notice(
'Created external rest API ' +
`(id: ${restApiId}, root resource id: ${restApiRootResourceId})`
);
await updateConfig({
provider: {
apiGateway: {
restApiId,
restApiRootResourceId,
},
},
});
stackName = `${serviceName}-${stage}`;
await deployService(serviceDir);
isDeployed = true;
return resolveEndpoint();
});
after(async () => {
if (!isDeployed) return;
log.notice('Removing service...');
await removeService(serviceDir);
log.notice('Deleting external rest API...');
await deleteRestApi(restApiId);
});
it('should expose an accessible GET HTTP endpoint', () => {
return fetch(endpoint, { method: 'GET' })
.then((response) => response.json())
.then((json) => expect(json.message).to.equal('Hello from API Gateway! - (minimal)'));
});
it('should expose an accessible POST HTTP endpoint', () => {
const testEndpoint = `${endpoint}/minimal-1`;
return fetch(testEndpoint, { method: 'POST' })
.then((response) => response.json())
.then((json) => expect(json.message).to.equal('Hello from API Gateway! - (minimal)'));
});
});