Skip to content

Commit b6da510

Browse files
Added unit tests for FileUploader component.
1 parent 94881b2 commit b6da510

File tree

4 files changed

+278
-38
lines changed

4 files changed

+278
-38
lines changed

package.json

+7-3
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@
3232
"devDependencies": {
3333
"@babel/cli": "^7.11.6",
3434
"@babel/core": "^7.11.1",
35-
"@storybook/addon-docs": "^6.0.22",
3635
"@storybook/addon-actions": "^6.0.22",
37-
"@storybook/vue": "^6.0.26",
38-
"@storybook/addon-links": "^6.0.26",
36+
"@storybook/addon-docs": "^6.0.22",
3937
"@storybook/addon-essentials": "^6.0.26",
38+
"@storybook/addon-links": "^6.0.26",
4039
"@storybook/storybook-deployer": "^2.8.6",
40+
"@storybook/vue": "^6.0.26",
4141
"@testing-library/vue": "^5.0.4",
4242
"@vue/cli-plugin-babel": "~4.5.6",
4343
"@vue/cli-plugin-eslint": "~4.5.6",
@@ -49,13 +49,17 @@
4949
"eslint": "^7.11.0",
5050
"eslint-plugin-vue": "^7.0.1",
5151
"jest": "^26.5.3",
52+
"jest-canvas-mock": "^2.3.0",
5253
"jest-serializer-vue": "^2.0.2",
5354
"jest-sonar-reporter": "^2.0.0",
5455
"react-is": "^16.13.1",
5556
"vue-jest": "^3.0.6",
5657
"vue-template-compiler": "^2.6.11"
5758
},
5859
"jest": {
60+
"setupFiles": [
61+
"jest-canvas-mock"
62+
],
5963
"transformIgnorePatterns": [
6064
"<rootDir>/node_modules/(?!mdi-vue)"
6165
],

src/components/file-uploader/FileUploader.test.js

+257-7
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,68 @@
1-
import FileUploader from "./FileUploader.vue";
1+
import FileUploader, {
2+
CommonImageProcessingError,
3+
CommonImage,
4+
CommonImageScaleFactorsImpl,
5+
CommonImageError
6+
} from "./FileUploader.vue";
27
import { mount } from "@vue/test-utils";
38
import { render, fireEvent } from "@testing-library/vue";
49
import { jest } from '@jest/globals';
510
const fs = require('fs');
11+
const sha1 = require('sha1');
12+
import sampleImage from './test-files/sample-id.jpg';
13+
14+
function mockDropData(files) {
15+
return {
16+
dataTransfer: {
17+
files,
18+
items: files.map((file) => ({
19+
kind: "file",
20+
type: file.type,
21+
getAsFile: () => file,
22+
})),
23+
types: ["Files"],
24+
},
25+
};
26+
}
27+
28+
const b64toBlob = (b64Data, contentType='', sliceSize=512) => {
29+
const byteCharacters = atob(b64Data);
30+
const byteArrays = [];
31+
32+
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
33+
const slice = byteCharacters.slice(offset, offset + sliceSize);
34+
35+
const byteNumbers = new Array(slice.length);
36+
for (let i = 0; i < slice.length; i++) {
37+
byteNumbers[i] = slice.charCodeAt(i);
38+
}
39+
40+
const byteArray = new Uint8Array(byteNumbers);
41+
byteArrays.push(byteArray);
42+
}
43+
44+
const blob = new Blob(byteArrays, {type: contentType});
45+
return blob;
46+
}
47+
48+
describe("CommonImageProcessingError", () => {
49+
test("creates a new instance", () => {
50+
const instance = new CommonImageProcessingError("error");
51+
expect(instance).toBeDefined();
52+
});
53+
});
54+
55+
describe("CommonImage", () => {
56+
test("creates a new instance", () => {
57+
const instance = new CommonImage("file content");
58+
expect(instance).toBeDefined();
59+
});
60+
61+
test("toJSON()", () => {
62+
const instance = new CommonImage("file content");
63+
expect(instance.toJSON()).toBeDefined();
64+
});
65+
});
666

