Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<String> validate(FinremCaseData caseData) {
ContactDetailsWrapper contactDetailsWrapper = caseData.getContactDetailsWrapper();
List<String> 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<String> 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<String> errors) {
if (!StringUtils.hasText(fieldValue)) {
errors.add(String.format("Respondent solicitor's %s is required.", fieldName));
}
}
}
Original file line number Diff line number Diff line change
@@ -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<String> actual = underTest.validate(finremCaseData);
assertThat(actual).isEmpty();
}

@Test
void givenContestedRespondentNotRepresented_whenValidate_thenReturnEmptyList() {
FinremCaseData finremCaseData = spy(FinremCaseData.class);
finremCaseData.getContactDetailsWrapper().setContestedRespondentRepresented(YesOrNo.NO);

List<String> actual = underTest.validate(finremCaseData);
assertThat(actual).isEmpty();
}

static Stream<OrganisationPolicy> 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<String> 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<String> 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<String> actual = underTest.validate(finremCaseData);
assertThat(actual).contains("Respondent solicitor's address is required.");
}

private static Stream<Arguments> 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<String> 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<String> 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<String> 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<String> actual = underTest.validate(finremCaseData);
assertThat(actual).anyMatch(error -> error.contains("name"));
}

private static Stream<Arguments> 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("[email protected]");
finremCaseData.getContactDetailsWrapper().setRespondentSolicitorPhone("01234567890");
finremCaseData.getContactDetailsWrapper().setRespondentSolicitorFirm("Solicitor Firm");
finremCaseData.getContactDetailsWrapper().setRespondentSolicitorName("Alexander Isak");

List<String> 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<String> actual = underTest.validate(finremCaseData);
assertThat(actual).isEmpty();
}

private Address validAddress() {
return Address.builder()
.addressLine1("20 Cromie Close")
.postTown("London")
.postCode("N13 4BF")
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.")));
}
}