Skip to content

Commit 034eddb

Browse files
committed
test: integration cases
1 parent c833344 commit 034eddb

3 files changed

Lines changed: 120 additions & 3 deletions

File tree

src/files/infra/repositories/FilesRepository.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ export class FilesRepository extends ApiRepository implements IFilesRepository {
322322

323323
return this.doPost(
324324
this.buildApiEndpoint(this.filesResourceName, 'replace', fileId),
325-
requestBody,
325+
formData,
326326
{},
327327
ApiConstants.CONTENT_TYPE_MULTIPART_FORM_DATA
328328
)

test/integration/files/DirectUpload.test.ts

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
CreatedDatasetIdentifiers,
44
DatasetNotNumberedVersion,
55
FileOrderCriteria,
6+
UploadedFileDTO,
67
createDataset
78
} from '../../../src'
89
import { 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)

test/testHelpers/files/filesHelper.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,12 @@ const enableFilePIDs = async (): Promise<AxiosResponse> => {
186186
)
187187
}
188188

189-
export async function createSinglepartFileBlob(): Promise<File> {
189+
export async function createSinglepartFileBlob(
190+
fileName = 'singlepart-file',
191+
fileSizeInBytes = 1000
192+
): Promise<File> {
190193
try {
191-
return await createFileBlobWithSize(1000, 'singlepart-file')
194+
return await createFileBlobWithSize(fileSizeInBytes, fileName)
192195
} catch (error) {
193196
throw new Error(`Error while creating test singlepart file`)
194197
}

0 commit comments

Comments
 (0)