diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/pcs/ccd/CaseDefinitionIT.java b/src/integrationTest/java/uk/gov/hmcts/reform/pcs/ccd/CaseDefinitionIT.java index 2c0715e526..929c3e8f58 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/pcs/ccd/CaseDefinitionIT.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/pcs/ccd/CaseDefinitionIT.java @@ -74,7 +74,8 @@ private static Stream saveAndResumeEventScenarios() { List.of( "enforcementApplication", "evictionDelayWarning", - "checkYourAnswersPlaceHolder" + "checkYourAnswersPlaceHolder", + "changeNameAddress" ) ) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/PCSCase.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/PCSCase.java index bf85c74a60..15a2fffaea 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/PCSCase.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/PCSCase.java @@ -1,14 +1,6 @@ package uk.gov.hmcts.reform.pcs.ccd.domain; -import static uk.gov.hmcts.ccd.sdk.type.FieldType.DynamicRadioList; -import static uk.gov.hmcts.ccd.sdk.type.FieldType.MultiSelectList; -import static uk.gov.hmcts.ccd.sdk.type.FieldType.TextArea; - import com.fasterxml.jackson.annotation.JsonUnwrapped; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Set; import lombok.Builder; import lombok.Data; import uk.gov.hmcts.ccd.sdk.External; @@ -34,6 +26,15 @@ import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringList; import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Set; + +import static uk.gov.hmcts.ccd.sdk.type.FieldType.DynamicRadioList; +import static uk.gov.hmcts.ccd.sdk.type.FieldType.MultiSelectList; +import static uk.gov.hmcts.ccd.sdk.type.FieldType.TextArea; + /** * The main domain model representing a possessions case. @@ -366,18 +367,27 @@ public class PCSCase { @CCD(searchable = false) private String postcodeNotAssignedView; + /** + * The primary defendant in the case. + */ @CCD private DefendantDetails defendant1; @CCD(label = "Do you need to add another defendant?") private VerticalYesNo addAnotherDefendant; + /** + * List of additional defendants added by the user, after the primary defendant. + */ @CCD( label = "Add additional defendant", hint = "Add an additional defendant to the case" ) private List> additionalDefendants; + /** + * Combined list of all defendants in the case (i.e. primary defendant + additional defendants). + */ private List> allDefendants; // Notice Details fields @@ -780,4 +790,7 @@ public class PCSCase { @CCD private ASBQuestionsDetailsWales asbQuestionsWales; + @CCD(searchable = false) + private String formattedDefendantNames; + } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/enforcement/EnforcementOrder.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/enforcement/EnforcementOrder.java index 8b9d971758..fe1cb182fd 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/enforcement/EnforcementOrder.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/enforcement/EnforcementOrder.java @@ -6,8 +6,13 @@ import lombok.Data; import uk.gov.hmcts.ccd.sdk.api.CCD; import uk.gov.hmcts.ccd.sdk.type.FieldType; +import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo; import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoNotSure; +import uk.gov.hmcts.reform.pcs.ccd.type.DynamicMultiSelectStringList; import java.util.Set; + +import static uk.gov.hmcts.ccd.sdk.type.FieldType.DynamicMultiSelectList; + /** * The main domain model representing an enforcement order. */ @@ -27,8 +32,19 @@ public class EnforcementOrder { private AdditionalInformation additionalInformation; @JsonUnwrapped + @CCD private NameAndAddressForEviction nameAndAddressForEviction; + @JsonUnwrapped + @CCD + private PeopleToEvict peopleToEvict; + + @CCD( + label = "Who do you want to evict?", + typeOverride = DynamicMultiSelectList + ) + private DynamicMultiSelectStringList selectedDefendants; + @CCD( label = "Does anyone living at the property pose a risk to the bailiff?" ) @@ -42,6 +58,21 @@ public class EnforcementOrder { ) private Set enforcementRiskCategories; + @CCD( + searchable = false + ) + private VerticalYesNo showChangeNameAddressPage; + + @CCD( + searchable = false + ) + private VerticalYesNo showPeopleWhoWillBeEvictedPage; + + @CCD( + searchable = false + ) + private VerticalYesNo showPeopleYouWantToEvictPage; + @JsonUnwrapped @CCD( label = "Risk details" diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/enforcement/NameAndAddressForEviction.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/enforcement/NameAndAddressForEviction.java index 79f5fdab04..1cfdc49fd4 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/enforcement/NameAndAddressForEviction.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/enforcement/NameAndAddressForEviction.java @@ -11,7 +11,10 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class NameAndAddressForEviction { - @CCD(label = "You can choose the defendants you want to evict on the next page") + @CCD( + label = "Is this the correct name and address for the eviction?", + hint = "You can choose the defendants you want to evict on the next page" + ) private VerticalYesNo correctNameAndAddress; } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/enforcement/PeopleToEvict.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/enforcement/PeopleToEvict.java new file mode 100644 index 0000000000..231e6607d4 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/enforcement/PeopleToEvict.java @@ -0,0 +1,23 @@ +package uk.gov.hmcts.reform.pcs.ccd.domain.enforcement; + +import lombok.Builder; +import lombok.Data; +import uk.gov.hmcts.ccd.sdk.api.CCD; +import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo; + +/** + * Domain model for the "people who will be evicted" page. + * Contains the selection for whether to evict everyone or specific people. + */ +@Builder +@Data +public class PeopleToEvict { + + @CCD( + label = "Do you want to evict everyone at the property?", + hint = "This includes all of the defendants and anyone else living at the property" + ) + private VerticalYesNo evictEveryone; + +} + diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcement/EnforcementOrderEvent.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcement/EnforcementOrderEvent.java index 6bbabe1b9d..8c35967bb7 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcement/EnforcementOrderEvent.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcement/EnforcementOrderEvent.java @@ -3,6 +3,7 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import uk.gov.hmcts.ccd.sdk.api.CCDConfig; import uk.gov.hmcts.ccd.sdk.api.DecentralisedConfigBuilder; import uk.gov.hmcts.ccd.sdk.api.Event; @@ -13,9 +14,11 @@ import uk.gov.hmcts.reform.pcs.ccd.common.PageBuilder; import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; import uk.gov.hmcts.reform.pcs.ccd.domain.State; +import uk.gov.hmcts.reform.pcs.ccd.domain.enforcement.EnforcementOrder; import uk.gov.hmcts.reform.pcs.ccd.page.builder.SavingPageBuilderFactory; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.AdditionalInformationPage; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.AggressiveAnimalsRiskPage; +import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.ChangeNameAddressPage; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.CheckYourAnswersPlaceHolder; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.CriminalAntisocialRiskPage; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.EnforcementApplicationPage; @@ -25,15 +28,23 @@ import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.LivingInThePropertyPage; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.MoneyOwedPage; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.NameAndAddressForEvictionPage; +import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.PeopleWhoWillBeEvictedPage; +import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.PeopleYouWantToEvictPage; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.PoliceOrSocialServicesRiskPage; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.PropertyAccessDetailsPage; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.ProtestorGroupRiskPage; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.VerbalOrWrittenThreatsRiskPage; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.ViolentAggressiveRiskPage; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.VulnerableAdultsChildrenPage; +import uk.gov.hmcts.reform.pcs.ccd.service.DefendantService; import uk.gov.hmcts.reform.pcs.ccd.service.enforcement.EnforcementOrderService; +import uk.gov.hmcts.reform.pcs.ccd.type.DynamicMultiSelectStringList; +import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringListElement; import uk.gov.hmcts.reform.pcs.ccd.util.AddressFormatter; +import java.util.ArrayList; +import java.util.List; + import static uk.gov.hmcts.reform.pcs.ccd.domain.State.AWAITING_SUBMISSION_TO_HMCTS; import static uk.gov.hmcts.reform.pcs.ccd.event.EventId.enforceTheOrder; @@ -45,6 +56,7 @@ public class EnforcementOrderEvent implements CCDConfig eventBu pageBuilder .add(new EnforcementApplicationPage()) .add(new NameAndAddressForEvictionPage()) + .add(new ChangeNameAddressPage()) + .add(new PeopleWhoWillBeEvictedPage()) + .add(new PeopleYouWantToEvictPage()) .add(new LivingInThePropertyPage()) .add(new EvictionDelayWarningPage()) .add(new EvictionRisksPosedPage()) @@ -95,12 +110,32 @@ private PCSCase start(EventPayload eventPayload) { pcsCase.setFormattedPropertyAddress(addressFormatter .formatAddressWithHtmlLineBreaks(pcsCase.getPropertyAddress())); - if (pcsCase.getAllDefendants() != null && !pcsCase.getAllDefendants().isEmpty()) { - pcsCase.setDefendant1(pcsCase.getAllDefendants().getFirst().getValue()); - } + initializeDefendantData(pcsCase); + populateDefendantSelectionList(pcsCase); + return pcsCase; } + private void initializeDefendantData(PCSCase caseData) { + var allDefendants = caseData.getAllDefendants(); + if (!CollectionUtils.isEmpty(allDefendants)) { + caseData.setDefendant1(allDefendants.getFirst().getValue()); + } + } + + void populateDefendantSelectionList(PCSCase caseData) { + EnforcementOrder enforcementOrder = caseData.getEnforcementOrder(); + var allDefendants = caseData.getAllDefendants(); + List listItems = defendantService.buildDefendantListItems(allDefendants); + + enforcementOrder.setSelectedDefendants( + DynamicMultiSelectStringList.builder() + .value(new ArrayList<>()) + .listItems(listItems) + .build() + ); + } + private SubmitResponse submit(EventPayload eventPayload) { long caseReference = eventPayload.caseReference(); diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/model/Defendant.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/model/Defendant.java index 7967fc0fb1..d65cff1ffa 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/model/Defendant.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/model/Defendant.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import uk.gov.hmcts.ccd.sdk.api.CCD; import uk.gov.hmcts.ccd.sdk.type.AddressUK; @@ -17,8 +18,10 @@ public class Defendant { private Boolean nameKnown; + @CCD private String firstName; + @CCD private String lastName; private Boolean addressKnown; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/ChangeNameAddressPage.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/ChangeNameAddressPage.java new file mode 100644 index 0000000000..9db090e3a9 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/ChangeNameAddressPage.java @@ -0,0 +1,80 @@ +package uk.gov.hmcts.reform.pcs.ccd.page.enforcement; + +import uk.gov.hmcts.ccd.sdk.api.CaseDetails; +import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; +import uk.gov.hmcts.reform.pcs.ccd.common.CcdPageConfiguration; +import uk.gov.hmcts.reform.pcs.ccd.common.PageBuilder; +import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; +import uk.gov.hmcts.reform.pcs.ccd.domain.State; +import uk.gov.hmcts.reform.pcs.ccd.domain.enforcement.EnforcementOrder; + +import java.util.List; + +import static uk.gov.hmcts.reform.pcs.ccd.ShowConditions.NEVER_SHOW; + +/** + * Error page shown when user indicates the name or address for eviction is incorrect. + * This page blocks progression and requires the user to make a general application. + */ +public class ChangeNameAddressPage implements CcdPageConfiguration { + + private static final String ERROR_MESSAGE = + "You cannot continue with this application until you ask the judge for permission " + + "to change the name and address."; + + @Override + public void addTo(PageBuilder pageBuilder) { + pageBuilder + .page("changeNameAddress", this::midEvent) + .pageLabel("You need permission from a judge to change the name and address for the eviction") + .showCondition("showChangeNameAddressPage=\"YES\"") + .complex(PCSCase::getEnforcementOrder) + .readonly(EnforcementOrder::getShowChangeNameAddressPage, NEVER_SHOW) + .done() + .label("changeNameAddress-line-separator", "---") + .label( + "changeNameAddress-information", + """ +

