diff --git a/build.gradle b/build.gradle index 7b2bd8ea7e2..825fc7557db 100644 --- a/build.gradle +++ b/build.gradle @@ -458,6 +458,7 @@ dependencies { implementation platform('com.azure:azure-sdk-bom:1.3.4') implementation 'com.azure:azure-storage-blob' + implementation 'com.azure:azure-storage-blob-batch' implementation group: 'io.rest-assured', name: 'rest-assured' implementation group: 'org.flywaydb', name: 'flyway-core', version: '11.20.3' diff --git a/src/functionalTest/java/uk/gov/hmcts/darts/arm/ArmServiceFunctionalTest.java b/src/functionalTest/java/uk/gov/hmcts/darts/arm/ArmServiceFunctionalTest.java index 1cf4750adb6..573f689b42a 100644 --- a/src/functionalTest/java/uk/gov/hmcts/darts/arm/ArmServiceFunctionalTest.java +++ b/src/functionalTest/java/uk/gov/hmcts/darts/arm/ArmServiceFunctionalTest.java @@ -172,6 +172,31 @@ void listBlobsUsingMarkerTestContinuationToken() { } + @Test + void saveAndDeleteMultipleBlobs() { + log.info("------------------ saveAndDeleteMultipleBlobs test"); + + byte[] testStringInBytes = TEST_BINARY_STRING.getBytes(StandardCharsets.UTF_8); + BinaryData data = BinaryData.fromBytes(testStringInBytes); + String filename1 = String.format("%s_functional_test", UUID.randomUUID()); + String actualResult1 = armService.saveBlobData(armContainerName, filename1, data); + armSubmissionBlobsToBeDeleted.add(actualResult1); + assertNotNull(actualResult1); + log.info("Blob filename1: {}", actualResult1); + + String filename2 = String.format("%s_functional_test2", UUID.randomUUID()); + String actualResult2 = armService.saveBlobData(armContainerName, filename2, data); + armSubmissionBlobsToBeDeleted.add(actualResult2); + assertNotNull(actualResult2); + log.info("Blob filename2: {}", actualResult2); + + armService.deleteMultipleBlobs(armContainerName, List.of( + actualResult1, + actualResult2 + )); + cleanupArmBlobData(); + } + private void uploadBatchedSubmissionBlobs(BinaryData data) { for (int counter = 0; counter < 11; counter++) { String filename = String.format("functional_test_%s", UUID.randomUUID()); diff --git a/src/functionalTest/java/uk/gov/hmcts/darts/datamanagement/DataManagementServiceFunctionalTest.java b/src/functionalTest/java/uk/gov/hmcts/darts/datamanagement/DataManagementServiceFunctionalTest.java index 3a97ffada27..d8ec5e0bfe4 100644 --- a/src/functionalTest/java/uk/gov/hmcts/darts/datamanagement/DataManagementServiceFunctionalTest.java +++ b/src/functionalTest/java/uk/gov/hmcts/darts/datamanagement/DataManagementServiceFunctionalTest.java @@ -12,7 +12,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import uk.gov.hmcts.darts.FunctionalTest; -import uk.gov.hmcts.darts.arm.config.ArmDataManagementConfiguration; import uk.gov.hmcts.darts.common.datamanagement.component.impl.DownloadResponseMetaData; import uk.gov.hmcts.darts.common.datamanagement.enums.DatastoreContainerType; import uk.gov.hmcts.darts.common.exception.AzureDeleteBlobException; @@ -43,14 +42,12 @@ class DataManagementServiceFunctionalTest extends FunctionalTest { private static final String TEST_BLOB_ID = "b0f23c62-8dd3-4e4e-ae6a-321ff6eb61d8"; @Value("${darts.storage.blob.container-name.unstructured}") - String unstructuredStorageContainerName; + private String unstructuredStorageContainerName; @Autowired - DataManagementService dataManagementService; + private DataManagementService dataManagementService; @Autowired - DataManagementConfiguration dataManagementConfiguration; - @Autowired - ArmDataManagementConfiguration armDataManagementConfiguration; + private DataManagementConfiguration dataManagementConfiguration; @Test void saveBinaryDataToBlobStorage() { diff --git a/src/integrationTest/java/uk/gov/hmcts/darts/arm/service/impl/AbstractArmBatchProcessResponseFilesIntTest.java b/src/integrationTest/java/uk/gov/hmcts/darts/arm/service/impl/AbstractArmBatchProcessResponseFilesIntTest.java index 76bcdc36ae1..b1838dda65c 100644 --- a/src/integrationTest/java/uk/gov/hmcts/darts/arm/service/impl/AbstractArmBatchProcessResponseFilesIntTest.java +++ b/src/integrationTest/java/uk/gov/hmcts/darts/arm/service/impl/AbstractArmBatchProcessResponseFilesIntTest.java @@ -240,12 +240,12 @@ void batchProcessResponseFiles_WithMediaReturnsSuccess() throws IOException { String uploadFileFilename3 = String.format("%s_04e6bc3b-952a-79b6-8362-13259aae1897_1_uf.rsp", hashcode1); String invalidLineFileFilename3 = String.format("%s_a17b9015-e6ad-77c5-8d1e-13259aae1897_0_il.rsp", hashcode1); String invalidLineFileFilename4 = String.format("%s_a17b9015-e6ad-77c5-8d1e-13259aae1892_0_il.rsp", hashcode1); - String invalidLineFileFilename5 = String.format("%s_a17b9015-e6ad-77c5-8d1e-13259aae1893_0_il.rsp", hashcode1); + String invalidLineFileFilename4b = String.format("%s_a17b9015-e6ad-77c5-8d1e-13259aae1893_0_il.rsp", hashcode1); List hashcodeResponses = List.of(createRecordFilename1, uploadFileFilename1, createRecordFilename2, invalidLineFileFilename2, uploadFileFilename3, invalidLineFileFilename3, - invalidLineFileFilename4, invalidLineFileFilename5); + invalidLineFileFilename4, invalidLineFileFilename4b); when(armDataManagementApi.listResponseBlobs(hashcode1)).thenReturn(hashcodeResponses); @@ -256,7 +256,7 @@ void batchProcessResponseFiles_WithMediaReturnsSuccess() throws IOException { String validUploadFileTest3 = "tests/arm/service/ArmBatchResponseFilesProcessorTest/ValidResponses/UploadFile.rsp"; String invalidLineFileTest3 = "tests/arm/service/ArmBatchResponseFilesProcessorTest/ValidResponses/InvalidLineFile.rsp"; String invalidLineFileTest4 = "tests/arm/service/ArmBatchResponseFilesProcessorTest/ValidResponses/InvalidLineFile.rsp"; - String invalidLineFileTest5 = "tests/arm/service/ArmBatchResponseFilesProcessorTest/ValidResponses/InvalidLineFile2.rsp"; + String invalidLineFileTest4b = "tests/arm/service/ArmBatchResponseFilesProcessorTest/ValidResponses/InvalidLineFile2.rsp"; BinaryData createRecordBinaryDataTest1 = convertStringToBinaryData(getCreateRecordFileContents(createRecordFileTest1, armEod1.getId())); BinaryData uploadFileBinaryDataTest1 = convertStringToBinaryData(getUploadFileContents(validUploadFileTest1, armEod1.getId(), media1.getChecksum())); @@ -265,7 +265,7 @@ void batchProcessResponseFiles_WithMediaReturnsSuccess() throws IOException { BinaryData uploadFileBinaryDataTest3 = convertStringToBinaryData(getUploadFileContents(validUploadFileTest3, armEod3.getId(), media3.getChecksum())); BinaryData invalidLineFileBinaryDataTest3 = convertStringToBinaryData(getInvalidLineFileContents(invalidLineFileTest3, armEod3.getId())); BinaryData invalidLineFileBinaryDataTest4 = convertStringToBinaryData(getInvalidLineFileContents(invalidLineFileTest4, armEod4.getId())); - BinaryData invalidLineFileBinaryDataTest5 = convertStringToBinaryData(getInvalidLineFileContents(invalidLineFileTest5, armEod4.getId())); + BinaryData invalidLineFileBinaryDataTest4b = convertStringToBinaryData(getInvalidLineFileContents(invalidLineFileTest4b, armEod4.getId())); when(armDataManagementApi.getBlobData(createRecordFilename1)).thenReturn(createRecordBinaryDataTest1); when(armDataManagementApi.getBlobData(uploadFileFilename1)).thenReturn(uploadFileBinaryDataTest1); @@ -274,16 +274,7 @@ void batchProcessResponseFiles_WithMediaReturnsSuccess() throws IOException { when(armDataManagementApi.getBlobData(uploadFileFilename3)).thenReturn(uploadFileBinaryDataTest3); when(armDataManagementApi.getBlobData(invalidLineFileFilename3)).thenReturn(invalidLineFileBinaryDataTest3); when(armDataManagementApi.getBlobData(invalidLineFileFilename4)).thenReturn(invalidLineFileBinaryDataTest4); - when(armDataManagementApi.getBlobData(invalidLineFileFilename5)).thenReturn(invalidLineFileBinaryDataTest5); - - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(createRecordFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename3)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename3)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename4)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename5)).thenReturn(true); + when(armDataManagementApi.getBlobData(invalidLineFileFilename4b)).thenReturn(invalidLineFileBinaryDataTest4b); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(endTime2); @@ -294,7 +285,7 @@ void batchProcessResponseFiles_WithMediaReturnsSuccess() throws IOException { when(armDataManagementApi.getBlobData(uploadFileFilename3)).thenReturn(uploadFileBinaryDataTest3); when(armDataManagementApi.getBlobData(invalidLineFileFilename3)).thenReturn(invalidLineFileBinaryDataTest3); when(armDataManagementApi.getBlobData(invalidLineFileFilename4)).thenReturn(invalidLineFileBinaryDataTest4); - when(armDataManagementApi.getBlobData(invalidLineFileFilename5)).thenReturn(invalidLineFileBinaryDataTest5); + when(armDataManagementApi.getBlobData(invalidLineFileFilename4b)).thenReturn(invalidLineFileBinaryDataTest4b); String hashcode2 = "7a374f19a9ce7dc9cc480ea8d4eca0fc"; String createRecordFilename5 = String.format("dropzone/DARTS/response/%s_a17b9015-e6ad-77c5-8d1e-13259aae1890_1_cr.rsp", hashcode2); @@ -304,17 +295,10 @@ void batchProcessResponseFiles_WithMediaReturnsSuccess() throws IOException { BinaryData createRecordBinaryDataTest5 = convertStringToBinaryData(getCreateRecordFileContents(createRecordFileTest5, armEod5.getId())); when(armDataManagementApi.getBlobData(createRecordFilename5)).thenReturn(createRecordBinaryDataTest5); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(createRecordFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename3)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename3)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(blobNameAndPath1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename4)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename5)).thenReturn(true); - - when(armDataManagementApi.deleteBlobData(createRecordFilename5)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename2, invalidLineFileFilename2))).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(uploadFileFilename3, invalidLineFileFilename3))).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(invalidLineFileFilename4, invalidLineFileFilename4b))).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(endTime2); @@ -395,22 +379,16 @@ void batchProcessResponseFiles_WithMediaReturnsSuccess() throws IOException { verify(armDataManagementApi).getBlobData(invalidLineFileFilename2); verify(armDataManagementApi).getBlobData(invalidLineFileFilename3); - verify(armDataManagementApi).deleteBlobData(createRecordFilename2); - verify(armDataManagementApi).deleteBlobData(invalidLineFileFilename2); - - verify(armDataManagementApi).deleteBlobData(createRecordFilename1); - verify(armDataManagementApi).deleteBlobData(uploadFileFilename1); - - verify(armDataManagementApi).deleteBlobData(uploadFileFilename3); - verify(armDataManagementApi).deleteBlobData(invalidLineFileFilename3); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(createRecordFilename2, invalidLineFileFilename2)); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1)); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(uploadFileFilename3, invalidLineFileFilename3)); verify(armDataManagementApi).deleteBlobData(blobNameAndPath1); verify(armDataManagementApi).listResponseBlobs(hashcode2); verify(armDataManagementApi).getBlobData(createRecordFilename5); - verify(armDataManagementApi).deleteBlobData(invalidLineFileFilename4); - verify(armDataManagementApi).deleteBlobData(invalidLineFileFilename5); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(invalidLineFileFilename4, invalidLineFileFilename4b)); verify(armDataManagementApi, never()).deleteBlobData(blobNameAndPath2); } @@ -464,8 +442,7 @@ void batchProcessResponseFiles_WithInvalidLineFileAndCreateRecordFileSuccess() t when(armDataManagementApi.getBlobData(createRecordFilename1)).thenReturn(createRecordBinaryDataTest1); when(armDataManagementApi.getBlobData(invalidLineFileFilename2)).thenReturn(invalidLineFileBinaryDataTest2); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename2)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, invalidLineFileFilename2))).thenReturn(true); // when armBatchProcessResponseFiles.processResponseFiles(BATCH_SIZE, asyncTaskConfig); @@ -488,8 +465,7 @@ void batchProcessResponseFiles_WithInvalidLineFileAndCreateRecordFileSuccess() t verify(armDataManagementApi).getBlobData(invalidLineFileFilename2); verify(armDataManagementApi).getBlobData(blobNameAndPath1); - verify(armDataManagementApi).deleteBlobData(createRecordFilename1); - verify(armDataManagementApi).deleteBlobData(invalidLineFileFilename2); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(createRecordFilename1, invalidLineFileFilename2)); verify(armDataManagementApi).deleteBlobData(blobNameAndPath1); verifyNoMoreInteractions(armDataManagementApi); @@ -558,8 +534,7 @@ void batchProcessResponseFiles_successful_withUploadFileAndCreateRecordFile() th when(armDataManagementApi.getBlobData(createRecordFilename1)).thenReturn(createRecordBinaryDataTest1); when(armDataManagementApi.getBlobData(uploadFileFilename1)).thenReturn(uploadFileBinaryDataTest1); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); // when armBatchProcessResponseFiles.processResponseFiles(BATCH_SIZE, asyncTaskConfig); @@ -582,8 +557,7 @@ void batchProcessResponseFiles_successful_withUploadFileAndCreateRecordFile() th verify(armDataManagementApi).getBlobData(uploadFileFilename1); verify(armDataManagementApi).getBlobData(blobNameAndPath1); - verify(armDataManagementApi).deleteBlobData(createRecordFilename1); - verify(armDataManagementApi).deleteBlobData(uploadFileFilename1); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1)); verify(armDataManagementApi).deleteBlobData(blobNameAndPath1); verifyNoMoreInteractions(armDataManagementApi); @@ -642,8 +616,7 @@ void batchProcessResponseFiles_throwsException_whenUploadFileIsInvalid() throws when(armDataManagementApi.getBlobData(createRecordFilename1)).thenReturn(createRecordBinaryDataTest1); when(armDataManagementApi.getBlobData(uploadFileFilename1)).thenReturn(uploadFileBinaryDataTest1); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); // when armBatchProcessResponseFiles.processResponseFiles(BATCH_SIZE, asyncTaskConfig); @@ -664,8 +637,7 @@ void batchProcessResponseFiles_throwsException_whenUploadFileIsInvalid() throws verify(armDataManagementApi).getBlobData(blobNameAndPath1); - verify(armDataManagementApi).deleteBlobData(createRecordFilename1); - verify(armDataManagementApi).deleteBlobData(uploadFileFilename1); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1)); verify(armDataManagementApi).deleteBlobData(blobNameAndPath1); verifyNoMoreInteractions(armDataManagementApi); @@ -725,18 +697,12 @@ void batchProcessResponseFiles_With3InvalidLineFilesCausingFailure() throws IOEx when(armDataManagementApi.getBlobData(invalidLineFileFilename2)).thenReturn(invalidLineFileBinaryDataTest2); when(armDataManagementApi.getBlobData(invalidLineFileFilename3)).thenReturn(invalidLineFileBinaryDataTest3); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename3)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(invalidLineFileFilename1, invalidLineFileFilename2, invalidLineFileFilename3))).thenReturn(true); when(armDataManagementApi.getBlobData(invalidLineFileFilename1)).thenReturn(invalidLineFileBinaryDataTest1); when(armDataManagementApi.getBlobData(invalidLineFileFilename2)).thenReturn(invalidLineFileBinaryDataTest2); when(armDataManagementApi.getBlobData(invalidLineFileFilename3)).thenReturn(invalidLineFileBinaryDataTest3); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename3)).thenReturn(true); - // when armBatchProcessResponseFiles.processResponseFiles(BATCH_SIZE, asyncTaskConfig); @@ -757,9 +723,7 @@ void batchProcessResponseFiles_With3InvalidLineFilesCausingFailure() throws IOEx verify(armDataManagementApi).getBlobData(invalidLineFileFilename2); verify(armDataManagementApi).getBlobData(invalidLineFileFilename3); - verify(armDataManagementApi).deleteBlobData(invalidLineFileFilename1); - verify(armDataManagementApi).deleteBlobData(invalidLineFileFilename2); - verify(armDataManagementApi).deleteBlobData(invalidLineFileFilename3); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(invalidLineFileFilename1, invalidLineFileFilename2, invalidLineFileFilename3)); verify(armDataManagementApi).getBlobData(blobNameAndPath1); @@ -879,12 +843,9 @@ void batchProcessResponseFiles_WithMediaUsingSmallContinuationTokenReturnsSucces BinaryData createRecordBinaryDataTest5 = convertStringToBinaryData(getCreateRecordFileContents(createRecordFileTest5, armEod5.getId())); when(armDataManagementApi.getBlobData(createRecordFilename5)).thenReturn(createRecordBinaryDataTest5); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(createRecordFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename3)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename3)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename2, invalidLineFileFilename2))).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(uploadFileFilename3, invalidLineFileFilename3))).thenReturn(true); when(armDataManagementApi.deleteBlobData(blobNameAndPath1)).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(endTime2); @@ -948,14 +909,9 @@ void batchProcessResponseFiles_WithMediaUsingSmallContinuationTokenReturnsSucces verify(armDataManagementApi).getBlobData(invalidLineFileFilename2); verify(armDataManagementApi).getBlobData(invalidLineFileFilename3); - verify(armDataManagementApi).deleteBlobData(createRecordFilename2); - verify(armDataManagementApi).deleteBlobData(invalidLineFileFilename2); - - verify(armDataManagementApi).deleteBlobData(createRecordFilename1); - verify(armDataManagementApi).deleteBlobData(uploadFileFilename1); - - verify(armDataManagementApi).deleteBlobData(uploadFileFilename3); - verify(armDataManagementApi).deleteBlobData(invalidLineFileFilename3); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(createRecordFilename2, invalidLineFileFilename2)); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1)); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(uploadFileFilename3, invalidLineFileFilename3)); verify(armDataManagementApi).deleteBlobData(blobNameAndPath1); @@ -1077,12 +1033,9 @@ void batchProcessResponseFiles_GetBlobsThrowsException() throws IOException { BinaryData createRecordBinaryDataTest4 = convertStringToBinaryData(getCreateRecordFileContents(createRecordFileTest4, armEod4.getId())); when(armDataManagementApi.getBlobData(createRecordFilename4)).thenReturn(createRecordBinaryDataTest4); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(createRecordFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename3)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename3)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename2, invalidLineFileFilename2))).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(uploadFileFilename3, invalidLineFileFilename3))).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(endTime2); @@ -1265,12 +1218,9 @@ void batchProcessResponseFiles_WithInvalidJson() throws IOException { BinaryData createRecordBinaryDataTest4 = convertStringToBinaryData(getCreateRecordFileContents(createRecordFileTest4, armEod4.getId())); when(armDataManagementApi.getBlobData(createRecordFilename4)).thenReturn(createRecordBinaryDataTest4); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(createRecordFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename3)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename3)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename2, invalidLineFileFilename2))).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(uploadFileFilename3, invalidLineFileFilename3))).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(endTime2); @@ -1392,10 +1342,8 @@ void batchProcessResponseFiles_WithInvalidFilenameStatus() throws IOException { when(armDataManagementApi.getBlobData(createRecordFilename2)).thenReturn(createRecordBinaryDataTest2); when(armDataManagementApi.getBlobData(invalidLineFileFilename2)).thenReturn(invalidLineFileBinaryDataTest2); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(createRecordFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename2)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename2, invalidLineFileFilename2))).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(endTime); @@ -1497,8 +1445,7 @@ void batchProcessResponseFiles_WithInvalidTranscriptionChecksum() throws IOExcep when(armDataManagementApi.getBlobData(createRecordFilename1)).thenReturn(createRecordBinaryDataTest1); when(armDataManagementApi.getBlobData(uploadFileFilename1)).thenReturn(uploadFileBinaryDataTest1); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(transcriptionEntity.getEndTime()); @@ -1568,8 +1515,7 @@ void batchProcessResponseFiles_WithAnnotationReturnsSuccess() throws IOException when(armDataManagementApi.getBlobData(createRecordFilename1)).thenReturn(createRecordBinaryDataTest1); when(armDataManagementApi.getBlobData(uploadFileFilename1)).thenReturn(uploadFileBinaryDataTest1); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(annotationDocument.getUploadedDateTime()); @@ -1590,9 +1536,7 @@ void batchProcessResponseFiles_WithAnnotationReturnsSuccess() throws IOException verify(armDataManagementApi).getBlobData(createRecordFilename1); verify(armDataManagementApi).getBlobData(uploadFileFilename1); - verify(armDataManagementApi).deleteBlobData(createRecordFilename1); - verify(armDataManagementApi).deleteBlobData(uploadFileFilename1); - + verify(armDataManagementApi).deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1)); verify(armDataManagementApi).deleteBlobData(blobNameAndPath1); } @@ -1664,8 +1608,7 @@ void batchProcessResponseFiles_WithCaseDocumentReturnsSuccess() throws IOExcepti when(armDataManagementApi.getBlobData(createRecordFilename1)).thenReturn(createRecordBinaryDataTest1); when(armDataManagementApi.getBlobData(uploadFileFilename1)).thenReturn(uploadFileBinaryDataTest1); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(caseDocument.getCreatedDateTime()); @@ -1686,8 +1629,7 @@ void batchProcessResponseFiles_WithCaseDocumentReturnsSuccess() throws IOExcepti verify(armDataManagementApi).getBlobData(createRecordFilename1); verify(armDataManagementApi).getBlobData(uploadFileFilename1); - verify(armDataManagementApi).deleteBlobData(createRecordFilename1); - verify(armDataManagementApi).deleteBlobData(uploadFileFilename1); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1)); verify(armDataManagementApi).deleteBlobData(blobNameAndPath1); } @@ -1767,8 +1709,7 @@ void batchProcessResponseFiles_WithCaseDocumentInvalidResponseFilenames() throws when(armDataManagementApi.getBlobData(uploadFileFilename3)).thenReturn(uploadFileBinaryDataTest3); when(armDataManagementApi.getBlobData(invalidLineFileFilename3)).thenReturn(invalidLineFileBinaryDataTest3); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(caseDocument.getCreatedDateTime()); @@ -1845,8 +1786,13 @@ void batchProcessResponseFiles_WithCaseDocumentInvalidResponseFilenamesNoEod() t when(armDataManagementApi.getBlobData(uploadFileFilename3)).thenReturn(uploadFileBinaryDataTest3); when(armDataManagementApi.getBlobData(invalidLineFileFilename3)).thenReturn(invalidLineFileBinaryDataTest3); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename2, invalidLineFileFilename2))).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(uploadFileFilename3, invalidLineFileFilename3))).thenReturn(true); + + // When no EOD exists for a response file, the code treats it as a dangling response and deletes it individually. + when(armDataManagementApi.deleteMultipleBlobs(List.of(invalidLineFileFilename2, createRecordFilename2))).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(invalidLineFileFilename3, uploadFileFilename3))).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(caseDocument.getCreatedDateTime()); @@ -1867,11 +1813,8 @@ void batchProcessResponseFiles_WithCaseDocumentInvalidResponseFilenamesNoEod() t verify(armDataManagementApi).getBlobData(uploadFileFilename3); verify(armDataManagementApi).getBlobData(invalidLineFileFilename3); - verify(armDataManagementApi).deleteBlobData(createRecordFilename2); - verify(armDataManagementApi).deleteBlobData(invalidLineFileFilename2); - - verify(armDataManagementApi).deleteBlobData(uploadFileFilename3); - verify(armDataManagementApi).deleteBlobData(invalidLineFileFilename3); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(invalidLineFileFilename2, createRecordFilename2)); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(invalidLineFileFilename3, uploadFileFilename3)); verify(armDataManagementApi).deleteBlobData(blobNameAndPath1); } @@ -1930,8 +1873,7 @@ void batchProcessResponseFiles_WithResponseAsInvalidManifestFile() throws IOExce when(armDataManagementApi.getBlobData(createRecordFilename2)).thenReturn(createRecordBinaryDataTest2); when(armDataManagementApi.getBlobData(invalidLineFileFilename2)).thenReturn(invalidLineFileBinaryDataTest2); - when(armDataManagementApi.deleteBlobData(createRecordFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(invalidLineFileFilename2)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename2, invalidLineFileFilename2))).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(caseDocument.getCreatedDateTime()); @@ -1999,8 +1941,7 @@ void batchProcessResponseFiles_WithErrorCodeInResponse() throws IOException { when(armDataManagementApi.getBlobData(createRecordFilename2)).thenReturn(createRecordBinaryDataTest2); when(armDataManagementApi.getBlobData(uploadFileFileFilename2)).thenReturn(uploadFileBinaryDataTest2); - when(armDataManagementApi.deleteBlobData(createRecordFilename2)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFileFilename2)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename2, uploadFileFileFilename2))).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(caseDocument.getCreatedDateTime()); @@ -2158,8 +2099,7 @@ void batchProcessResponseFiles_WithNullTranscriptionChecksum() throws IOExceptio when(armDataManagementApi.getBlobData(createRecordFilename1)).thenReturn(createRecordBinaryDataTest1); when(armDataManagementApi.getBlobData(uploadFileFilename1)).thenReturn(uploadFileBinaryDataTest1); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(transcriptionEntity.getEndTime()); @@ -2229,8 +2169,7 @@ void batchProcessResponseFiles_WithNullAnnotationChecksum() throws IOException { when(armDataManagementApi.getBlobData(createRecordFilename1)).thenReturn(createRecordBinaryDataTest1); when(armDataManagementApi.getBlobData(uploadFileFilename1)).thenReturn(uploadFileBinaryDataTest1); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(annotationDocument.getUploadedDateTime()); @@ -2293,8 +2232,7 @@ void batchProcessResponseFiles_WithAnnotationNoEodFound() throws IOException { when(armDataManagementApi.getBlobData(createRecordFilename1)).thenReturn(createRecordBinaryDataTest1); when(armDataManagementApi.getBlobData(uploadFileFilename1)).thenReturn(uploadFileBinaryDataTest1); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); when(armDataManagementApi.deleteBlobData(blobNameAndPath1)).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(annotationDocument.getUploadedDateTime()); @@ -2312,8 +2250,7 @@ void batchProcessResponseFiles_WithAnnotationNoEodFound() throws IOException { verify(armDataManagementApi).getBlobData(createRecordFilename1); verify(armDataManagementApi).getBlobData(uploadFileFilename1); - verify(armDataManagementApi).deleteBlobData(createRecordFilename1); - verify(armDataManagementApi).deleteBlobData(uploadFileFilename1); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1)); verify(armDataManagementApi).deleteBlobData(blobNameAndPath1); } @@ -2434,8 +2371,7 @@ private void batchProcessResponseFiles_WithTranscriptionReturnsSuccess(String te when(armDataManagementApi.getBlobData(createRecordFilename1)).thenReturn(createRecordBinaryDataTest1); when(armDataManagementApi.getBlobData(uploadFileFilename1)).thenReturn(uploadFileBinaryDataTest1); - when(armDataManagementApi.deleteBlobData(createRecordFilename1)).thenReturn(true); - when(armDataManagementApi.deleteBlobData(uploadFileFilename1)).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1))).thenReturn(true); when(currentTimeHelper.currentOffsetDateTime()).thenReturn(transcriptionEntity.getEndTime()); @@ -2456,8 +2392,7 @@ private void batchProcessResponseFiles_WithTranscriptionReturnsSuccess(String te verify(armDataManagementApi).getBlobData(createRecordFilename1); verify(armDataManagementApi).getBlobData(uploadFileFilename1); - verify(armDataManagementApi).deleteBlobData(createRecordFilename1); - verify(armDataManagementApi).deleteBlobData(uploadFileFilename1); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1)); verify(armDataManagementApi).deleteBlobData(blobNameAndPath1); } diff --git a/src/integrationTest/java/uk/gov/hmcts/darts/arm/service/impl/DeleteArmResponseFilesHelperIntTest.java b/src/integrationTest/java/uk/gov/hmcts/darts/arm/service/impl/DeleteArmResponseFilesHelperIntTest.java index d6815c3617f..c5bff83278c 100644 --- a/src/integrationTest/java/uk/gov/hmcts/darts/arm/service/impl/DeleteArmResponseFilesHelperIntTest.java +++ b/src/integrationTest/java/uk/gov/hmcts/darts/arm/service/impl/DeleteArmResponseFilesHelperIntTest.java @@ -6,7 +6,6 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean; import uk.gov.hmcts.darts.arm.api.ArmDataManagementApi; import uk.gov.hmcts.darts.arm.model.blobs.ArmResponseBatchData; -import uk.gov.hmcts.darts.arm.service.ExternalObjectDirectoryService; import uk.gov.hmcts.darts.arm.util.files.BatchInputUploadFileFilenameProcessor; import uk.gov.hmcts.darts.arm.util.files.CreateRecordFilenameProcessor; import uk.gov.hmcts.darts.arm.util.files.UploadFileFilenameProcessor; @@ -14,7 +13,6 @@ import uk.gov.hmcts.darts.common.entity.ExternalObjectDirectoryEntity; import uk.gov.hmcts.darts.common.entity.MediaEntity; import uk.gov.hmcts.darts.common.entity.UserAccountEntity; -import uk.gov.hmcts.darts.common.repository.ExternalObjectDirectoryRepository; import uk.gov.hmcts.darts.testutils.PostgresIntegrationBase; import java.util.List; @@ -36,18 +34,12 @@ class DeleteArmResponseFilesHelperIntTest extends PostgresIntegrationBase { private static final String MANIFEST_PREFIX = "DARTS_6a374f19a9ce7dc9cc480ea8d4eca0fb"; private static final String RESPONSE_FILE_PREFIX = "04e6bc3b-952a-79b6-8362-13259aae1895"; - @Autowired - private ExternalObjectDirectoryRepository externalObjectDirectoryRepository; - @MockitoBean private ArmDataManagementApi armDataManagementApi; @MockitoBean private UserIdentity userIdentity; - @Autowired - private ExternalObjectDirectoryService externalObjectDirectoryService; - @Autowired private DeleteArmResponseFilesHelperImpl deleteArmResponseFilesHelper; @@ -66,7 +58,7 @@ void setUp() { } @Test - void deleteResponseBlobsByManifestName_shouldDeleteBlobsWhenAllResponsesAreCompletedAndCleaned() { + void deleteResponseBlobsByManifestName_shouldDeleteBlobsIndividuallyWhenAllResponsesAreCompletedAndCleaned() { // given String manifestName = MANIFEST_PREFIX + ".a360"; eodRpoPending.setManifestFile(manifestName); @@ -92,33 +84,36 @@ void deleteResponseBlobsByManifestName_shouldDeleteBlobsWhenAllResponsesAreCompl void deleteDanglingResponses_shouldDeleteDanglingResponses() { // given BatchInputUploadFileFilenameProcessor batchInputUploadFileFilenameProcessor = new BatchInputUploadFileFilenameProcessor(DARTS_INPUT_UPLOAD_FILE); - String responseFile = "dropzone/DARTS/response/" + RESPONSE_FILE_PREFIX + "_ABC_1_rsp"; - when(armDataManagementApi.listResponseBlobs(any())).thenReturn(List.of(responseFile)); + String otherResponseFile = "dropzone/DARTS/response/" + RESPONSE_FILE_PREFIX + "_ABC_1_rsp"; + String crResponseFile = "dropzone/DARTS/response/" + RESPONSE_FILE_PREFIX + "_b17b9015-e6ad-77c5-8d1e-13259aae1896_0_cr.rsp"; + String ilResponseFile = "dropzone/DARTS/response/" + RESPONSE_FILE_PREFIX + "_c17b9015-e6ad-77c5-8d1e-13259aae1896_1_il.rsp"; + + when(armDataManagementApi.listResponseBlobs(any())).thenReturn(List.of(otherResponseFile, crResponseFile, ilResponseFile)); + when(armDataManagementApi.deleteMultipleBlobs(any())).thenReturn(true); when(armDataManagementApi.deleteBlobData(anyString())).thenReturn(true); // when deleteArmResponseFilesHelper.deleteDanglingResponses(batchInputUploadFileFilenameProcessor); // then - verify(armDataManagementApi).deleteBlobData(responseFile); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(otherResponseFile, crResponseFile, ilResponseFile)); verify(armDataManagementApi).deleteBlobData(DARTS_INPUT_UPLOAD_FILE); verify(armDataManagementApi).listResponseBlobs(batchInputUploadFileFilenameProcessor.getHashcode()); verifyNoMoreInteractions(armDataManagementApi); } @Test - void deleteResponseBlobs_shouldDeleteAllResponseBlobs() { + void deleteResponseBlobsIndividually_shouldDeleteAllResponseBlobIndividually() { // given - List responseBlobs = List.of("blob1", "blob2"); + String responseBlob = "blob1"; when(armDataManagementApi.deleteBlobData(anyString())).thenReturn(true); // when - List result = deleteArmResponseFilesHelper.deleteResponseBlobs(responseBlobs); + Boolean result = deleteArmResponseFilesHelper.deleteResponseBlobIndividually(responseBlob); // then - assertTrue(result.stream().allMatch(Boolean::booleanValue)); + assertTrue(result); verify(armDataManagementApi).deleteBlobData("blob1"); - verify(armDataManagementApi).deleteBlobData("blob2"); verifyNoMoreInteractions(armDataManagementApi); } @@ -134,14 +129,13 @@ void deleteResponseBlobs_shouldUpdateEodWhenResponsesAreDeleted() { .uploadFileFilenameProcessor(new UploadFileFilenameProcessor(uploadFileFilename1)) .build(); - when(armDataManagementApi.deleteBlobData(anyString())).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(any())).thenReturn(true); // when deleteArmResponseFilesHelper.deleteResponseBlobs(batchData); // then - verify(armDataManagementApi).deleteBlobData(createRecordFilename1); - verify(armDataManagementApi).deleteBlobData(uploadFileFilename1); + verify(armDataManagementApi).deleteMultipleBlobs(List.of(createRecordFilename1, uploadFileFilename1)); verifyNoMoreInteractions(armDataManagementApi); } diff --git a/src/integrationTest/java/uk/gov/hmcts/darts/testutils/stubs/ArmServiceStubImpl.java b/src/integrationTest/java/uk/gov/hmcts/darts/testutils/stubs/ArmServiceStubImpl.java index abbc3a15b31..024811e0553 100644 --- a/src/integrationTest/java/uk/gov/hmcts/darts/testutils/stubs/ArmServiceStubImpl.java +++ b/src/integrationTest/java/uk/gov/hmcts/darts/testutils/stubs/ArmServiceStubImpl.java @@ -76,6 +76,12 @@ public boolean deleteBlobData(String containerName, String blobPathAndName) { return true; } + @Override + public boolean deleteMultipleBlobs(String containerName, List blobPathAndName) { + logStubUsageWarning(); + return true; + } + private void logStubUsageWarning() { log.warn("### This implementation is intended only for integration tests. If you see this log message elsewhere" + " you should ask questions! ###"); diff --git a/src/main/java/uk/gov/hmcts/darts/arm/api/ArmDataManagementApi.java b/src/main/java/uk/gov/hmcts/darts/arm/api/ArmDataManagementApi.java index 7479db68dea..160da9c3882 100644 --- a/src/main/java/uk/gov/hmcts/darts/arm/api/ArmDataManagementApi.java +++ b/src/main/java/uk/gov/hmcts/darts/arm/api/ArmDataManagementApi.java @@ -27,6 +27,8 @@ public interface ArmDataManagementApi extends BlobContainerDownloadable { boolean deleteBlobData(String blobPathAndName); + boolean deleteMultipleBlobs(List blobPathAndNames); + UpdateMetadataResponse updateMetadata(String externalRecordId, OffsetDateTime eventTimestamp, RetentionConfidenceScoreEnum retConfScore, diff --git a/src/main/java/uk/gov/hmcts/darts/arm/api/impl/ArmDataManagementApiImpl.java b/src/main/java/uk/gov/hmcts/darts/arm/api/impl/ArmDataManagementApiImpl.java index a101dba8b29..fdc3b9f6a0e 100644 --- a/src/main/java/uk/gov/hmcts/darts/arm/api/impl/ArmDataManagementApiImpl.java +++ b/src/main/java/uk/gov/hmcts/darts/arm/api/impl/ArmDataManagementApiImpl.java @@ -26,6 +26,7 @@ @Service @RequiredArgsConstructor +@SuppressWarnings({"PMD.TooManyMethods"}) public class ArmDataManagementApiImpl implements ArmDataManagementApi { private final ArmService armService; @@ -88,6 +89,11 @@ public boolean deleteBlobData(String blobPathAndName) { return armService.deleteBlobData(armDataManagementConfiguration.getContainerName(), blobPathAndName); } + @Override + public boolean deleteMultipleBlobs(List blobPathAndNames) { + return armService.deleteMultipleBlobs(armDataManagementConfiguration.getContainerName(), blobPathAndNames); + } + @Override public UpdateMetadataResponse updateMetadata(String externalRecordId, OffsetDateTime eventTimestamp, diff --git a/src/main/java/uk/gov/hmcts/darts/arm/service/ArmService.java b/src/main/java/uk/gov/hmcts/darts/arm/service/ArmService.java index e995d85c919..8db89148865 100644 --- a/src/main/java/uk/gov/hmcts/darts/arm/service/ArmService.java +++ b/src/main/java/uk/gov/hmcts/darts/arm/service/ArmService.java @@ -34,4 +34,6 @@ public interface ArmService { */ boolean deleteBlobData(String containerName, String blobPathAndName); + boolean deleteMultipleBlobs(String containerName, List blobPathAndName); + } diff --git a/src/main/java/uk/gov/hmcts/darts/arm/service/DeleteArmResponseFilesHelper.java b/src/main/java/uk/gov/hmcts/darts/arm/service/DeleteArmResponseFilesHelper.java index 3aaaa214793..e1b5b14695d 100644 --- a/src/main/java/uk/gov/hmcts/darts/arm/service/DeleteArmResponseFilesHelper.java +++ b/src/main/java/uk/gov/hmcts/darts/arm/service/DeleteArmResponseFilesHelper.java @@ -11,10 +11,12 @@ public interface DeleteArmResponseFilesHelper { void deleteDanglingResponses(BatchInputUploadFileFilenameProcessor batchUploadFileFilenameProcessor); - List deleteResponseBlobs(List responseBlobsToBeDeleted); + Boolean deleteResponseBlobIndividually(String responseBlobsToBeDeleted); + + Boolean deleteResponseBlobs(List responseBlobsToBeDeleted); void deleteResponseBlobs(ArmResponseBatchData armResponseBatchData); List getResponseBlobsToBeDeleted(ArmResponseBatchData armResponseBatchData); - + } diff --git a/src/main/java/uk/gov/hmcts/darts/arm/service/impl/AbstractArmBatchProcessResponseFiles.java b/src/main/java/uk/gov/hmcts/darts/arm/service/impl/AbstractArmBatchProcessResponseFiles.java index 81ae2475106..f98382cd811 100644 --- a/src/main/java/uk/gov/hmcts/darts/arm/service/impl/AbstractArmBatchProcessResponseFiles.java +++ b/src/main/java/uk/gov/hmcts/darts/arm/service/impl/AbstractArmBatchProcessResponseFiles.java @@ -575,7 +575,7 @@ private ArmResponseCreateRecord getResponseCreateRecordOrDelete(String createRec return objectMapper.readValue(createRecordBinary.toString(), ArmResponseCreateRecord.class); } catch (Exception e) { log.error("Unable to read ARM response create record file {} - About to delete ", createRecordFilenameAndPath, e); - deleteArmResponseFilesHelper.deleteResponseBlobs(List.of(createRecordFilenameAndPath)); + deleteArmResponseFilesHelper.deleteResponseBlobIndividually(createRecordFilenameAndPath); throw e; } } @@ -628,7 +628,7 @@ private ArmResponseUploadFileRecord getResponseUploadFileRecordOrDelete(String u return objectMapper.readValue(uploadFileBinary.toString(), ArmResponseUploadFileRecord.class); } catch (Exception e) { log.error("Unable to read ARM response upload file {} - About to delete ", uploadFileFilenameAndPath, e); - deleteArmResponseFilesHelper.deleteResponseBlobs(List.of(uploadFileFilenameAndPath)); + deleteArmResponseFilesHelper.deleteResponseBlobIndividually(uploadFileFilenameAndPath); throw e; } } @@ -759,7 +759,7 @@ private ResponseFilenames getArmResponseFilenames(List responseFiles, St } catch (IllegalArgumentException e) { // This occurs when the filename is not parsable log.error("Invalid ARM response filename: {} for manifest {}", responseFile, manifestName); - deleteArmResponseFilesHelper.deleteResponseBlobs(List.of(responseFile)); + deleteArmResponseFilesHelper.deleteResponseBlobIndividually(responseFile); } } return responseFilenames; @@ -798,7 +798,7 @@ private void readInvalidLineFile(BinaryData invalidLineFileBinary, InvalidLineFi } else { log.warn("Failed to obtain EOD id (relation id) from invalid line record {} from file {}", input, invalidLineFileFilenameProcessor.getInvalidLineFilename()); - deleteArmResponseFilesHelper.deleteResponseBlobs(List.of(invalidLineFileFilenameAndPath)); + deleteArmResponseFilesHelper.deleteResponseBlobIndividually(invalidLineFileFilenameAndPath); } } catch (Exception e) { @@ -815,7 +815,7 @@ private ArmResponseInvalidLineRecord getResponseInvalidLineRecordOrDelete(String return objectMapper.readValue(invalidLineFileBinary.toString(), ArmResponseInvalidLineRecord.class); } catch (Exception e) { log.error("Unable to read ARM response {} - About to delete ", invalidLineFileFilenameAndPath, e); - deleteArmResponseFilesHelper.deleteResponseBlobs(List.of(invalidLineFileFilenameAndPath)); + deleteArmResponseFilesHelper.deleteResponseBlobIndividually(invalidLineFileFilenameAndPath); throw e; } } diff --git a/src/main/java/uk/gov/hmcts/darts/arm/service/impl/ArmServiceImpl.java b/src/main/java/uk/gov/hmcts/darts/arm/service/impl/ArmServiceImpl.java index 5d5a5495a1c..f1b1409a801 100644 --- a/src/main/java/uk/gov/hmcts/darts/arm/service/impl/ArmServiceImpl.java +++ b/src/main/java/uk/gov/hmcts/darts/arm/service/impl/ArmServiceImpl.java @@ -6,6 +6,9 @@ import com.azure.core.util.BinaryData; import com.azure.storage.blob.BlobClient; import com.azure.storage.blob.BlobContainerClient; +import com.azure.storage.blob.BlobServiceClient; +import com.azure.storage.blob.batch.BlobBatchClient; +import com.azure.storage.blob.batch.BlobBatchClientBuilder; import com.azure.storage.blob.models.BlobItem; import com.azure.storage.blob.models.BlobListDetails; import com.azure.storage.blob.models.DeleteSnapshotsOptionType; @@ -36,7 +39,7 @@ @Service @Slf4j -@SuppressWarnings("PMD.TooManyMethods")//TODO - refactor to reduce methods when this class is next edited +@SuppressWarnings({"PMD.TooManyMethods", "PMD.CouplingBetweenObjects"}) public class ArmServiceImpl implements ArmService { private static final String FILE_PATH_DELIMITER = "/"; @@ -280,4 +283,52 @@ public boolean deleteBlobData(String containerName, String blobPathAndName) { } } + @Override + public boolean deleteMultipleBlobs(String containerName, List blobPathAndName) { + if (blobPathAndName == null || blobPathAndName.isEmpty()) { + log.info("No blobs provided to delete for containerName={}", containerName); + return false; + } + + try { + BlobContainerClient containerClient = armDataManagementDao.getBlobContainerClient(containerName); + + // Delete *all* blobs in one go using Azure Storage Blob Batch. + BlobServiceClient blobServiceClient = containerClient.getServiceClient(); + BlobBatchClient batchClient = new BlobBatchClientBuilder(blobServiceClient).buildClient(); + + boolean allSuccessful = true; + PagedIterable> responses = batchClient.deleteBlobs( + blobPathAndName, + DeleteSnapshotsOptionType.INCLUDE, + Duration.of(TIMEOUT, ChronoUnit.SECONDS), + null + ); + + int index = 0; + for (Response response : responses) { + int statusCode = response.getStatusCode(); + HttpStatus httpStatus = valueOf(statusCode); + String blobName = index < blobPathAndName.size() ? blobPathAndName.get(index) : ""; + index++; + + if (!(httpStatus.is2xxSuccessful() || NOT_FOUND.equals(httpStatus))) { + allSuccessful = false; + log.warn("Failed to delete blob in batch containerName={}, blobPathAndName={}, statusCode={}, httpStatus={}", + containerName, blobName, statusCode, httpStatus); + } + } + + if (allSuccessful) { + log.info("Successfully deleted {} blobs from containerName={} using batch", blobPathAndName.size(), containerName); + } else { + log.error("Batch deletion completed with one or more failures for containerName={}", containerName); + } + return allSuccessful; + } catch (Exception e) { + log.error("Could not delete multiple blobs from storage container={}", containerName, e); + return false; + } + } + } \ No newline at end of file diff --git a/src/main/java/uk/gov/hmcts/darts/arm/service/impl/DeleteArmResponseFilesHelperImpl.java b/src/main/java/uk/gov/hmcts/darts/arm/service/impl/DeleteArmResponseFilesHelperImpl.java index 9783b976b90..4ce35322536 100644 --- a/src/main/java/uk/gov/hmcts/darts/arm/service/impl/DeleteArmResponseFilesHelperImpl.java +++ b/src/main/java/uk/gov/hmcts/darts/arm/service/impl/DeleteArmResponseFilesHelperImpl.java @@ -74,14 +74,14 @@ public void deleteDanglingResponses(BatchInputUploadFileFilenameProcessor batchU } if (CollectionUtils.isNotEmpty(responseFiles)) { - List deletedResponseBlobStatuses = deleteResponseBlobs(responseFiles); + boolean deletedResponseBlobStatuses = deleteResponseBlobs(responseFiles); - if (deletedResponseBlobStatuses.contains(false)) { - log.warn("Unable to delete dangling ARM batch input upload file {} as referenced data is not all deleted", - batchUploadFileFilenameProcessor.getBatchMetadataFilename()); - } else { + if (deletedResponseBlobStatuses) { log.info("About to delete dangling ARM input upload file {}", batchUploadFileFilenameProcessor.getBatchMetadataFilename()); armDataManagementApi.deleteBlobData(batchUploadFileFilenameProcessor.getBatchMetadataFilenameAndPath()); + } else { + log.warn("Unable to delete dangling ARM batch input upload file {} as referenced data is not all deleted", + batchUploadFileFilenameProcessor.getBatchMetadataFilename()); } } else { log.info("Unable to delete dangling ARM input upload file {}", batchUploadFileFilenameProcessor.getBatchMetadataFilename()); @@ -90,14 +90,16 @@ public void deleteDanglingResponses(BatchInputUploadFileFilenameProcessor batchU } @Override - public List deleteResponseBlobs(List responseBlobsToBeDeleted) { - return responseBlobsToBeDeleted.stream() - .map(armDataManagementApi::deleteBlobData) - .toList(); + public Boolean deleteResponseBlobIndividually(String responseBlobToBeDeleted) { + return armDataManagementApi.deleteBlobData(responseBlobToBeDeleted); + } + + @Override + public Boolean deleteResponseBlobs(List responseBlobsToBeDeleted) { + return armDataManagementApi.deleteMultipleBlobs(responseBlobsToBeDeleted); } @Override - @SuppressWarnings("PMD.CyclomaticComplexity") public void deleteResponseBlobs(ArmResponseBatchData armResponseBatchData) { List responseBlobsToBeDeleted = getResponseBlobsToBeDeleted(armResponseBatchData); ExternalObjectDirectoryEntity externalObjectDirectory = getExternalObjectDirectory(armResponseBatchData.getExternalObjectDirectoryId()); @@ -109,9 +111,9 @@ public void deleteResponseBlobs(ArmResponseBatchData armResponseBatchData) { || ARM_RESPONSE_MANIFEST_FAILED.equals(status) || ARM_RESPONSE_CHECKSUM_VERIFICATION_FAILED.equals(status)) { log.info("About to delete ARM responses for EOD {}", externalObjectDirectory.getId()); - List deletedResponseBlobStatuses = deleteResponseBlobs(responseBlobsToBeDeleted); + boolean deletedResponseBlobStatuses = deleteResponseBlobs(responseBlobsToBeDeleted); - if (deletedResponseBlobStatuses.size() == 2 && !deletedResponseBlobStatuses.contains(false)) { + if (deletedResponseBlobStatuses) { externalObjectDirectory.setResponseCleaned(true); externalObjectDirectoryRepository.saveAndFlush(externalObjectDirectory); } else { diff --git a/src/test/java/uk/gov/hmcts/darts/arm/service/impl/ArmServiceImplTest.java b/src/test/java/uk/gov/hmcts/darts/arm/service/impl/ArmServiceImplTest.java index 429c15c51ec..2f1a89d72fe 100644 --- a/src/test/java/uk/gov/hmcts/darts/arm/service/impl/ArmServiceImplTest.java +++ b/src/test/java/uk/gov/hmcts/darts/arm/service/impl/ArmServiceImplTest.java @@ -5,6 +5,9 @@ import com.azure.core.util.BinaryData; import com.azure.storage.blob.BlobClient; import com.azure.storage.blob.BlobContainerClient; +import com.azure.storage.blob.BlobServiceClient; +import com.azure.storage.blob.batch.BlobBatchClient; +import com.azure.storage.blob.batch.BlobBatchClientBuilder; import com.azure.storage.blob.models.BlobItem; import com.azure.storage.blob.models.DeleteSnapshotsOptionType; import org.junit.jupiter.api.BeforeEach; @@ -26,7 +29,10 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @@ -56,7 +62,7 @@ void beforeEach() { } @Test - void testSaveBlobDataUsingFilename() { + void saveBlobData_shouldSaveBlobUsingFilename() { var foldersConfig = new ArmDataManagementConfiguration.Folders(); foldersConfig.setSubmission(TEST_BINARY_STRING); when(armDataManagementConfiguration.getFolders()).thenReturn(foldersConfig); @@ -70,7 +76,7 @@ void testSaveBlobDataUsingFilename() { } @Test - void testSaveBlobDataUsingBlobPathAndFilename() { + void saveBlobData_shouldSaveBlobUsingBlobPathAndFilename() { String blobPathAndFilename = TEST_DROP_ZONE + BLOB_FILENAME; when(armDataManagementDao.getBlobContainerClient(ARM_BLOB_CONTAINER_NAME)).thenReturn(blobContainerClient); when(armDataManagementDao.getBlobClient(any(), any())).thenReturn(blobClient); @@ -80,7 +86,7 @@ void testSaveBlobDataUsingBlobPathAndFilename() { } @Test - void testListSubmissionBlobs() { + void listSubmissionBlobs_shouldListSubmissionBlobs() { PagedIterable pagedIterable = (PagedIterable) mock(PagedIterable.class); when(blobContainerClient.listBlobsByHierarchy(any(), any(), any())).thenReturn(pagedIterable); when(armDataManagementDao.getBlobContainerClient(ARM_BLOB_CONTAINER_NAME)).thenReturn(blobContainerClient); @@ -97,7 +103,7 @@ void testListSubmissionBlobs() { } @Test - void testListResponseBlobs() { + void listResponseBlobs_shouldListResponseBlobs() { PagedIterable pagedIterable = (PagedIterable) mock(PagedIterable.class); when(blobContainerClient.listBlobsByHierarchy(any(), any(), any())).thenReturn(pagedIterable); when(armDataManagementDao.getBlobContainerClient(ARM_BLOB_CONTAINER_NAME)).thenReturn(blobContainerClient); @@ -114,7 +120,7 @@ void testListResponseBlobs() { } @Test - void testGetBlobData() { + void getBlobData_shouldReturnBlob() { when(armDataManagementDao.getBlobContainerClient(ARM_BLOB_CONTAINER_NAME)).thenReturn(blobContainerClient); when(armDataManagementDao.getBlobClient(any(), any())).thenReturn(blobClient); when(blobClient.exists()).thenReturn(Boolean.TRUE); @@ -125,7 +131,7 @@ void testGetBlobData() { } @Test - void testDeleteResponseBlobIsSuccessful() { + void deleteResponseBlob_shouldReturnIsSuccessful() { when(armDataManagementDao.getBlobContainerClient(ARM_BLOB_CONTAINER_NAME)).thenReturn(blobContainerClient); when(armDataManagementDao.getBlobClient(any(), any())).thenReturn(blobClient); @@ -139,7 +145,7 @@ void testDeleteResponseBlobIsSuccessful() { } @Test - void testDeleteResponseBlobIsNotSuccessful() { + void deleteResponseBlob_shouldReturnIsNotSuccessful_when500Error() { when(armDataManagementDao.getBlobContainerClient(ARM_BLOB_CONTAINER_NAME)).thenReturn(blobContainerClient); when(armDataManagementDao.getBlobClient(any(), any())).thenReturn(blobClient); @@ -153,7 +159,7 @@ void testDeleteResponseBlobIsNotSuccessful() { } @Test - void testListSubmissionBlobsUsingBatch() { + void listSubmissionBlobsUsingBatch_shouldListSubmissionBlobsUsingBatch() { PagedIterable pagedIterable = (PagedIterable) mock(PagedIterable.class); when(blobContainerClient.listBlobs(any(), any())).thenReturn(pagedIterable); when(armDataManagementDao.getBlobContainerClient(ARM_BLOB_CONTAINER_NAME)).thenReturn(blobContainerClient); @@ -171,7 +177,7 @@ void testListSubmissionBlobsUsingBatch() { } @Test - void testListResponseBlobsUsingBatch() { + void listResponseBlobsUsingBatch_shouldListResponseBlobsUsingBatch() { PagedIterable pagedIterable = (PagedIterable) mock(PagedIterable.class); when(blobContainerClient.listBlobs(any(), any())).thenReturn(pagedIterable); when(armDataManagementDao.getBlobContainerClient(ARM_BLOB_CONTAINER_NAME)).thenReturn(blobContainerClient); @@ -191,7 +197,7 @@ void testListResponseBlobsUsingBatch() { @Test void listSubmissionBlobsWithMarker_ShouldSucceed() { - PagedIterable mockPagedIterable = mock(PagedIterable.class); + PagedIterable mockPagedIterable = (PagedIterable) mock(PagedIterable.class); when(blobContainerClient.listBlobs(any(), any(), any())).thenReturn(mockPagedIterable); when(armDataManagementDao.getBlobContainerClient(ARM_BLOB_CONTAINER_NAME)).thenReturn(blobContainerClient); @@ -210,7 +216,7 @@ void listSubmissionBlobsWithMarker_ShouldSucceed() { @Test void listResponseBlobsWithMarker_ShouldReturnToken() { - PagedIterable mockPagedTableEntities = mock(PagedIterable.class); + PagedIterable mockPagedTableEntities = (PagedIterable) mock(PagedIterable.class); when(blobContainerClient.listBlobs(any(), any(), any())).thenReturn(mockPagedTableEntities); when(armDataManagementDao.getBlobContainerClient(ARM_BLOB_CONTAINER_NAME)).thenReturn(blobContainerClient); @@ -225,4 +231,77 @@ void listResponseBlobsWithMarker_ShouldReturnToken() { ARM_BLOB_CONTAINER_NAME, prefix, 10, null); assertNotNull(continuationTokenBlobs); } + + @Test + void deleteMultipleBlobs_shouldReturnFalseAndNotCallAzure_whenNoBlobsProvided() { + assertFalse(armService.deleteMultipleBlobs(ARM_BLOB_CONTAINER_NAME, null)); + assertFalse(armService.deleteMultipleBlobs(ARM_BLOB_CONTAINER_NAME, List.of())); + } + + @Test + void deleteMultipleBlobs_shouldReturnTrue_whenAllDeletesSucceed() { + when(armDataManagementDao.getBlobContainerClient(ARM_BLOB_CONTAINER_NAME)).thenReturn(blobContainerClient); + BlobServiceClient blobServiceClient = mock(BlobServiceClient.class); + when(blobContainerClient.getServiceClient()).thenReturn(blobServiceClient); + + + PagedIterable> pagedResponses = (PagedIterable>) mock(PagedIterable.class); + Response r1 = (Response) mock(Response.class); + Response r2 = (Response) mock(Response.class); + when(r1.getStatusCode()).thenReturn(202); + when(r2.getStatusCode()).thenReturn(404); + when(pagedResponses.iterator()).thenReturn(List.of(r1, r2).iterator()); + + BlobBatchClient batchClient = mock(BlobBatchClient.class); + when(batchClient.deleteBlobs(anyList(), eq(DeleteSnapshotsOptionType.INCLUDE), any(Duration.class), eq(null))) + .thenReturn(pagedResponses); + + try (var ignored = mockConstruction(BlobBatchClientBuilder.class, + (builder, context) -> when(builder.buildClient()).thenReturn(batchClient))) { + boolean result = armService.deleteMultipleBlobs(ARM_BLOB_CONTAINER_NAME, List.of("blob1", "blob2")); + assertTrue(result); + } + } + + @Test + void deleteMultipleBlobs_shouldReturnFalse_whenAnyDeleteFails() { + when(armDataManagementDao.getBlobContainerClient(ARM_BLOB_CONTAINER_NAME)).thenReturn(blobContainerClient); + BlobServiceClient blobServiceClient = mock(BlobServiceClient.class); + when(blobContainerClient.getServiceClient()).thenReturn(blobServiceClient); + + PagedIterable> pagedResponses = (PagedIterable>) mock(PagedIterable.class); + Response r1 = (Response) mock(Response.class); + Response r2 = (Response) mock(Response.class); + when(r1.getStatusCode()).thenReturn(202); + when(r2.getStatusCode()).thenReturn(500); + when(pagedResponses.iterator()).thenReturn(List.of(r1, r2).iterator()); + + BlobBatchClient batchClient = mock(BlobBatchClient.class); + when(batchClient.deleteBlobs(anyList(), eq(DeleteSnapshotsOptionType.INCLUDE), any(Duration.class), eq(null))) + .thenReturn(pagedResponses); + + try (var ignored = mockConstruction(BlobBatchClientBuilder.class, + (builder, context) -> when(builder.buildClient()).thenReturn(batchClient))) { + boolean result = armService.deleteMultipleBlobs(ARM_BLOB_CONTAINER_NAME, List.of("blob1", "blob2")); + assertFalse(result); + } + } + + @Test + void deleteMultipleBlobs_shouldReturnFalse_whenAzureThrowsException() { + when(armDataManagementDao.getBlobContainerClient(ARM_BLOB_CONTAINER_NAME)).thenReturn(blobContainerClient); + BlobServiceClient blobServiceClient = mock(BlobServiceClient.class); + when(blobContainerClient.getServiceClient()).thenReturn(blobServiceClient); + + BlobBatchClient batchClient = mock(BlobBatchClient.class); + when(batchClient.deleteBlobs(anyList(), eq(DeleteSnapshotsOptionType.INCLUDE), any(Duration.class), eq(null))) + .thenThrow(new RuntimeException("Azure error")); + + try (var ignored = mockConstruction(BlobBatchClientBuilder.class, + (builder, context) -> when(builder.buildClient()).thenReturn(batchClient))) { + boolean result = armService.deleteMultipleBlobs(ARM_BLOB_CONTAINER_NAME, List.of("blob1", "blob2")); + assertFalse(result); + } + } + } diff --git a/src/test/java/uk/gov/hmcts/darts/arm/service/impl/DeleteArmResponseFilesHelperImplTest.java b/src/test/java/uk/gov/hmcts/darts/arm/service/impl/DeleteArmResponseFilesHelperImplTest.java index 7dcf2899b98..5252ee92af6 100644 --- a/src/test/java/uk/gov/hmcts/darts/arm/service/impl/DeleteArmResponseFilesHelperImplTest.java +++ b/src/test/java/uk/gov/hmcts/darts/arm/service/impl/DeleteArmResponseFilesHelperImplTest.java @@ -22,7 +22,7 @@ import java.util.Optional; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -45,7 +45,6 @@ class DeleteArmResponseFilesHelperImplTest { private ExternalObjectDirectoryEntity eod; - private DeleteArmResponseFilesHelperImpl deleteArmResponseFilesHelper; @BeforeEach @@ -68,7 +67,7 @@ public static void close() { } @Test - void deleteResponseBlobsByManifestName_shouldDeleteBlobsWhenAllResponsesAreCompletedAndCleaned() { + void deleteResponseBlobsByManifestName_shouldDeleteBlobsIndividuallyWhenAllResponsesAreCompletedAndCleaned() { // given String manifestName = "DARTS_6a374f19a9ce7dc9cc480ea8d4eca0fb.a360"; eod.setStatus(EodHelper.armRpoPendingStatus()); @@ -95,7 +94,7 @@ void deleteDanglingResponses_shouldDeleteDanglingResponses() { BatchInputUploadFileFilenameProcessor processor = mock(BatchInputUploadFileFilenameProcessor.class); when(processor.getHashcode()).thenReturn("testHashcode"); when(armDataManagementApi.listResponseBlobs("testHashcode")).thenReturn(List.of("responseBlob")); - when(armDataManagementApi.deleteBlobData("responseBlob")).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(List.of("responseBlob"))).thenReturn(true); when(processor.getBatchMetadataFilename()).thenReturn("testFile"); when(processor.getBatchMetadataFilenameAndPath()).thenReturn("testFilePath"); @@ -103,22 +102,20 @@ void deleteDanglingResponses_shouldDeleteDanglingResponses() { deleteArmResponseFilesHelper.deleteDanglingResponses(processor); // then - verify(armDataManagementApi).deleteBlobData("responseBlob"); - verify(armDataManagementApi).deleteBlobData("testFilePath"); + verify(armDataManagementApi).deleteMultipleBlobs(List.of("responseBlob")); } @Test - void deleteResponseBlobs_shouldDeleteAllResponseBlobs() { + void deleteResponseBlob_shouldDeletResponseBlob() { // given - List responseBlobs = List.of("blob1", "blob2"); + String responseBlob = "blob1"; when(armDataManagementApi.deleteBlobData("blob1")).thenReturn(true); - when(armDataManagementApi.deleteBlobData("blob2")).thenReturn(true); // when - List result = deleteArmResponseFilesHelper.deleteResponseBlobs(responseBlobs); + Boolean result = deleteArmResponseFilesHelper.deleteResponseBlobIndividually(responseBlob); // then - assertTrue(result.stream().allMatch(Boolean::booleanValue)); + assertTrue(result); } @Test @@ -130,7 +127,7 @@ void deleteResponseBlobs_shouldUpdateEodWhenResponsesAreDeleted() { eod.setStatus(EodHelper.armResponseChecksumVerificationFailedStatus()); - when(armDataManagementApi.deleteBlobData(anyString())).thenReturn(true); + when(armDataManagementApi.deleteMultipleBlobs(anyList())).thenReturn(true); when(batchData.getCreateRecordFilenameProcessor()).thenReturn(createRecordFilenameProcessor); when(batchData.getUploadFileFilenameProcessor()).thenReturn(uploadFileFilenameProcessor); when(batchData.getInvalidLineFileFilenameProcessors()).thenReturn(Collections.emptyList());