Skip to content

Commit a1e79de

Browse files
committed
[test]: import attachments into WorkBench data set
1 parent 7f3488f commit a1e79de

1 file changed

Lines changed: 118 additions & 0 deletions

File tree

specifyweb/frontend/js_src/lib/components/WbImportAttachments/__tests__/WbImportAttachments.test.tsx

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,70 @@ import React from 'react';
22
import * as Router from 'react-router-dom';
33

44
import { clearIdStore } from '../../../hooks/useId';
5+
import { overrideAjax } from '../../../tests/ajax';
56
import { requireContext } from '../../../tests/helpers';
67
import { mount } from '../../../tests/reactUtils';
8+
import * as Attachments from '../../Attachments/attachments';
9+
import { testAttachment } from '../../Attachments/__tests__/utils';
10+
import { deserializeResource } from '../../DataModel/serializers';
711
import { SetMenuContext } from '../../Header/MenuContext';
812
import { WbImportAttachmentsView } from '..';
13+
import { UnloadProtectsContext } from '../../Router/UnloadProtect';
914

1015
requireContext();
1116

17+
const dataSetId = 123;
18+
const dataSetAttachmentId = 456;
19+
20+
const dataSetResponse = {
21+
id: dataSetId,
22+
name: 'Attachments',
23+
importedfilename: 'attachments',
24+
columns: ['attachments'],
25+
data: [[]],
26+
resource_uri: `/api/specify/spdataset/${dataSetId}/`,
27+
};
28+
29+
const createDataSetRequest = jest.fn(() => dataSetResponse);
30+
31+
const createDataSetAttachmentsRequest = jest.fn(() => [
32+
{
33+
id: dataSetAttachmentId,
34+
attachment: testAttachment,
35+
spdataset: `/api/specify/spdataset/${dataSetId}/`,
36+
resource_uri: `/api/specify/spdatasetattachment/${dataSetAttachmentId}/`,
37+
},
38+
]);
39+
40+
const updateDataSetRequest = jest.fn(() => dataSetResponse);
41+
42+
overrideAjax('/api/workbench/dataset/', []);
43+
44+
overrideAjax('/api/specify/spdataset/', createDataSetRequest, {
45+
method: 'POST',
46+
});
47+
48+
overrideAjax(
49+
'/bulk_copy/bulk/spdatasetattachment/',
50+
createDataSetAttachmentsRequest,
51+
{
52+
method: 'POST',
53+
}
54+
);
55+
56+
overrideAjax(`/api/specify/spdataset/${dataSetId}/`, updateDataSetRequest, {
57+
method: 'PUT',
58+
});
59+
1260
beforeEach(() => {
61+
jest.clearAllMocks();
1362
clearIdStore();
1463
});
1564

65+
afterEach(() => {
66+
jest.restoreAllMocks();
67+
});
68+
1669
// [Import Attachments] Select multiple image files
1770
test('selects multiple image files', async () => {
1871
const { container, getByRole, user } = mount(
@@ -99,3 +152,68 @@ test('selects different image file types', async () => {
99152
expect(getByRole('cell', { name: file.name })).toBeInTheDocument();
100153
}
101154
});
155+
156+
// [Import Attachments] Import selected files into a WorkBench data set
157+
test('imports selected attachment files', async () => {
158+
const uploadFile = jest
159+
.spyOn(Attachments, 'uploadFile')
160+
.mockResolvedValue(deserializeResource(testAttachment));
161+
162+
const { container, findByText, getByRole, user } = mount(
163+
<Router.MemoryRouter
164+
initialEntries={['/']}
165+
future={{
166+
v7_relativeSplatPath: true,
167+
v7_startTransition: true,
168+
}}
169+
>
170+
<UnloadProtectsContext.Provider value={[]}>
171+
<Router.Routes>
172+
<Router.Route
173+
path="/"
174+
element={
175+
<SetMenuContext.Provider value={jest.fn()}>
176+
<WbImportAttachmentsView />
177+
</SetMenuContext.Provider>
178+
}
179+
/>
180+
<Router.Route
181+
path="/specify/workbench/plan/:dataSetId/"
182+
element={<div>WorkBench data set created</div>}
183+
/>
184+
</Router.Routes>
185+
</UnloadProtectsContext.Provider>
186+
</Router.MemoryRouter>
187+
);
188+
189+
const input = container.querySelector<HTMLInputElement>('input[type="file"]');
190+
191+
if (input === null) {
192+
throw new Error('Unable to find the attachment file picker');
193+
}
194+
195+
const file = new File(['image'], 'attachment.png', {
196+
type: 'image/png',
197+
});
198+
199+
await user.upload(input, file);
200+
201+
await user.click(
202+
getByRole('button', {
203+
name: 'Import Attachments',
204+
})
205+
);
206+
207+
expect(await findByText('WorkBench data set created')).toBeInTheDocument();
208+
209+
expect(uploadFile).toHaveBeenCalledTimes(1);
210+
expect(uploadFile).toHaveBeenCalledWith(
211+
expect.objectContaining({
212+
file,
213+
})
214+
);
215+
216+
expect(createDataSetRequest).toHaveBeenCalledTimes(1);
217+
expect(createDataSetAttachmentsRequest).toHaveBeenCalledTimes(1);
218+
expect(updateDataSetRequest).toHaveBeenCalledTimes(1);
219+
});

0 commit comments

Comments
 (0)