You need to ask permission from the judge before you can change the name or + address for the eviction.

+

The judge will decide if you:

+
    +
  • can change the address and continue with this application + (if the change is something small, like a typing error)
  • +
  • must start again, with a new application + (if the change is more significant, like a completely different address)
  • +
+

You cannot continue with your application until you have asked the judge for + permission to make this change.

+

If you want to proceed with changing the name or + address for the eviction

+

+ + Ask the judge if you can change the name or address for the eviction + (GOV.UK, opens in a new tab). +

+

If you want to keep the existing name or address

+

If you are confident that the name or address is correct, you can go back to the + previous page and change your answer to the last question.

+
+ + + Warning + If the name and address is incorrect, the bailiff will not be able to carry out the eviction. + +
+ """ + ); + } + + private AboutToStartOrSubmitResponse midEvent( + CaseDetails details, + CaseDetails before) { + + // Always return an error to block progression + return AboutToStartOrSubmitResponse.builder() + .errors(List.of(ERROR_MESSAGE)) + .build(); + } +} + diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/EnforcementApplicationPage.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/EnforcementApplicationPage.java index 1a2f7436a1..5bf1dc2052 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/EnforcementApplicationPage.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/EnforcementApplicationPage.java @@ -1,16 +1,24 @@ package uk.gov.hmcts.reform.pcs.ccd.page.enforcement; +import uk.gov.hmcts.ccd.sdk.api.CaseDetails; +import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; +import uk.gov.hmcts.ccd.sdk.type.ListValue; import uk.gov.hmcts.reform.pcs.ccd.common.CcdPageConfiguration; import uk.gov.hmcts.reform.pcs.ccd.common.PageBuilder; +import uk.gov.hmcts.reform.pcs.ccd.domain.DefendantDetails; import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; +import uk.gov.hmcts.reform.pcs.ccd.domain.State; import uk.gov.hmcts.reform.pcs.ccd.domain.enforcement.EnforcementOrder; +import java.util.List; +import java.util.stream.Collectors; + public class EnforcementApplicationPage implements CcdPageConfiguration { @Override public void addTo(PageBuilder pageBuilder) { pageBuilder - .page("enforcementApplication") + .page("enforcementApplication", this::midEvent) .pageLabel("Your application") .label("enforcementApplication-content", "---") .complex(PCSCase::getEnforcementOrder) @@ -30,4 +38,26 @@ public void addTo(PageBuilder pageBuilder) { """); } + private AboutToStartOrSubmitResponse midEvent(CaseDetails details, + CaseDetails before) { + PCSCase pcsCase = before.getData(); + PCSCase data = details.getData(); + setFormattedDefendantNames(pcsCase.getAllDefendants(), data); + return AboutToStartOrSubmitResponse.builder() + .data(data).build(); + } + + private void setFormattedDefendantNames(List> defendants, PCSCase pcsCase) { + if (defendants != null && !defendants.isEmpty()) { + pcsCase.setAllDefendants(defendants); + pcsCase.setFormattedDefendantNames(defendants.stream() + .map(defendant -> "" + + defendant.getValue().getFirstName() + " " + defendant.getValue().getLastName() + + "
") + .collect(Collectors.joining("\n"))); + } + } + + + } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/EvictionRisksPosedPage.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/EvictionRisksPosedPage.java index 5ec41fede0..851c2be118 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/EvictionRisksPosedPage.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/EvictionRisksPosedPage.java @@ -1,6 +1,5 @@ package uk.gov.hmcts.reform.pcs.ccd.page.enforcement; -import java.util.List; import uk.gov.hmcts.ccd.sdk.api.CaseDetails; import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; import uk.gov.hmcts.reform.pcs.ccd.common.CcdPageConfiguration; @@ -52,7 +51,6 @@ private AboutToStartOrSubmitResponse midEvent(CaseDetailsbuilder() .data(data) - .errors(List.of()) .build(); } } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/NameAndAddressForEvictionPage.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/NameAndAddressForEvictionPage.java index acfb905669..bc85d5a502 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/NameAndAddressForEvictionPage.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/NameAndAddressForEvictionPage.java @@ -1,8 +1,12 @@ package uk.gov.hmcts.reform.pcs.ccd.page.enforcement; +import uk.gov.hmcts.ccd.sdk.api.CaseDetails; +import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; import uk.gov.hmcts.reform.pcs.ccd.common.CcdPageConfiguration; import uk.gov.hmcts.reform.pcs.ccd.common.PageBuilder; import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; +import uk.gov.hmcts.reform.pcs.ccd.domain.State; +import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo; import uk.gov.hmcts.reform.pcs.ccd.domain.enforcement.EnforcementOrder; import uk.gov.hmcts.reform.pcs.ccd.domain.enforcement.NameAndAddressForEviction; @@ -14,51 +18,30 @@ public class NameAndAddressForEvictionPage implements CcdPageConfiguration { @Override public void addTo(PageBuilder pageBuilder) { pageBuilder - .page("nameAndAddressForEviction") - .pageLabel("The name and address for the eviction (placeholder)") - .readonly(PCSCase::getDefendant1, NEVER_SHOW) - .label( - "nameAndAddressForEviction-defendants-check", - """ -
-

Check the name and address for the eviction

-
-
-
-
-

Defendants

-
-
-

${defendant1.firstName} ${defendant1.lastName}

-
-
-
-
- """) + .page("nameAndAddressForEviction", this::midEvent) + .pageLabel("The name and address for the eviction") + .readonly(PCSCase::getFormattedDefendantNames, NEVER_SHOW) .readonly(PCSCase::getFormattedPropertyAddress, NEVER_SHOW) .label( - "nameAndAddressForEviction-address-check", - """ -
-
-
-
-
-

Address

-
-
-

${formattedPropertyAddress}

-
-
-
-
- """) - .label( - "nameAndAddressForEviction-confirmation", + "nameAndAddressForEviction-defendants-check", """ - --- -

Is this the correct name and address for the eviction?

- """) +
+ + + + + + + + + + + + +
+ Check the name and address for the eviction
Defendants${formattedDefendantNames}
Address${formattedPropertyAddress}
+ """ + ) .complex(PCSCase::getEnforcementOrder) .complex(EnforcementOrder::getNameAndAddressForEviction) .mandatory(NameAndAddressForEviction::getCorrectNameAndAddress) @@ -66,4 +49,33 @@ public void addTo(PageBuilder pageBuilder) { } + private AboutToStartOrSubmitResponse midEvent( + CaseDetails details, + CaseDetails before) { + + PCSCase caseData = details.getData(); + + // Set navigation flags based on user selection + NameAndAddressForEviction nameAndAddress = + caseData.getEnforcementOrder().getNameAndAddressForEviction(); + + VerticalYesNo correctNameAndAddress = nameAndAddress.getCorrectNameAndAddress(); + + EnforcementOrder enforcementOrder = caseData.getEnforcementOrder(); + + if (correctNameAndAddress == VerticalYesNo.NO) { + // Navigate to ChangeNameAddressPage + enforcementOrder.setShowChangeNameAddressPage(VerticalYesNo.YES); + enforcementOrder.setShowPeopleWhoWillBeEvictedPage(VerticalYesNo.NO); + } else if (correctNameAndAddress == VerticalYesNo.YES) { + // Navigate to PeopleWhoWillBeEvictedPage + enforcementOrder.setShowChangeNameAddressPage(VerticalYesNo.NO); + enforcementOrder.setShowPeopleWhoWillBeEvictedPage(VerticalYesNo.YES); + } + + return AboutToStartOrSubmitResponse.builder() + .data(caseData) + .build(); + } + } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/PeopleWhoWillBeEvictedPage.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/PeopleWhoWillBeEvictedPage.java new file mode 100644 index 0000000000..870e948881 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/PeopleWhoWillBeEvictedPage.java @@ -0,0 +1,75 @@ +package uk.gov.hmcts.reform.pcs.ccd.page.enforcement; + +import uk.gov.hmcts.ccd.sdk.api.CaseDetails; +import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; +import uk.gov.hmcts.reform.pcs.ccd.common.CcdPageConfiguration; +import uk.gov.hmcts.reform.pcs.ccd.common.PageBuilder; +import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; +import uk.gov.hmcts.reform.pcs.ccd.domain.State; +import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo; +import uk.gov.hmcts.reform.pcs.ccd.domain.enforcement.EnforcementOrder; +import uk.gov.hmcts.reform.pcs.ccd.domain.enforcement.PeopleToEvict; + +import java.util.ArrayList; +import java.util.List; + +import static uk.gov.hmcts.reform.pcs.ccd.ShowConditions.NEVER_SHOW; +import static uk.gov.hmcts.reform.pcs.ccd.page.CommonPageContent.SAVE_AND_RETURN; + +/** + * Page for selecting whether to evict everyone or specific people. + */ +public class PeopleWhoWillBeEvictedPage implements CcdPageConfiguration { + + @Override + public void addTo(PageBuilder pageBuilder) { + pageBuilder + .page("peopleWhoWillBeEvicted", this::midEvent) + .pageLabel("The people who will be evicted") + .showCondition("showPeopleWhoWillBeEvictedPage=\"YES\"") + .complex(PCSCase::getEnforcementOrder) + .readonly(EnforcementOrder::getShowPeopleWhoWillBeEvictedPage, NEVER_SHOW) + .done() + .label("peopleWhoWillBeEvicted-line-separator", "---") + .complex(PCSCase::getEnforcementOrder) + .complex(EnforcementOrder::getPeopleToEvict) + .mandatory(PeopleToEvict::getEvictEveryone) + .done() + .label("peopleWhoWillBeEvicted-save-and-return", SAVE_AND_RETURN); + } + + private AboutToStartOrSubmitResponse midEvent( + CaseDetails details, + CaseDetails before) { + + PCSCase caseData = details.getData(); + List errors = new ArrayList<>(); + + // Validate that a selection has been made + PeopleToEvict peopleToEvict = caseData.getEnforcementOrder().getPeopleToEvict(); + if (peopleToEvict.getEvictEveryone() == null) { + errors.add("Please select whether you want to evict everyone or specific people"); + } + + if (!errors.isEmpty()) { + return AboutToStartOrSubmitResponse.builder() + .data(caseData) + .errors(errors) + .build(); + } + + EnforcementOrder enforcementOrder = caseData.getEnforcementOrder(); + if (peopleToEvict.getEvictEveryone() == VerticalYesNo.NO) { + // Navigate to PeopleYouWantToEvictPage + enforcementOrder.setShowPeopleYouWantToEvictPage(VerticalYesNo.YES); + } else if (peopleToEvict.getEvictEveryone() == VerticalYesNo.YES) { + // Skip PeopleYouWantToEvictPage, go directly to LivingInThePropertyPage + enforcementOrder.setShowPeopleYouWantToEvictPage(VerticalYesNo.NO); + } + + return AboutToStartOrSubmitResponse.builder() + .data(caseData) + .build(); + } +} + diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/PeopleYouWantToEvictPage.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/PeopleYouWantToEvictPage.java new file mode 100644 index 0000000000..b7533fb05d --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/PeopleYouWantToEvictPage.java @@ -0,0 +1,68 @@ +package uk.gov.hmcts.reform.pcs.ccd.page.enforcement; + +import uk.gov.hmcts.ccd.sdk.api.CaseDetails; +import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; +import uk.gov.hmcts.reform.pcs.ccd.common.CcdPageConfiguration; +import uk.gov.hmcts.reform.pcs.ccd.common.PageBuilder; +import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; +import uk.gov.hmcts.reform.pcs.ccd.domain.State; +import uk.gov.hmcts.reform.pcs.ccd.domain.enforcement.EnforcementOrder; +import uk.gov.hmcts.reform.pcs.ccd.type.DynamicMultiSelectStringList; + +import java.util.ArrayList; +import java.util.List; + +import static uk.gov.hmcts.reform.pcs.ccd.ShowConditions.NEVER_SHOW; +import static uk.gov.hmcts.reform.pcs.ccd.page.CommonPageContent.SAVE_AND_RETURN; + +/** + * Page for selecting specific defendants to evict. + */ +public class PeopleYouWantToEvictPage implements CcdPageConfiguration { + + @Override + public void addTo(PageBuilder pageBuilder) { + pageBuilder + .page("peopleYouWantToEvict", this::midEvent) + .pageLabel("The people you want to evict") + .showCondition("showPeopleYouWantToEvictPage=\"YES\"") + .complex(PCSCase::getEnforcementOrder) + .readonly(EnforcementOrder::getShowPeopleYouWantToEvictPage, NEVER_SHOW) + .done() + .label("peopleYouWantToEvict-line-separator", "---") + .complex(PCSCase::getEnforcementOrder) + .mandatory(EnforcementOrder::getSelectedDefendants) + .done() + .label("peopleYouWantToEvict-save-and-return", SAVE_AND_RETURN); + } + + private AboutToStartOrSubmitResponse midEvent( + CaseDetails details, + CaseDetails before) { + + PCSCase caseData = details.getData(); + List errors = new ArrayList<>(); + + EnforcementOrder enforcementOrder = caseData.getEnforcementOrder(); + DynamicMultiSelectStringList selectedDefendants = enforcementOrder.getSelectedDefendants(); + + // Validate that at least one defendant is selected + if (selectedDefendants == null + || selectedDefendants.getValue() == null + || selectedDefendants.getValue().isEmpty()) { + errors.add("Please select at least one person you want to evict"); + } + + if (!errors.isEmpty()) { + return AboutToStartOrSubmitResponse.builder() + .data(caseData) + .errors(errors) + .build(); + } + + return AboutToStartOrSubmitResponse.builder() + .data(caseData) + .build(); + } +} + diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantService.java index 11ce28957a..5356ffaab6 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantService.java @@ -3,22 +3,25 @@ import lombok.AllArgsConstructor; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import uk.gov.hmcts.ccd.sdk.type.ListValue; import uk.gov.hmcts.reform.pcs.ccd.domain.DefendantDetails; import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo; import uk.gov.hmcts.reform.pcs.ccd.model.Defendant; +import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringListElement; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.UUID; @Service @AllArgsConstructor public class DefendantService { - private ModelMapper modelMapper; + private final ModelMapper modelMapper; public List buildDefendantsList(PCSCase pcsCase) { Objects.requireNonNull(pcsCase.getDefendant1(), "Defendant 1 must be provided"); @@ -82,4 +85,51 @@ private List buildAdditionalDefendants(List buildDefendantListItems( + List> defendants) { + + if (CollectionUtils.isEmpty(defendants)) { + return new ArrayList<>(); + } + + List listItems = new ArrayList<>(); + for (ListValue listValue : defendants) { + DefendantDetails defendantDetails = listValue.getValue(); + String defendantName = buildDefendantDisplayName(defendantDetails); + + listItems.add(DynamicStringListElement.builder() + .code(UUID.randomUUID().toString()) + .label(defendantName) + .build()); + } + + return listItems; + } + } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/type/DynamicMultiSelectStringList.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/type/DynamicMultiSelectStringList.java new file mode 100644 index 0000000000..c4eb6618bd --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/type/DynamicMultiSelectStringList.java @@ -0,0 +1,42 @@ +package uk.gov.hmcts.reform.pcs.ccd.type; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import uk.gov.hmcts.ccd.sdk.api.ComplexType; + +import java.util.List; + +/** + * Representation of a CCD Dynamic Multi-Select List, which has String values for the elements + * rather than UUID values. This is used for checkboxes where multiple selections are allowed. + */ +@NoArgsConstructor +@Builder +@Data +@ComplexType +@JsonIgnoreProperties(ignoreUnknown = true) +public class DynamicMultiSelectStringList { + + /** + * The selected values for the checkboxes (multiple selections allowed). + */ + private List value; + + /** + * List of options for the checkboxes. + */ + @JsonProperty("list_items") + private List listItems; + + @JsonCreator + public DynamicMultiSelectStringList(@JsonProperty("value") List value, + @JsonProperty("list_items") List listItems) { + this.value = value; + this.listItems = listItems; + } +} + diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcement/EnforcementOrderEventTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcement/EnforcementOrderEventTest.java index 4e5efb3118..f7f2ca9e71 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcement/EnforcementOrderEventTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcement/EnforcementOrderEventTest.java @@ -1,8 +1,13 @@ package uk.gov.hmcts.reform.pcs.ccd.event.enforcement; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.ccd.sdk.api.Event; @@ -15,6 +20,9 @@ import uk.gov.hmcts.reform.pcs.ccd.service.enforcement.EnforcementOrderService; import uk.gov.hmcts.reform.pcs.ccd.page.builder.SavingPageBuilder; import uk.gov.hmcts.reform.pcs.ccd.page.builder.SavingPageBuilderFactory; +import uk.gov.hmcts.reform.pcs.ccd.service.DefendantService; +import uk.gov.hmcts.reform.pcs.ccd.type.DynamicMultiSelectStringList; +import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringListElement; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.AdditionalInformationPage; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.AggressiveAnimalsRiskPage; import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.CriminalAntisocialRiskPage; @@ -27,15 +35,18 @@ import uk.gov.hmcts.reform.pcs.ccd.page.enforcement.VulnerableAdultsChildrenPage; import uk.gov.hmcts.reform.pcs.ccd.util.AddressFormatter; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.junit.jupiter.params.provider.Arguments.arguments; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; import static org.mockito.Mockito.verify; import static uk.gov.hmcts.reform.pcs.ccd.event.EventId.enforceTheOrder; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class EnforcementOrderEventTest extends BaseEventTest { @@ -43,6 +54,8 @@ class EnforcementOrderEventTest extends BaseEventTest { @Mock private final AddressFormatter addressFormatter = new AddressFormatter(); @Mock + private DefendantService defendantService; + @Mock private ViolentAggressiveRiskPage violentAggressiveRiskPage; @Mock private VerbalOrWrittenThreatsRiskPage verbalOrWrittenThreatsRiskPage; @@ -74,11 +87,7 @@ void setUp() { when(savingPageBuilder.add(any())).thenReturn(savingPageBuilder); when(savingPageBuilderFactory.create(any(Event.EventBuilder.class), eq(enforceTheOrder))) .thenReturn(savingPageBuilder); - setEventUnderTest(new EnforcementOrderEvent(enforcementOrderService, addressFormatter, - violentAggressiveRiskPage, verbalOrWrittenThreatsRiskPage, protestorGroupRiskPage, - policeOrSocialServicesRiskPage, firearmsPossessionRiskPage, - criminalAntisocialRiskPage, aggressiveAnimalsRiskPage, propertyAccessDetailsPage, - vulnerableAdultsChildrenPage, additionalInformationPage, savingPageBuilderFactory)); + setEventUnderTest(newEnforcementOrderEvent()); } @Test @@ -92,9 +101,16 @@ void shouldReturnCaseDataInStartCallback() { String firstName = "Test"; String lastName = "Testing"; DefendantDetails defendantDetails = DefendantDetails.builder().firstName(firstName).lastName(lastName).build(); + List> allDefendants = List.of( + ListValue.builder().value(defendantDetails).build() + ); + when(defendantService.buildDefendantListItems(allDefendants)).thenReturn(new ArrayList<>()); + PCSCase caseData = PCSCase.builder() - .allDefendants(List.of(ListValue.builder().value(defendantDetails).build())) - .propertyAddress(propertyAddress).build(); + .allDefendants(allDefendants) + .propertyAddress(propertyAddress) + .enforcementOrder(EnforcementOrder.builder().build()) + .build(); // When PCSCase result = callStartHandler(caseData); @@ -119,4 +135,143 @@ void shouldCreateEnforcementDataInSubmitCallback() { // Then verify(enforcementOrderService).createEnforcementOrder(TEST_CASE_REFERENCE, enforcementOrder); } + + @Nested + @DisplayName("populateDefendantSelectionList tests") + class PopulateDefendantSelectionListTests { + + @Test + @DisplayName("Should populate selectedDefendants with empty value and list items from service") + void shouldPopulateSelectedDefendantsWithEmptyValueAndListItems() { + // Given + String firstName = "John"; + String lastName = "Doe"; + DefendantDetails defendantDetails = DefendantDetails.builder() + .firstName(firstName) + .lastName(lastName) + .build(); + List> allDefendants = List.of( + ListValue.builder().value(defendantDetails).build() + ); + + DynamicStringListElement listItem = DynamicStringListElement.builder() + .code("code-1") + .label("John Doe") + .build(); + List expectedListItems = List.of(listItem); + when(defendantService.buildDefendantListItems(allDefendants)).thenReturn(expectedListItems); + + EnforcementOrder enforcementOrder = EnforcementOrder.builder().build(); + PCSCase caseData = PCSCase.builder() + .allDefendants(allDefendants) + .enforcementOrder(enforcementOrder) + .build(); + EnforcementOrderEvent event = newEnforcementOrderEvent(); + + // When + event.populateDefendantSelectionList(caseData); + + // Then + verify(defendantService).buildDefendantListItems(allDefendants); + DynamicMultiSelectStringList selectedDefendants = enforcementOrder.getSelectedDefendants(); + assertThat(selectedDefendants).isNotNull(); + assertThat(selectedDefendants.getValue()).isEmpty(); + assertThat(selectedDefendants.getListItems()).isEqualTo(expectedListItems); + } + + @ParameterizedTest(name = "Should handle {0} defendants list") + @MethodSource("emptyDefendantsScenarios") + @DisplayName("Should handle empty or null defendants list") + void shouldHandleEmptyOrNullDefendantsList( + String scenarioName, + List> allDefendants) { + // Given + List expectedListItems = new ArrayList<>(); + when(defendantService.buildDefendantListItems(allDefendants)).thenReturn(expectedListItems); + + EnforcementOrder enforcementOrder = EnforcementOrder.builder().build(); + PCSCase caseData = PCSCase.builder() + .allDefendants(allDefendants) + .enforcementOrder(enforcementOrder) + .build(); + + EnforcementOrderEvent event = newEnforcementOrderEvent(); + + // When + event.populateDefendantSelectionList(caseData); + + // Then + verify(defendantService).buildDefendantListItems(allDefendants); + DynamicMultiSelectStringList selectedDefendants = enforcementOrder.getSelectedDefendants(); + assertThat(selectedDefendants).isNotNull(); + assertThat(selectedDefendants.getValue()).isEmpty(); + assertThat(selectedDefendants.getListItems()).isEmpty(); + } + + static Stream emptyDefendantsScenarios() { + return Stream.of( + arguments("empty", new ArrayList<>()), + arguments("null", null) + ); + } + + @Test + @DisplayName("Should handle multiple defendants") + void shouldHandleMultipleDefendants() { + // Given + DefendantDetails defendant1 = DefendantDetails.builder() + .firstName("John") + .lastName("Doe") + .build(); + DefendantDetails defendant2 = DefendantDetails.builder() + .firstName("Jane") + .lastName("Smith") + .build(); + List> allDefendants = List.of( + ListValue.builder().value(defendant1).build(), + ListValue.builder().value(defendant2).build() + ); + + DynamicStringListElement listItem1 = DynamicStringListElement.builder() + .code("code-1") + .label("John Doe") + .build(); + DynamicStringListElement listItem2 = DynamicStringListElement.builder() + .code("code-2") + .label("Jane Smith") + .build(); + List expectedListItems = List.of(listItem1, listItem2); + when(defendantService.buildDefendantListItems(allDefendants)).thenReturn(expectedListItems); + + EnforcementOrder enforcementOrder = EnforcementOrder.builder().build(); + PCSCase caseData = PCSCase.builder() + .allDefendants(allDefendants) + .enforcementOrder(enforcementOrder) + .build(); + + EnforcementOrderEvent event = newEnforcementOrderEvent(); + + // When + event.populateDefendantSelectionList(caseData); + + // Then + verify(defendantService).buildDefendantListItems(allDefendants); + DynamicMultiSelectStringList selectedDefendants = enforcementOrder.getSelectedDefendants(); + assertThat(selectedDefendants).isNotNull(); + assertThat(selectedDefendants.getValue()).isEmpty(); + assertThat(selectedDefendants.getListItems()).hasSize(2); + assertThat(selectedDefendants.getListItems()).isEqualTo(expectedListItems); + } + } + + private EnforcementOrderEvent newEnforcementOrderEvent() { + return new EnforcementOrderEvent(enforcementOrderService, addressFormatter, defendantService, + violentAggressiveRiskPage, verbalOrWrittenThreatsRiskPage, + protestorGroupRiskPage, policeOrSocialServicesRiskPage, + firearmsPossessionRiskPage, criminalAntisocialRiskPage, + aggressiveAnimalsRiskPage, propertyAccessDetailsPage, + vulnerableAdultsChildrenPage, additionalInformationPage, + savingPageBuilderFactory); + } + } diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/ChangeNameAddressPageTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/ChangeNameAddressPageTest.java new file mode 100644 index 0000000000..7fa1b017d3 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/ChangeNameAddressPageTest.java @@ -0,0 +1,62 @@ +package uk.gov.hmcts.reform.pcs.ccd.page.enforcement; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; +import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; +import uk.gov.hmcts.reform.pcs.ccd.domain.State; +import uk.gov.hmcts.reform.pcs.ccd.domain.enforcement.EnforcementOrder; +import uk.gov.hmcts.reform.pcs.ccd.page.BasePageTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayName("ChangeNameAddressPage tests") +class ChangeNameAddressPageTest extends BasePageTest { + + @BeforeEach + void setUp() { + setPageUnderTest(new ChangeNameAddressPage()); + } + + @Nested + @DisplayName("Mid-event callback tests") + class MidEventCallbackTests { + + @Test + @DisplayName("Should always return error to block progression") + void shouldAlwaysReturnError() { + // Given + PCSCase caseData = PCSCase.builder() + .enforcementOrder(EnforcementOrder.builder().build()) + .build(); + + // When + AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + + // Then + assertThat(response.getErrors()).isNotEmpty(); + assertThat(response.getErrors().get(0)) + .contains("You cannot continue with this application until you ask the judge for permission"); + } + + @Test + @DisplayName("Should return error message about general application") + void shouldReturnGeneralApplicationErrorMessage() { + // Given + PCSCase caseData = PCSCase.builder() + .enforcementOrder(EnforcementOrder.builder().build()) + .build(); + + // When + AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + + // Then + assertThat(response.getErrors()).isNotEmpty(); + assertThat(response.getErrors().get(0)) + .contains("You cannot continue with this application until you ask the judge for permission"); + } + } +} + diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/EvictionRisksPosedPageTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/EvictionRisksPosedPageTest.java index 35777f6af9..ea6b33f3be 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/EvictionRisksPosedPageTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/EvictionRisksPosedPageTest.java @@ -48,7 +48,7 @@ void shouldAllowValidSelections(Set selectedRisks) { AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); // Then - assertThat(response.getErrors()).isEmpty(); + assertThat(response.getErrors()).isNullOrEmpty(); assertThat(response.getData().getEnforcementOrder().getEnforcementRiskCategories()).isEqualTo(selectedRisks); } @@ -120,7 +120,7 @@ void shouldHandleNullRiskDetails() { AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); // Then - assertThat(response.getErrors()).isEmpty(); + assertThat(response.getErrors()).isNullOrEmpty(); assertThat(response.getData().getEnforcementOrder().getRiskDetails()).isNotNull(); } @@ -142,7 +142,7 @@ void shouldHandleAllRiskCategoriesSelected() { AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); // Then - assertThat(response.getErrors()).isEmpty(); + assertThat(response.getErrors()).isNullOrEmpty(); assertThat(response.getData().getEnforcementOrder().getEnforcementRiskCategories()) .isEqualTo(allCategories); } diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/NameAndAddressForEvictionPageTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/NameAndAddressForEvictionPageTest.java new file mode 100644 index 0000000000..7dde481976 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/NameAndAddressForEvictionPageTest.java @@ -0,0 +1,75 @@ +package uk.gov.hmcts.reform.pcs.ccd.page.enforcement; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; +import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; +import uk.gov.hmcts.reform.pcs.ccd.domain.State; +import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo; +import uk.gov.hmcts.reform.pcs.ccd.domain.enforcement.EnforcementOrder; +import uk.gov.hmcts.reform.pcs.ccd.domain.enforcement.NameAndAddressForEviction; +import uk.gov.hmcts.reform.pcs.ccd.page.BasePageTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayName("NameAndAddressForEvictionPage tests") +class NameAndAddressForEvictionPageTest extends BasePageTest { + + @BeforeEach + void setUp() { + setPageUnderTest(new NameAndAddressForEvictionPage()); + } + + @Nested + @DisplayName("Mid-event callback tests") + class MidEventCallbackTests { + + @Test + @DisplayName("Should set navigation flags when correctNameAndAddress is NO") + void shouldSetNavigationFlagsWhenCorrectNameAndAddressIsNo() { + // Given + PCSCase caseData = PCSCase.builder() + .enforcementOrder(EnforcementOrder.builder() + .nameAndAddressForEviction(NameAndAddressForEviction.builder() + .correctNameAndAddress(VerticalYesNo.NO) + .build()) + .build()) + .build(); + + // When + AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + + // Then + assertThat(response.getErrors()).isNullOrEmpty(); + EnforcementOrder enforcementOrder = response.getData().getEnforcementOrder(); + assertThat(enforcementOrder.getShowChangeNameAddressPage()).isEqualTo(VerticalYesNo.YES); + assertThat(enforcementOrder.getShowPeopleWhoWillBeEvictedPage()).isEqualTo(VerticalYesNo.NO); + } + + @Test + @DisplayName("Should set navigation flags when correctNameAndAddress is YES") + void shouldSetNavigationFlagsWhenCorrectNameAndAddressIsYes() { + // Given + PCSCase caseData = PCSCase.builder() + .enforcementOrder(EnforcementOrder.builder() + .nameAndAddressForEviction(NameAndAddressForEviction.builder() + .correctNameAndAddress(VerticalYesNo.YES) + .build()) + .build()) + .build(); + + // When + AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + + // Then + assertThat(response.getErrors()).isNullOrEmpty(); + EnforcementOrder enforcementOrder = response.getData().getEnforcementOrder(); + assertThat(enforcementOrder.getShowChangeNameAddressPage()).isEqualTo(VerticalYesNo.NO); + assertThat(enforcementOrder.getShowPeopleWhoWillBeEvictedPage()).isEqualTo(VerticalYesNo.YES); + } + } +} + + diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/PeopleWhoWillBeEvictedPageTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/PeopleWhoWillBeEvictedPageTest.java new file mode 100644 index 0000000000..081e39d002 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/PeopleWhoWillBeEvictedPageTest.java @@ -0,0 +1,91 @@ +package uk.gov.hmcts.reform.pcs.ccd.page.enforcement; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; +import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; +import uk.gov.hmcts.reform.pcs.ccd.domain.State; +import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo; +import uk.gov.hmcts.reform.pcs.ccd.domain.enforcement.EnforcementOrder; +import uk.gov.hmcts.reform.pcs.ccd.domain.enforcement.PeopleToEvict; +import uk.gov.hmcts.reform.pcs.ccd.page.BasePageTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayName("PeopleWhoWillBeEvictedPage tests") +class PeopleWhoWillBeEvictedPageTest extends BasePageTest { + + @BeforeEach + void setUp() { + setPageUnderTest(new PeopleWhoWillBeEvictedPage()); + } + + @Nested + @DisplayName("Mid-event callback tests") + class MidEventCallbackTests { + + @Test + @DisplayName("Should return error when no selection is made") + void shouldReturnErrorWhenNoSelection() { + // Given + PCSCase caseData = PCSCase.builder() + .enforcementOrder(EnforcementOrder.builder() + .peopleToEvict(PeopleToEvict.builder().build()) + .build()) + .build(); + + // When + AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + + // Then + assertThat(response.getErrors()).isNotEmpty(); + assertThat(response.getErrors().get(0)) + .contains("Please select whether you want to evict everyone or specific people"); + } + + @Test + @DisplayName("Should set showPeopleYouWantToEvictPage to NO when evictEveryone is YES") + void shouldSetShowPeopleYouWantToEvictPageToNoWhenEvictEveryoneIsYes() { + // Given + PCSCase caseData = PCSCase.builder() + .enforcementOrder(EnforcementOrder.builder() + .peopleToEvict(PeopleToEvict.builder() + .evictEveryone(VerticalYesNo.YES) + .build()) + .build()) + .build(); + + // When + AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + + // Then + assertThat(response.getErrors()).isNullOrEmpty(); + EnforcementOrder enforcementOrder = response.getData().getEnforcementOrder(); + assertThat(enforcementOrder.getShowPeopleYouWantToEvictPage()).isEqualTo(VerticalYesNo.NO); + } + + @Test + @DisplayName("Should set showPeopleYouWantToEvictPage to YES when evictEveryone is NO") + void shouldSetShowPeopleYouWantToEvictPageToYesWhenEvictEveryoneIsNo() { + // Given + PCSCase caseData = PCSCase.builder() + .enforcementOrder(EnforcementOrder.builder() + .peopleToEvict(PeopleToEvict.builder() + .evictEveryone(VerticalYesNo.NO) + .build()) + .build()) + .build(); + + // When + AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + + // Then + assertThat(response.getErrors()).isNullOrEmpty(); + EnforcementOrder enforcementOrder = response.getData().getEnforcementOrder(); + assertThat(enforcementOrder.getShowPeopleYouWantToEvictPage()).isEqualTo(VerticalYesNo.YES); + } + } +} + diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/PeopleYouWantToEvictPageTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/PeopleYouWantToEvictPageTest.java new file mode 100644 index 0000000000..c6580ce100 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/enforcement/PeopleYouWantToEvictPageTest.java @@ -0,0 +1,142 @@ +package uk.gov.hmcts.reform.pcs.ccd.page.enforcement; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; +import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; +import uk.gov.hmcts.reform.pcs.ccd.domain.State; +import uk.gov.hmcts.reform.pcs.ccd.domain.enforcement.EnforcementOrder; +import uk.gov.hmcts.reform.pcs.ccd.page.BasePageTest; +import uk.gov.hmcts.reform.pcs.ccd.type.DynamicMultiSelectStringList; +import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringListElement; + +import java.util.List; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayName("PeopleYouWantToEvictPage tests") +class PeopleYouWantToEvictPageTest extends BasePageTest { + + @BeforeEach + void setUp() { + setPageUnderTest(new PeopleYouWantToEvictPage()); + } + + @Nested + @DisplayName("Mid-event callback tests") + class MidEventCallbackTests { + + @Test + @DisplayName("Should return error when no defendants are selected") + void shouldReturnErrorWhenNoDefendantsSelected() { + // Given + PCSCase caseData = PCSCase.builder() + .enforcementOrder(EnforcementOrder.builder() + .selectedDefendants(DynamicMultiSelectStringList.builder() + .value(List.of()) + .build()) + .build()) + .build(); + + // When + AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + + // Then + assertThat(response.getErrors()).isNotEmpty(); + assertThat(response.getErrors().getFirst()) + .contains("Please select at least one person you want to evict"); + } + + @Test + @DisplayName("Should return error when selectedDefendants is null") + void shouldReturnErrorWhenSelectedDefendantsIsNull() { + // Given + PCSCase caseData = PCSCase.builder() + .enforcementOrder(EnforcementOrder.builder() + .selectedDefendants(null) + .build()) + .build(); + + // When + AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + + // Then + assertThat(response.getErrors()).isNotEmpty(); + assertThat(response.getErrors().getFirst()) + .contains("Please select at least one person you want to evict"); + } + + @Test + @DisplayName("Should accept valid selection with one defendant") + void shouldAcceptValidSelectionWithOneDefendant() { + // Given + String defendantCode = UUID.randomUUID().toString(); + DynamicStringListElement element1 = DynamicStringListElement.builder() + .code(defendantCode) + .label("John Doe") + .build(); + PCSCase caseData = PCSCase.builder() + .enforcementOrder(EnforcementOrder.builder() + .selectedDefendants(DynamicMultiSelectStringList.builder() + .value(List.of(element1)) + .listItems(List.of(element1)) + .build()) + .build()) + .build(); + + // When + AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + + // Then + assertThat(response.getErrors()).isNullOrEmpty(); + DynamicMultiSelectStringList selected = + response.getData().getEnforcementOrder().getSelectedDefendants(); + assertThat(selected).isNotNull(); + assertThat(selected.getValue()).hasSize(1); + assertThat(selected.getValue().get(0).getCode()).isEqualTo(defendantCode); + assertThat(selected.getValue().get(0).getLabel()).isEqualTo("John Doe"); + } + + @Test + @DisplayName("Should accept valid selection with multiple defendants") + void shouldAcceptValidSelectionWithMultipleDefendants() { + // Given + String defendantCode1 = UUID.randomUUID().toString(); + String defendantCode2 = UUID.randomUUID().toString(); + DynamicStringListElement element1 = DynamicStringListElement.builder() + .code(defendantCode1) + .label("John Doe") + .build(); + DynamicStringListElement element2 = DynamicStringListElement.builder() + .code(defendantCode2) + .label("Jane Smith") + .build(); + PCSCase caseData = PCSCase.builder() + .enforcementOrder(EnforcementOrder.builder() + .selectedDefendants(DynamicMultiSelectStringList.builder() + .value(List.of(element1, element2)) + .listItems(List.of(element1, element2)) + .build()) + .build()) + .build(); + + // When + AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + + // Then + assertThat(response.getErrors()).isNullOrEmpty(); + DynamicMultiSelectStringList selected = + response.getData().getEnforcementOrder().getSelectedDefendants(); + assertThat(selected).isNotNull(); + assertThat(selected.getValue()).hasSize(2); + assertThat(selected.getValue().stream() + .map(DynamicStringListElement::getCode) + .toList()) + .containsExactlyInAnyOrder(defendantCode1, defendantCode2); + } + } +} + diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantServiceTest.java index 23cbe644bd..914a6ea4af 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantServiceTest.java @@ -1,6 +1,8 @@ package uk.gov.hmcts.reform.pcs.ccd.service; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; @@ -10,12 +12,16 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.modelmapper.ModelMapper; import uk.gov.hmcts.ccd.sdk.type.AddressUK; +import uk.gov.hmcts.ccd.sdk.type.ListValue; import uk.gov.hmcts.reform.pcs.ccd.domain.DefendantDetails; import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo; import uk.gov.hmcts.reform.pcs.ccd.model.Defendant; +import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringListElement; +import java.util.ArrayList; import java.util.List; +import java.util.regex.Pattern; import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; @@ -279,6 +285,297 @@ void shouldMapFromDefendantListToDefendantDetailsList() { assertThat(actualDefendantDetails).containsExactly(defendantDetails1, defendantDetails2); } + @Nested + @DisplayName("buildDefendantDisplayName tests") + class BuildDefendantDisplayNameTests { + + @Test + @DisplayName("Should return 'Unknown' when defendant details is null") + void shouldReturnUnknownWhenDefendantDetailsIsNull() { + // When + String result = underTest.buildDefendantDisplayName(null); + + // Then + assertThat(result).isEqualTo("Unknown"); + } + + @Test + @DisplayName("Should return 'Name not known' when nameKnown is NO") + void shouldReturnNameNotKnownWhenNameKnownIsNo() { + // Given + DefendantDetails details = DefendantDetails.builder() + .nameKnown(VerticalYesNo.NO) + .firstName("John") + .lastName("Doe") + .build(); + + // When + String result = underTest.buildDefendantDisplayName(details); + + // Then + assertThat(result).isEqualTo("Name not known"); + } + + @ParameterizedTest(name = ARGUMENT_SET_NAME_PLACEHOLDER) + @MethodSource("defendantDisplayNameScenarios") + @DisplayName("Should return correct display name for various name combinations") + void shouldReturnCorrectDisplayNameForVariousNameCombinations( + DefendantDetails details, String expectedDisplayName) { + // When + String result = underTest.buildDefendantDisplayName(details); + + // Then + assertThat(result).isEqualTo(expectedDisplayName); + } + + @Test + @DisplayName("Should trim whitespace from final result") + void shouldTrimWhitespaceFromFinalResult() { + // Given + DefendantDetails details = DefendantDetails.builder() + .nameKnown(VerticalYesNo.YES) + .firstName(" John ") + .lastName(" Doe ") + .build(); + + // When + String result = underTest.buildDefendantDisplayName(details); + + // Then + // Note: The method trims the final result but not individual names, + // so spaces within names are preserved but leading/trailing spaces are removed + assertThat(result).isEqualTo(" John Doe ".trim()); + assertThat(result).isEqualTo("John Doe"); + } + + private static Stream defendantDisplayNameScenarios() { + return Stream.of( + argumentSet( + "Full name when both first and last name are provided", + DefendantDetails.builder() + .nameKnown(VerticalYesNo.YES) + .firstName("John") + .lastName("Doe") + .build(), + "John Doe" + ), + argumentSet( + "First name only when last name is null", + DefendantDetails.builder() + .nameKnown(VerticalYesNo.YES) + .firstName("John") + .lastName(null) + .build(), + "John" + ), + argumentSet( + "Last name only when first name is null", + DefendantDetails.builder() + .nameKnown(VerticalYesNo.YES) + .firstName(null) + .lastName("Doe") + .build(), + "Doe" + ), + argumentSet( + "Unknown when both names are empty strings", + DefendantDetails.builder() + .nameKnown(VerticalYesNo.YES) + .firstName("") + .lastName("") + .build(), + "Unknown" + ), + argumentSet( + "Unknown when both names are null", + DefendantDetails.builder() + .nameKnown(VerticalYesNo.YES) + .firstName(null) + .lastName(null) + .build(), + "Unknown" + ) + ); + } + } + + @Nested + @DisplayName("buildDefendantListItems tests") + class BuildDefendantListItemsTests { + + @Test + @DisplayName("Should return empty list when allDefendants is null") + void shouldReturnEmptyListWhenAllDefendantsIsNull() { + // When + List result = underTest.buildDefendantListItems(null); + + // Then + assertThat(result).isEmpty(); + } + + @Test + @DisplayName("Should return empty list when allDefendants is empty") + void shouldReturnEmptyListWhenAllDefendantsIsEmpty() { + // When + List result = underTest.buildDefendantListItems(new ArrayList<>()); + + // Then + assertThat(result).isEmpty(); + } + + @Test + @DisplayName("Should build list with single defendant") + void shouldBuildListWithSingleDefendant() { + // Given + DefendantDetails defendantDetails = DefendantDetails.builder() + .nameKnown(VerticalYesNo.YES) + .firstName("John") + .lastName("Doe") + .build(); + + List> allDefendants = List.of( + ListValue.builder().value(defendantDetails).build() + ); + + // When + List result = underTest.buildDefendantListItems(allDefendants); + + // Then + assertThat(result).hasSize(1); + assertThat(result.get(0).getCode()).matches(Pattern.compile( + "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + Pattern.CASE_INSENSITIVE)); + assertThat(result.get(0).getLabel()).isEqualTo("John Doe"); + } + + @Test + @DisplayName("Should build list with multiple defendants") + void shouldBuildListWithMultipleDefendants() { + // Given + DefendantDetails defendant1 = DefendantDetails.builder() + .nameKnown(VerticalYesNo.YES) + .firstName("John") + .lastName("Doe") + .build(); + + DefendantDetails defendant2 = DefendantDetails.builder() + .nameKnown(VerticalYesNo.YES) + .firstName("Jane") + .lastName("Smith") + .build(); + + DefendantDetails defendant3 = DefendantDetails.builder() + .nameKnown(VerticalYesNo.NO) + .build(); + + List> allDefendants = List.of( + ListValue.builder().value(defendant1).build(), + ListValue.builder().value(defendant2).build(), + ListValue.builder().value(defendant3).build() + ); + + // When + List result = underTest.buildDefendantListItems(allDefendants); + + // Then + assertThat(result).hasSize(3); + Pattern uuidPattern = Pattern.compile( + "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + Pattern.CASE_INSENSITIVE); + assertThat(result.get(0).getCode()).matches(uuidPattern); + assertThat(result.get(0).getLabel()).isEqualTo("John Doe"); + assertThat(result.get(1).getCode()).matches(uuidPattern); + assertThat(result.get(1).getLabel()).isEqualTo("Jane Smith"); + assertThat(result.get(2).getCode()).matches(uuidPattern); + assertThat(result.get(2).getLabel()).isEqualTo("Name not known"); + // Ensure all codes are unique + assertThat(result.stream().map(DynamicStringListElement::getCode).distinct()) + .hasSize(3); + } + + @Test + @DisplayName("Should handle mixed scenarios with various name combinations") + void shouldHandleMixedScenariosWithVariousNameCombinations() { + // Given + DefendantDetails defendant1 = DefendantDetails.builder() + .nameKnown(VerticalYesNo.YES) + .firstName("John") + .lastName("Doe") + .build(); + + DefendantDetails defendant2 = DefendantDetails.builder() + .nameKnown(VerticalYesNo.YES) + .firstName("Jane") + .lastName(null) + .build(); + + DefendantDetails defendant3 = DefendantDetails.builder() + .nameKnown(VerticalYesNo.YES) + .firstName(null) + .lastName("Smith") + .build(); + + DefendantDetails defendant4 = DefendantDetails.builder() + .nameKnown(VerticalYesNo.YES) + .firstName("") + .lastName("") + .build(); + + DefendantDetails defendant5 = DefendantDetails.builder() + .nameKnown(VerticalYesNo.NO) + .build(); + + List> allDefendants = List.of( + ListValue.builder().value(defendant1).build(), + ListValue.builder().value(defendant2).build(), + ListValue.builder().value(defendant3).build(), + ListValue.builder().value(defendant4).build(), + ListValue.builder().value(defendant5).build() + ); + + // When + List result = underTest.buildDefendantListItems(allDefendants); + + // Then + assertThat(result).hasSize(5); + Pattern uuidPattern = Pattern.compile( + "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + Pattern.CASE_INSENSITIVE); + assertThat(result.get(0).getCode()).matches(uuidPattern); + assertThat(result.get(0).getLabel()).isEqualTo("John Doe"); + assertThat(result.get(1).getCode()).matches(uuidPattern); + assertThat(result.get(1).getLabel()).isEqualTo("Jane"); + assertThat(result.get(2).getCode()).matches(uuidPattern); + assertThat(result.get(2).getLabel()).isEqualTo("Smith"); + assertThat(result.get(3).getCode()).matches(uuidPattern); + assertThat(result.get(3).getLabel()).isEqualTo("Unknown"); + assertThat(result.get(4).getCode()).matches(uuidPattern); + assertThat(result.get(4).getLabel()).isEqualTo("Name not known"); + // Ensure all codes are unique + assertThat(result.stream().map(DynamicStringListElement::getCode).distinct()) + .hasSize(5); + } + + @Test + @DisplayName("Should handle null defendant details in list") + void shouldHandleNullDefendantDetailsInList() { + // Given + List> allDefendants = List.of( + ListValue.builder().value(null).build() + ); + + // When + List result = underTest.buildDefendantListItems(allDefendants); + + // Then + assertThat(result).hasSize(1); + assertThat(result.get(0).getCode()).matches(Pattern.compile( + "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", + Pattern.CASE_INSENSITIVE)); + assertThat(result.get(0).getLabel()).isEqualTo("Unknown"); + } + } + private static Stream singleDefendantScenarios() { AddressUK correspondenceAddress = mock(AddressUK.class); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DraftCaseJsonMergerTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DraftCaseJsonMergerTest.java index edd0132cb2..1ab2f7a3f9 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DraftCaseJsonMergerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DraftCaseJsonMergerTest.java @@ -63,7 +63,10 @@ void shouldKeepExistingFieldsWhenMerging() throws JsonProcessingException { "applicationWithClaim", "claimantType", "noRentArrearsReasonForGrounds.holidayLetTextArea", - "waysToPay") + "waysToPay", + "enforcementOrder.showChangeNameAddressPage", + "enforcementOrder.showPeopleWhoWillBeEvictedPage", + "enforcementOrder.showPeopleYouWantToEvictPage") .isEqualTo(existingCaseData); assertThat(mergedCaseData.getOtherGroundDescription()).isEqualTo("some other ground description");