From 1e5bf6905e1106ecb29bcdfd3bbd46588507155f Mon Sep 17 00:00:00 2001 From: Andrey Pereverzin Date: Fri, 7 Feb 2025 17:19:49 +0000 Subject: [PATCH] Introduced HearingDecision --- .../MakeNewApplicationSubmitHandler.java | 25 +--- .../service/HearingDecisionProcessor.java | 1 - .../service/MakeNewApplicationService.java | 21 +++- .../MakeNewApplicationSubmitHandlerTest.java | 27 +++-- .../MakeNewApplicationServiceTest.java | 107 ++++++++++++++++-- 5 files changed, 141 insertions(+), 40 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/bailcaseapi/domain/handlers/presubmit/MakeNewApplicationSubmitHandler.java b/src/main/java/uk/gov/hmcts/reform/bailcaseapi/domain/handlers/presubmit/MakeNewApplicationSubmitHandler.java index e983382b5..e7d4e48fa 100644 --- a/src/main/java/uk/gov/hmcts/reform/bailcaseapi/domain/handlers/presubmit/MakeNewApplicationSubmitHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/bailcaseapi/domain/handlers/presubmit/MakeNewApplicationSubmitHandler.java @@ -2,9 +2,6 @@ import static java.util.Objects.requireNonNull; -import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.CURRENT_HEARING_ID; -import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.HEARING_DECISION_LIST; -import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.HEARING_ID_LIST; import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.IS_IMA_ENABLED; import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.ccd.field.YesOrNo.NO; import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.ccd.field.YesOrNo.YES; @@ -12,22 +9,17 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCase; -import uk.gov.hmcts.reform.bailcaseapi.domain.entities.HearingDecision; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.ccd.CaseDetails; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.ccd.Event; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.ccd.State; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.ccd.callback.Callback; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.ccd.callback.PreSubmitCallbackResponse; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.ccd.callback.PreSubmitCallbackStage; -import uk.gov.hmcts.reform.bailcaseapi.domain.entities.ccd.field.IdValue; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.ccd.field.YesOrNo; import uk.gov.hmcts.reform.bailcaseapi.domain.handlers.PreSubmitCallbackStateHandler; import uk.gov.hmcts.reform.bailcaseapi.domain.service.FeatureToggleService; import uk.gov.hmcts.reform.bailcaseapi.domain.service.MakeNewApplicationService; -import java.util.List; -import java.util.Optional; - @Slf4j @Component public class MakeNewApplicationSubmitHandler implements PreSubmitCallbackStateHandler { @@ -51,9 +43,11 @@ public boolean canHandle(PreSubmitCallbackStage callbackStage, Callback handle(PreSubmitCallbackStage callbackStage, Callback callback, - PreSubmitCallbackResponse callbackResponse) { - + public PreSubmitCallbackResponse handle( + PreSubmitCallbackStage callbackStage, + Callback callback, + PreSubmitCallbackResponse callbackResponse + ) { requireNonNull(callbackResponse, "callback must not be null"); if (!canHandle(callbackStage, callback)) { @@ -77,14 +71,7 @@ public PreSubmitCallbackResponse handle(PreSubmitCallbackStage callbac YesOrNo isImaEnabled = featureToggleService.imaEnabled() ? YES : NO; bailCase.write(IS_IMA_ENABLED, isImaEnabled); - Optional currentHearingIdOpt = detailsBefore.read(CURRENT_HEARING_ID); - Optional>> hearingIdListOpt = detailsBefore.read(HEARING_ID_LIST); - Optional>> hearingDecisionListOpt = detailsBefore.read(HEARING_DECISION_LIST); - currentHearingIdOpt.ifPresent(currentHearingId -> bailCase.write(CURRENT_HEARING_ID, currentHearingId)); - hearingIdListOpt.ifPresent(hearingIdList -> bailCase.write(HEARING_ID_LIST, hearingIdList)); - hearingDecisionListOpt.ifPresent( - hearingDecisionList -> bailCase.write(HEARING_DECISION_LIST, hearingDecisionList) - ); + makeNewApplicationService.preserveHearingsData(bailCase, detailsBefore); return new PreSubmitCallbackResponse<>(bailCase, State.APPLICATION_SUBMITTED); } diff --git a/src/main/java/uk/gov/hmcts/reform/bailcaseapi/domain/service/HearingDecisionProcessor.java b/src/main/java/uk/gov/hmcts/reform/bailcaseapi/domain/service/HearingDecisionProcessor.java index 24a53f144..cf19b5261 100644 --- a/src/main/java/uk/gov/hmcts/reform/bailcaseapi/domain/service/HearingDecisionProcessor.java +++ b/src/main/java/uk/gov/hmcts/reform/bailcaseapi/domain/service/HearingDecisionProcessor.java @@ -21,7 +21,6 @@ public class HearingDecisionProcessor { public void processHearingDecision(BailCase bailCase) { Optional decisionOpt = bailCase.read(DECISION_GRANTED_OR_REFUSED, String.class); - log.info("----------------decisionOpt: {}", decisionOpt); String decision = decisionOpt.orElse("decided"); processHearingDecision(bailCase, decision); } diff --git a/src/main/java/uk/gov/hmcts/reform/bailcaseapi/domain/service/MakeNewApplicationService.java b/src/main/java/uk/gov/hmcts/reform/bailcaseapi/domain/service/MakeNewApplicationService.java index bec21a14f..1772db81b 100644 --- a/src/main/java/uk/gov/hmcts/reform/bailcaseapi/domain/service/MakeNewApplicationService.java +++ b/src/main/java/uk/gov/hmcts/reform/bailcaseapi/domain/service/MakeNewApplicationService.java @@ -6,17 +6,21 @@ import java.util.stream.Collectors; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import uk.gov.hmcts.reform.bailcaseapi.domain.UserDetailsHelper; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCase; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.DynamicList; +import uk.gov.hmcts.reform.bailcaseapi.domain.entities.HearingDecision; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.PriorApplication; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.UserDetails; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.UserRoleLabel; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.ccd.field.IdValue; +import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.CURRENT_HEARING_ID; +import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.HEARING_DECISION_LIST; +import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.HEARING_ID_LIST; + @Service public class MakeNewApplicationService { private final Appender appender; @@ -68,6 +72,17 @@ public void clearFieldsAboutToSubmit(BailCase bailCase) { clearUnrelatedFields(bailCase, VALID_ABOUT_TO_SUBMIT_MAKE_NEW_APPLICATION_FIELDS); } + public void preserveHearingsData(BailCase bailCase, BailCase detailsBefore) { + Optional currentHearingIdOpt = detailsBefore.read(CURRENT_HEARING_ID, String.class); + Optional>> hearingIdListOpt = detailsBefore.read(HEARING_ID_LIST); + Optional>> hearingDecisionListOpt = detailsBefore.read(HEARING_DECISION_LIST); + currentHearingIdOpt.ifPresent(currentHearingId -> bailCase.write(CURRENT_HEARING_ID, currentHearingId)); + hearingIdListOpt.ifPresent(hearingIdList -> bailCase.write(HEARING_ID_LIST, hearingIdList)); + hearingDecisionListOpt.ifPresent( + hearingDecisionList -> bailCase.write(HEARING_DECISION_LIST, hearingDecisionList) + ); + } + private void clearRoleDependentFields(BailCase bailCase) { UserRoleLabel userRoleLabel = userDetailsHelper.getLoggedInUserRoleLabel(userDetails); @@ -109,12 +124,14 @@ public BailCase getBailCaseFromString(String caseDataJson) { if (caseDataJson == null || caseDataJson.isEmpty()) { throw new IllegalArgumentException("CaseData (json) is missing"); } - BailCase bailCase = new BailCase(); + + BailCase bailCase; try { bailCase = mapper.readValue(caseDataJson, BailCase.class); } catch (JsonProcessingException e) { throw new IllegalArgumentException("Could not convert data", e); } + return bailCase; } diff --git a/src/test/java/uk/gov/hmcts/reform/bailcaseapi/domain/handlers/presubmit/MakeNewApplicationSubmitHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/bailcaseapi/domain/handlers/presubmit/MakeNewApplicationSubmitHandlerTest.java index 30fb92519..ea929d108 100644 --- a/src/test/java/uk/gov/hmcts/reform/bailcaseapi/domain/handlers/presubmit/MakeNewApplicationSubmitHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/bailcaseapi/domain/handlers/presubmit/MakeNewApplicationSubmitHandlerTest.java @@ -59,30 +59,33 @@ public void setUp() { } @Test - void should_handle_make_new_application_about_to_submit() { - + void should_handle_make_new_application_about_to_submit_and_do_not_preserve_hearing_data() { + // given when(callback.getEvent()).thenReturn(Event.MAKE_NEW_APPLICATION); when(callback.getCaseDetails()).thenReturn(caseDetails); when(callback.getCaseDetailsBefore()).thenReturn(Optional.of(caseDetailsBefore)); when(caseDetails.getCaseData()).thenReturn(bailCase); when(caseDetailsBefore.getCaseData()).thenReturn(bailCaseBefore); + // when PreSubmitCallbackResponse response = makeNewApplicationSubmitHandler.handle(ABOUT_TO_SUBMIT, callback, callbackResponse); + // then assertThat(response).isNotNull(); assertThat(response.getData()).isNotEmpty(); assertThat(response.getData()).isEqualTo(bailCase); assertThat(response.getErrors()).isEmpty(); - verify(makeNewApplicationService, times(1)).clearFieldsAboutToSubmit(bailCase); - verify(makeNewApplicationService, times(1)).appendPriorApplication(bailCase, bailCaseBefore); + verify(makeNewApplicationService).clearFieldsAboutToSubmit(bailCase); + verify(makeNewApplicationService).appendPriorApplication(bailCase, bailCaseBefore); + verify(makeNewApplicationService).preserveHearingsData(bailCase, bailCaseBefore); when(featureToggleService.imaEnabled()).thenReturn(false); + verify(bailCase).write(IS_IMA_ENABLED, YesOrNo.NO); } @Test void it_can_handle_callback() { - for (Event event : Event.values()) { when(callback.getEvent()).thenReturn(event); @@ -100,12 +103,14 @@ void it_can_handle_callback() { @Test void should_throw_when_case_details_before_is_not_present() { - + // given when(callback.getEvent()).thenReturn(Event.MAKE_NEW_APPLICATION); when(callback.getCaseDetails()).thenReturn(caseDetails); when(caseDetails.getCaseData()).thenReturn(bailCase); when(callback.getCaseDetailsBefore()).thenReturn(Optional.empty()); + // when + // then assertThatThrownBy(() -> makeNewApplicationSubmitHandler.handle(PreSubmitCallbackStage.ABOUT_TO_SUBMIT, callback, callbackResponse)) .hasMessage("Case details before missing") @@ -115,6 +120,7 @@ void should_throw_when_case_details_before_is_not_present() { @ParameterizedTest @CsvSource({"true", "false"}) void should_set_ima_field(boolean featureFlag) { + // given when(featureToggleService.imaEnabled()).thenReturn(featureFlag); when(callback.getEvent()).thenReturn(Event.MAKE_NEW_APPLICATION); when(callback.getCaseDetails()).thenReturn(caseDetails); @@ -122,13 +128,15 @@ void should_set_ima_field(boolean featureFlag) { when(caseDetails.getCaseData()).thenReturn(bailCase); when(caseDetailsBefore.getCaseData()).thenReturn(bailCaseBefore); + // when makeNewApplicationSubmitHandler.handle(PreSubmitCallbackStage.ABOUT_TO_SUBMIT, callback, callbackResponse); + + // then verify(bailCase, times(1)).write(IS_IMA_ENABLED, featureFlag ? YesOrNo.YES : YesOrNo.NO); } @Test void should_not_allow_null_arguments() { - assertThatThrownBy(() -> makeNewApplicationSubmitHandler .canHandle(null, callback)) .hasMessage("callbackStage must not be null") @@ -152,12 +160,15 @@ void should_not_allow_null_arguments() { @Test void handler_throws_error_if_cannot_actually_handle() { - + // given assertThatThrownBy(() -> makeNewApplicationSubmitHandler.handle(ABOUT_TO_SUBMIT, callback, callbackResponse)) .hasMessage("Cannot handle callback") .isExactlyInstanceOf(IllegalStateException.class); when(callback.getEvent()).thenReturn(Event.MAKE_NEW_APPLICATION); + + // when + // then assertThatThrownBy(() -> makeNewApplicationSubmitHandler.handle(ABOUT_TO_SUBMIT, callback, callbackResponse)) .isExactlyInstanceOf(NullPointerException.class); diff --git a/src/test/java/uk/gov/hmcts/reform/bailcaseapi/domain/service/MakeNewApplicationServiceTest.java b/src/test/java/uk/gov/hmcts/reform/bailcaseapi/domain/service/MakeNewApplicationServiceTest.java index 6fb679028..7989d0230 100644 --- a/src/test/java/uk/gov/hmcts/reform/bailcaseapi/domain/service/MakeNewApplicationServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/bailcaseapi/domain/service/MakeNewApplicationServiceTest.java @@ -4,9 +4,15 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.CASE_NOTES; +import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.CURRENT_HEARING_ID; import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.CURRENT_USER; +import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.HEARING_DECISION_LIST; +import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.HEARING_ID_LIST; import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.LISTING_LOCATION; import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.LIST_CASE_HEARING_DATE; import static uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCaseFieldDefinition.OUTCOME_STATE; @@ -15,8 +21,9 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.Arrays; import java.util.List; +import java.util.Optional; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -31,12 +38,16 @@ import uk.gov.hmcts.reform.bailcaseapi.domain.UserDetailsHelper; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.BailCase; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.DocumentWithDescription; +import uk.gov.hmcts.reform.bailcaseapi.domain.entities.HearingDecision; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.ListingHearingCentre; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.PriorApplication; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.UserDetails; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.UserRoleLabel; import uk.gov.hmcts.reform.bailcaseapi.domain.entities.ccd.field.IdValue; +import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; + @ExtendWith(MockitoExtension.class) class MakeNewApplicationServiceTest { @@ -55,11 +66,15 @@ class MakeNewApplicationServiceTest { private Appender priorApplicationAppender; @Mock private DocumentWithDescription b1Document; + @Mock + private List> hearingIdList; + @Mock + private List> hearingDecisionList; private MakeNewApplicationService makeNewApplicationService; @Mock - private ObjectMapper mapper = new ObjectMapper(); + private final ObjectMapper mapper = new ObjectMapper(); @Captor private ArgumentCaptor>> existingPriorApplicationsCaptor; @@ -73,61 +88,76 @@ public void setup() { @Test void should_append_prior_application_to_empty_list() { - + // given when(priorApplicationAppender.append(Mockito.any(PriorApplication.class), Mockito.anyList())) .thenReturn(allAppendedPriorApplications); + // when makeNewApplicationService.appendPriorApplication(bailCase, bailCaseBefore); - Mockito.verify(priorApplicationAppender, Mockito.times(1)).append( + // then + verify(priorApplicationAppender, Mockito.times(1)).append( newPriorApplicationCaptor.capture(), existingPriorApplicationsCaptor.capture()); - Mockito.verify(bailCase, Mockito.times(1)).write(PRIOR_APPLICATIONS, allAppendedPriorApplications); + verify(bailCase, Mockito.times(1)).write(PRIOR_APPLICATIONS, allAppendedPriorApplications); } @Test void should_remove_fields_not_in_list_about_to_start() { + // given BailCase bailCase = new BailCase(); bailCase.write(CURRENT_USER, "current_user"); bailCase.write(OUTCOME_STATE, "applicationEnded"); when(userDetailsHelper.getLoggedInUserRoleLabel(userDetails)).thenReturn(UserRoleLabel.ADMIN_OFFICER); + // when makeNewApplicationService.clearFieldsAboutToStart(bailCase); + + // then assertThat(bailCase).isEmpty(); } @Test void should_remove_fields_not_in_list_about_to_submit() { + // given BailCase bailCase = new BailCase(); bailCase.write(CURRENT_USER, "current_user"); bailCase.write(OUTCOME_STATE, "applicationEnded"); when(userDetailsHelper.getLoggedInUserRoleLabel(userDetails)).thenReturn(UserRoleLabel.ADMIN_OFFICER); + // when makeNewApplicationService.clearFieldsAboutToSubmit(bailCase); + + // then assertThat(bailCase).isEmpty(); } @Test void should_remove_if_value_is_null() { + // given BailCase bailCase = new BailCase(); bailCase.write(CURRENT_USER, null); bailCase.write(OUTCOME_STATE, null); when(userDetailsHelper.getLoggedInUserRoleLabel(userDetails)).thenReturn(UserRoleLabel.ADMIN_OFFICER); + // when makeNewApplicationService.clearFieldsAboutToSubmit(bailCase); + + // then assertThat(bailCase).isEmpty(); } @ParameterizedTest @EnumSource(value = UserRoleLabel.class, names = {"LEGAL_REPRESENTATIVE", "HOME_OFFICE_BAIL"}) void should_clear_role_dependent_field(UserRoleLabel userRoleLabel) { + // given List> b1DocumentList = - Arrays.asList( + singletonList( new IdValue<>("1", b1Document) ); @@ -135,14 +165,18 @@ void should_clear_role_dependent_field(UserRoleLabel userRoleLabel) { when(userDetailsHelper.getLoggedInUserRoleLabel(userDetails)).thenReturn(userRoleLabel); + // when makeNewApplicationService.clearFieldsAboutToSubmit(bailCase); - Mockito.verify(bailCase, Mockito.times(1)).remove(UPLOAD_B1_FORM_DOCS); + + // then + verify(bailCase, Mockito.times(1)).remove(UPLOAD_B1_FORM_DOCS); } @Test void should_not_clear_role_dependent_field_if_admin() { + // given List> b1DocumentList = - Arrays.asList( + asList( new IdValue<>("1", b1Document) ); @@ -150,14 +184,17 @@ void should_not_clear_role_dependent_field_if_admin() { when(userDetailsHelper.getLoggedInUserRoleLabel(userDetails)).thenReturn(UserRoleLabel.ADMIN_OFFICER); + // when makeNewApplicationService.clearFieldsAboutToSubmit(bailCase); - Mockito.verify(bailCase, Mockito.times(0)).clear(UPLOAD_B1_FORM_DOCS); + + // then + verify(bailCase, Mockito.times(0)).clear(UPLOAD_B1_FORM_DOCS); } @Test void should_convert_checked_exception_to_runtime_on_error() throws JsonProcessingException { - Mockito.doThrow(Mockito.mock(JsonProcessingException.class)) + doThrow(Mockito.mock(JsonProcessingException.class)) .when(mapper) .writeValueAsString(bailCaseBefore); @@ -168,11 +205,16 @@ void should_convert_checked_exception_to_runtime_on_error() throws JsonProcessin @Test void should_convert_string_to_bail_case() throws JsonProcessingException { + // given String caseDataJson = "{\"endApplicationOutcome\":\"Bail dismissed without a hearing\"," + "\"applicantGivenNames\":\"John\",\"applicantFamilyName\":\"Smith\"," + "\"outcomeState\":\"applicationEnded\",\"endApplicationDate\":\"2022-06-20\"}"; when(mapper.readValue(caseDataJson, BailCase.class)).thenReturn(bailCase); + + // then BailCase bailCase = makeNewApplicationService.getBailCaseFromString(caseDataJson); + + // then assertNotNull(bailCase); } @@ -186,32 +228,77 @@ void should_throw_exception_for_empty_null_json(String json) { @Test void should_keep_case_notes_about_to_start() { + // given BailCase bailCase = new BailCase(); bailCase.write(CASE_NOTES, "case note"); when(userDetailsHelper.getLoggedInUserRoleLabel(userDetails)).thenReturn(UserRoleLabel.ADMIN_OFFICER); + + // when makeNewApplicationService.clearFieldsAboutToStart(bailCase); + + // then assertTrue(bailCase.containsKey(CASE_NOTES.value())); } @Test void should_keep_case_notes_about_to_submit() { + // given BailCase bailCase = new BailCase(); bailCase.write(CASE_NOTES, "case note"); when(userDetailsHelper.getLoggedInUserRoleLabel(userDetails)).thenReturn(UserRoleLabel.ADMIN_OFFICER); + + // when makeNewApplicationService.clearFieldsAboutToSubmit(bailCase); + + // then assertTrue(bailCase.containsKey(CASE_NOTES.value())); } @Test void should_keep_hearing_details_about_to_submit() { + // given BailCase bailCase = new BailCase(); bailCase.write(LISTING_LOCATION, ListingHearingCentre.BIRMINGHAM); bailCase.write(LIST_CASE_HEARING_DATE, "2024-04-04T08:00:00.000"); when(userDetailsHelper.getLoggedInUserRoleLabel(userDetails)).thenReturn(UserRoleLabel.ADMIN_OFFICER); + + // when makeNewApplicationService.clearFieldsAboutToSubmit(bailCase); + + // then assertTrue(bailCase.containsKey(LISTING_LOCATION.value())); assertTrue(bailCase.containsKey(LIST_CASE_HEARING_DATE.value())); } + + @Test + void preserveHearingsData_should_preserve_hearing_data_if_it_exists() { + // given + when(bailCaseBefore.read(CURRENT_HEARING_ID, String.class)).thenReturn(Optional.of("12345")); + when(bailCaseBefore.read(HEARING_ID_LIST)).thenReturn(Optional.of(hearingIdList)); + when(bailCaseBefore.read(HEARING_DECISION_LIST)).thenReturn(Optional.of(hearingDecisionList)); + + // when + makeNewApplicationService.preserveHearingsData(bailCase, bailCaseBefore); + + // then + verify(bailCase).write(CURRENT_HEARING_ID, "12345"); + verify(bailCase).write(HEARING_ID_LIST, hearingIdList); + verify(bailCase).write(HEARING_DECISION_LIST, hearingDecisionList); + } + + @Test + void preserveHearingsData_should_not_preserve_hearing_data_if_it_does_not_exist() { + // given + when(bailCaseBefore.read(CURRENT_HEARING_ID, String.class)).thenReturn(Optional.empty()); + when(bailCaseBefore.read(HEARING_ID_LIST)).thenReturn(Optional.empty()); + when(bailCaseBefore.read(HEARING_DECISION_LIST)).thenReturn(Optional.empty()); + + // when + makeNewApplicationService.preserveHearingsData(bailCase, bailCaseBefore); + + // then + verifyNoInteractions(bailCase); + } }