diff --git a/src/main/java/uk/gov/hmcts/reform/finrem/caseorchestration/handler/solicitorcreatecase/mandatorydatavalidation/RespondentSolicitorDetailsValidator.java b/src/main/java/uk/gov/hmcts/reform/finrem/caseorchestration/handler/solicitorcreatecase/mandatorydatavalidation/RespondentSolicitorDetailsValidator.java new file mode 100644 index 00000000000..bff075f6422 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/finrem/caseorchestration/handler/solicitorcreatecase/mandatorydatavalidation/RespondentSolicitorDetailsValidator.java @@ -0,0 +1,63 @@ +package uk.gov.hmcts.reform.finrem.caseorchestration.handler.solicitorcreatecase.mandatorydatavalidation; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.FinremCaseData; +import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.Organisation; +import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.OrganisationPolicy; +import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.YesOrNo; +import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.wrapper.ContactDetailsWrapper; +import uk.gov.hmcts.reform.finrem.caseorchestration.utils.NullChecker; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +@Component +@Slf4j +class RespondentSolicitorDetailsValidator implements MandatoryDataValidator { + + @Override + public List validate(FinremCaseData caseData) { + ContactDetailsWrapper contactDetailsWrapper = caseData.getContactDetailsWrapper(); + List ret = new ArrayList<>(); + + if (shouldSkipRespondentSolicitorValidation(contactDetailsWrapper)) { + return ret; + } + + checkRespondentOrganisationPolicy(caseData, ret); + if (caseData.isConsentedApplication()) { + if (contactDetailsWrapper.getRespondentSolicitorAddress() == null + || !NullChecker.anyNonNull(contactDetailsWrapper.getRespondentSolicitorAddress())) { + ret.add("Respondent solicitor's address is required."); + } + validateField(contactDetailsWrapper.getRespondentSolicitorEmail(), "email", ret); + validateField(contactDetailsWrapper.getRespondentSolicitorPhone(), "phone", ret); + validateField(contactDetailsWrapper.getRespondentSolicitorFirm(), "name of firm", ret); + validateField(contactDetailsWrapper.getRespondentSolicitorName(), "name", ret); + } + return ret; + } + + private boolean shouldSkipRespondentSolicitorValidation(ContactDetailsWrapper contactDetailsWrapper) { + return YesOrNo.NO.equals(contactDetailsWrapper.getConsentedRespondentRepresented()) + || YesOrNo.NO.equals(contactDetailsWrapper.getContestedRespondentRepresented()); + } + + private void checkRespondentOrganisationPolicy(FinremCaseData caseData, List errors) { + if (Optional.ofNullable(caseData.getRespondentOrganisationPolicy()) + .map(OrganisationPolicy::getOrganisation) + .map(Organisation::getOrganisationID) + .orElse(null) == null) { + errors.add("Respondent organisation policy is missing."); + } + } + + private void validateField(String fieldValue, String fieldName, List errors) { + if (!StringUtils.hasText(fieldValue)) { + errors.add(String.format("Respondent solicitor's %s is required.", fieldName)); + } + } +} diff --git a/src/test/java/uk/gov/hmcts/reform/finrem/caseorchestration/handler/solicitorcreatecase/mandatorydatavalidation/RespondentSolicitorDetailsValidatorTest.java b/src/test/java/uk/gov/hmcts/reform/finrem/caseorchestration/handler/solicitorcreatecase/mandatorydatavalidation/RespondentSolicitorDetailsValidatorTest.java new file mode 100644 index 00000000000..98fa71d5f4c --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/finrem/caseorchestration/handler/solicitorcreatecase/mandatorydatavalidation/RespondentSolicitorDetailsValidatorTest.java @@ -0,0 +1,196 @@ +package uk.gov.hmcts.reform.finrem.caseorchestration.handler.solicitorcreatecase.mandatorydatavalidation; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.Address; +import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.FinremCaseData; +import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.Organisation; +import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.OrganisationPolicy; +import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.YesOrNo; +import java.util.List; +import java.util.stream.Stream; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; +import static uk.gov.hmcts.reform.finrem.caseorchestration.TestConstants.TEST_ORG_ID; + +class RespondentSolicitorDetailsValidatorTest { + + private final RespondentSolicitorDetailsValidator underTest = new RespondentSolicitorDetailsValidator(); + + @Test + void givenConsentedRespondentNotRepresented_whenValidate_thenReturnEmptyList() { + FinremCaseData finremCaseData = spy(FinremCaseData.class); + finremCaseData.getContactDetailsWrapper().setConsentedRespondentRepresented(YesOrNo.NO); + + List actual = underTest.validate(finremCaseData); + assertThat(actual).isEmpty(); + } + + @Test + void givenContestedRespondentNotRepresented_whenValidate_thenReturnEmptyList() { + FinremCaseData finremCaseData = spy(FinremCaseData.class); + finremCaseData.getContactDetailsWrapper().setContestedRespondentRepresented(YesOrNo.NO); + + List actual = underTest.validate(finremCaseData); + assertThat(actual).isEmpty(); + } + + static Stream givenRespondentRepresentedAndOrganisationPolicyMissing_whenValidate_thenReturnAnError() { + return Stream.of( + null, + OrganisationPolicy.builder().build(), + OrganisationPolicy.builder().organisation(Organisation.builder().build()).build() + ); + } + + @ParameterizedTest + @MethodSource + void givenRespondentRepresentedAndOrganisationPolicyMissing_whenValidate_thenReturnAnError( + OrganisationPolicy organisationPolicy + ) { + FinremCaseData finremCaseData = spy(FinremCaseData.class); + finremCaseData.getContactDetailsWrapper().setConsentedRespondentRepresented(YesOrNo.YES); + finremCaseData.setRespondentOrganisationPolicy(organisationPolicy); + List actual = underTest.validate(finremCaseData); + assertThat(actual).containsExactly("Respondent organisation policy is missing."); + } + + @Test + void givenRespondentRepresentedAndValidOrganisationPolicy_whenValidate_thenEmptyList() { + FinremCaseData finremCaseData = spy(FinremCaseData.class); + finremCaseData.getContactDetailsWrapper().setConsentedRespondentRepresented(YesOrNo.YES); + finremCaseData.setRespondentOrganisationPolicy(validOrganisationPolicy()); + + List actual = underTest.validate(finremCaseData); + assertThat(actual).isEmpty(); + } + + private static OrganisationPolicy validOrganisationPolicy() { + return OrganisationPolicy.builder().organisation(Organisation.builder() + .organisationID(TEST_ORG_ID).build()).build(); + } + + @ParameterizedTest + @MethodSource + void givenRepresentedRespondentAndInvalidSolicitorAddress_whenValidate_thenReturnAnError( + Address respondentSolicitorAddress + ) { + FinremCaseData finremCaseData = spy(FinremCaseData.class); + when(finremCaseData.isConsentedApplication()).thenReturn(true); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorAddress(respondentSolicitorAddress); + + List actual = underTest.validate(finremCaseData); + assertThat(actual).contains("Respondent solicitor's address is required."); + } + + private static Stream givenRepresentedRespondentAndInvalidSolicitorAddress_whenValidate_thenReturnAnError() { + return Stream.of( + Arguments.of((Address) null), + Arguments.of(Address.builder().build()) + ); + } + + @ParameterizedTest + @MethodSource("invalidStringValues") + void givenRepresentedRespondentAndInvalidSolicitorEmail_whenValidate_thenReturnEmailError( + String email + ) { + FinremCaseData finremCaseData = spy(FinremCaseData.class); + when(finremCaseData.isConsentedApplication()).thenReturn(true); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorAddress(validAddress()); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorEmail(email); + + List actual = underTest.validate(finremCaseData); + assertThat(actual).anyMatch(error -> error.contains("email")); + } + + @ParameterizedTest + @MethodSource("invalidStringValues") + void givenRepresentedRespondentAndInvalidPhone_whenValidate_thenReturnPhoneError( + String phone + ) { + FinremCaseData finremCaseData = spy(FinremCaseData.class); + when(finremCaseData.isConsentedApplication()).thenReturn(true); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorAddress(validAddress()); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorPhone(phone); + + List actual = underTest.validate(finremCaseData); + assertThat(actual).anyMatch(error -> error.contains("phone")); + } + + @ParameterizedTest + @MethodSource("invalidStringValues") + void givenRepresentedRespondentAndInvalidFirm_whenValidate_thenReturnFirmError( + String firm + ) { + FinremCaseData finremCaseData = spy(FinremCaseData.class); + when(finremCaseData.isConsentedApplication()).thenReturn(true); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorAddress(validAddress()); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorFirm(firm); + + List actual = underTest.validate(finremCaseData); + assertThat(actual).anyMatch(error -> error.contains("name of firm")); + } + + @ParameterizedTest + @MethodSource("invalidStringValues") + void givenRepresentedRespondentAndInvalidName_whenValidate_thenReturnNameError( + String name + ) { + FinremCaseData finremCaseData = spy(FinremCaseData.class); + when(finremCaseData.isConsentedApplication()).thenReturn(true); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorAddress(validAddress()); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorName(name); + + List actual = underTest.validate(finremCaseData); + assertThat(actual).anyMatch(error -> error.contains("name")); + } + + private static Stream invalidStringValues() { + return Stream.of( + Arguments.of((String) null), + Arguments.of(""), + Arguments.of(" ") + ); + } + + @Test + void givenRepresentedAndValidSolicitorDetails_whenValidate_thenEmptyList() { + FinremCaseData finremCaseData = spy(FinremCaseData.class); + finremCaseData.getContactDetailsWrapper().setConsentedRespondentRepresented(YesOrNo.YES); + finremCaseData.setRespondentOrganisationPolicy(validOrganisationPolicy()); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorAddress(validAddress()); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorEmail("dasd@gmail.com"); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorPhone("01234567890"); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorFirm("Solicitor Firm"); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorName("Alexander Isak"); + + List actual = underTest.validate(finremCaseData); + assertThat(actual).isEmpty(); + } + + @Test + void givenNotRepresented_whenValidate_thenEmptyList() { + FinremCaseData finremCaseData = spy(FinremCaseData.class); + finremCaseData.getContactDetailsWrapper().setConsentedRespondentRepresented(YesOrNo.NO); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorAddress(null); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorEmail(null); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorPhone(null); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorFirm(null); + finremCaseData.getContactDetailsWrapper().setRespondentSolicitorName(null); + + List actual = underTest.validate(finremCaseData); + assertThat(actual).isEmpty(); + } + + private Address validAddress() { + return Address.builder() + .addressLine1("20 Cromie Close") + .postTown("London") + .postCode("N13 4BF") + .build(); + } +} diff --git a/src/test/java/uk/gov/hmcts/reform/finrem/caseorchestration/integrationtest/createcase/CreateCaseMandatoryDataIntegrationTest.java b/src/test/java/uk/gov/hmcts/reform/finrem/caseorchestration/integrationtest/createcase/CreateCaseMandatoryDataIntegrationTest.java index 4a0416a354f..16d300793a2 100644 --- a/src/test/java/uk/gov/hmcts/reform/finrem/caseorchestration/integrationtest/createcase/CreateCaseMandatoryDataIntegrationTest.java +++ b/src/test/java/uk/gov/hmcts/reform/finrem/caseorchestration/integrationtest/createcase/CreateCaseMandatoryDataIntegrationTest.java @@ -83,11 +83,12 @@ void testCreateCaseValidateMandatoryData() throws Exception { .andExpect(status().isOk()) .andExpect(jsonPath("$.data", notNullValue())) .andExpect(jsonPath("$.warnings",empty())) - .andExpect(jsonPath("$.errors", hasSize(2))) + .andExpect(jsonPath("$.errors", hasSize(3))) .andExpect(jsonPath("$.errors", hasItem("Applicant organisation policy is missing."))) .andExpect(jsonPath("$.errors", - hasItem("Applicant's Local Court is required. Update Please choose the Region in which the Applicant resides"))); - + hasItem("Applicant's Local Court is required. Update Please choose the Region in which the Applicant resides"))) + .andExpect(jsonPath("$.errors", + hasItem("Respondent organisation policy is missing."))); } }