This repository has been archived on 2026-04-30. You can view files and clone it, but cannot push or open issues or pull requests.
next-deploy/packages/aws-cloudfront/__tests__/s3-origin.test.ts

181 lines
4.8 KiB
TypeScript

import {
mockCreateDistribution,
mockUpdateDistribution,
mockCreateDistributionPromise,
mockGetDistributionConfigPromise,
mockUpdateDistributionPromise,
mockCreateCloudFrontOriginAccessIdentityPromise,
mockPutBucketPolicy,
} from 'aws-sdk';
import CloudFrontComponent from '../serverless';
import { createComponent, assertHasOrigin } from './test-utils';
jest.mock('aws-sdk', () => require('../__mocks__/aws-sdk.mock'));
describe('S3 origins', () => {
let component: CloudFrontComponent;
beforeEach(async () => {
mockCreateDistributionPromise.mockResolvedValueOnce({
Distribution: {
Id: 'distributionwithS3origin',
},
});
component = await createComponent();
});
describe('When origin is an S3 bucket URL', () => {
it('creates distribution', async () => {
await component.default({
origins: ['https://mybucket.s3.amazonaws.com'],
});
assertHasOrigin(mockCreateDistribution, {
Id: 'mybucket',
DomainName: 'mybucket.s3.amazonaws.com',
S3OriginConfig: {
OriginAccessIdentity: '',
},
CustomHeaders: {
Quantity: 0,
Items: [],
},
OriginPath: '',
});
expect(mockCreateDistribution.mock.calls[0][0]).toMatchSnapshot();
});
it('updates distribution', async () => {
mockGetDistributionConfigPromise.mockResolvedValueOnce({
ETag: 'etag',
DistributionConfig: {
Origins: {
Items: [],
},
},
});
mockUpdateDistributionPromise.mockResolvedValueOnce({
Distribution: {
Id: 'distributionwithS3originupdated',
},
});
await component.default({
origins: ['https://mybucket.s3.amazonaws.com'],
});
await component.default({
origins: ['https://anotherbucket.s3.amazonaws.com'],
});
assertHasOrigin(mockUpdateDistribution, {
Id: 'anotherbucket',
DomainName: 'anotherbucket.s3.amazonaws.com',
});
expect(mockUpdateDistribution.mock.calls[0][0]).toMatchSnapshot();
});
});
describe('When origin is an S3 URL only accessible via CloudFront', () => {
it('creates distribution', async () => {
mockCreateCloudFrontOriginAccessIdentityPromise.mockResolvedValueOnce({
CloudFrontOriginAccessIdentity: {
Id: 'access-identity-xyz',
S3CanonicalUserId: 's3-canonical-user-id-xyz',
},
});
await component.default({
origins: [
{
url: 'https://mybucket.s3.amazonaws.com',
private: true,
},
],
});
expect(mockPutBucketPolicy).toBeCalledWith({
Bucket: 'mybucket',
Policy: expect.stringContaining('"CanonicalUser":"s3-canonical-user-id-xyz"'),
});
assertHasOrigin(mockCreateDistribution, {
Id: 'mybucket',
DomainName: 'mybucket.s3.amazonaws.com',
S3OriginConfig: {
OriginAccessIdentity: 'origin-access-identity/cloudfront/access-identity-xyz',
},
CustomHeaders: {
Quantity: 0,
Items: [],
},
OriginPath: '',
});
expect(mockCreateDistribution.mock.calls[0][0]).toMatchSnapshot();
});
it('updates distribution', async () => {
mockCreateCloudFrontOriginAccessIdentityPromise.mockResolvedValue({
CloudFrontOriginAccessIdentity: {
Id: 'access-identity-xyz',
S3CanonicalUserId: 's3-canonical-user-id-xyz',
},
});
mockGetDistributionConfigPromise.mockResolvedValueOnce({
ETag: 'etag',
DistributionConfig: {
Origins: {
Items: [],
},
},
});
mockUpdateDistributionPromise.mockResolvedValueOnce({
Distribution: {
Id: 'distributionwithS3originupdated',
},
});
await component.default({
origins: [
{
url: 'https://mybucket.s3.amazonaws.com',
private: true,
},
],
});
await component.default({
origins: [
{
url: 'https://anotherbucket.s3.amazonaws.com',
private: true,
},
],
});
expect(mockPutBucketPolicy).toBeCalledWith({
Bucket: 'anotherbucket',
Policy: expect.stringContaining('"CanonicalUser":"s3-canonical-user-id-xyz"'),
});
assertHasOrigin(mockUpdateDistribution, {
Id: 'anotherbucket',
DomainName: 'anotherbucket.s3.amazonaws.com',
S3OriginConfig: {
OriginAccessIdentity: 'origin-access-identity/cloudfront/access-identity-xyz',
},
OriginPath: '',
CustomHeaders: { Items: [], Quantity: 0 },
});
expect(mockCreateDistribution.mock.calls[0][0]).toMatchSnapshot();
});
});
});