Add tests
This commit is contained in:
parent
b77962f53a
commit
81c5d37afa
2 changed files with 84 additions and 15 deletions
67
src/utils/handlers/multiFileUploadHandler.test.ts
Normal file
67
src/utils/handlers/multiFileUploadHandler.test.ts
Normal 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();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue