UNPKG

aws-spa

Version:

A no-brainer script to deploy a single page app on AWS

222 lines (218 loc) 9.86 kB
"use strict"; var _acm = require("./acm"); var _awsServices = require("./aws-services"); var _testHelper = require("./test-helper"); jest.mock('inquirer', () => { return { __esModule: true, default: { prompt: jest.fn() } }; }); describe('acm', () => { describe('getCertificateARN', () => { const listCertificatesMock = jest.spyOn(_awsServices.acm, 'listCertificates'); const describeCertificateMock = jest.spyOn(_awsServices.acm, 'describeCertificate'); const waitForMock = jest.spyOn(_awsServices.waitUntil, 'certificateValidated'); afterEach(() => { listCertificatesMock.mockReset(); describeCertificateMock.mockReset(); waitForMock.mockReset(); }); it('should get the list of certificates (1 page)', async () => { listCertificatesMock.mockReturnValue((0, _testHelper.awsResolve)({ CertificateSummaryList: [{ CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/xxx' }] })); describeCertificateMock.mockReturnValue((0, _testHelper.awsResolve)({ Certificate: { Status: 'ISSUED', DomainName: '*.example.com', CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/xxx' } })); const arn = await (0, _acm.getCertificateARN)('hello.example.com'); expect(arn).toEqual('arn:aws:acm:us-east-1:123456789:certificate/xxx'); expect(listCertificatesMock).toHaveBeenCalledTimes(1); }); it('should get the list of certificates (2 page)', async () => { listCertificatesMock.mockReturnValueOnce((0, _testHelper.awsResolve)({ CertificateSummaryList: [{ CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/xxx' }], NextToken: 'xxx' })).mockReturnValueOnce((0, _testHelper.awsResolve)({ CertificateSummaryList: [{ CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/yyy' }] })); describeCertificateMock.mockReturnValueOnce((0, _testHelper.awsResolve)({ Certificate: { Status: 'ISSUED', DomainName: 'hello2.example.com', CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/xxx' } })).mockReturnValueOnce((0, _testHelper.awsResolve)({ Certificate: { Status: 'ISSUED', DomainName: '*.example.com', CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/yyy' } })); const arn = await (0, _acm.getCertificateARN)('hello.example.com'); expect(arn).toEqual('arn:aws:acm:us-east-1:123456789:certificate/yyy'); expect(listCertificatesMock).toHaveBeenCalledTimes(2); }); it('should check alternative names', async () => { listCertificatesMock.mockReturnValue((0, _testHelper.awsResolve)({ CertificateSummaryList: [{ CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/xxx' }] })); describeCertificateMock.mockReturnValue((0, _testHelper.awsResolve)({ Certificate: { DomainName: 'example.com', Status: 'ISSUED', CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/xxx', SubjectAlternativeNames: ['staging.example.com', '*.example.com'] } })); const arn = await (0, _acm.getCertificateARN)('hello.example.com'); expect(arn).toEqual('arn:aws:acm:us-east-1:123456789:certificate/xxx'); }); it('should ignored non issued or pending certificates', async () => { listCertificatesMock.mockReturnValue((0, _testHelper.awsResolve)({ CertificateSummaryList: [{ CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/xxx' }] })); describeCertificateMock.mockReturnValue((0, _testHelper.awsResolve)({ Certificate: { DomainName: '*.example.com', Status: 'REVOKED', CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/xxx' } })); const arn = await (0, _acm.getCertificateARN)('hello.example.com'); expect(arn).toEqual(null); }); it('should check return null if no certificate is found', async () => { listCertificatesMock.mockReturnValue((0, _testHelper.awsResolve)({ CertificateSummaryList: [{ CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/xxx' }] })); describeCertificateMock.mockReturnValue((0, _testHelper.awsResolve)({ Certificate: { DomainName: 'example.com', Status: 'ISSUED', CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/xxx' } })); const arn = await (0, _acm.getCertificateARN)('hello.example.com'); expect(arn).toEqual(null); }); it('should use an ISSUED certificate before a PENDING_VALIDATION certificate', async () => { listCertificatesMock.mockReturnValue((0, _testHelper.awsResolve)({ CertificateSummaryList: [{ CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/pending' }, { CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/issued' }] })); describeCertificateMock.mockReturnValueOnce((0, _testHelper.awsResolve)({ Certificate: { DomainName: '*.example.com', Status: 'PENDING_VALIDATION', CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/pending' } })).mockReturnValueOnce((0, _testHelper.awsResolve)({ Certificate: { DomainName: 'hello.example.com', Status: 'ISSUED', CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/issued' } })); const arn = await (0, _acm.getCertificateARN)('hello.example.com'); expect(arn).toEqual('arn:aws:acm:us-east-1:123456789:certificate/issued'); }); it('should waitFor a PENDING_VALIDATION certificate', async () => { listCertificatesMock.mockReturnValue((0, _testHelper.awsResolve)({ CertificateSummaryList: [{ CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/pending' }] })); describeCertificateMock.mockReturnValue((0, _testHelper.awsResolve)({ Certificate: { DomainName: '*.example.com', Status: 'PENDING_VALIDATION', CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/pending' } })); waitForMock.mockReturnValue((0, _testHelper.awsResolve)()); const arn = await (0, _acm.getCertificateARN)('hello.example.com'); expect(arn).toEqual('arn:aws:acm:us-east-1:123456789:certificate/pending'); expect(waitForMock).toHaveBeenCalledTimes(1); }); }); describe('domainNameMatch', () => { it('should handle exact domain name match', () => { expect((0, _acm.domainNameMatch)('hello.example.com', 'hello.example.com')).toEqual(true); }); it('should handle wildcare domain name match', () => { expect((0, _acm.domainNameMatch)('*.example.com', 'hello.example.com')).toEqual(true); }); it('should not match different domain name', () => { expect((0, _acm.domainNameMatch)('*.example.com', 'hello.example2.com')).toEqual(false); }); it('should not match different domain name', () => { expect((0, _acm.domainNameMatch)('hello.example.com', 'hello2.example.com')).toEqual(false); }); }); describe('createCertificate', () => { const requestCertificateMock = jest.spyOn(_awsServices.acm, 'requestCertificate'); const waitForMock = jest.spyOn(_awsServices.waitUntil, 'certificateValidated'); const describeCertificateMock = jest.spyOn(_awsServices.acm, 'describeCertificate'); const changeResourceRecordSetsMock = jest.spyOn(_awsServices.route53, 'changeResourceRecordSets'); afterEach(() => { requestCertificateMock.mockReset(); waitForMock.mockReset(); describeCertificateMock.mockReset(); changeResourceRecordSetsMock.mockReset(); }); it('should request a certificate', async () => { requestCertificateMock.mockReturnValue((0, _testHelper.awsResolve)({ CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/xxx' })); describeCertificateMock.mockReturnValue((0, _testHelper.awsResolve)({ Certificate: { DomainValidationOptions: [{ DomainName: 'hello.example.com', ResourceRecord: { Name: '_sOmESTrAnGeChArAcTeRs.example.com', Type: 'CNAME', Value: '_sOmESTrAnGeChArAcTeRs' } }] } })); changeResourceRecordSetsMock.mockReturnValue((0, _testHelper.awsResolve)()); waitForMock.mockReturnValue((0, _testHelper.awsResolve)()); await (0, _acm.createCertificate)('hello.example.com', 'hostedZoneId', 0); expect(requestCertificateMock).toHaveBeenCalledTimes(1); const requestCertificateParams = requestCertificateMock.mock.calls[0][0]; expect(requestCertificateParams.DomainName).toEqual('hello.example.com'); expect(requestCertificateParams.ValidationMethod).toEqual('DNS'); expect(waitForMock).toHaveBeenCalledWith(expect.anything(), { CertificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/xxx' }); expect(changeResourceRecordSetsMock).toHaveBeenCalledTimes(1); const changeResourceRecordSetsMockParams = changeResourceRecordSetsMock.mock.calls[0][0]; expect(changeResourceRecordSetsMockParams.ChangeBatch.Changes[0].ResourceRecordSet.Name).toEqual('_sOmESTrAnGeChArAcTeRs.example.com'); expect(changeResourceRecordSetsMockParams.ChangeBatch.Changes[0].ResourceRecordSet.Type).toEqual('CNAME'); expect(changeResourceRecordSetsMockParams.ChangeBatch.Changes[0].ResourceRecordSet.ResourceRecords[0].Value).toEqual('_sOmESTrAnGeChArAcTeRs'); }); }); });