767
describe("FileUploader component", () => {
868
test("matches the success snapshot", () => {
@@ -19,19 +79,20 @@ describe("FileUploader component", () => {
1979
fireEvent.dragOver(container.querySelector(".dropzone"));
2080
});
2181

22-
test("drop event", () => {
82+
test("drop event", async () => {
2383
const { container } = render(FileUploader, {
2484
propsData: {
2585
value: [],
2686
}
2787
});
28-
const dragEventInit = {
29-
dataTransfer: {}
30-
};
31-
fireEvent.drop(container.querySelector(".dropzone"), dragEventInit);
88+
const file = new File([JSON.stringify({ test: true })], "test.json", {
89+
type: "application/json"
90+
});
91+
const data = mockDropData([file]);
92+
fireEvent.drop(container.querySelector(".dropzone"), data);
3293
});
3394

34-
test("change event", () => {
95+
test("change event", (done) => {
3596
const { container } = render(FileUploader, {
3697
propsData: {
3798
value: [],
@@ -40,14 +101,37 @@ describe("FileUploader component", () => {
40101
});
41102
const blob = new Blob(fs.readFileSync('src/components/file-uploader/test-files/sample-id.jpg'));
42103
const file = new File([blob], 'sample-id.jpg');
104+
console.log("file is File", sampleImage);
105+
// const file = new File([JSON.stringify({ ping: true })], "ping.json", {
106+
// type: "application/json",
107+
// });
43108
const changeEventInit = {
44109
target: {
45110
files: [file]
46111
}
47112
};
48113
fireEvent.change(container.querySelector("#test"), changeEventInit);
114+
setTimeout(() => {
115+
done();
116+
}, 4000);
49117
});
50118

119+
test("change event with empty `files` array", () => {
120+
const { container } = render(FileUploader, {
121+
propsData: {
122+
value: [],
123+
id: 'test'
124+
}
125+
});
126+
const changeEventInit = {
127+
target: {
128+
files: []
129+
}
130+
};
131+
fireEvent.change(container.querySelector("#test"), changeEventInit);
132+
});
133+
134+
51135
test("Click `add` button.", () => {
52136
const { container } = render(FileUploader, {
53137
propsData: {
@@ -57,4 +141,170 @@ describe("FileUploader component", () => {
57141
});
58142
fireEvent.click(container.querySelector("a.common-thumbnail"));
59143
});
144+
145+
test("checkImageExists(): false", () => {
146+
const wrapper = mount(FileUploader, {});
147+
const image = new CommonImage("file content")
148+
const imageExists = wrapper.vm.checkImageExists(image, []);
149+
expect(imageExists).toBeFalsy();
150+
});
151+
152+
test("checkImageExists(): true", () => {
153+
const wrapper = mount(FileUploader, {});
154+
const fileContent = "file content";
155+
const image = new CommonImage(fileContent)
156+
image.id = sha1(fileContent);
157+
158+
const imageExists = wrapper.vm.checkImageExists(image, [image]);
159+
expect(imageExists).toBeTruthy();
160+
});
161+
162+
test("resizeImage()", () => {
163+
jest.mock('blueimp-load-image', () => (image, onload) => {
164+
onload();
165+
});
166+
const wrapper = mount(FileUploader, {});
167+
const fileContent = "file content";
168+
// const image = new CommonImage(fileContent)
169+
const image = document.createElement("img");
170+
image.src = sampleImage;
171+
const observer = {
172+
next: jest.fn()
173+
}
174+
wrapper.vm.resizeImage(
175+
image,
176+
wrapper.vm,
177+
new CommonImageScaleFactorsImpl(1,1),
178+
observer,
179+
0,
180+
true
181+
);
182+
});
183+
184+
test("retryStrategy()", () => {
185+
const wrapper = mount(FileUploader, {});
186+
const error = {
187+
errorCode: CommonImageError.TooBig,
188+
pipe: jest.fn()
189+
}
190+
const callback = wrapper.vm.retryStrategy(1);
191+
callback(error);
192+
});
193+
194+
test("readPDF()", (done) => {
195+
const wrapper = mount(FileUploader, {});
196+
const pdfContents = fs.readFileSync('src/components/file-uploader/test-files/sample.pdf', {encoding: 'base64'});
197+
const blob = b64toBlob(pdfContents, 'application/pdf');
198+
const pdfFile = new File([blob], 'sample.pdf');
199+
wrapper.vm.readPDF(
200+
pdfFile,
201+
new CommonImageScaleFactorsImpl(1,1),
202+
() => {
203+
done();
204+
},
205+
() => {
206+
done();
207+
}
208+
);
209+
});
210+
211+
test("makeGrayScale()", () => {
212+
const wrapper = mount(FileUploader, {});
213+
const canvas = document.createElement('canvas');
214+
canvas.width = 10;
215+
canvas.height = 10;
216+
wrapper.vm.makeGrayScale(canvas);
217+
});
218+
219+
test("handleImageFile()", () => {
220+
const wrapper = mount(FileUploader, {});
221+
const image = new CommonImage("content");
222+
wrapper.vm.handleImageFile(image);
223+
});
224+
225+
test("filterError() TooBig", () => {
226+
const wrapper = mount(FileUploader, {});
227+
const error = {
228+
errorCode: CommonImageError.TooBig,
229+
image: new CommonImage("content")
230+
};
231+
wrapper.vm.filterError(error);
232+
});
233+
234+
test("filterError() CannotOpen", () => {
235+
const wrapper = mount(FileUploader, {});
236+
const error = {
237+
errorCode: CommonImageError.CannotOpen,
238+
rawImageFile: {
239+
name: 'name.jpg'
240+
}
241+
};
242+
wrapper.vm.filterError(error);
243+
});
244+
245+
test("filterError() CannotOpenPDF", () => {
246+
const wrapper = mount(FileUploader, {});
247+
const error = {
248+
errorCode: CommonImageError.CannotOpenPDF,
249+
image: new CommonImage("content")
250+
};
251+
wrapper.vm.filterError(error);
252+
});
253+
254+
test("filterError() other error", () => {
255+
const wrapper = mount(FileUploader, {});
256+
const error = {
257+
errorCode: CommonImageError.AlreadyExists,
258+
image: new CommonImage("content")
259+
};
260+
expect(() => {
261+
wrapper.vm.filterError(error);
262+
}).toThrow();
263+
});
264+
265+
test("handleError() handle empty image model", () => {
266+
const wrapper = mount(FileUploader, {});
267+
wrapper.vm.handleError(null, null, null);
268+
});
269+
270+
test("getErrorMessage()", () => {
271+
const wrapper = mount(FileUploader, {});
272+
expect(wrapper.vm.getErrorMessage(CommonImageError.WrongType)).toBe('Wrong file type.');
273+
expect(wrapper.vm.getErrorMessage(CommonImageError.TooSmall)).toBe('File too small.');
274+
expect(wrapper.vm.getErrorMessage(CommonImageError.TooBig)).toBe('File too large.');
275+
expect(wrapper.vm.getErrorMessage(CommonImageError.AlreadyExists)).toBe('File already exists.');
276+
expect(wrapper.vm.getErrorMessage(CommonImageError.Unknown)).toBe('Unknown error.');
277+
expect(wrapper.vm.getErrorMessage(CommonImageError.CannotOpen)).toBe('Cannot open file.');
278+
expect(wrapper.vm.getErrorMessage(CommonImageError.PDFnotSupported)).toBe('This PDF file is not supported.');
279+
expect(wrapper.vm.getErrorMessage(CommonImageError.CannotOpenPDF)).toBe('Cannot open PDF file.');
280+
expect(wrapper.vm.getErrorMessage(null)).toBe('An error has occurred.');
281+
});
282+
283+
test("deleteImage()", () => {
284+
const wrapper = mount(FileUploader, {});
285+
const image = new CommonImage("content");
286+
wrapper.vm.$emit('input', [image]);
287+
wrapper.vm.deleteImage(image);
288+
expect(wrapper.vm.images.length).toBe(0);
289+
});
290+
291+
test("checkImageDimensions()", () => {
292+
const wrapper = mount(FileUploader, {});
293+
expect(wrapper.vm.checkImageDimensions({
294+
naturalWidth: 10,
295+
naturalHeight: 10
296+
})).toBeTruthy();
297+
298+
expect(wrapper.vm.checkImageDimensions({
299+
naturalWidth: -10,
300+
naturalHeight: 10
301+
})).toBeFalsy();
302+
303+
expect(wrapper.vm.checkImageDimensions({
304+
naturalWidth: 10,
305+
naturalHeight: -10
306+
})).toBeFalsy();
307+
});
308+
309+
60310
});

0 commit comments

Comments
 (0)