Skip to content

Commit 9e9d429

Browse files
authored
DMP-5265 ARM - Unable to parse timestamp (#3085)
1 parent 46fd1e3 commit 9e9d429

File tree

5 files changed

+152
-15
lines changed

5 files changed

+152
-15
lines changed

src/integrationTest/java/uk/gov/hmcts/darts/arm/service/impl/AbstractArmBatchProcessResponseFilesIntTest.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ abstract class AbstractArmBatchProcessResponseFilesIntTest extends IntegrationBa
127127
protected AsyncTaskConfig asyncTaskConfig;
128128

129129
@BeforeEach
130-
void commonSetup() {
130+
void setup() {
131131
asyncTaskConfig = mock(AsyncTaskConfig.class);
132132
when(asyncTaskConfig.getThreads()).thenReturn(1);
133133
when(asyncTaskConfig.getAsyncTimeout()).thenReturn(Duration.ofSeconds(10));
@@ -359,7 +359,7 @@ void batchProcessResponseFiles_WithMediaReturnsSuccess() throws IOException {
359359

360360
assertEquals(1, foundMediaList4.size());
361361
ExternalObjectDirectoryEntity foundMedia4 = foundMediaList4.getFirst();
362-
assertNull(foundMedia4.getDataIngestionTs());
362+
assertEquals("2023-06-10T14:08:28.316382Z", foundMedia4.getInputUploadProcessedTs().toString());
363363
assertEquals(ARM_RESPONSE_MANIFEST_FAILED.getId(), foundMedia4.getStatus().getId());
364364
assertEquals(2, foundMedia4.getVerificationAttempts());
365365
assertEquals(1, foundMedia4.getTransferAttempts());
@@ -374,7 +374,7 @@ void batchProcessResponseFiles_WithMediaReturnsSuccess() throws IOException {
374374

375375
assertEquals(1, foundMediaList5.size());
376376
ExternalObjectDirectoryEntity foundMedia5 = foundMediaList5.getFirst();
377-
assertNull(foundMedia5.getDataIngestionTs());
377+
assertEquals("2023-06-10T14:08:28.316382Z", foundMedia5.getInputUploadProcessedTs().toString());
378378
assertEquals(ARM_DROP_ZONE.getId(), foundMedia5.getStatus().getId());
379379
assertEquals(1, foundMedia5.getVerificationAttempts());
380380
assertEquals(1, foundMedia5.getTransferAttempts());
@@ -2422,10 +2422,9 @@ private void batchProcessResponseFiles_WithTranscriptionReturnsSuccess(String te
24222422

24232423
when(armDataManagementApi.listResponseBlobs(hashcode1)).thenReturn(hashcodeResponses);
24242424

2425-
String createRecordFileTest1 = testFilePath;
24262425
String validUploadFileTest1 = "tests/arm/service/ArmBatchResponseFilesProcessorTest/ValidResponses/UploadFile.rsp";
24272426

2428-
BinaryData createRecordBinaryDataTest1 = convertStringToBinaryData(getCreateRecordFileContents(createRecordFileTest1, armEod.getId()));
2427+
BinaryData createRecordBinaryDataTest1 = convertStringToBinaryData(getCreateRecordFileContents(testFilePath, armEod.getId()));
24292428
BinaryData uploadFileBinaryDataTest1 = convertStringToBinaryData(
24302429
getUploadFileContents(validUploadFileTest1, armEod.getId(), transcriptionDocumentEntity.getChecksum()));
24312430

src/main/java/uk/gov/hmcts/darts/arm/service/impl/AbstractArmBatchProcessResponseFiles.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ private void processInputUploadBlob(String inputUploadBlob, UserAccountEntity us
211211
}
212212
}
213213

214-
OffsetDateTime getInputUploadFileTimestamp(ArmResponseInputUploadFileRecord inputUploadFileRecord) {
214+
public OffsetDateTime getInputUploadFileTimestamp(ArmResponseInputUploadFileRecord inputUploadFileRecord) {
215215
try {
216216
return OffsetDateTime.parse(inputUploadFileRecord.getTimestamp(), dateTimeFormatter);
217217
} catch (Exception e) {
@@ -221,12 +221,12 @@ OffsetDateTime getInputUploadFileTimestamp(ArmResponseInputUploadFileRecord inpu
221221
}
222222
}
223223

224-
private OffsetDateTime getUploadFileRecordProcessTime(ArmResponseUploadFileRecord armResponseUploadFileRecord) {
224+
public OffsetDateTime getUploadFileRecordProcessTime(ArmResponseUploadFileRecord armResponseUploadFileRecord) {
225225
try {
226226
return OffsetDateTime.parse(armResponseUploadFileRecord.getProcessTime(), dateTimeFormatter);
227227
} catch (Exception e) {
228-
log.error("Unable to parse timestamp {} from ARM upload file (UF) record {}", armResponseUploadFileRecord.getProcessTime(),
229-
armResponseUploadFileRecord.getA360RecordId(), e);
228+
log.warn("Unable to parse timestamp {} from ARM upload file (UF) record {}", armResponseUploadFileRecord.getProcessTime(),
229+
armResponseUploadFileRecord.getA360RecordId(), e);
230230
throw new IllegalArgumentException(e);
231231
}
232232
}
@@ -450,7 +450,6 @@ private void processMultipleInvalidLineFiles(ArmResponseBatchData armResponseBat
450450
deleteArmResponseFilesHelper.deleteResponseBlobs(invalidResponseFiles);
451451
}
452452
} else {
453-
454453
log.warn("Unable to find external object directory with ID {} for ARM batch responses with first IL file {}, second IL file {}",
455454
armResponseBatchData.getExternalObjectDirectoryId(),
456455
invalidLineFileFilenameProcessor1.getInvalidLineFileFilenameAndPath(),
@@ -464,7 +463,6 @@ private void processMultipleInvalidLineFiles(ArmResponseBatchData armResponseBat
464463
} catch (Exception e) {
465464
log.error("Unable to update invalid line responses", e);
466465
}
467-
468466
}
469467

470468
private void setInvalidLineErrorDescription(ArmResponseInvalidLineRecord record1, ArmResponseInvalidLineRecord record2,

src/main/resources/application.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ darts:
244244
transcription-record-properties-file: properties/arm/transcription-record.properties
245245
annotation-record-properties-file: properties/arm/annotation-record.properties
246246
case-record-properties-file: properties/arm/case-record.properties
247-
input-upload-response-timestamp-format: yyyy-MM-dd'T'HH:mm:ss.SSSSSS[XXXX][XXXXX]
247+
input-upload-response-timestamp-format: yyyy-MM-dd'T'HH:mm:ss[.SSSSSS][XXXX][XXXXX]
248248

249249
response-cleanup-buffer-days: 0
250250
batch-response-cleanup:

src/test/java/uk/gov/hmcts/darts/arm/service/impl/ArmBatchProcessResponseFilesImplTest.java

Lines changed: 142 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.azure.core.util.BinaryData;
44
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import org.jetbrains.annotations.NotNull;
56
import org.junit.jupiter.api.AfterAll;
67
import org.junit.jupiter.api.BeforeAll;
78
import org.junit.jupiter.api.BeforeEach;
@@ -17,6 +18,8 @@
1718
import uk.gov.hmcts.darts.arm.model.blobs.ArmBatchResponses;
1819
import uk.gov.hmcts.darts.arm.model.blobs.ArmResponseBatchData;
1920
import uk.gov.hmcts.darts.arm.model.blobs.ContinuationTokenBlobs;
21+
import uk.gov.hmcts.darts.arm.model.record.armresponse.ArmResponseInputUploadFileRecord;
22+
import uk.gov.hmcts.darts.arm.model.record.armresponse.ArmResponseUploadFileRecord;
2023
import uk.gov.hmcts.darts.arm.service.DeleteArmResponseFilesHelper;
2124
import uk.gov.hmcts.darts.arm.service.ExternalObjectDirectoryService;
2225
import uk.gov.hmcts.darts.arm.util.files.BatchInputUploadFileFilenameProcessor;
@@ -36,12 +39,15 @@
3639

3740
import java.time.Duration;
3841
import java.time.OffsetDateTime;
42+
import java.time.format.DateTimeFormatter;
3943
import java.util.ArrayList;
4044
import java.util.Collections;
4145
import java.util.List;
4246
import java.util.Map;
4347
import java.util.UUID;
4448

49+
import static org.junit.jupiter.api.Assertions.assertEquals;
50+
import static org.junit.jupiter.api.Assertions.assertThrows;
4551
import static org.mockito.ArgumentMatchers.any;
4652
import static org.mockito.ArgumentMatchers.anyList;
4753
import static org.mockito.Mockito.doNothing;
@@ -78,7 +84,7 @@ class ArmBatchProcessResponseFilesImplTest {
7884
private static final Integer BATCH_SIZE = 2;
7985
private static final String DATETIMEKEY = "<datetimekey>";
8086
private static final String INPUT_UPLOAD_RESPONSE_DATETIME = "2021-08-01T10:08:28.316382+00:00";
81-
private static final String UPLOAD_RESPONSE_TIMESTAMP_FORAMT = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS[XXXX][XXXXX]";
87+
private static final String UPLOAD_RESPONSE_TIMESTAMP_FORAMT = "yyyy-MM-dd'T'HH:mm:ss[.SSSSSS][XXXX][XXXXX]";
8288

8389
@Mock
8490
private ExternalObjectDirectoryRepository externalObjectDirectoryRepository;
@@ -104,14 +110,15 @@ class ArmBatchProcessResponseFilesImplTest {
104110
private AsyncTaskConfig asyncTaskConfig;
105111

106112
private ArmBatchProcessResponseFilesImplProtectedMethodSupport armBatchProcessResponseFiles;
113+
private ObjectMapper objectMapper;
107114

108115
@BeforeEach
109116
void setupData() {
110117
lenient().when(asyncTaskConfig.getThreads()).thenReturn(1);
111118
lenient().when(asyncTaskConfig.getAsyncTimeout()).thenReturn(Duration.ofSeconds(10));
112119

113120
ObjectMapperConfig objectMapperConfig = new ObjectMapperConfig();
114-
ObjectMapper objectMapper = objectMapperConfig.objectMapper();
121+
objectMapper = objectMapperConfig.objectMapper();
115122

116123
when(armDataManagementConfiguration.getInputUploadResponseTimestampFormat()).thenReturn(UPLOAD_RESPONSE_TIMESTAMP_FORAMT);
117124

@@ -501,6 +508,139 @@ void processResponseFiles_throwsInterruptedException() {
501508
}
502509
}
503510

511+
@Test
512+
void getInputUploadFileTimestamp_shouldReturnParsedOffsetDateTime_WithMilliseconds() {
513+
// given
514+
ArmBatchProcessResponseFilesImpl armBatchProcessResponse = new ArmBatchProcessResponseFilesImpl(
515+
externalObjectDirectoryRepository,
516+
armDataManagementApi,
517+
fileOperationService,
518+
armDataManagementConfiguration,
519+
objectMapper,
520+
userIdentity,
521+
currentTimeHelper,
522+
externalObjectDirectoryService,
523+
logApi,
524+
deleteArmResponseFilesHelper
525+
);
526+
String timestamp = "2023-06-10T14:08:28.316382+00:00";
527+
ArmResponseInputUploadFileRecord inputUploadFileRecord = new ArmResponseInputUploadFileRecord();
528+
inputUploadFileRecord.setTimestamp(timestamp);
529+
530+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(UPLOAD_RESPONSE_TIMESTAMP_FORAMT);
531+
532+
// when
533+
OffsetDateTime result = armBatchProcessResponse.getInputUploadFileTimestamp(inputUploadFileRecord);
534+
535+
// then
536+
assertEquals(OffsetDateTime.parse(timestamp, formatter), result);
537+
}
538+
539+
@Test
540+
void getInputUploadFileTimestamp_shouldThrowException_WhereDateIsInvalid() {
541+
// given
542+
ArmBatchProcessResponseFilesImpl armBatchProcessResponse = getArmBatchProcessResponseFiles();
543+
String invalidTimestamp = "2023-06-10T14:08:28+00:00Z";
544+
ArmResponseInputUploadFileRecord inputUploadFileRecord = new ArmResponseInputUploadFileRecord();
545+
inputUploadFileRecord.setTimestamp(invalidTimestamp);
546+
547+
// when
548+
assertThrows(IllegalArgumentException.class,
549+
() -> armBatchProcessResponse.getInputUploadFileTimestamp(inputUploadFileRecord));
550+
551+
}
552+
553+
@Test
554+
void getUploadFileRecordProcessTime_shouldReturnParsedOffsetDateTime_WithMilliseconds() {
555+
// given
556+
ArmBatchProcessResponseFilesImpl armBatchProcessResponse = getArmBatchProcessResponseFiles();
557+
String timestamp = "2023-06-10T14:08:28.316382+00:00";
558+
ArmResponseUploadFileRecord armResponseUploadFileRecord = new ArmResponseUploadFileRecord();
559+
armResponseUploadFileRecord.setProcessTime(timestamp);
560+
561+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(UPLOAD_RESPONSE_TIMESTAMP_FORAMT);
562+
563+
// when
564+
OffsetDateTime result = armBatchProcessResponse.getUploadFileRecordProcessTime(armResponseUploadFileRecord);
565+
566+
// then
567+
assertEquals(OffsetDateTime.parse(timestamp, formatter), result);
568+
}
569+
570+
@Test
571+
void getUploadFileRecordProcessTime_shouldReturnParsedOffsetDateTime_WithoutMilliseconds() {
572+
// given
573+
ArmBatchProcessResponseFilesImpl armBatchProcessResponse = getArmBatchProcessResponseFiles();
574+
String timestamp = "2023-06-10T14:08:28+00:00";
575+
ArmResponseUploadFileRecord armResponseUploadFileRecord = new ArmResponseUploadFileRecord();
576+
armResponseUploadFileRecord.setProcessTime(timestamp);
577+
578+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(UPLOAD_RESPONSE_TIMESTAMP_FORAMT);
579+
580+
// when
581+
OffsetDateTime result = armBatchProcessResponse.getUploadFileRecordProcessTime(armResponseUploadFileRecord);
582+
583+
// then
584+
assertEquals(OffsetDateTime.parse(timestamp, formatter), result);
585+
}
586+
587+
@Test
588+
void getUploadFileRecordProcessTime_shouldThrowException_WhereDateIsInvalid() {
589+
// given
590+
ArmBatchProcessResponseFilesImpl armBatchProcessResponse = getArmBatchProcessResponseFiles();
591+
String invalidTimestamp = "2023-06-10T14:08:28+00:00Z";
592+
ArmResponseUploadFileRecord armResponseUploadFileRecord = new ArmResponseUploadFileRecord();
593+
armResponseUploadFileRecord.setProcessTime(invalidTimestamp);
594+
595+
// when
596+
assertThrows(IllegalArgumentException.class,
597+
() -> armBatchProcessResponse.getUploadFileRecordProcessTime(armResponseUploadFileRecord));
598+
599+
}
600+
601+
@Test
602+
void getInputUploadFileTimestamp_shouldReturnParsedOffsetDateTime_WithoutMilliseconds() {
603+
// given
604+
ArmBatchProcessResponseFilesImpl armBatchProcessResponse = new ArmBatchProcessResponseFilesImpl(
605+
externalObjectDirectoryRepository,
606+
armDataManagementApi,
607+
fileOperationService,
608+
armDataManagementConfiguration,
609+
objectMapper,
610+
userIdentity,
611+
currentTimeHelper,
612+
externalObjectDirectoryService,
613+
logApi,
614+
deleteArmResponseFilesHelper
615+
);
616+
String timestamp = "2023-06-10T14:08:28+00:00";
617+
ArmResponseInputUploadFileRecord inputUploadFileRecord = new ArmResponseInputUploadFileRecord();
618+
inputUploadFileRecord.setTimestamp(timestamp);
619+
620+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(UPLOAD_RESPONSE_TIMESTAMP_FORAMT);
621+
622+
// when
623+
OffsetDateTime result = armBatchProcessResponse.getInputUploadFileTimestamp(inputUploadFileRecord);
624+
625+
// then
626+
assertEquals(OffsetDateTime.parse(timestamp, formatter), result);
627+
}
628+
629+
private @NotNull ArmBatchProcessResponseFilesImpl getArmBatchProcessResponseFiles() {
630+
return new ArmBatchProcessResponseFilesImpl(
631+
externalObjectDirectoryRepository,
632+
armDataManagementApi,
633+
fileOperationService,
634+
armDataManagementConfiguration,
635+
objectMapper,
636+
userIdentity,
637+
currentTimeHelper,
638+
externalObjectDirectoryService,
639+
logApi,
640+
deleteArmResponseFilesHelper
641+
);
642+
}
643+
504644
class ArmBatchProcessResponseFilesImplProtectedMethodSupport extends ArmBatchProcessResponseFilesImpl {
505645

506646
public ArmBatchProcessResponseFilesImplProtectedMethodSupport(ExternalObjectDirectoryRepository externalObjectDirectoryRepository,

src/test/java/uk/gov/hmcts/darts/arm/service/impl/DetsToArmBatchProcessResponseFilesImplTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
@Isolated
5151
class DetsToArmBatchProcessResponseFilesImplTest {
5252

53-
private static final String UPLOAD_RESPONSE_TIMESTAMP_FORAMT = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS[XXXX][XXXXX]";
53+
private static final String UPLOAD_RESPONSE_TIMESTAMP_FORAMT = "yyyy-MM-dd'T'HH:mm:ss[.SSSSSS][XXXX][XXXXX]";
5454

5555
@Mock
5656
private ArmDataManagementApi armDataManagementApi;

0 commit comments

Comments
 (0)