2424import uk .gov .hmcts .darts .common .repository .TranscriptionRepository ;
2525import uk .gov .hmcts .darts .common .util .EodHelper ;
2626import uk .gov .hmcts .darts .retention .service .impl .ApplyRetentionCaseAssociatedObjectsSingleCaseProcessorImpl ;
27- import uk .gov .hmcts .darts .test .common .MediaIdMatcher ;
2827import uk .gov .hmcts .darts .testutils .IntegrationBase ;
2928import uk .gov .hmcts .darts .testutils .stubs .AnnotationStub ;
3029import uk .gov .hmcts .darts .testutils .stubs .CaseDocumentStub ;
3938
4039import static java .time .ZoneOffset .UTC ;
4140import static org .assertj .core .api .Assertions .assertThat ;
42- import static org .mockito .ArgumentMatchers .argThat ;
41+ import static org .mockito .ArgumentMatchers .eq ;
4342import static org .mockito .ArgumentMatchers .refEq ;
4443import static org .mockito .Mockito .doThrow ;
4544import static org .mockito .Mockito .never ;
4645import static org .mockito .Mockito .verify ;
4746import static org .mockito .Mockito .when ;
4847import static uk .gov .hmcts .darts .common .enums .ExternalLocationTypeEnum .ARM ;
48+ import static uk .gov .hmcts .darts .common .enums .ExternalLocationTypeEnum .DETS ;
4949import static uk .gov .hmcts .darts .common .enums .ExternalLocationTypeEnum .INBOUND ;
5050import static uk .gov .hmcts .darts .common .enums .ObjectRecordStatusEnum .ARM_DROP_ZONE ;
5151import static uk .gov .hmcts .darts .common .enums .ObjectRecordStatusEnum .STORED ;
5252
53+ @ SuppressWarnings ({"VariableDeclarationUsageDistance" , "PMD.NcssCount" })
5354class 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 ();
0 commit comments