/
TextLayer.spec.jsx
147 lines (110 loc) · 4.52 KB
/
TextLayer.spec.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import React from 'react';
import { render } from '@testing-library/react';
import { pdfjs } from '../entry.jest';
import { TextLayerInternal as TextLayer } from './TextLayer';
import failingPage from '../../__mocks__/_failing_page';
import { loadPDF, makeAsyncCallback, muteConsole, restoreConsole } from '../../test-utils';
const pdfFile = loadPDF('./__mocks__/_pdf.pdf');
describe('TextLayer', () => {
// Loaded page
let page;
let page2;
// Loaded page text items
let desiredTextItems;
let desiredTextItems2;
beforeAll(async () => {
const pdf = await pdfjs.getDocument({ data: pdfFile.arrayBuffer }).promise;
page = await pdf.getPage(1);
const textContent = await page.getTextContent();
desiredTextItems = textContent.items;
page2 = await pdf.getPage(2);
const textContent2 = await page2.getTextContent();
desiredTextItems2 = textContent2.items;
});
describe('loading', () => {
it('loads text content and calls onGetTextSuccess callback properly', async () => {
const { func: onGetTextSuccess, promise: onGetTextSuccessPromise } = makeAsyncCallback();
render(<TextLayer onGetTextSuccess={onGetTextSuccess} page={page} />);
expect.assertions(1);
await expect(onGetTextSuccessPromise).resolves.toMatchObject({ items: desiredTextItems });
});
it('calls onGetTextError when failed to load text content', async () => {
const { func: onGetTextError, promise: onGetTextErrorPromise } = makeAsyncCallback();
muteConsole();
render(<TextLayer onGetTextError={onGetTextError} page={failingPage} />);
expect.assertions(1);
await expect(onGetTextErrorPromise).resolves.toBeInstanceOf(Error);
restoreConsole();
});
it('replaces text content properly', async () => {
const { func: onGetTextSuccess, promise: onGetTextSuccessPromise } = makeAsyncCallback();
const { rerender } = render(<TextLayer onGetTextSuccess={onGetTextSuccess} page={page} />);
expect.assertions(2);
await expect(onGetTextSuccessPromise).resolves.toMatchObject({
items: desiredTextItems,
});
const { func: onGetTextSuccess2, promise: onGetTextSuccessPromise2 } = makeAsyncCallback();
rerender(<TextLayer onGetTextSuccess={onGetTextSuccess2} page={page2} />);
await expect(onGetTextSuccessPromise2).resolves.toMatchObject({
items: desiredTextItems2,
});
});
it('throws an error when placed outside Page', () => {
muteConsole();
expect(() => render(<TextLayer />)).toThrow();
restoreConsole();
});
});
describe('rendering', () => {
it('renders text content properly', async () => {
const { func: onRenderTextLayerSuccess, promise: onRenderTextLayerSuccessPromise } =
makeAsyncCallback();
const { container } = render(
<TextLayer onRenderTextLayerSuccess={onRenderTextLayerSuccess} page={page} />,
);
expect.assertions(1);
return onRenderTextLayerSuccessPromise.then(() => {
const textItems = [...container.firstChild.children];
expect(textItems).toHaveLength(desiredTextItems.length + 1);
});
});
it('calls customTextRenderer with necessary arguments', () => {
const { func: onRenderTextLayerSuccess, promise: onRenderTextLayerSuccessPromise } =
makeAsyncCallback();
const customTextRenderer = jest.fn();
render(
<TextLayer
customTextRenderer={customTextRenderer}
onRenderTextLayerSuccess={onRenderTextLayerSuccess}
page={page}
/>,
);
expect.assertions(2);
return onRenderTextLayerSuccessPromise.then(() => {
expect(customTextRenderer).toHaveBeenCalledTimes(desiredTextItems.length);
expect(customTextRenderer).toHaveBeenCalledWith(
expect.objectContaining({
str: expect.any(String),
itemIndex: expect.any(Number),
}),
);
});
});
it('renders text content properly given customTextRenderer', () => {
const { func: onRenderTextLayerSuccess, promise: onRenderTextLayerSuccessPromise } =
makeAsyncCallback();
const customTextRenderer = () => 'Test value';
const { container } = render(
<TextLayer
customTextRenderer={customTextRenderer}
onRenderTextLayerSuccess={onRenderTextLayerSuccess}
page={page}
/>,
);
expect.assertions(1);
return onRenderTextLayerSuccessPromise.then(() => {
expect(container).toHaveTextContent('Test value');
});
});
});
});