serverless/test/unit/lib/plugins/aws/deploy-list.test.js
2024-05-29 11:51:04 -04:00

238 lines
6.8 KiB
JavaScript

'use strict'
const sinon = require('sinon')
const expect = require('chai').expect
const AwsDeployList = require('../../../../../lib/plugins/aws/deploy-list')
const AwsProvider = require('../../../../../lib/plugins/aws/provider')
const Serverless = require('../../../../../lib/serverless')
describe('AwsDeployList', () => {
let serverless
let provider
let awsDeployList
let s3Key
beforeEach(() => {
const options = {
stage: 'dev',
region: 'us-east-1',
}
serverless = new Serverless({ commands: [], options: {} })
provider = new AwsProvider(serverless, options)
serverless.setProvider('aws', provider)
serverless.service.service = 'listDeployments'
const prefix = provider.getDeploymentPrefix()
s3Key = `${prefix}/${serverless.service.service}/${provider.getStage()}`
awsDeployList = new AwsDeployList(serverless, options)
awsDeployList.bucketName = 'deployment-bucket'
})
describe('#listDeployments()', () => {
it('should print no deployments in case there are none', async () => {
const s3Response = {
Contents: [],
}
const listObjectsStub = sinon
.stub(awsDeployList.provider, 'request')
.resolves(s3Response)
await awsDeployList.listDeployments()
expect(listObjectsStub.calledOnce).to.be.equal(true)
expect(
listObjectsStub.calledWithExactly('S3', 'listObjectsV2', {
Bucket: awsDeployList.bucketName,
Prefix: `${s3Key}`,
}),
).to.be.equal(true)
awsDeployList.provider.request.restore()
})
it('should display all available deployments', async () => {
const s3Response = {
Contents: [
{ Key: `${s3Key}/113304333331-2016-08-18T13:40:06/artifact.zip` },
{
Key: `${s3Key}/113304333331-2016-08-18T13:40:06/cloudformation.json`,
},
{ Key: `${s3Key}/903940390431-2016-08-18T23:42:08/artifact.zip` },
{
Key: `${s3Key}/903940390431-2016-08-18T23:42:08/cloudformation.json`,
},
],
}
const listObjectsStub = sinon
.stub(awsDeployList.provider, 'request')
.resolves(s3Response)
await awsDeployList.listDeployments()
expect(listObjectsStub.calledOnce).to.be.equal(true)
expect(
listObjectsStub.calledWithExactly('S3', 'listObjectsV2', {
Bucket: awsDeployList.bucketName,
Prefix: `${s3Key}`,
}),
).to.be.equal(true)
awsDeployList.provider.request.restore()
})
})
describe('#listFunctions()', () => {
let getFunctionsStub
let getFunctionVersionsStub
let displayFunctionsStub
beforeEach(() => {
getFunctionsStub = sinon.stub(awsDeployList, 'getFunctions').resolves()
getFunctionVersionsStub = sinon
.stub(awsDeployList, 'getFunctionVersions')
.resolves()
displayFunctionsStub = sinon
.stub(awsDeployList, 'displayFunctions')
.resolves()
})
afterEach(() => {
awsDeployList.getFunctions.restore()
awsDeployList.getFunctionVersions.restore()
awsDeployList.displayFunctions.restore()
})
it('should run promise chain in order', async () => {
await awsDeployList.listFunctions()
expect(getFunctionsStub.calledOnce).to.equal(true)
expect(getFunctionVersionsStub.calledAfter(getFunctionsStub)).to.equal(
true,
)
expect(
displayFunctionsStub.calledAfter(getFunctionVersionsStub),
).to.equal(true)
})
})
describe('#getFunctions()', () => {
let listFunctionsStub
beforeEach(() => {
awsDeployList.serverless.service.functions = {
func1: {
name: 'listDeployments-dev-func1',
},
func2: {
name: 'listDeployments-dev-func2',
},
}
listFunctionsStub = sinon.stub(awsDeployList.provider, 'request')
listFunctionsStub.onCall(0).resolves({
Configuration: {
FunctionName: 'listDeployments-dev-func1',
},
})
listFunctionsStub.onCall(1).resolves({
Configuration: {
FunctionName: 'listDeployments-dev-func2',
},
})
})
afterEach(() => {
awsDeployList.provider.request.restore()
})
it('should get all service related functions', async () => {
const expectedResult = [
{ FunctionName: 'listDeployments-dev-func1' },
{ FunctionName: 'listDeployments-dev-func2' },
]
const result = await awsDeployList.getFunctions()
expect(listFunctionsStub.callCount).to.equal(2)
expect(result).to.deep.equal(expectedResult)
})
})
describe('#getFunctionPaginatedVersions()', () => {
beforeEach(() => {
sinon
.stub(awsDeployList.provider, 'request')
.onFirstCall()
.resolves({
Versions: [
{ FunctionName: 'listDeployments-dev-func', Version: '1' },
],
NextMarker: '123',
})
.onSecondCall()
.resolves({
Versions: [
{ FunctionName: 'listDeployments-dev-func', Version: '2' },
],
})
})
afterEach(() => {
awsDeployList.provider.request.restore()
})
it('should return the versions for the provided function when response is paginated', async () => {
const params = {
FunctionName: 'listDeployments-dev-func',
}
const result = await awsDeployList.getFunctionPaginatedVersions(params)
const expectedResult = {
Versions: [
{ FunctionName: 'listDeployments-dev-func', Version: '1' },
{ FunctionName: 'listDeployments-dev-func', Version: '2' },
],
}
expect(result).to.deep.equal(expectedResult)
})
})
describe('#getFunctionVersions()', () => {
let listVersionsByFunctionStub
beforeEach(() => {
listVersionsByFunctionStub = sinon
.stub(awsDeployList.provider, 'request')
.resolves({
Versions: [
{ FunctionName: 'listDeployments-dev-func', Version: '$LATEST' },
],
})
})
afterEach(() => {
awsDeployList.provider.request.restore()
})
it('should return the versions for the provided functions', async () => {
const funcs = [
{ FunctionName: 'listDeployments-dev-func1' },
{ FunctionName: 'listDeployments-dev-func2' },
]
const result = await awsDeployList.getFunctionVersions(funcs)
const expectedResult = [
{
Versions: [
{ FunctionName: 'listDeployments-dev-func', Version: '$LATEST' },
],
},
{
Versions: [
{ FunctionName: 'listDeployments-dev-func', Version: '$LATEST' },
],
},
]
expect(listVersionsByFunctionStub.calledTwice).to.equal(true)
expect(result).to.deep.equal(expectedResult)
})
})
})