@@ -2,17 +2,70 @@ import React from 'react';
22import * as Router from 'react-router-dom' ;
33
44import { clearIdStore } from '../../../hooks/useId' ;
5+ import { overrideAjax } from '../../../tests/ajax' ;
56import { requireContext } from '../../../tests/helpers' ;
67import { mount } from '../../../tests/reactUtils' ;
8+ import * as Attachments from '../../Attachments/attachments' ;
9+ import { testAttachment } from '../../Attachments/__tests__/utils' ;
10+ import { deserializeResource } from '../../DataModel/serializers' ;
711import { SetMenuContext } from '../../Header/MenuContext' ;
812import { WbImportAttachmentsView } from '..' ;
13+ import { UnloadProtectsContext } from '../../Router/UnloadProtect' ;
914
1015requireContext ( ) ;
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+
1260beforeEach ( ( ) => {
61+ jest . clearAllMocks ( ) ;
1362 clearIdStore ( ) ;
1463} ) ;
1564
65+ afterEach ( ( ) => {
66+ jest . restoreAllMocks ( ) ;
67+ } ) ;
68+
1669// [Import Attachments] Select multiple image files
1770test ( '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