Skip to content

Commit 46fd1e3

Browse files
authored
DMP-5264-DETSChildObjectRetention (#3084)
1 parent e4a3e8b commit 46fd1e3

File tree

6 files changed

+1079
-320
lines changed

6 files changed

+1079
-320
lines changed

src/integrationTest/java/uk/gov/hmcts/darts/common/repository/ExternalObjectDirectoryRepositoryTest.java

Lines changed: 613 additions & 164 deletions
Large diffs are not rendered by default.

src/integrationTest/java/uk/gov/hmcts/darts/retention/service/ApplyRetentionCaseAssociatedObjectsProcessorIntTest.java

Lines changed: 107 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import uk.gov.hmcts.darts.common.repository.TranscriptionRepository;
2525
import uk.gov.hmcts.darts.common.util.EodHelper;
2626
import uk.gov.hmcts.darts.retention.service.impl.ApplyRetentionCaseAssociatedObjectsSingleCaseProcessorImpl;
27-
import uk.gov.hmcts.darts.test.common.MediaIdMatcher;
2827
import uk.gov.hmcts.darts.testutils.IntegrationBase;
2928
import uk.gov.hmcts.darts.testutils.stubs.AnnotationStub;
3029
import uk.gov.hmcts.darts.testutils.stubs.CaseDocumentStub;
@@ -39,17 +38,19 @@
3938

4039
import static java.time.ZoneOffset.UTC;
4140
import static org.assertj.core.api.Assertions.assertThat;
42-
import static org.mockito.ArgumentMatchers.argThat;
41+
import static org.mockito.ArgumentMatchers.eq;
4342
import static org.mockito.ArgumentMatchers.refEq;
4443
import static org.mockito.Mockito.doThrow;
4544
import static org.mockito.Mockito.never;
4645
import static org.mockito.Mockito.verify;
4746
import static org.mockito.Mockito.when;
4847
import static uk.gov.hmcts.darts.common.enums.ExternalLocationTypeEnum.ARM;
48+
import static uk.gov.hmcts.darts.common.enums.ExternalLocationTypeEnum.DETS;
4949
import static uk.gov.hmcts.darts.common.enums.ExternalLocationTypeEnum.INBOUND;
5050
import static uk.gov.hmcts.darts.common.enums.ObjectRecordStatusEnum.ARM_DROP_ZONE;
5151
import static uk.gov.hmcts.darts.common.enums.ObjectRecordStatusEnum.STORED;
5252

53+
@SuppressWarnings({"VariableDeclarationUsageDistance", "PMD.NcssCount"})
5354
class ApplyRetentionCaseAssociatedObjectsProcessorIntTest extends IntegrationBase {
5455

5556
private static final OffsetDateTime DT_2025 = OffsetDateTime.of(2025, 1, 1, 1, 0, 0, 0, UTC);
@@ -60,50 +61,51 @@ class ApplyRetentionCaseAssociatedObjectsProcessorIntTest extends IntegrationBas
6061
private UserAccountEntity testUser;
6162

6263
@Autowired
63-
CaseRepository caseRepository;
64+
private CaseRepository caseRepository;
6465
@Autowired
65-
HearingRepository hearingRepository;
66+
private HearingRepository hearingRepository;
6667
@Autowired
67-
CaseRetentionStub caseRetentionStub;
68+
private CaseRetentionStub caseRetentionStub;
6869
@Autowired
69-
CaseRetentionRepository caseRetentionRepository;
70+
private CaseRetentionRepository caseRetentionRepository;
7071
@Autowired
71-
MediaRepository mediaRepository;
72+
private MediaRepository mediaRepository;
7273
@Autowired
73-
ExternalObjectDirectoryStub eodStub;
74+
private ExternalObjectDirectoryStub eodStub;
7475
@MockitoSpyBean
75-
ExternalObjectDirectoryRepository eodRepository;
76+
private ExternalObjectDirectoryRepository eodRepository;
7677
@Autowired
77-
AnnotationStub annotationStub;
78+
private AnnotationStub annotationStub;
7879
@Autowired
79-
TranscriptionStub transcriptionStub;
80+
private TranscriptionStub transcriptionStub;
8081
@Autowired
81-
AnnotationRepository annotationRepository;
82+
private AnnotationRepository annotationRepository;
8283
@Autowired
83-
AnnotationDocumentRepository annotationDocumentRepository;
84+
private AnnotationDocumentRepository annotationDocumentRepository;
8485
@Autowired
85-
TranscriptionRepository transcriptionRepository;
86+
private TranscriptionRepository transcriptionRepository;
8687
@Autowired
87-
TranscriptionDocumentRepository transcriptionDocumentRepository;
88+
private TranscriptionDocumentRepository transcriptionDocumentRepository;
8889
@Autowired
89-
CourtCaseStub caseStub;
90+
private CourtCaseStub caseStub;
9091
@Autowired
91-
CaseDocumentStub caseDocumentStub;
92+
private CaseDocumentStub caseDocumentStub;
9293
@Autowired
93-
CaseDocumentRepository caseDocumentRepository;
94+
private CaseDocumentRepository caseDocumentRepository;
9495
@MockitoSpyBean
95-
ApplyRetentionCaseAssociatedObjectsSingleCaseProcessorImpl singleCaseProcessor;
96+
private ApplyRetentionCaseAssociatedObjectsSingleCaseProcessorImpl singleCaseProcessor;
9697
@MockitoBean
97-
UserIdentity userIdentity;
98+
private UserIdentity userIdentity;
9899

99100
@Autowired
100-
ApplyRetentionCaseAssociatedObjectsProcessor processor;
101-
102-
List<MediaEntity> medias;
103-
CourtCaseEntity caseA;
104-
CourtCaseEntity caseB;
105-
CourtCaseEntity caseC;
101+
private ApplyRetentionCaseAssociatedObjectsProcessor processor;
106102

103+
private List<MediaEntity> medias;
104+
private CourtCaseEntity caseA;
105+
private CourtCaseEntity caseB;
106+
private CourtCaseEntity caseC;
107+
private CourtCaseEntity caseD;
108+
private CourtCaseEntity caseE;
107109

108110
@BeforeEach
109111
void setup() {
@@ -120,6 +122,7 @@ void setup() {
120122
media 1 -> hearing A1 -> case A
121123
media 2 -> hearing A2 -> case A
122124
media 3 -> hearing C -> case C
125+
media 4 -> hearing D -> case D
123126
*/
124127

125128
// given
@@ -138,46 +141,70 @@ void setup() {
138141
caseC.setRetentionRetries(2);
139142
caseC.setClosed(true);
140143

144+
caseD = caseStub.createAndSaveCourtCaseWithHearings();
145+
caseD.setRetentionUpdated(true);
146+
caseD.setRetentionRetries(1);
147+
caseD.setClosed(true);
148+
149+
caseE = caseStub.createAndSaveCourtCaseWithHearings();
150+
caseE.setRetentionUpdated(true);
151+
caseE.setRetentionRetries(1);
152+
caseE.setClosed(true);
153+
141154
medias = dartsDatabase.getMediaStub().createAndSaveSomeMedias();
142155

143156
var hearA1 = caseA.getHearings().getFirst();
144157
var hearA2 = caseA.getHearings().get(1);
145158
var hearA3 = caseA.getHearings().get(2);
146159
var hearB = caseB.getHearings().getFirst();
147160
var hearC = caseC.getHearings().getFirst();
161+
var hearD = caseD.getHearings().getFirst();
162+
var hearE = caseE.getHearings().getFirst();
163+
148164
hearA1.addMedia(medias.getFirst());
149165
hearA1.addMedia(medias.get(1));
150166
hearA2.addMedia(medias.get(2));
151167
hearB.addMedia(medias.getFirst());
152168
hearC.addMedia(medias.get(3));
169+
hearD.addMedia(medias.get(4));
170+
hearE.addMedia(medias.get(5));
153171

154172
hearingRepository.save(hearA3);
155173
hearingRepository.save(hearA2);
156174
hearingRepository.save(hearA1);
157175
hearingRepository.save(hearB);
158176
hearingRepository.save(hearC);
177+
hearingRepository.save(hearD);
178+
hearingRepository.save(hearE);
159179

160180
caseRetentionStub.createCaseRetentionObject(caseA, DT_2025);
161181
caseRetentionStub.createCaseRetentionObject(caseA, DT_2026);
162182
caseRetentionStub.createCaseRetentionObject(caseB, DT_2027);
163183
caseRetentionStub.createCaseRetentionObject(caseB, DT_2028);
164184
caseRetentionStub.createCaseRetentionObject(caseC, DT_2028);
185+
caseRetentionStub.createCaseRetentionObject(caseD, DT_2025);
186+
caseRetentionStub.createCaseRetentionObject(caseE, DT_2025);
165187

166188
eodStub.createAndSaveEod(medias.getFirst(), ARM_DROP_ZONE, ARM, eod -> eod.setUpdateRetention(false));
167189
eodStub.createAndSaveEod(medias.get(1), ARM_DROP_ZONE, ARM, eod -> eod.setUpdateRetention(false));
168190
eodStub.createAndSaveEod(medias.get(2), ARM_DROP_ZONE, ARM, eod -> eod.setUpdateRetention(false));
169191
eodStub.createAndSaveEod(medias.get(3), ARM_DROP_ZONE, ARM, eod -> eod.setUpdateRetention(false));
192+
eodStub.createAndSaveEod(medias.get(4), ARM_DROP_ZONE, DETS, eod -> eod.setUpdateRetention(false));
193+
eodStub.createAndSaveEod(medias.get(5), ARM_DROP_ZONE, ARM, eod -> eod.setUpdateRetention(false));
194+
eodStub.createAndSaveEod(medias.get(5), ARM_DROP_ZONE, DETS, eod -> eod.setUpdateRetention(false));
170195

171196
testUser = dartsDatabase.getUserAccountStub().getIntegrationTestUserAccountEntity();
172197
when(userIdentity.getUserAccount()).thenReturn(testUser);
173198

174199
caseRepository.save(caseA);
175200
caseRepository.save(caseB);
176201
caseRepository.save(caseC);
202+
caseRepository.save(caseD);
203+
caseRepository.save(caseE);
177204
}
178205

179206
@Test
180-
void testSuccessfullyApplyRetentionToCaseMedias() {
207+
void processApplyRetentionToCaseAssociatedObjects_ShouldSuccessfullyApplyRetentionToCaseMedias() {
181208

182209
// when
183210
processor.processApplyRetentionToCaseAssociatedObjects(1000);
@@ -203,7 +230,46 @@ void testSuccessfullyApplyRetentionToCaseMedias() {
203230
}
204231

205232
@Test
206-
void testSuccessfullyApplyRetentionToCaseMediasIncludingLinkedMedias() {
233+
void processApplyRetentionToCaseAssociatedObjects_ShouldSuccessfullyApplyRetentionToCaseMediasInDets() {
234+
235+
// when
236+
processor.processApplyRetentionToCaseAssociatedObjects(1000);
237+
238+
// then
239+
var media4 = mediaRepository.findById(medias.get(4).getId()).get();
240+
assertThat(media4.getRetainUntilTs()).isEqualTo(DT_2025);
241+
242+
var actualCaseD = caseRepository.findById(caseD.getId());
243+
assertThat(actualCaseD.get().isRetentionUpdated()).isFalse();
244+
assertThat(actualCaseD.get().getRetentionRetries()).isEqualTo(1);
245+
246+
var detsEodsMedia4 = eodRepository.findByMediaStatusAndType(media4, EodHelper.armDropZoneStatus(), EodHelper.detsLocation());
247+
assertThat(detsEodsMedia4.getFirst().isUpdateRetention()).isFalse();
248+
}
249+
250+
@Test
251+
void processApplyRetentionToCaseAssociatedObjects_ShouldSuccessfullyApplyRetentionToCaseMediasInArmAndDets() {
252+
253+
// when
254+
processor.processApplyRetentionToCaseAssociatedObjects(1000);
255+
256+
// then
257+
var media5 = mediaRepository.findById(medias.get(5).getId()).get();
258+
assertThat(media5.getRetainUntilTs()).isEqualTo(DT_2025);
259+
260+
var actualCaseE = caseRepository.findById(caseE.getId());
261+
assertThat(actualCaseE.get().isRetentionUpdated()).isFalse();
262+
assertThat(actualCaseE.get().getRetentionRetries()).isEqualTo(1);
263+
264+
var armEodsMedia5 = eodRepository.findByMediaStatusAndType(media5, EodHelper.armDropZoneStatus(), EodHelper.armLocation());
265+
assertThat(armEodsMedia5.getFirst().isUpdateRetention()).isTrue();
266+
var detsEodsMedia5 = eodRepository.findByMediaStatusAndType(media5, EodHelper.armDropZoneStatus(), EodHelper.detsLocation());
267+
assertThat(detsEodsMedia5.getFirst().isUpdateRetention()).isFalse();
268+
269+
}
270+
271+
@Test
272+
void processApplyRetentionToCaseAssociatedObjects_ShouldSuccessfullyApplyRetentionToCaseMediasIncludingLinkedMedias() {
207273
// given
208274
MediaLinkedCaseEntity mediaLinkedCase1 = createMediaLinkedCase(medias.get(3), caseA);
209275
dartsDatabase.getMediaLinkedCaseRepository().save(mediaLinkedCase1);
@@ -241,10 +307,8 @@ void testSuccessfullyApplyRetentionToCaseMediasIncludingLinkedMedias() {
241307
}
242308

243309
@Test
244-
void testSuccessfullyApplyRetentionToCaseAnnotations() {
310+
void processApplyRetentionToCaseAssociatedObjects_ShouldSuccessfullyApplyRetentionToCaseAnnotations() {
245311
/*
246-
Test data setup:
247-
248312
case A -> hearing 1A -> annotation1A -> annotationDoc1, annotationDoc2
249313
case A -> hearing 1A -> annotation2A -> annotationDoc3
250314
case A -> hearing 2A -> annotation2A -> annotationDoc3
@@ -294,13 +358,13 @@ void testSuccessfullyApplyRetentionToCaseAnnotations() {
294358
// then
295359
var actualAnnotationDoc1 = annotationDocumentRepository.findById(annotationDoc1.getId()).get();
296360
assertThat(actualAnnotationDoc1.getRetainUntilTs()).isEqualTo(DT_2028);
297-
var eodsAnnotationDoc1 = eodRepository.findByAnnotationDocumentEntityAndExternalLocationType(
298-
annotationDoc1, EodHelper.armLocation());
361+
var eodsAnnotationDoc1 = eodRepository.findByAnnotationDocumentIdAndExternalLocationTypes(
362+
annotationDoc1.getId(), List.of(EodHelper.armLocation()));
299363
assertThat(eodsAnnotationDoc1.getFirst().isUpdateRetention()).isTrue();
300364
var actualAnnotationDoc3 = annotationDocumentRepository.findById(annotationDoc3.getId()).get();
301365
assertThat(actualAnnotationDoc3.getRetainUntilTs()).isEqualTo(DT_2026);
302-
var eodsAnnotationDoc3 = eodRepository.findByAnnotationDocumentEntityAndExternalLocationType(
303-
annotationDoc3, EodHelper.armLocation());
366+
var eodsAnnotationDoc3 = eodRepository.findByAnnotationDocumentIdAndExternalLocationTypes(
367+
annotationDoc3.getId(), List.of(EodHelper.armLocation()));
304368
assertThat(eodsAnnotationDoc3.getFirst().isUpdateRetention()).isTrue();
305369
var actualAnnotationDoc4 = annotationDocumentRepository.findById(annotationDoc4.getId()).get();
306370
assertThat(actualAnnotationDoc4.getRetainUntilTs()).isEqualTo(DT_2026);
@@ -316,15 +380,12 @@ void testSuccessfullyApplyRetentionToCaseAnnotations() {
316380
}
317381

318382
@Test
319-
void testSuccessfullyApplyRetentionToCaseTranscriptionDocuments() {
383+
void processApplyRetentionToCaseAssociatedObjects_ShouldSuccessfullyApplyRetentionToCaseTranscriptionDocuments() {
320384
/*
321-
Test data setup:
322-
323385
case A -> hearing 1 -> transcription1 -> transcriptionDoc1, transcriptionDoc2
324386
case A -> hearing 1 -> transcription2 -> transcriptionDoc3
325387
case A -> hearing 2 -> transcription2 -> transcriptionDoc3
326388
case B -> hearing 3 -> transcription1 -> transcriptionDoc1, transcriptionDoc2
327-
328389
*/
329390

330391
// given
@@ -378,7 +439,7 @@ void testSuccessfullyApplyRetentionToCaseTranscriptionDocuments() {
378439
}
379440

380441
@Test
381-
void testSuccessfullyApplyRetentionToCaseDocuments() {
442+
void processApplyRetentionToCaseAssociatedObjects_ShouldSuccessfullyApplyRetentionToCaseDocuments() {
382443
/*
383444
Test data setup:
384445
@@ -415,11 +476,11 @@ void testSuccessfullyApplyRetentionToCaseDocuments() {
415476
}
416477

417478
@Test
418-
void testExceptionOnOneObjectCausesRollbackOfAllChangesToAllObjectsAndProcessingOfOtherCasesContinues() {
479+
void processApplyRetentionToCaseAssociatedObjects_ShouldFail_WhenOneObjectCausesRollbackToAllObjectsAndProcessingOfOtherCasesContinues() {
419480

420481
// given
421-
doThrow(RuntimeException.class).when(eodRepository).findByMediaAndExternalLocationType(argThat(
422-
new MediaIdMatcher(medias.getFirst().getId())), refEq(EodHelper.armLocation()));
482+
doThrow(RuntimeException.class).when(eodRepository).findByMediaIdAndExternalLocationTypes(
483+
eq(medias.getFirst().getId()), refEq(List.of(EodHelper.armLocation(), EodHelper.detsLocation())));
423484

424485
// when
425486
processor.processApplyRetentionToCaseAssociatedObjects(1000);
@@ -442,7 +503,7 @@ void testExceptionOnOneObjectCausesRollbackOfAllChangesToAllObjectsAndProcessing
442503
}
443504

444505
@Test
445-
void testRetentionIsNotAppliedIfAssociatedCasesAreNotAllClosed() {
506+
void processApplyRetentionToCaseAssociatedObjects_ShouldSetRetentionIsNotAppliedIfAssociatedCasesAreNotAllClosed() {
446507

447508
// given
448509
caseB.setClosed(false);
@@ -464,7 +525,7 @@ void testRetentionIsNotAppliedIfAssociatedCasesAreNotAllClosed() {
464525
}
465526

466527
@Test
467-
void testRetentionIsNotAppliedIfMissingArmEod() {
528+
void processApplyRetentionToCaseAssociatedObjects_ShouldSetRetentionIsNotAppliedIfMissingArmEod() {
468529

469530
// given
470531
eodRepository.deleteAll();
@@ -489,7 +550,7 @@ void testRetentionIsNotAppliedIfMissingArmEod() {
489550
}
490551

491552
@Test
492-
void testRetentionIsNotAppliedIfNoRetentionsFoundOnMediaCases() {
553+
void processApplyRetentionToCaseAssociatedObjects_ShouldSetRetentionIsNotAppliedIfNoRetentionsFoundOnMediaCases() {
493554

494555
// given
495556
caseRetentionRepository.deleteAll();

src/main/java/uk/gov/hmcts/darts/audio/service/impl/AudioServiceImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ public void setIsArchived(List<AudioMetadata> audioMetadata, Integer hearingId)
9494
}
9595
}
9696

97-
/*
98-
Set the isAvailable flag if the media is available in the unstructured datastore.
97+
/**
98+
* Set the isAvailable flag if the media is available in the unstructured datastore.
9999
*/
100100
@Override
101101
public void setIsAvailable(List<AudioMetadata> audioMetadataList) {

0 commit comments

Comments
 (0)