@dabapps/django-s3-file-upload
Version:
Upload files from the browser to S3 - client side implementation
155 lines (124 loc) • 4.29 kB
text/typescript
import { mockAxios } from './helpers/mock-axios';
jest.mock('axios', () => ({ default: mockAxios }));
import { uploadFileToS3 } from '../src';
import * as requests from '../src/upload-file-to-s3';
import {
mockedFile,
mockedFileAndACL,
mockedUploadData,
} from './helpers/stubs';
describe('Django S3 File Upload', () => {
beforeEach(() => {
mockAxios.clear();
});
describe('uploadFileToS3', () => {
it('should call getUploadForm with the provided file', () => {
jest.spyOn(requests, 'getUploadForm');
uploadFileToS3(mockedFile);
expect(requests.getUploadForm).toHaveBeenCalledTimes(1);
expect(requests.getUploadForm).toHaveBeenCalledWith(mockedFile);
});
});
describe('getUploadForm', () => {
it('should make an axios request and then call uploadFileToSignedUrl', () => {
requests.getUploadForm(mockedFile);
// Get the request calls
const { requestCalls } = mockAxios;
// Check that it was called
expect(requestCalls.length).toBe(1);
expect(requestCalls[0].arguments).toEqual([
{
method: 'POST',
url: '/api/s3-file-uploads/',
headers: {
'X-CSRFToken': undefined,
},
data: {
filename: 'llama',
},
},
]);
// Get the .then calls
const { thenCalls } = requestCalls[0];
const spyOnUploadFileToSignedUrl = jest.spyOn(
requests,
'uploadFileToSignedUrl'
);
// Manually trigger .then
thenCalls[0].arguments[0]({ data: mockedUploadData });
expect(spyOnUploadFileToSignedUrl).toHaveBeenCalledTimes(1);
expect(spyOnUploadFileToSignedUrl).toHaveBeenCalledWith(
mockedUploadData,
mockedFile
);
spyOnUploadFileToSignedUrl.mockRestore();
});
it('should make an axios request and then call uploadFileToSignedUrl with ACL data included', () => {
requests.getUploadForm(mockedFileAndACL);
// Get the request calls
const { requestCalls } = mockAxios;
// Check that it was called
expect(requestCalls.length).toBe(1);
expect(requestCalls[0].arguments).toEqual([
{
method: 'POST',
url: '/api/s3-file-uploads/',
headers: {
'X-CSRFToken': undefined,
},
data: {
filename: 'drama',
acl: 'public-read',
},
},
]);
// Get the .then calls
const { thenCalls } = requestCalls[0];
const spyOnUploadFileToSignedUrl = jest.spyOn(
requests,
'uploadFileToSignedUrl'
);
// Manually trigger .then
thenCalls[0].arguments[0]({ data: mockedUploadData });
expect(spyOnUploadFileToSignedUrl).toHaveBeenCalledTimes(1);
expect(spyOnUploadFileToSignedUrl).toHaveBeenCalledWith(
mockedUploadData,
mockedFileAndACL.file
);
spyOnUploadFileToSignedUrl.mockRestore();
});
});
describe('uploadFileToSignedUrl', () => {
it('should make an axios request and then call completeFileUpload', () => {
requests.uploadFileToSignedUrl(mockedUploadData, mockedFile);
// Get the request calls
const { requestCalls } = mockAxios;
// Check that it was called
expect(requestCalls.length).toBe(1);
// Get the .then calls
const { thenCalls } = requestCalls[0];
const spyOnCompleteFileUpload = jest.spyOn(
requests,
'completeFileUpload'
);
// Manually trigger .then
thenCalls[0].arguments[0]();
expect(spyOnCompleteFileUpload).toHaveBeenCalledTimes(1);
expect(spyOnCompleteFileUpload).toHaveBeenCalledWith(mockedUploadData);
});
});
describe('completeFileUpload', () => {
it('should make an axios request and return mockedUploadData', () => {
requests.completeFileUpload(mockedUploadData);
// Get the request calls
const { requestCalls } = mockAxios;
// Check that it was called
expect(requestCalls.length).toBe(1);
// Get the .then calls
const { thenCalls } = requestCalls[0];
// Manually trigger .then
const response = thenCalls[0].arguments[0]();
expect(response).toEqual(mockedUploadData);
});
});
});