Add tests

This commit is contained in:
dominik-zeglen 2019-11-29 13:06:16 +01:00
parent b77962f53a
commit 81c5d37afa
2 changed files with 84 additions and 15 deletions

View file

@ -0,0 +1,67 @@
import createMultiFileUploadHandler from "./multiFileUploadHandler";
const testFiles = Array(5)
.fill(0)
.map(() => new File([""], "mockFile"));
describe("Multiple file upload handler", () => {
it("properly handles success", done => {
const cbs = {
onAfterUpload: jest.fn(),
onBeforeUpload: jest.fn(),
onCompleted: jest.fn(files =>
expect(files.length).toBe(testFiles.length)
),
onError: jest.fn(),
onStart: jest.fn()
};
const handle = createMultiFileUploadHandler(() => {
const promise = new Promise(resolve => {
expect(cbs.onBeforeUpload).toBeCalledTimes(
cbs.onAfterUpload.mock.calls.length + 1
);
resolve();
});
return promise;
}, cbs);
handle((testFiles as unknown) as FileList).then(() => {
expect(cbs.onAfterUpload).toBeCalledTimes(testFiles.length);
expect(cbs.onBeforeUpload).toBeCalledTimes(testFiles.length);
expect(cbs.onCompleted).toBeCalledTimes(1);
expect(cbs.onError).toBeCalledTimes(0);
expect(cbs.onStart).toBeCalledTimes(1);
done();
});
});
it("properly handles error", done => {
const cbs = {
onAfterUpload: jest.fn(),
onBeforeUpload: jest.fn(),
onCompleted: jest.fn(files =>
expect(files.length).toBe(testFiles.length)
),
onError: jest.fn(),
onStart: jest.fn()
};
const handle = createMultiFileUploadHandler((_, fileIndex) => {
const promise = new Promise((resolve, reject) => {
if (fileIndex === 2) {
reject();
} else {
resolve();
}
});
return promise;
}, cbs);
handle((testFiles as unknown) as FileList).then(() => {
expect(cbs.onAfterUpload).toBeCalledTimes(testFiles.length - 1);
expect(cbs.onBeforeUpload).toBeCalledTimes(testFiles.length);
expect(cbs.onCompleted).toBeCalledTimes(1);
expect(cbs.onError).toBeCalledTimes(1);
done();
});
});
});

View file

@ -1,13 +1,13 @@
export type CreateMultiFileUploadHandlerCallbacks = Partial<{ export type CreateMultiFileUploadHandlerCallbacks = Partial<{
onAfterUpload: (index: number, all: number) => void; onAfterUpload: (index: number, files: File[]) => void;
onBeforeUpload: (index: number, all: number) => void; onBeforeUpload: (index: number, files: File[]) => void;
onCompleted: (files: FileList) => void; onCompleted: (files: File[]) => void;
onError: (index: number, all: number) => void; onError: (index: number, files: File[]) => void;
onStart: (files: FileList) => void; onStart: (files: File[]) => void;
}>; }>;
function createMultiFileUploadHandler<T>( function createMultiFileUploadHandler<T>(
upload: (file: File) => Promise<T>, upload: (file: File, fileIndex: number) => Promise<T>,
{ {
onAfterUpload, onAfterUpload,
onBeforeUpload, onBeforeUpload,
@ -16,39 +16,41 @@ function createMultiFileUploadHandler<T>(
onStart onStart
}: CreateMultiFileUploadHandlerCallbacks }: CreateMultiFileUploadHandlerCallbacks
) { ) {
async function uploadImage(files: FileList, fileIndex: number) { async function uploadImage(files: File[], fileIndex: number): Promise<void> {
if (files.length > fileIndex) { if (files.length > fileIndex) {
try { try {
if (onBeforeUpload) { if (onBeforeUpload) {
onBeforeUpload(fileIndex, files.length); onBeforeUpload(fileIndex, files);
} }
await upload(files[fileIndex]); await upload(files[fileIndex], fileIndex);
if (onAfterUpload) { if (onAfterUpload) {
onAfterUpload(fileIndex, files.length); onAfterUpload(fileIndex, files);
} }
} catch (exception) { } catch (exception) {
console.error( console.error(
`Could not upload file #${fileIndex + 1}. Reason: ${exception}` `Could not upload file #${fileIndex + 1}. Reason: ${exception}`
); );
if (onError) { if (onError) {
onError(fileIndex, files.length); onError(fileIndex, files);
} }
} finally { } finally {
await uploadImage(files, fileIndex + 1); await uploadImage(files, fileIndex + 1);
} }
} }
} }
return async (files: FileList) => { return async (files: FileList): Promise<void> => {
const fileArray = Array.from(files);
if (onStart) { if (onStart) {
onStart(files); onStart(fileArray);
} }
await uploadImage(files, 0); await uploadImage(fileArray, 0);
if (onCompleted) { if (onCompleted) {
onCompleted(files); onCompleted(fileArray);
} }
}; };
} }