33 CreatedDatasetIdentifiers ,
44 DatasetNotNumberedVersion ,
55 FileOrderCriteria ,
6+ UploadedFileDTO ,
67 createDataset
78} from '../../../src'
89import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
@@ -27,6 +28,7 @@ describe('Direct Upload', () => {
2728 const testCollectionAlias = 'directUploadTestCollection'
2829 let testDataset1Ids : CreatedDatasetIdentifiers
2930 let testDataset2Ids : CreatedDatasetIdentifiers
31+ let testDataset3Ids : CreatedDatasetIdentifiers
3032
3133 const filesRepositorySut = new FilesRepository ( )
3234 const directUploadSut : DirectUploadClient = new DirectUploadClient ( filesRepositorySut )
@@ -57,6 +59,10 @@ describe('Direct Upload', () => {
5759 TestConstants . TEST_NEW_DATASET_DTO ,
5860 testCollectionAlias
5961 )
62+ testDataset3Ids = await createDataset . execute (
63+ TestConstants . TEST_NEW_DATASET_DTO ,
64+ testCollectionAlias
65+ )
6066 } catch ( error ) {
6167 throw new Error ( 'Tests beforeAll(): Error while creating test dataset' )
6268 }
@@ -67,6 +73,7 @@ describe('Direct Upload', () => {
6773 afterAll ( async ( ) => {
6874 await deleteUnpublishedDatasetViaApi ( testDataset1Ids . numericId )
6975 await deleteUnpublishedDatasetViaApi ( testDataset2Ids . numericId )
76+ await deleteUnpublishedDatasetViaApi ( testDataset3Ids . numericId )
7077 await deleteCollectionViaApi ( testCollectionAlias )
7178 } )
7279
@@ -213,6 +220,113 @@ describe('Direct Upload', () => {
213220 ) . rejects . toThrow ( FileUploadCancelError )
214221 } )
215222
223+ test ( 'should upload file add it to the dataset, upload a new one and replace it' , async ( ) => {
224+ // 1 - Upload first file and add it to the dataset
225+ const destination = await createTestFileUploadDestination (
226+ singlepartFile ,
227+ testDataset3Ids . numericId
228+ )
229+ const singlepartFileUrl = destination . urls [ 0 ]
230+
231+ const progressMock = jest . fn ( )
232+ const abortController = new AbortController ( )
233+
234+ expect ( await singlepartFileExistsInBucket ( singlepartFileUrl ) ) . toBe ( false )
235+
236+ const actualStorageId = await directUploadSut . uploadFile (
237+ testDataset3Ids . numericId ,
238+ singlepartFile ,
239+ progressMock ,
240+ abortController ,
241+ destination
242+ )
243+ expect ( actualStorageId ) . toBe ( destination . storageId )
244+
245+ expect ( await singlepartFileExistsInBucket ( singlepartFileUrl ) ) . toBe ( true )
246+
247+ let datasetFiles = await filesRepositorySut . getDatasetFiles (
248+ testDataset3Ids . numericId ,
249+ DatasetNotNumberedVersion . LATEST ,
250+ true ,
251+ FileOrderCriteria . NAME_AZ
252+ )
253+
254+ expect ( datasetFiles . totalFilesCount ) . toBe ( 0 )
255+
256+ const fileArrayBuffer = await singlepartFile . arrayBuffer ( )
257+ const fileBuffer = Buffer . from ( fileArrayBuffer )
258+
259+ const uploadedFileDTO = {
260+ fileName : singlepartFile . name ,
261+ storageId : actualStorageId ,
262+ checksumType : checksumAlgorithm ,
263+ checksumValue : calculateBlobChecksum ( fileBuffer ) ,
264+ mimeType : singlepartFile . type
265+ }
266+
267+ await filesRepositorySut . addUploadedFilesToDataset ( testDataset3Ids . numericId , [ uploadedFileDTO ] )
268+
269+ datasetFiles = await filesRepositorySut . getDatasetFiles (
270+ testDataset3Ids . numericId ,
271+ DatasetNotNumberedVersion . LATEST ,
272+ true ,
273+ FileOrderCriteria . NAME_AZ
274+ )
275+
276+ expect ( datasetFiles . totalFilesCount ) . toBe ( 1 )
277+ expect ( datasetFiles . files [ 0 ] . name ) . toBe ( 'singlepart-file' )
278+ expect ( datasetFiles . files [ 0 ] . sizeBytes ) . toBe ( singlepartFile . size )
279+ expect ( datasetFiles . files [ 0 ] . storageIdentifier ) . toContain ( 'localstack1://mybucket:' )
280+
281+ // 2 - Upload a new file and get the new storage id
282+ const newSinglepartFile = await createSinglepartFileBlob ( 'new-singlepart-file' , 1500 )
283+ const newDestination = await createTestFileUploadDestination (
284+ newSinglepartFile ,
285+ testDataset3Ids . numericId
286+ )
287+ const newSinglepartFileUrl = newDestination . urls [ 0 ]
288+
289+ expect ( await singlepartFileExistsInBucket ( newSinglepartFileUrl ) ) . toBe ( false )
290+
291+ const newFileStorageId = await directUploadSut . uploadFile (
292+ testDataset3Ids . numericId ,
293+ newSinglepartFile ,
294+ progressMock ,
295+ abortController ,
296+ newDestination
297+ )
298+ expect ( newFileStorageId ) . toBe ( newDestination . storageId )
299+
300+ expect ( await singlepartFileExistsInBucket ( newSinglepartFileUrl ) ) . toBe ( true )
301+
302+ // 3 - Replace the old file with the new file (must have different content)
303+ const currentFileId = datasetFiles . files [ 0 ] . id
304+ const newFileArrayBuffer = await newSinglepartFile . arrayBuffer ( )
305+ const newFileBuffer = Buffer . from ( newFileArrayBuffer )
306+ const newUploadedFileDTO : UploadedFileDTO = {
307+ fileName : newSinglepartFile . name ,
308+ storageId : newFileStorageId ,
309+ checksumType : checksumAlgorithm ,
310+ checksumValue : calculateBlobChecksum ( newFileBuffer ) ,
311+ mimeType : newSinglepartFile . type
312+ }
313+
314+ await filesRepositorySut . replaceFile ( currentFileId , newUploadedFileDTO )
315+
316+ // 4 - Verify that the new file is in the dataset and the old file is not
317+ datasetFiles = await filesRepositorySut . getDatasetFiles (
318+ testDataset3Ids . numericId ,
319+ DatasetNotNumberedVersion . LATEST ,
320+ true ,
321+ FileOrderCriteria . NAME_AZ
322+ )
323+
324+ expect ( datasetFiles . totalFilesCount ) . toBe ( 1 )
325+ expect ( datasetFiles . files [ 0 ] . name ) . toBe ( 'new-singlepart-file' )
326+ expect ( datasetFiles . files [ 0 ] . sizeBytes ) . toBe ( newSinglepartFile . size )
327+ expect ( datasetFiles . files [ 0 ] . storageIdentifier ) . toContain ( 'localstack1://mybucket:' )
328+ } )
329+
216330 const createTestFileUploadDestination = async ( file : File , testDatasetId : number ) => {
217331 const filesRepository = new FilesRepository ( )
218332 const destination = await filesRepository . getFileUploadDestination ( testDatasetId , file )
0 commit comments