From 008d82443c1c1fd451065ef4e99c17f8ec3a64af Mon Sep 17 00:00:00 2001 From: Alex McAusland Date: Wed, 25 Feb 2026 21:29:09 +0000 Subject: [PATCH 1/7] Migrate CreatePossessionClaim to isolated DTO pattern Replace PCSCase god class usage with a focused CreateClaimData DTO for the CreatePossessionClaim event. The DTO contains only the fields needed by this event (address, legislative country, fee amount, etc.) instead of the full 700+ field case class. - Add CreateClaimData DTO class with @Data/@Builder - Update CreatePossessionClaim to use decentralisedEvent DTO overload - Update all 5 page classes to accept EventBuilder instead of PageBuilder (no longer implement CcdPageConfiguration) - Update tests with DTO helper methods in BaseEventTest/BasePageTest - All field prefixing, show conditions, and label references handled automatically by the SDK Co-Authored-By: Claude Opus 4.6 --- .../reform/pcs/ccd/dto/CreateClaimData.java | 30 +++ .../pcs/ccd/event/CreatePossessionClaim.java | 36 ++-- .../CrossBorderPostcodeSelection.java | 36 ++-- .../EnterPropertyAddress.java | 33 ++-- .../PostcodeNotAssignedToCourt.java | 28 +-- .../PropertyNotEligible.java | 27 +-- .../StartTheService.java | 16 +- .../reform/pcs/ccd/event/BaseEventTest.java | 14 ++ .../ccd/event/CreatePossessionClaimTest.java | 175 ++++++++++++++++++ .../reform/pcs/ccd/page/BasePageTest.java | 24 +++ .../CrossBorderPostcodeSelectionTest.java | 23 +-- .../EnterPropertyAddressTest.java | 35 ++-- .../PostcodeNotAssignedToCourtTest.java | 13 +- 13 files changed, 369 insertions(+), 121 deletions(-) create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java create mode 100644 src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java new file mode 100644 index 0000000000..083f67d4eb --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java @@ -0,0 +1,30 @@ +package uk.gov.hmcts.reform.pcs.ccd.dto; + +import lombok.AllArgsConstructor; +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; +import uk.gov.hmcts.ccd.sdk.type.FieldType; +import uk.gov.hmcts.ccd.sdk.type.YesOrNo; +import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringList; +import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CreateClaimData { + private AddressUK propertyAddress; + private LegislativeCountry legislativeCountry; + private String feeAmount; + private YesOrNo showCrossBorderPage; + private YesOrNo showPropertyNotEligiblePage; + private YesOrNo showPostcodeNotAssignedToCourt; + @CCD(typeOverride = FieldType.DynamicRadioList) + private DynamicStringList crossBorderCountriesList; + private String crossBorderCountry1; + private String crossBorderCountry2; + private String postcodeNotAssignedView; +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java index a30caa3b2d..da89178394 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java @@ -10,9 +10,9 @@ import uk.gov.hmcts.ccd.sdk.api.Permission; import uk.gov.hmcts.ccd.sdk.api.callback.SubmitResponse; import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.UserRole; -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.dto.CreateClaimData; import uk.gov.hmcts.reform.pcs.ccd.page.createpossessionclaim.CrossBorderPostcodeSelection; import uk.gov.hmcts.reform.pcs.ccd.page.createpossessionclaim.EnterPropertyAddress; import uk.gov.hmcts.reform.pcs.ccd.page.createpossessionclaim.PostcodeNotAssignedToCourt; @@ -38,41 +38,45 @@ public class CreatePossessionClaim implements CCDConfig configBuilder) { - EventBuilder eventBuilder = + EventBuilder eventBuilder = configBuilder - .decentralisedEvent(createPossessionClaim.name(), this::submit, this::start) + .decentralisedEvent( + createPossessionClaim.name(), + CreateClaimData.class, + "cpc", + this::submit, + this::start + ) .initialState(State.AWAITING_SUBMISSION_TO_HMCTS) .showSummary() .name("Make a claim") .grant(Permission.CRUD, UserRole.PCS_SOLICITOR); - new PageBuilder(eventBuilder) - .add(new StartTheService()) - .add(enterPropertyAddress) - .add(crossBorderPostcodeSelection) - .add(propertyNotEligible) - .add(new PostcodeNotAssignedToCourt()); - + new StartTheService().addTo(eventBuilder); + enterPropertyAddress.addTo(eventBuilder); + crossBorderPostcodeSelection.addTo(eventBuilder); + propertyNotEligible.addTo(eventBuilder); + new PostcodeNotAssignedToCourt().addTo(eventBuilder); } - private PCSCase start(EventPayload eventPayload) { - PCSCase caseData = eventPayload.caseData(); + private CreateClaimData start(EventPayload eventPayload) { + CreateClaimData caseData = eventPayload.caseData(); applyCaseIssueFeeAmount(caseData); return caseData; } - private void applyCaseIssueFeeAmount(PCSCase pcsCase) { + private void applyCaseIssueFeeAmount(CreateClaimData pcsCase) { feeApplier.applyFeeAmount( pcsCase, FeeType.CASE_ISSUE_FEE, - PCSCase::setFeeAmount + CreateClaimData::setFeeAmount ); } - private SubmitResponse submit(EventPayload eventPayload) { + private SubmitResponse submit(EventPayload eventPayload) { long caseReference = eventPayload.caseReference(); - PCSCase caseData = eventPayload.caseData(); + CreateClaimData caseData = eventPayload.caseData(); pcsCaseService.createCase(caseReference, caseData.getPropertyAddress(), caseData.getLegislativeCountry()); diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/CrossBorderPostcodeSelection.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/CrossBorderPostcodeSelection.java index 8d998ba56d..5d828bf251 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/CrossBorderPostcodeSelection.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/CrossBorderPostcodeSelection.java @@ -6,11 +6,11 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import uk.gov.hmcts.ccd.sdk.api.CaseDetails; +import uk.gov.hmcts.ccd.sdk.api.Event.EventBuilder; import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; -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.accesscontrol.UserRole; +import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; import uk.gov.hmcts.reform.pcs.ccd.domain.State; import uk.gov.hmcts.reform.pcs.postcodecourt.exception.EligibilityCheckException; import uk.gov.hmcts.reform.pcs.postcodecourt.model.EligibilityResult; @@ -24,19 +24,18 @@ @AllArgsConstructor @Component @Slf4j -public class CrossBorderPostcodeSelection implements CcdPageConfiguration { +public class CrossBorderPostcodeSelection { private final EligibilityService eligibilityService; - @Override - public void addTo(PageBuilder pageBuilder) { - pageBuilder + public void addTo(EventBuilder eventBuilder) { + eventBuilder.fields() .page("crossBorderPostcodeSelection", this::midEvent) .pageLabel("Border postcode") .showCondition("showCrossBorderPage=\"Yes\"") - .readonly(PCSCase::getShowCrossBorderPage, NEVER_SHOW) - .readonly(PCSCase::getCrossBorderCountry1, NEVER_SHOW, true) - .readonly(PCSCase::getCrossBorderCountry2, NEVER_SHOW, true) + .readonly(CreateClaimData::getShowCrossBorderPage, NEVER_SHOW) + .readonly(CreateClaimData::getCrossBorderCountry1, NEVER_SHOW, true) + .readonly(CreateClaimData::getCrossBorderCountry2, NEVER_SHOW, true) .label("crossBorderPostcodeSelection-info", """ ---
@@ -61,16 +60,17 @@ public void addTo(PageBuilder pageBuilder) {
""") - .mandatory(PCSCase::getCrossBorderCountriesList, + .mandatory(CreateClaimData::getCrossBorderCountriesList, null, null, "Is the property located in ${crossBorderCountry1} or ${crossBorderCountry2}?"); } - private AboutToStartOrSubmitResponse midEvent(CaseDetails details, - CaseDetails detailsBefore) { + private AboutToStartOrSubmitResponse midEvent( + CaseDetails details, + CaseDetails detailsBefore) { - PCSCase caseData = details.getData(); + CreateClaimData caseData = details.getData(); String postcode = getPostcode(caseData); String countryCode = getSelectedCountryCode(caseData); @@ -131,16 +131,16 @@ private AboutToStartOrSubmitResponse midEvent(CaseDetails response(PCSCase caseData) { - return AboutToStartOrSubmitResponse.builder() + private AboutToStartOrSubmitResponse response(CreateClaimData caseData) { + return AboutToStartOrSubmitResponse.builder() .data(caseData) .build(); } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/EnterPropertyAddress.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/EnterPropertyAddress.java index 80147274e0..0fa1665f15 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/EnterPropertyAddress.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/EnterPropertyAddress.java @@ -4,17 +4,16 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import uk.gov.hmcts.ccd.sdk.api.CaseDetails; +import uk.gov.hmcts.ccd.sdk.api.Event.EventBuilder; import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; import uk.gov.hmcts.ccd.sdk.type.AddressUK; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; -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.accesscontrol.UserRole; +import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; import uk.gov.hmcts.reform.pcs.ccd.domain.State; import uk.gov.hmcts.reform.pcs.ccd.service.AddressValidator; import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringList; import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringListElement; -import uk.gov.hmcts.reform.pcs.ccd.util.StringUtils; import uk.gov.hmcts.reform.pcs.postcodecourt.exception.EligibilityCheckException; import uk.gov.hmcts.reform.pcs.postcodecourt.model.EligibilityResult; import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry; @@ -27,18 +26,17 @@ @AllArgsConstructor @Component @Slf4j -public class EnterPropertyAddress implements CcdPageConfiguration { +public class EnterPropertyAddress { private final EligibilityService eligibilityService; private final AddressValidator addressValidator; - @Override - public void addTo(PageBuilder pageBuilder) { - pageBuilder + public void addTo(EventBuilder eventBuilder) { + eventBuilder.fields() .page("enterPropertyAddress", this::midEvent) .pageLabel("What is the address of the property you’re claiming possession of?") .label("enterPropertyAddress-lineSeparator", "---") - .complex(PCSCase::getPropertyAddress) + .complex(CreateClaimData::getPropertyAddress) .mandatory(AddressUK::getAddressLine1) .optional(AddressUK::getAddressLine2) .optional(AddressUK::getAddressLine3) @@ -47,20 +45,21 @@ public void addTo(PageBuilder pageBuilder) { .optional(AddressUK::getCountry) .mandatoryWithLabel(AddressUK::getPostCode, "Postcode") .done() - .readonly(PCSCase::getLegislativeCountry, NEVER_SHOW, true); + .readonly(CreateClaimData::getLegislativeCountry, NEVER_SHOW, true); } - private AboutToStartOrSubmitResponse midEvent(CaseDetails details, - CaseDetails detailsBefore) { + private AboutToStartOrSubmitResponse midEvent( + CaseDetails details, + CaseDetails detailsBefore) { - PCSCase caseData = details.getData(); + CreateClaimData caseData = details.getData(); AddressUK propertyAddress = caseData.getPropertyAddress(); List validationErrors = addressValidator.validateAddressFields(propertyAddress); if (!validationErrors.isEmpty()) { - return AboutToStartOrSubmitResponse.builder() - .errorMessageOverride(StringUtils.joinIfNotEmpty("\n", validationErrors)) + return AboutToStartOrSubmitResponse.builder() + .errors(validationErrors) .build(); } @@ -99,7 +98,7 @@ private AboutToStartOrSubmitResponse midEvent(CaseDetailsbuilder() + return AboutToStartOrSubmitResponse.builder() .data(caseData) .build(); } @@ -115,7 +114,7 @@ private void validateLegislativeCountries(List legislativeCo } } - private void setupCrossBorderData(PCSCase caseData, List legislativeCountries) { + private void setupCrossBorderData(CreateClaimData caseData, List legislativeCountries) { caseData.setShowCrossBorderPage(YesOrNo.YES); List crossBorderCountries = diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PostcodeNotAssignedToCourt.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PostcodeNotAssignedToCourt.java index 2c8682b253..705174552f 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PostcodeNotAssignedToCourt.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PostcodeNotAssignedToCourt.java @@ -4,32 +4,33 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import uk.gov.hmcts.ccd.sdk.api.CaseDetails; +import uk.gov.hmcts.ccd.sdk.api.Event.EventBuilder; 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.accesscontrol.UserRole; +import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; import uk.gov.hmcts.reform.pcs.ccd.domain.State; +import java.util.List; + import static uk.gov.hmcts.reform.pcs.ccd.ShowConditions.NEVER_SHOW; @AllArgsConstructor @Component @Slf4j -public class PostcodeNotAssignedToCourt implements CcdPageConfiguration { +public class PostcodeNotAssignedToCourt { private static final String SHOW_PAGE = "showPostcodeNotAssignedToCourt=\"Yes\""; private static final String SHOW_ENGLAND = SHOW_PAGE + " AND postcodeNotAssignedView=\"ENGLAND\""; private static final String SHOW_WALES = SHOW_PAGE + " AND postcodeNotAssignedView=\"WALES\""; private static final String SHOW_ALL = SHOW_PAGE + " AND postcodeNotAssignedView=\"ALL_COUNTRIES\""; - @Override - public void addTo(PageBuilder pageBuilder) { - pageBuilder + public void addTo(EventBuilder eventBuilder) { + eventBuilder.fields() .page("postcodeNotAssignedToCourt", this::midEvent) .pageLabel("You cannot use this online service") .showCondition(SHOW_PAGE) - .readonly(PCSCase::getShowPostcodeNotAssignedToCourt, NEVER_SHOW) - .readonly(PCSCase::getPostcodeNotAssignedView, NEVER_SHOW) + .readonly(CreateClaimData::getShowPostcodeNotAssignedToCourt, NEVER_SHOW) + .readonly(CreateClaimData::getPostcodeNotAssignedView, NEVER_SHOW) .label( "postcodeNotAssignedToCourt-header", """ @@ -108,10 +109,11 @@ Enforcement of Judgments Office (EJO) (opens in new tab). FOOTER); } - private AboutToStartOrSubmitResponse midEvent(CaseDetails details, - CaseDetails detailsBefore) { - return AboutToStartOrSubmitResponse.builder() - .errorMessageOverride("Property not eligible for this online service") + private AboutToStartOrSubmitResponse midEvent( + CaseDetails details, + CaseDetails detailsBefore) { + return AboutToStartOrSubmitResponse.builder() + .errors(List.of("Property not eligible for this online service")) .build(); } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PropertyNotEligible.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PropertyNotEligible.java index 11ff511ea5..3f54c28e77 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PropertyNotEligible.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PropertyNotEligible.java @@ -4,12 +4,14 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import uk.gov.hmcts.ccd.sdk.api.CaseDetails; +import uk.gov.hmcts.ccd.sdk.api.Event.EventBuilder; 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.accesscontrol.UserRole; +import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; import uk.gov.hmcts.reform.pcs.ccd.domain.State; +import java.util.List; + import static uk.gov.hmcts.reform.pcs.ccd.ShowConditions.NEVER_SHOW; /** @@ -19,15 +21,14 @@ @AllArgsConstructor @Component @Slf4j -public class PropertyNotEligible implements CcdPageConfiguration { +public class PropertyNotEligible { - @Override - public void addTo(PageBuilder pageBuilder) { - pageBuilder + public void addTo(EventBuilder eventBuilder) { + eventBuilder.fields() .page("propertyNotEligible", this::midEvent) .pageLabel("Property not eligible for this online service") .showCondition("showPropertyNotEligiblePage=\"Yes\"") - .readonly(PCSCase::getShowPropertyNotEligiblePage, NEVER_SHOW) + .readonly(CreateClaimData::getShowPropertyNotEligiblePage, NEVER_SHOW) // England and Wales guidance section .label("propertyNotEligible-england-wales", """ @@ -135,11 +136,11 @@ View the full list of property possessions forms (opens in new tab) """, "legislativeCountry=\"Channel Islands\" OR legislativeCountry=\"Isle of Man\""); } - - private AboutToStartOrSubmitResponse midEvent(CaseDetails details, - CaseDetails detailsBefore) { - return AboutToStartOrSubmitResponse.builder() - .errorMessageOverride("Property not eligible for this online service") + private AboutToStartOrSubmitResponse midEvent( + CaseDetails details, + CaseDetails detailsBefore) { + return AboutToStartOrSubmitResponse.builder() + .errors(List.of("Property not eligible for this online service")) .build(); } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/StartTheService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/StartTheService.java index cc611ad3ec..e945cdfce2 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/StartTheService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/StartTheService.java @@ -1,19 +1,19 @@ package uk.gov.hmcts.reform.pcs.ccd.page.createpossessionclaim; -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.ccd.sdk.api.Event.EventBuilder; +import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.UserRole; +import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; +import uk.gov.hmcts.reform.pcs.ccd.domain.State; import static uk.gov.hmcts.reform.pcs.ccd.ShowConditions.NEVER_SHOW; /** * CCD page configuration for making a housing possession claim online. */ -public class StartTheService implements CcdPageConfiguration { +public class StartTheService { - @Override - public void addTo(PageBuilder pageBuilder) { - pageBuilder + public void addTo(EventBuilder eventBuilder) { + eventBuilder.fields() .page("startTheService") .label("mainContent", "

Make a housing possession claim online

" @@ -49,6 +49,6 @@ public void addTo(PageBuilder pageBuilder) { + "can then return to sign, submit and pay at a later date" + "" ) - .readonly(PCSCase::getFeeAmount, NEVER_SHOW, true); + .readonly(CreateClaimData::getFeeAmount, NEVER_SHOW, true); } } diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/BaseEventTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/BaseEventTest.java index 576ddca16d..58127b5c9e 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/BaseEventTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/BaseEventTest.java @@ -35,11 +35,25 @@ protected PCSCase callStartHandler(PCSCase caseData) { } protected SubmitResponse callSubmitHandler(PCSCase caseData) { + @SuppressWarnings({"unchecked", "rawtypes"}) + protected D callDtoStartHandler(D caseData) { + EventPayload eventPayload = new EventPayload<>(TEST_CASE_REFERENCE, caseData, null); + Start startHandler = getConfiguredEvent().getStartHandler(); + return (D) startHandler.start(eventPayload); + } + EventPayload eventPayload = new EventPayload<>(TEST_CASE_REFERENCE, caseData, null); Submit submitHandler = getConfiguredEvent().getSubmitHandler(); return submitHandler.submit(eventPayload); } + @SuppressWarnings({"unchecked", "rawtypes"}) + protected void callDtoSubmitHandler(D caseData) { + EventPayload eventPayload = new EventPayload<>(TEST_CASE_REFERENCE, caseData, null); + Submit submitHandler = getConfiguredEvent().getSubmitHandler(); + submitHandler.submit(eventPayload); + } + private ResolvedCCDConfig buildEventConfig( CCDConfig eventConfig) { diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java new file mode 100644 index 0000000000..768af19d5a --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java @@ -0,0 +1,175 @@ +package uk.gov.hmcts.reform.pcs.ccd.event; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import uk.gov.hmcts.ccd.sdk.type.AddressUK; +import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; +import uk.gov.hmcts.reform.pcs.ccd.page.createpossessionclaim.CrossBorderPostcodeSelection; +import uk.gov.hmcts.reform.pcs.ccd.page.createpossessionclaim.EnterPropertyAddress; +import uk.gov.hmcts.reform.pcs.ccd.page.createpossessionclaim.PropertyNotEligible; +import uk.gov.hmcts.reform.pcs.ccd.service.PcsCaseService; +import uk.gov.hmcts.reform.pcs.feesandpay.model.FeeDetails; +import uk.gov.hmcts.reform.pcs.feesandpay.model.FeeTypes; +import uk.gov.hmcts.reform.pcs.feesandpay.service.FeeService; +import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry; + +import java.math.BigDecimal; +import java.lang.reflect.Field; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class CreatePossessionClaimTest extends BaseEventTest { + + @Mock + private PcsCaseService pcsCaseService; + @Mock + private FeeService feeService; + @Mock + private EnterPropertyAddress enterPropertyAddress; + @Mock + private CrossBorderPostcodeSelection crossBorderPostcodeSelection; + @Mock + private PropertyNotEligible propertyNotEligible; + + @BeforeEach + void setUp() { + CreatePossessionClaim underTest = new CreatePossessionClaim( + pcsCaseService, + feeService, + enterPropertyAddress, + crossBorderPostcodeSelection, + propertyNotEligible + ); + setEventUnderTest(underTest); + } + + @Test + void shouldUpdateCaseOnSubmit() { + AddressUK propertyAddress = mock(AddressUK.class); + LegislativeCountry legislativeCountry = LegislativeCountry.ENGLAND; + + CreateClaimData caseData = CreateClaimData.builder() + .propertyAddress(propertyAddress) + .legislativeCountry(legislativeCountry) + .build(); + + callDtoSubmitHandler(caseData); + + verify(pcsCaseService).createCase(TEST_CASE_REFERENCE, propertyAddress, legislativeCountry); + } + + @Test + void shouldConfigureEventFieldPrefix() { + assertThat(configuredEvent.getFieldPrefix()).isEqualTo("cpc"); + assertThat(configuredEvent.getEventFieldPrefix()).isEqualTo("cpc"); + } + + @Test + void shouldKeepGeneratedFieldIdsWithinCcdLimit() { + assertThat(configuredEvent.getFields().getFields()) + .allSatisfy(field -> assertThat(getFieldBuilderId(field)).hasSizeLessThanOrEqualTo(70)); + } + + @Test + void shouldSetFeeAmountOnStart() { + CreateClaimData caseData = CreateClaimData.builder().build(); + when(feeService.getFee(FeeTypes.CASE_ISSUE_FEE)).thenReturn( + FeeDetails.builder() + .feeAmount(new BigDecimal("404.00")) + .build() + ); + + CreateClaimData result = callDtoStartHandler(caseData); + + assertThat(result.getFeeAmount()).isEqualTo("£404"); + verify(feeService).getFee(FeeTypes.CASE_ISSUE_FEE); + } + + @Test + void shouldHandleFeeWithDecimalPlaces() { + CreateClaimData caseData = CreateClaimData.builder().build(); + when(feeService.getFee(FeeTypes.CASE_ISSUE_FEE)).thenReturn( + FeeDetails.builder() + .feeAmount(new BigDecimal("123.45")) + .build() + ); + + CreateClaimData result = callDtoStartHandler(caseData); + + assertThat(result.getFeeAmount()).isEqualTo("£123.45"); + verify(feeService).getFee(FeeTypes.CASE_ISSUE_FEE); + } + + @Test + void shouldHandleZeroFeeAmount() { + CreateClaimData caseData = CreateClaimData.builder().build(); + when(feeService.getFee(FeeTypes.CASE_ISSUE_FEE)).thenReturn( + FeeDetails.builder() + .feeAmount(BigDecimal.ZERO) + .build() + ); + + CreateClaimData result = callDtoStartHandler(caseData); + + assertThat(result.getFeeAmount()).isEqualTo("£0"); + verify(feeService).getFee(FeeTypes.CASE_ISSUE_FEE); + } + + @Test + void shouldHandleNullFeeAmount() { + CreateClaimData caseData = CreateClaimData.builder().build(); + when(feeService.getFee(FeeTypes.CASE_ISSUE_FEE)).thenReturn( + FeeDetails.builder() + .feeAmount(null) + .build() + ); + + CreateClaimData result = callDtoStartHandler(caseData); + + assertThat(result.getFeeAmount()).isEqualTo("Unable to retrieve"); + verify(feeService).getFee(FeeTypes.CASE_ISSUE_FEE); + } + + @Test + void shouldSetDefaultFeeWhenFeeServiceFails() { + CreateClaimData caseData = CreateClaimData.builder().build(); + + when(feeService.getFee(FeeTypes.CASE_ISSUE_FEE)) + .thenThrow(new RuntimeException("Fee not found")); + + CreateClaimData result = callDtoStartHandler(caseData); + + assertThat(result.getFeeAmount()).isEqualTo("Unable to retrieve"); + verify(feeService).getFee(FeeTypes.CASE_ISSUE_FEE); + } + + @Test + void shouldSetDefaultFeeWhenFeeServiceThrowsRuntimeException() { + CreateClaimData caseData = CreateClaimData.builder().build(); + + when(feeService.getFee(FeeTypes.CASE_ISSUE_FEE)) + .thenThrow(new RuntimeException("API unavailable")); + + CreateClaimData result = callDtoStartHandler(caseData); + + assertThat(result.getFeeAmount()).isEqualTo("Unable to retrieve"); + verify(feeService).getFee(FeeTypes.CASE_ISSUE_FEE); + } + + private String getFieldBuilderId(Object fieldBuilder) { + try { + Field idField = fieldBuilder.getClass().getDeclaredField("id"); + idField.setAccessible(true); + return (String) idField.get(fieldBuilder); + } catch (ReflectiveOperationException e) { + throw new AssertionError("Unable to read field builder id", e); + } + } +} diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/BasePageTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/BasePageTest.java index 383dab3bc1..c9b0ae26d6 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/BasePageTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/BasePageTest.java @@ -15,6 +15,7 @@ import java.util.Collection; import java.util.Map; +import java.util.function.Consumer; import static org.assertj.core.api.Assertions.assertThat; @@ -29,6 +30,19 @@ protected void setPageUnderTest(CcdPageConfiguration pageUnderTest) { event = buildPageInTestEvent(pageUnderTest); } + @SuppressWarnings({"unchecked", "rawtypes"}) + protected void setDtoPageUnderTest(Class dtoClass, + Consumer> pageSetup) { + ConfigBuilderImpl configBuilder = createConfigBuilder(); + Event.EventBuilder eventBuilder = (Event.EventBuilder) configBuilder + .decentralisedEvent(TEST_EVENT_ID, dtoClass, null) + .forAllStates(); + pageSetup.accept(eventBuilder); + ResolvedCCDConfig resolvedCCDConfig = configBuilder.build(); + event = resolvedCCDConfig.getEvents().get(TEST_EVENT_ID); + assertThat(event).isNotNull(); + } + protected AboutToStartOrSubmitResponse callMidEventHandler(PCSCase caseData) { CaseDetails caseDetails = CaseDetails.builder() .id(TEST_CASE_REFERENCE) @@ -38,6 +52,16 @@ protected AboutToStartOrSubmitResponse callMidEventHandler(PCSCa return getMidEventForPage().handle(caseDetails, null); } + @SuppressWarnings({"unchecked", "rawtypes"}) + protected AboutToStartOrSubmitResponse callDtoMidEventHandler(D caseData) { + CaseDetails caseDetails = CaseDetails.builder() + .id(TEST_CASE_REFERENCE) + .data(caseData) + .build(); + + return (AboutToStartOrSubmitResponse) getMidEventForPage().handle(caseDetails, null); + } + private Event buildPageInTestEvent(CcdPageConfiguration page) { ConfigBuilderImpl configBuilder = createConfigBuilder(); Event.EventBuilder eventBuilder = createEventBuilder(configBuilder); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/CrossBorderPostcodeSelectionTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/CrossBorderPostcodeSelectionTest.java index e682c75aad..68714ba6f2 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/CrossBorderPostcodeSelectionTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/CrossBorderPostcodeSelectionTest.java @@ -13,7 +13,7 @@ import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; import uk.gov.hmcts.ccd.sdk.type.AddressUK; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; -import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; +import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; import uk.gov.hmcts.reform.pcs.ccd.domain.State; import uk.gov.hmcts.reform.pcs.ccd.page.BasePageTest; import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringList; @@ -39,7 +39,8 @@ class CrossBorderPostcodeSelectionTest extends BasePageTest { @BeforeEach void setUp() { - setPageUnderTest(new CrossBorderPostcodeSelection(eligibilityService)); + CrossBorderPostcodeSelection page = new CrossBorderPostcodeSelection(eligibilityService); + setDtoPageUnderTest(CreateClaimData.class, page::addTo); } @ParameterizedTest @@ -53,7 +54,7 @@ void shouldSetLegislativeCountryWhenEligibilityMatchFound(EligibilityStatus elig .postCode(postCode) .build(); - PCSCase caseData = PCSCase.builder() + CreateClaimData caseData = CreateClaimData.builder() .propertyAddress(propertyAddress) .crossBorderCountriesList(createCountryListWithSelectedValue(expectedLegislativeCountry)) .build(); @@ -66,7 +67,7 @@ void shouldSetLegislativeCountryWhenEligibilityMatchFound(EligibilityStatus elig when(eligibilityService.checkEligibility(postCode, expectedLegislativeCountry)).thenReturn(eligibilityResult); // When - callMidEventHandler(caseData); + callDtoMidEventHandler(caseData); // Then assertThat(caseData.getLegislativeCountry()).isEqualTo(expectedLegislativeCountry); @@ -80,7 +81,7 @@ void shouldLogEligibilityBasedOnCountrySelection( EligibilityStatus status) { // Given - PCSCase caseData = PCSCase.builder() + CreateClaimData caseData = CreateClaimData.builder() .propertyAddress(AddressUK.builder().postCode(postcode).build()) .crossBorderCountriesList(createCountryListWithSelectedValue(selectedCountry)) .build(); @@ -93,11 +94,11 @@ void shouldLogEligibilityBasedOnCountrySelection( .thenReturn(eligibilityResult); // When - AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + AboutToStartOrSubmitResponse response = callDtoMidEventHandler(caseData); // Then assertThat(response).isNotNull(); - PCSCase resultData = response.getData(); + CreateClaimData resultData = response.getData(); assertThat(resultData).isNotNull(); if (status == EligibilityStatus.NO_MATCH_FOUND) { @@ -163,7 +164,7 @@ void shouldNotShowNotEligibleOrNotAssignedPagesIfPropertyIsEligible() { .thenReturn(result); // When - AboutToStartOrSubmitResponse resp = callMidEventHandler(caseData); + AboutToStartOrSubmitResponse resp = callDtoMidEventHandler(caseData); // Then var data = resp.getData(); @@ -190,7 +191,7 @@ void shouldShowPropertyNotEligiblePageWhenCrossBorderPropertyIsNotEligible( .thenReturn(result); // When - AboutToStartOrSubmitResponse resp = callMidEventHandler(caseData); + AboutToStartOrSubmitResponse resp = callDtoMidEventHandler(caseData); // Then: show PNE, keep cross-border for 'Previous' var data = resp.getData(); @@ -205,7 +206,7 @@ private static Stream eligibleCountries() { ); } - private PCSCase buildCrossBorderCaseWithFlags(LegislativeCountry selectedCountry) { + private CreateClaimData buildCrossBorderCaseWithFlags(LegislativeCountry selectedCountry) { var selected = DynamicStringListElement.builder() .code(selectedCountry.name()) @@ -216,7 +217,7 @@ private PCSCase buildCrossBorderCaseWithFlags(LegislativeCountry selectedCountry .value(selected) .build(); - return PCSCase.builder() + return CreateClaimData.builder() .propertyAddress(AddressUK.builder().postCode(CrossBorderPostcodeSelectionTest.SOME_POSTCODE).build()) .crossBorderCountriesList(dynamicStringList) .showCrossBorderPage(YesOrNo.YES) diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/EnterPropertyAddressTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/EnterPropertyAddressTest.java index 325f76bf9c..a3ae7cc7db 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/EnterPropertyAddressTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/EnterPropertyAddressTest.java @@ -12,7 +12,7 @@ import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; import uk.gov.hmcts.ccd.sdk.type.AddressUK; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; -import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; +import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; import uk.gov.hmcts.reform.pcs.ccd.domain.State; import uk.gov.hmcts.reform.pcs.ccd.page.BasePageTest; import uk.gov.hmcts.reform.pcs.ccd.service.AddressValidator; @@ -49,7 +49,8 @@ class EnterPropertyAddressTest extends BasePageTest { @BeforeEach void setUp() { - setPageUnderTest(new EnterPropertyAddress(eligibilityService, addressValidator)); + EnterPropertyAddress page = new EnterPropertyAddress(eligibilityService, addressValidator); + setDtoPageUnderTest(CreateClaimData.class, page::addTo); } @ParameterizedTest @@ -63,7 +64,7 @@ void shouldSetLegislativeCountryWhenEligibilityMatchFound(EligibilityStatus elig .postCode(postCode) .build(); - PCSCase caseData = PCSCase.builder() + CreateClaimData caseData = CreateClaimData.builder() .propertyAddress(propertyAddress) .build(); @@ -75,7 +76,7 @@ void shouldSetLegislativeCountryWhenEligibilityMatchFound(EligibilityStatus elig when(eligibilityService.checkEligibility(postCode, null)).thenReturn(eligibilityResult); // When - callMidEventHandler(caseData); + callDtoMidEventHandler(caseData); // Then assertThat(caseData.getLegislativeCountry()).isEqualTo(expectedLegislativeCountry); @@ -96,7 +97,7 @@ void shouldHandlePostcodeEligibilityCheck( .postCode(postcode) .build(); - PCSCase caseData = PCSCase.builder() + CreateClaimData caseData = CreateClaimData.builder() .propertyAddress(propertyAddress) .legislativeCountry(SCOTLAND) .build(); @@ -109,9 +110,9 @@ void shouldHandlePostcodeEligibilityCheck( when(eligibilityService.checkEligibility(postcode, null)).thenReturn(eligibilityResult); // When - AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + AboutToStartOrSubmitResponse response = callDtoMidEventHandler(caseData); // Then - PCSCase resultData = response.getData(); + CreateClaimData resultData = response.getData(); assertThat(resultData.getShowCrossBorderPage()).isEqualTo(expectedShowCrossBorder); if (status == EligibilityStatus.NO_MATCH_FOUND) { @@ -141,7 +142,7 @@ void shouldThrowExceptionWhenLegislativeCountryRequiredButInvalidCountries( .postCode(postcode) .build(); - PCSCase caseData = PCSCase.builder() + CreateClaimData caseData = CreateClaimData.builder() .propertyAddress(propertyAddress) .build(); @@ -153,7 +154,7 @@ void shouldThrowExceptionWhenLegislativeCountryRequiredButInvalidCountries( when(eligibilityService.checkEligibility(postcode, null)).thenReturn(eligibilityResult); // When & Then - assertThatThrownBy(() -> callMidEventHandler(caseData)) + assertThatThrownBy(() -> callDtoMidEventHandler(caseData)) .isInstanceOf(EligibilityCheckException.class) .hasMessageContaining("Expected at least 2 legislative countries") .hasMessageContaining(expectedMessageFragment) @@ -164,7 +165,7 @@ void shouldThrowExceptionWhenLegislativeCountryRequiredButInvalidCountries( void shouldNotShowPropertyNotEligibleOrCrossBorderPagesOnEligible() { // Given AddressUK propertyAddress = AddressUK.builder().postCode("M1 1AA").build(); - PCSCase caseData = PCSCase.builder().propertyAddress(propertyAddress).build(); + CreateClaimData caseData = CreateClaimData.builder().propertyAddress(propertyAddress).build(); var result = EligibilityResult.builder() .status(EligibilityStatus.ELIGIBLE) @@ -174,10 +175,10 @@ void shouldNotShowPropertyNotEligibleOrCrossBorderPagesOnEligible() { when(eligibilityService.checkEligibility("M1 1AA", null)).thenReturn(result); // When - AboutToStartOrSubmitResponse resp = callMidEventHandler(caseData); + AboutToStartOrSubmitResponse resp = callDtoMidEventHandler(caseData); // Then - PCSCase data = resp.getData(); + CreateClaimData data = resp.getData(); assertThat(data.getShowCrossBorderPage()).isEqualTo(YesOrNo.NO); assertThat(data.getShowPropertyNotEligiblePage()).isEqualTo(YesOrNo.NO); } @@ -186,7 +187,7 @@ void shouldNotShowPropertyNotEligibleOrCrossBorderPagesOnEligible() { void shouldShowPropertyNotEligiblePageOnNotEligible() { // Given AddressUK propertyAddress = AddressUK.builder().postCode("M1 1AA").build(); - PCSCase caseData = PCSCase.builder().propertyAddress(propertyAddress).build(); + CreateClaimData caseData = CreateClaimData.builder().propertyAddress(propertyAddress).build(); var result = EligibilityResult.builder() .status(EligibilityStatus.NOT_ELIGIBLE) @@ -196,10 +197,10 @@ void shouldShowPropertyNotEligiblePageOnNotEligible() { when(eligibilityService.checkEligibility("M1 1AA", null)).thenReturn(result); // When - AboutToStartOrSubmitResponse resp = callMidEventHandler(caseData); + AboutToStartOrSubmitResponse resp = callDtoMidEventHandler(caseData); // Then - PCSCase data = resp.getData(); + CreateClaimData data = resp.getData(); assertThat(data.getShowCrossBorderPage()).isEqualTo(YesOrNo.NO); assertThat(data.getShowPropertyNotEligiblePage()).isEqualTo(YesOrNo.YES); } @@ -208,7 +209,7 @@ void shouldShowPropertyNotEligiblePageOnNotEligible() { void shouldReturnValidationErrorsWhenAddressInvalid() { // Given AddressUK propertyAddress = mock(AddressUK.class); - PCSCase caseData = PCSCase.builder() + CreateClaimData caseData = CreateClaimData.builder() .propertyAddress(propertyAddress) .build(); @@ -216,7 +217,7 @@ void shouldReturnValidationErrorsWhenAddressInvalid() { when(addressValidator.validateAddressFields(propertyAddress)).thenReturn(validationErrors); // When - AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + AboutToStartOrSubmitResponse response = callDtoMidEventHandler(caseData); // Then assertThat(response.getErrorMessageOverride()).isEqualTo("error 1\nerror 2"); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PostcodeNotAssignedToCourtTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PostcodeNotAssignedToCourtTest.java index 4b900874cd..43996324eb 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PostcodeNotAssignedToCourtTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PostcodeNotAssignedToCourtTest.java @@ -12,8 +12,7 @@ import uk.gov.hmcts.ccd.sdk.api.Event.EventBuilder; import uk.gov.hmcts.ccd.sdk.api.FieldCollection.FieldCollectionBuilder; import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.UserRole; -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.dto.CreateClaimData; import uk.gov.hmcts.reform.pcs.ccd.domain.State; import java.util.stream.Stream; @@ -30,11 +29,10 @@ class PostcodeNotAssignedToCourtTest { @Mock - private EventBuilder eventBuilder; + private EventBuilder eventBuilder; @Mock - private FieldCollectionBuilder> fieldBuilder; + private FieldCollectionBuilder> fieldBuilder; - private PageBuilder pageBuilder; private PostcodeNotAssignedToCourt underTest; @BeforeEach @@ -47,14 +45,13 @@ void setUp() { when(fieldBuilder.label(anyString(), anyString())).thenReturn(fieldBuilder); when(fieldBuilder.label(anyString(), anyString(), anyString())).thenReturn(fieldBuilder); - pageBuilder = new PageBuilder(eventBuilder); underTest = new PostcodeNotAssignedToCourt(); } @Test @DisplayName("Should build page configuration successfully") void shouldBuildPageConfigurationSuccessfully() { - underTest.addTo(pageBuilder); + underTest.addTo(eventBuilder); verify(fieldBuilder).page(eq("postcodeNotAssignedToCourt"), any()); verify(fieldBuilder).pageLabel(eq("You cannot use this online service")); @@ -64,7 +61,7 @@ void shouldBuildPageConfigurationSuccessfully() { @MethodSource("showConditionScenarios") @DisplayName("Should apply correct show conditions for different views") void shouldApplyCorrectShowConditions(String expectedShowCondition, String expectedLabelId) { - underTest.addTo(pageBuilder); + underTest.addTo(eventBuilder); // Verify the main show condition is set verify(fieldBuilder).showCondition(eq("showPostcodeNotAssignedToCourt=\"Yes\"")); From 010cff6a1c102f378607cce54b4ba45f0a7e2666 Mon Sep 17 00:00:00 2001 From: Alex McAusland Date: Thu, 19 Mar 2026 13:44:13 +0000 Subject: [PATCH 2/7] Use cpc wire keys in create possession claim cftlib test --- .../reform/pcs/CreatePossessionClaimTest.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/cftlibTest/java/uk/gov/hmcts/reform/pcs/CreatePossessionClaimTest.java b/src/cftlibTest/java/uk/gov/hmcts/reform/pcs/CreatePossessionClaimTest.java index 2855e139bb..fcfd2a97e9 100644 --- a/src/cftlibTest/java/uk/gov/hmcts/reform/pcs/CreatePossessionClaimTest.java +++ b/src/cftlibTest/java/uk/gov/hmcts/reform/pcs/CreatePossessionClaimTest.java @@ -11,7 +11,6 @@ import org.junit.jupiter.api.TestMethodOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import uk.gov.hmcts.ccd.sdk.type.AddressUK; import uk.gov.hmcts.ccd.sdk.type.ListValue; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.ccd.client.CoreCaseDataApi; @@ -35,6 +34,7 @@ import uk.gov.hmcts.rse.ccd.lib.test.CftlibTest; import java.util.List; +import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; import static uk.gov.hmcts.reform.pcs.ccd.event.EventId.createPossessionClaim; @@ -67,18 +67,17 @@ void setup() { @Test @Order(1) void createPossessionClaim() { - - PCSCase caseData = PCSCase.builder() - .propertyAddress(AddressUK.builder() - .addressLine1("123 Baker Street") - .addressLine2("Marylebone") - .postTown("London") - .county("Greater London") - .postCode("NW1 6XE") - .build() - ) - .legislativeCountry(LegislativeCountry.ENGLAND) - .build(); + Map caseData = Map.of( + "cpcpropertyAddress", + Map.of( + "AddressLine1", "123 Baker Street", + "AddressLine2", "Marylebone", + "PostTown", "London", + "County", "Greater London", + "PostCode", "NW1 6XE" + ), + "cpclegislativeCountry", LegislativeCountry.ENGLAND.getLabel() + ); CaseDetails caseDetails = startAndSubmitCreationEvent(createPossessionClaim, caseData); @@ -127,7 +126,7 @@ void resumePossessionClaim() { } @SuppressWarnings("SameParameterValue") - private CaseDetails startAndSubmitCreationEvent(EventId eventId, PCSCase caseData) { + private CaseDetails startAndSubmitCreationEvent(EventId eventId, Object caseData) { StartEventResponse startEventResponse = ccdApi.startCase( idamToken, s2sToken, From 8e0676c71d4ebe77018d6fca77a33b3ae32c3bbe Mon Sep 17 00:00:00 2001 From: Alex McAusland Date: Thu, 19 Mar 2026 14:26:09 +0000 Subject: [PATCH 3/7] new transport --- .../hmcts/reform/pcs/ccd/domain/PCSCase.java | 3 +- .../reform/pcs/ccd/dto/CreateClaimData.java | 3 +- .../pcs/ccd/event/CreatePossessionClaim.java | 6 +--- .../enforcetheorder/EnforceTheOrder.java | 9 +++--- .../hmcts/reform/pcs/ccd/util/FeeApplier.java | 13 ++++---- .../reform/pcs/ccd/util/HasFeeAmount.java | 6 ++++ .../reform/pcs/ccd/event/BaseEventTest.java | 10 +++---- .../ccd/event/CreatePossessionClaimTest.java | 30 ++++++++++--------- .../enforcetheorder/EnforceTheOrderTest.java | 18 +++++------ .../reform/pcs/ccd/page/BasePageTest.java | 3 +- .../reform/pcs/ccd/util/FeeApplierTest.java | 15 ++-------- 11 files changed, 57 insertions(+), 59 deletions(-) create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/HasFeeAmount.java 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 d9a4598fcf..d89b51b087 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 @@ -37,6 +37,7 @@ import uk.gov.hmcts.reform.pcs.ccd.domain.wales.PeriodicContractTermsWales; import uk.gov.hmcts.reform.pcs.ccd.domain.wales.SecureContractGroundsForPossessionWales; import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringList; +import uk.gov.hmcts.reform.pcs.ccd.util.HasFeeAmount; import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry; import java.util.List; @@ -52,7 +53,7 @@ */ @Builder(toBuilder = true) @Data -public class PCSCase { +public class PCSCase implements HasFeeAmount { // Field label constants - shared between domain annotations and validation public static final String NOTICE_EMAIL_EXPLANATION_LABEL = "Explain how it was served by email"; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java index 083f67d4eb..66fe16b797 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java @@ -9,13 +9,14 @@ import uk.gov.hmcts.ccd.sdk.type.FieldType; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringList; +import uk.gov.hmcts.reform.pcs.ccd.util.HasFeeAmount; import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry; @Data @Builder @NoArgsConstructor @AllArgsConstructor -public class CreateClaimData { +public class CreateClaimData implements HasFeeAmount { private AddressUK propertyAddress; private LegislativeCountry legislativeCountry; private String feeAmount; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java index da89178394..97732b544b 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java @@ -67,11 +67,7 @@ private CreateClaimData start(EventPayload eventPayload) } private void applyCaseIssueFeeAmount(CreateClaimData pcsCase) { - feeApplier.applyFeeAmount( - pcsCase, - FeeType.CASE_ISSUE_FEE, - CreateClaimData::setFeeAmount - ); + feeApplier.applyFeeAmount(pcsCase, FeeType.CASE_ISSUE_FEE); } private SubmitResponse submit(EventPayload eventPayload) { diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcetheorder/EnforceTheOrder.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcetheorder/EnforceTheOrder.java index 8c2ffe186c..ba380119a2 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcetheorder/EnforceTheOrder.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcetheorder/EnforceTheOrder.java @@ -91,15 +91,16 @@ private void populateDefendantSelectionList(PCSCase caseData) { } private void applyWarrantFeeAmount(PCSCase pcsCase) { - feeApplier.applyFeeAmount(pcsCase, + feeApplier.applyFeeAmount( FeeType.ENFORCEMENT_WARRANT_FEE, - (caseData, fee) -> caseData.getEnforcementOrder().setWarrantFeeAmount(fee)); + pcsCase.getEnforcementOrder()::setWarrantFeeAmount + ); } private void applyWritFeeAmount(PCSCase pcsCase) { - feeApplier.applyFeeAmount(pcsCase, + feeApplier.applyFeeAmount( FeeType.ENFORCEMENT_WRIT_FEE, - (caseData, fee) -> caseData.getEnforcementOrder().setWritFeeAmount(fee) + pcsCase.getEnforcementOrder()::setWritFeeAmount ); } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplier.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplier.java index 369b12687e..3a2b57b618 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplier.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplier.java @@ -3,12 +3,11 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; import uk.gov.hmcts.reform.pcs.feesandpay.model.FeeType; import uk.gov.hmcts.reform.pcs.feesandpay.service.FeeService; import java.math.BigDecimal; -import java.util.function.BiConsumer; +import java.util.function.Consumer; @Slf4j @Component @@ -20,14 +19,18 @@ public class FeeApplier { private final FeeService feeService; private final MoneyFormatter moneyFormatter; - public void applyFeeAmount(PCSCase pcsCase, FeeType feeType, BiConsumer setter) { + public void applyFeeAmount(HasFeeAmount target, FeeType feeType) { + applyFeeAmount(feeType, target::setFeeAmount); + } + + public void applyFeeAmount(FeeType feeType, Consumer setter) { try { BigDecimal feeAmount = feeService.getFee(feeType).getFeeAmount(); String formatted = moneyFormatter.formatFee(feeAmount); - setter.accept(pcsCase, formatted != null ? formatted : UNABLE_TO_RETRIEVE); + setter.accept(formatted != null ? formatted : UNABLE_TO_RETRIEVE); } catch (Exception e) { log.error("Error while getting {} fee", feeType.name(), e); - setter.accept(pcsCase, UNABLE_TO_RETRIEVE); + setter.accept(UNABLE_TO_RETRIEVE); } } } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/HasFeeAmount.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/HasFeeAmount.java new file mode 100644 index 0000000000..a57e101805 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/HasFeeAmount.java @@ -0,0 +1,6 @@ +package uk.gov.hmcts.reform.pcs.ccd.util; + +public interface HasFeeAmount { + + void setFeeAmount(String feeAmount); +} diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/BaseEventTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/BaseEventTest.java index 58127b5c9e..c0bdde956d 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/BaseEventTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/BaseEventTest.java @@ -35,6 +35,11 @@ protected PCSCase callStartHandler(PCSCase caseData) { } protected SubmitResponse callSubmitHandler(PCSCase caseData) { + EventPayload eventPayload = new EventPayload<>(TEST_CASE_REFERENCE, caseData, null); + Submit submitHandler = getConfiguredEvent().getSubmitHandler(); + return submitHandler.submit(eventPayload); + } + @SuppressWarnings({"unchecked", "rawtypes"}) protected D callDtoStartHandler(D caseData) { EventPayload eventPayload = new EventPayload<>(TEST_CASE_REFERENCE, caseData, null); @@ -42,11 +47,6 @@ protected D callDtoStartHandler(D caseData) { return (D) startHandler.start(eventPayload); } - EventPayload eventPayload = new EventPayload<>(TEST_CASE_REFERENCE, caseData, null); - Submit submitHandler = getConfiguredEvent().getSubmitHandler(); - return submitHandler.submit(eventPayload); - } - @SuppressWarnings({"unchecked", "rawtypes"}) protected void callDtoSubmitHandler(D caseData) { EventPayload eventPayload = new EventPayload<>(TEST_CASE_REFERENCE, caseData, null); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java index 768af19d5a..214d4fcd66 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java @@ -11,8 +11,10 @@ import uk.gov.hmcts.reform.pcs.ccd.page.createpossessionclaim.EnterPropertyAddress; import uk.gov.hmcts.reform.pcs.ccd.page.createpossessionclaim.PropertyNotEligible; import uk.gov.hmcts.reform.pcs.ccd.service.PcsCaseService; +import uk.gov.hmcts.reform.pcs.ccd.util.FeeApplier; +import uk.gov.hmcts.reform.pcs.ccd.util.MoneyFormatter; import uk.gov.hmcts.reform.pcs.feesandpay.model.FeeDetails; -import uk.gov.hmcts.reform.pcs.feesandpay.model.FeeTypes; +import uk.gov.hmcts.reform.pcs.feesandpay.model.FeeType; import uk.gov.hmcts.reform.pcs.feesandpay.service.FeeService; import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry; @@ -42,7 +44,7 @@ class CreatePossessionClaimTest extends BaseEventTest { void setUp() { CreatePossessionClaim underTest = new CreatePossessionClaim( pcsCaseService, - feeService, + new FeeApplier(feeService, new MoneyFormatter()), enterPropertyAddress, crossBorderPostcodeSelection, propertyNotEligible @@ -80,7 +82,7 @@ void shouldKeepGeneratedFieldIdsWithinCcdLimit() { @Test void shouldSetFeeAmountOnStart() { CreateClaimData caseData = CreateClaimData.builder().build(); - when(feeService.getFee(FeeTypes.CASE_ISSUE_FEE)).thenReturn( + when(feeService.getFee(FeeType.CASE_ISSUE_FEE)).thenReturn( FeeDetails.builder() .feeAmount(new BigDecimal("404.00")) .build() @@ -89,13 +91,13 @@ void shouldSetFeeAmountOnStart() { CreateClaimData result = callDtoStartHandler(caseData); assertThat(result.getFeeAmount()).isEqualTo("£404"); - verify(feeService).getFee(FeeTypes.CASE_ISSUE_FEE); + verify(feeService).getFee(FeeType.CASE_ISSUE_FEE); } @Test void shouldHandleFeeWithDecimalPlaces() { CreateClaimData caseData = CreateClaimData.builder().build(); - when(feeService.getFee(FeeTypes.CASE_ISSUE_FEE)).thenReturn( + when(feeService.getFee(FeeType.CASE_ISSUE_FEE)).thenReturn( FeeDetails.builder() .feeAmount(new BigDecimal("123.45")) .build() @@ -104,13 +106,13 @@ void shouldHandleFeeWithDecimalPlaces() { CreateClaimData result = callDtoStartHandler(caseData); assertThat(result.getFeeAmount()).isEqualTo("£123.45"); - verify(feeService).getFee(FeeTypes.CASE_ISSUE_FEE); + verify(feeService).getFee(FeeType.CASE_ISSUE_FEE); } @Test void shouldHandleZeroFeeAmount() { CreateClaimData caseData = CreateClaimData.builder().build(); - when(feeService.getFee(FeeTypes.CASE_ISSUE_FEE)).thenReturn( + when(feeService.getFee(FeeType.CASE_ISSUE_FEE)).thenReturn( FeeDetails.builder() .feeAmount(BigDecimal.ZERO) .build() @@ -119,13 +121,13 @@ void shouldHandleZeroFeeAmount() { CreateClaimData result = callDtoStartHandler(caseData); assertThat(result.getFeeAmount()).isEqualTo("£0"); - verify(feeService).getFee(FeeTypes.CASE_ISSUE_FEE); + verify(feeService).getFee(FeeType.CASE_ISSUE_FEE); } @Test void shouldHandleNullFeeAmount() { CreateClaimData caseData = CreateClaimData.builder().build(); - when(feeService.getFee(FeeTypes.CASE_ISSUE_FEE)).thenReturn( + when(feeService.getFee(FeeType.CASE_ISSUE_FEE)).thenReturn( FeeDetails.builder() .feeAmount(null) .build() @@ -134,33 +136,33 @@ void shouldHandleNullFeeAmount() { CreateClaimData result = callDtoStartHandler(caseData); assertThat(result.getFeeAmount()).isEqualTo("Unable to retrieve"); - verify(feeService).getFee(FeeTypes.CASE_ISSUE_FEE); + verify(feeService).getFee(FeeType.CASE_ISSUE_FEE); } @Test void shouldSetDefaultFeeWhenFeeServiceFails() { CreateClaimData caseData = CreateClaimData.builder().build(); - when(feeService.getFee(FeeTypes.CASE_ISSUE_FEE)) + when(feeService.getFee(FeeType.CASE_ISSUE_FEE)) .thenThrow(new RuntimeException("Fee not found")); CreateClaimData result = callDtoStartHandler(caseData); assertThat(result.getFeeAmount()).isEqualTo("Unable to retrieve"); - verify(feeService).getFee(FeeTypes.CASE_ISSUE_FEE); + verify(feeService).getFee(FeeType.CASE_ISSUE_FEE); } @Test void shouldSetDefaultFeeWhenFeeServiceThrowsRuntimeException() { CreateClaimData caseData = CreateClaimData.builder().build(); - when(feeService.getFee(FeeTypes.CASE_ISSUE_FEE)) + when(feeService.getFee(FeeType.CASE_ISSUE_FEE)) .thenThrow(new RuntimeException("API unavailable")); CreateClaimData result = callDtoStartHandler(caseData); assertThat(result.getFeeAmount()).isEqualTo("Unable to retrieve"); - verify(feeService).getFee(FeeTypes.CASE_ISSUE_FEE); + verify(feeService).getFee(FeeType.CASE_ISSUE_FEE); } private String getFieldBuilderId(Object fieldBuilder) { diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcetheorder/EnforceTheOrderTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcetheorder/EnforceTheOrderTest.java index 0873de9c3a..808ff8d332 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcetheorder/EnforceTheOrderTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/enforcetheorder/EnforceTheOrderTest.java @@ -34,7 +34,7 @@ import java.util.ArrayList; import java.util.List; -import java.util.function.BiConsumer; +import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Stream; @@ -282,12 +282,10 @@ void shouldSetFeeAmountOnStart(FeeType fee, Function f String expectedFormattedFee = "£" + (1 + FEE_AMOUNT); doAnswer(invocation -> { - PCSCase pcs = invocation.getArgument(0); - BiConsumer setter = invocation.getArgument(2); - setter.accept(pcs, expectedFormattedFee); + Consumer setter = invocation.getArgument(1); + setter.accept(expectedFormattedFee); return null; }).when(feeApplier).applyFeeAmount( - any(PCSCase.class), any(FeeType.class), any() ); @@ -297,7 +295,7 @@ void shouldSetFeeAmountOnStart(FeeType fee, Function f // Then assertThat(feeGetter.apply(result.getEnforcementOrder())).isEqualTo(expectedFormattedFee); - verify(feeApplier).applyFeeAmount(eq(caseData), eq(fee), any()); + verify(feeApplier).applyFeeAmount(eq(fee), any()); } @ParameterizedTest @@ -308,16 +306,14 @@ void shouldSetDefaultFeeWhenFeeServiceFails(FeeType fee, Function { - PCSCase pcs = invocation.getArgument(0); - BiConsumer setter = invocation.getArgument(2); + Consumer setter = invocation.getArgument(1); try { throw new RuntimeException("Fee not found"); } catch (RuntimeException e) { - setter.accept(pcs, expectedFeesMessage); + setter.accept(expectedFeesMessage); } return null; }).when(feeApplier).applyFeeAmount( - eq(caseData), any(FeeType.class), any()); @@ -326,7 +322,7 @@ void shouldSetDefaultFeeWhenFeeServiceFails(FeeType fee, Function enforcementFeeScenarios() { diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/BasePageTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/BasePageTest.java index c9b0ae26d6..a7b80b04b3 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/BasePageTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/BasePageTest.java @@ -24,6 +24,7 @@ public abstract class BasePageTest { protected static final long TEST_CASE_REFERENCE = 1234L; private static final String TEST_EVENT_ID = "test-event"; + private static final String TEST_FIELD_PREFIX = "tst"; protected Event event; protected void setPageUnderTest(CcdPageConfiguration pageUnderTest) { @@ -35,7 +36,7 @@ protected void setDtoPageUnderTest(Class dtoClass, Consumer> pageSetup) { ConfigBuilderImpl configBuilder = createConfigBuilder(); Event.EventBuilder eventBuilder = (Event.EventBuilder) configBuilder - .decentralisedEvent(TEST_EVENT_ID, dtoClass, null) + .decentralisedEvent(TEST_EVENT_ID, dtoClass, TEST_FIELD_PREFIX, null) .forAllStates(); pageSetup.accept(eventBuilder); ResolvedCCDConfig resolvedCCDConfig = configBuilder.build(); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplierTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplierTest.java index aae0db69f5..3377d6bba7 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplierTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplierTest.java @@ -14,7 +14,6 @@ import uk.gov.hmcts.reform.pcs.feesandpay.service.FeeService; import java.math.BigDecimal; -import java.util.function.BiConsumer; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.verify; @@ -49,11 +48,8 @@ void shouldSetFormattedFeeWhenFeeServiceReturnsFee() { .feeAmount(feeAmount) .build() ); - BiConsumer setter = (caseData, fee) -> caseData - .getEnforcementOrder().setWarrantFeeAmount(fee); - // When - underTest.applyFeeAmount(pcsCase, feeType, setter); + underTest.applyFeeAmount(feeType, pcsCase.getEnforcementOrder()::setWarrantFeeAmount); // Then verify(feeService).getFee(feeType); @@ -71,11 +67,8 @@ void shouldSetDefaultFeeWhenFeeServiceThrows() { when(feeService.getFee(feeType)) .thenThrow(new RuntimeException("Fee service error")); - BiConsumer setter = (caseData, fee) -> caseData - .getEnforcementOrder().setWarrantFeeAmount(fee); - // When - underTest.applyFeeAmount(pcsCase, feeType, setter); + underTest.applyFeeAmount(feeType, pcsCase.getEnforcementOrder()::setWarrantFeeAmount); // Then verify(feeService).getFee(feeType); @@ -93,10 +86,8 @@ void shouldSetUnableToRetrieveWhenFeeServiceReturnsNull() { when(feeService.getFee(feeType)).thenReturn(feeDetails); - BiConsumer setter = PCSCase::setFeeAmount; - // When - underTest.applyFeeAmount(pcsCase, feeType, setter); + underTest.applyFeeAmount(pcsCase, feeType); // Then verify(feeService).getFee(feeType); From caa22c4d19f538831bbbd8720694118fc19ee3ba Mon Sep 17 00:00:00 2001 From: Alex McAusland Date: Thu, 19 Mar 2026 15:11:31 +0000 Subject: [PATCH 4/7] use new test helper --- .../reform/pcs/CreatePossessionClaimTest.java | 56 ++++++++----------- .../pcs/ccd/event/CreatePossessionClaim.java | 12 ++-- .../ccd/event/CreatePossessionClaimTest.java | 3 + 3 files changed, 32 insertions(+), 39 deletions(-) diff --git a/src/cftlibTest/java/uk/gov/hmcts/reform/pcs/CreatePossessionClaimTest.java b/src/cftlibTest/java/uk/gov/hmcts/reform/pcs/CreatePossessionClaimTest.java index fcfd2a97e9..2dbdba9426 100644 --- a/src/cftlibTest/java/uk/gov/hmcts/reform/pcs/CreatePossessionClaimTest.java +++ b/src/cftlibTest/java/uk/gov/hmcts/reform/pcs/CreatePossessionClaimTest.java @@ -11,6 +11,8 @@ import org.junit.jupiter.api.TestMethodOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import uk.gov.hmcts.ccd.sdk.CcdEventTestClient; +import uk.gov.hmcts.ccd.sdk.type.AddressUK; import uk.gov.hmcts.ccd.sdk.type.ListValue; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.ccd.client.CoreCaseDataApi; @@ -29,15 +31,15 @@ import uk.gov.hmcts.reform.pcs.ccd.domain.TenancyLicenceDetails; import uk.gov.hmcts.reform.pcs.ccd.domain.TenancyLicenceType; import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo; +import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; import uk.gov.hmcts.reform.pcs.ccd.event.EventId; import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry; import uk.gov.hmcts.rse.ccd.lib.test.CftlibTest; import java.util.List; -import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; -import static uk.gov.hmcts.reform.pcs.ccd.event.EventId.createPossessionClaim; +import static uk.gov.hmcts.reform.pcs.ccd.event.CreatePossessionClaim.EVENT; import static uk.gov.hmcts.reform.pcs.ccd.event.EventId.resumePossessionClaim; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) @@ -54,6 +56,9 @@ class CreatePossessionClaimTest extends CftlibTest { @Autowired private ObjectMapper objectMapper; + @Autowired + private CcdEventTestClient ccdEventTestClient; + private String idamToken; private String s2sToken; private Long caseReference; @@ -67,19 +72,24 @@ void setup() { @Test @Order(1) void createPossessionClaim() { - Map caseData = Map.of( - "cpcpropertyAddress", - Map.of( - "AddressLine1", "123 Baker Street", - "AddressLine2", "Marylebone", - "PostTown", "London", - "County", "Greater London", - "PostCode", "NW1 6XE" - ), - "cpclegislativeCountry", LegislativeCountry.ENGLAND.getLabel() - ); + CreateClaimData caseData = CreateClaimData.builder() + .propertyAddress(AddressUK.builder() + .addressLine1("123 Baker Street") + .addressLine2("Marylebone") + .postTown("London") + .county("Greater London") + .postCode("NW1 6XE") + .build()) + .legislativeCountry(LegislativeCountry.ENGLAND) + .build(); - CaseDetails caseDetails = startAndSubmitCreationEvent(createPossessionClaim, caseData); + CaseDetails caseDetails = ccdEventTestClient.startAndSubmitCreateEvent( + idamToken, + s2sToken, + CaseType.getCaseType(), + EVENT, + caseData + ); caseReference = caseDetails.getId(); assertThat(caseReference).isNotNull(); @@ -125,24 +135,6 @@ void resumePossessionClaim() { assertThat(retrievedCase.getState()).isEqualTo(State.PENDING_CASE_ISSUED.name()); } - @SuppressWarnings("SameParameterValue") - private CaseDetails startAndSubmitCreationEvent(EventId eventId, Object caseData) { - StartEventResponse startEventResponse = ccdApi.startCase( - idamToken, - s2sToken, - CaseType.getCaseType(), - eventId.name() - ); - - CaseDataContent content = CaseDataContent.builder() - .data(caseData) - .event(Event.builder().id(eventId.name()).build()) - .eventToken(startEventResponse.getToken()) - .build(); - - return ccdApi.submitCaseCreation(idamToken, s2sToken, CaseType.getCaseType(), content); - } - @SuppressWarnings("SameParameterValue") private CaseResource startAndSubmitUpdateEvent(EventId eventId, PCSCase caseData) { StartEventResponse startEventResponse = ccdApi.startEvent( diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java index 97732b544b..5a45660ea5 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java @@ -5,6 +5,7 @@ import org.springframework.stereotype.Component; import uk.gov.hmcts.ccd.sdk.api.CCDConfig; import uk.gov.hmcts.ccd.sdk.api.DecentralisedConfigBuilder; +import uk.gov.hmcts.ccd.sdk.api.DtoEventRef; import uk.gov.hmcts.ccd.sdk.api.Event.EventBuilder; import uk.gov.hmcts.ccd.sdk.api.EventPayload; import uk.gov.hmcts.ccd.sdk.api.Permission; @@ -30,6 +31,9 @@ @AllArgsConstructor public class CreatePossessionClaim implements CCDConfig { + public static final DtoEventRef EVENT = + DtoEventRef.of(createPossessionClaim.name(), "cpc", CreateClaimData.class); + private final PcsCaseService pcsCaseService; private final FeeApplier feeApplier; private final EnterPropertyAddress enterPropertyAddress; @@ -40,13 +44,7 @@ public class CreatePossessionClaim implements CCDConfig configBuilder) { EventBuilder eventBuilder = configBuilder - .decentralisedEvent( - createPossessionClaim.name(), - CreateClaimData.class, - "cpc", - this::submit, - this::start - ) + .decentralisedEvent(EVENT, this::submit, this::start) .initialState(State.AWAITING_SUBMISSION_TO_HMCTS) .showSummary() .name("Make a claim") diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java index 214d4fcd66..13bd4da8bc 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java @@ -69,6 +69,9 @@ void shouldUpdateCaseOnSubmit() { @Test void shouldConfigureEventFieldPrefix() { + assertThat(CreatePossessionClaim.EVENT.id()).isEqualTo(configuredEvent.getId()); + assertThat(CreatePossessionClaim.EVENT.fieldPrefix()).isEqualTo("cpc"); + assertThat(CreatePossessionClaim.EVENT.dtoClass()).isEqualTo(CreateClaimData.class); assertThat(configuredEvent.getFieldPrefix()).isEqualTo("cpc"); assertThat(configuredEvent.getEventFieldPrefix()).isEqualTo("cpc"); } From aa1030239e6cc0a26a8cbd0ceefc22e286985c85 Mon Sep 17 00:00:00 2001 From: Alex McAusland Date: Thu, 19 Mar 2026 15:37:06 +0000 Subject: [PATCH 5/7] tidy --- build.gradle | 5 + .../reform/pcs/ccd/event/BaseEventTest.java | 14 -- .../ccd/event/CreatePossessionClaimTest.java | 180 ------------------ 3 files changed, 5 insertions(+), 194 deletions(-) delete mode 100644 src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java diff --git a/build.gradle b/build.gradle index 296a89c902..fcf1564858 100644 --- a/build.gradle +++ b/build.gradle @@ -95,6 +95,11 @@ ccd { configDir = file('build/definitions') decentralised = true runtimeIndexing = !integrationBuild + tsBindings { + enabled = true + outputDir.set(layout.projectDirectory.dir('../pcs-frontend/src/main/generated/ccd')) + moduleName = 'pcs' + } } tasks.withType(JavaCompile).configureEach { diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/BaseEventTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/BaseEventTest.java index c0bdde956d..576ddca16d 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/BaseEventTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/BaseEventTest.java @@ -40,20 +40,6 @@ protected SubmitResponse callSubmitHandler(PCSCase caseData) { return submitHandler.submit(eventPayload); } - @SuppressWarnings({"unchecked", "rawtypes"}) - protected D callDtoStartHandler(D caseData) { - EventPayload eventPayload = new EventPayload<>(TEST_CASE_REFERENCE, caseData, null); - Start startHandler = getConfiguredEvent().getStartHandler(); - return (D) startHandler.start(eventPayload); - } - - @SuppressWarnings({"unchecked", "rawtypes"}) - protected void callDtoSubmitHandler(D caseData) { - EventPayload eventPayload = new EventPayload<>(TEST_CASE_REFERENCE, caseData, null); - Submit submitHandler = getConfiguredEvent().getSubmitHandler(); - submitHandler.submit(eventPayload); - } - private ResolvedCCDConfig buildEventConfig( CCDConfig eventConfig) { diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java deleted file mode 100644 index 13bd4da8bc..0000000000 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaimTest.java +++ /dev/null @@ -1,180 +0,0 @@ -package uk.gov.hmcts.reform.pcs.ccd.event; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import uk.gov.hmcts.ccd.sdk.type.AddressUK; -import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; -import uk.gov.hmcts.reform.pcs.ccd.page.createpossessionclaim.CrossBorderPostcodeSelection; -import uk.gov.hmcts.reform.pcs.ccd.page.createpossessionclaim.EnterPropertyAddress; -import uk.gov.hmcts.reform.pcs.ccd.page.createpossessionclaim.PropertyNotEligible; -import uk.gov.hmcts.reform.pcs.ccd.service.PcsCaseService; -import uk.gov.hmcts.reform.pcs.ccd.util.FeeApplier; -import uk.gov.hmcts.reform.pcs.ccd.util.MoneyFormatter; -import uk.gov.hmcts.reform.pcs.feesandpay.model.FeeDetails; -import uk.gov.hmcts.reform.pcs.feesandpay.model.FeeType; -import uk.gov.hmcts.reform.pcs.feesandpay.service.FeeService; -import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry; - -import java.math.BigDecimal; -import java.lang.reflect.Field; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -@ExtendWith(MockitoExtension.class) -class CreatePossessionClaimTest extends BaseEventTest { - - @Mock - private PcsCaseService pcsCaseService; - @Mock - private FeeService feeService; - @Mock - private EnterPropertyAddress enterPropertyAddress; - @Mock - private CrossBorderPostcodeSelection crossBorderPostcodeSelection; - @Mock - private PropertyNotEligible propertyNotEligible; - - @BeforeEach - void setUp() { - CreatePossessionClaim underTest = new CreatePossessionClaim( - pcsCaseService, - new FeeApplier(feeService, new MoneyFormatter()), - enterPropertyAddress, - crossBorderPostcodeSelection, - propertyNotEligible - ); - setEventUnderTest(underTest); - } - - @Test - void shouldUpdateCaseOnSubmit() { - AddressUK propertyAddress = mock(AddressUK.class); - LegislativeCountry legislativeCountry = LegislativeCountry.ENGLAND; - - CreateClaimData caseData = CreateClaimData.builder() - .propertyAddress(propertyAddress) - .legislativeCountry(legislativeCountry) - .build(); - - callDtoSubmitHandler(caseData); - - verify(pcsCaseService).createCase(TEST_CASE_REFERENCE, propertyAddress, legislativeCountry); - } - - @Test - void shouldConfigureEventFieldPrefix() { - assertThat(CreatePossessionClaim.EVENT.id()).isEqualTo(configuredEvent.getId()); - assertThat(CreatePossessionClaim.EVENT.fieldPrefix()).isEqualTo("cpc"); - assertThat(CreatePossessionClaim.EVENT.dtoClass()).isEqualTo(CreateClaimData.class); - assertThat(configuredEvent.getFieldPrefix()).isEqualTo("cpc"); - assertThat(configuredEvent.getEventFieldPrefix()).isEqualTo("cpc"); - } - - @Test - void shouldKeepGeneratedFieldIdsWithinCcdLimit() { - assertThat(configuredEvent.getFields().getFields()) - .allSatisfy(field -> assertThat(getFieldBuilderId(field)).hasSizeLessThanOrEqualTo(70)); - } - - @Test - void shouldSetFeeAmountOnStart() { - CreateClaimData caseData = CreateClaimData.builder().build(); - when(feeService.getFee(FeeType.CASE_ISSUE_FEE)).thenReturn( - FeeDetails.builder() - .feeAmount(new BigDecimal("404.00")) - .build() - ); - - CreateClaimData result = callDtoStartHandler(caseData); - - assertThat(result.getFeeAmount()).isEqualTo("£404"); - verify(feeService).getFee(FeeType.CASE_ISSUE_FEE); - } - - @Test - void shouldHandleFeeWithDecimalPlaces() { - CreateClaimData caseData = CreateClaimData.builder().build(); - when(feeService.getFee(FeeType.CASE_ISSUE_FEE)).thenReturn( - FeeDetails.builder() - .feeAmount(new BigDecimal("123.45")) - .build() - ); - - CreateClaimData result = callDtoStartHandler(caseData); - - assertThat(result.getFeeAmount()).isEqualTo("£123.45"); - verify(feeService).getFee(FeeType.CASE_ISSUE_FEE); - } - - @Test - void shouldHandleZeroFeeAmount() { - CreateClaimData caseData = CreateClaimData.builder().build(); - when(feeService.getFee(FeeType.CASE_ISSUE_FEE)).thenReturn( - FeeDetails.builder() - .feeAmount(BigDecimal.ZERO) - .build() - ); - - CreateClaimData result = callDtoStartHandler(caseData); - - assertThat(result.getFeeAmount()).isEqualTo("£0"); - verify(feeService).getFee(FeeType.CASE_ISSUE_FEE); - } - - @Test - void shouldHandleNullFeeAmount() { - CreateClaimData caseData = CreateClaimData.builder().build(); - when(feeService.getFee(FeeType.CASE_ISSUE_FEE)).thenReturn( - FeeDetails.builder() - .feeAmount(null) - .build() - ); - - CreateClaimData result = callDtoStartHandler(caseData); - - assertThat(result.getFeeAmount()).isEqualTo("Unable to retrieve"); - verify(feeService).getFee(FeeType.CASE_ISSUE_FEE); - } - - @Test - void shouldSetDefaultFeeWhenFeeServiceFails() { - CreateClaimData caseData = CreateClaimData.builder().build(); - - when(feeService.getFee(FeeType.CASE_ISSUE_FEE)) - .thenThrow(new RuntimeException("Fee not found")); - - CreateClaimData result = callDtoStartHandler(caseData); - - assertThat(result.getFeeAmount()).isEqualTo("Unable to retrieve"); - verify(feeService).getFee(FeeType.CASE_ISSUE_FEE); - } - - @Test - void shouldSetDefaultFeeWhenFeeServiceThrowsRuntimeException() { - CreateClaimData caseData = CreateClaimData.builder().build(); - - when(feeService.getFee(FeeType.CASE_ISSUE_FEE)) - .thenThrow(new RuntimeException("API unavailable")); - - CreateClaimData result = callDtoStartHandler(caseData); - - assertThat(result.getFeeAmount()).isEqualTo("Unable to retrieve"); - verify(feeService).getFee(FeeType.CASE_ISSUE_FEE); - } - - private String getFieldBuilderId(Object fieldBuilder) { - try { - Field idField = fieldBuilder.getClass().getDeclaredField("id"); - idField.setAccessible(true); - return (String) idField.get(fieldBuilder); - } catch (ReflectiveOperationException e) { - throw new AssertionError("Unable to read field builder id", e); - } - } -} From 80794a6152da74bee338b2fc64b5376d06c276b9 Mon Sep 17 00:00:00 2001 From: Alex McAusland Date: Thu, 19 Mar 2026 20:01:12 +0000 Subject: [PATCH 6/7] trim --- .../gov/hmcts/reform/pcs/ccd/domain/PCSCase.java | 3 +-- .../hmcts/reform/pcs/ccd/dto/CreateClaimData.java | 3 +-- .../pcs/ccd/event/CreatePossessionClaim.java | 14 ++++++++------ .../gov/hmcts/reform/pcs/ccd/util/FeeApplier.java | 4 ---- .../hmcts/reform/pcs/ccd/util/HasFeeAmount.java | 6 ------ .../hmcts/reform/pcs/ccd/page/BasePageTest.java | 12 ++++++------ .../CrossBorderPostcodeSelectionTest.java | 5 +---- .../EnterPropertyAddressTest.java | 5 +++-- .../PostcodeNotAssignedToCourtTest.java | 2 +- .../hmcts/reform/pcs/ccd/util/FeeApplierTest.java | 2 +- 10 files changed, 22 insertions(+), 34 deletions(-) delete mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/HasFeeAmount.java 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 d89b51b087..d9a4598fcf 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 @@ -37,7 +37,6 @@ import uk.gov.hmcts.reform.pcs.ccd.domain.wales.PeriodicContractTermsWales; import uk.gov.hmcts.reform.pcs.ccd.domain.wales.SecureContractGroundsForPossessionWales; import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringList; -import uk.gov.hmcts.reform.pcs.ccd.util.HasFeeAmount; import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry; import java.util.List; @@ -53,7 +52,7 @@ */ @Builder(toBuilder = true) @Data -public class PCSCase implements HasFeeAmount { +public class PCSCase { // Field label constants - shared between domain annotations and validation public static final String NOTICE_EMAIL_EXPLANATION_LABEL = "Explain how it was served by email"; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java index 66fe16b797..083f67d4eb 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java @@ -9,14 +9,13 @@ import uk.gov.hmcts.ccd.sdk.type.FieldType; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringList; -import uk.gov.hmcts.reform.pcs.ccd.util.HasFeeAmount; import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry; @Data @Builder @NoArgsConstructor @AllArgsConstructor -public class CreateClaimData implements HasFeeAmount { +public class CreateClaimData { private AddressUK propertyAddress; private LegislativeCountry legislativeCountry; private String feeAmount; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java index 5a45660ea5..2990d26319 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/CreatePossessionClaim.java @@ -4,8 +4,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import uk.gov.hmcts.ccd.sdk.api.CCDConfig; +import uk.gov.hmcts.ccd.sdk.api.CcdEventBinding; import uk.gov.hmcts.ccd.sdk.api.DecentralisedConfigBuilder; -import uk.gov.hmcts.ccd.sdk.api.DtoEventRef; import uk.gov.hmcts.ccd.sdk.api.Event.EventBuilder; import uk.gov.hmcts.ccd.sdk.api.EventPayload; import uk.gov.hmcts.ccd.sdk.api.Permission; @@ -23,6 +23,8 @@ import uk.gov.hmcts.reform.pcs.ccd.util.FeeApplier; import uk.gov.hmcts.reform.pcs.feesandpay.model.FeeType; +import java.util.function.Consumer; + import static uk.gov.hmcts.reform.pcs.ccd.event.EventId.createPossessionClaim; @@ -31,8 +33,8 @@ @AllArgsConstructor public class CreatePossessionClaim implements CCDConfig { - public static final DtoEventRef EVENT = - DtoEventRef.of(createPossessionClaim.name(), "cpc", CreateClaimData.class); + public static final CcdEventBinding EVENT = + CcdEventBinding.of(createPossessionClaim.name(), "cpc", CreateClaimData.class); private final PcsCaseService pcsCaseService; private final FeeApplier feeApplier; @@ -60,12 +62,12 @@ public void configureDecentralised(DecentralisedConfigBuilder eventPayload) { CreateClaimData caseData = eventPayload.caseData(); - applyCaseIssueFeeAmount(caseData); + applyCaseIssueFeeAmount(caseData::setFeeAmount); return caseData; } - private void applyCaseIssueFeeAmount(CreateClaimData pcsCase) { - feeApplier.applyFeeAmount(pcsCase, FeeType.CASE_ISSUE_FEE); + private void applyCaseIssueFeeAmount(Consumer setter) { + feeApplier.applyFeeAmount(FeeType.CASE_ISSUE_FEE, setter); } private SubmitResponse submit(EventPayload eventPayload) { diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplier.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplier.java index 3a2b57b618..8d20387a28 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplier.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplier.java @@ -19,10 +19,6 @@ public class FeeApplier { private final FeeService feeService; private final MoneyFormatter moneyFormatter; - public void applyFeeAmount(HasFeeAmount target, FeeType feeType) { - applyFeeAmount(feeType, target::setFeeAmount); - } - public void applyFeeAmount(FeeType feeType, Consumer setter) { try { BigDecimal feeAmount = feeService.getFee(feeType).getFeeAmount(); diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/HasFeeAmount.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/HasFeeAmount.java deleted file mode 100644 index a57e101805..0000000000 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/util/HasFeeAmount.java +++ /dev/null @@ -1,6 +0,0 @@ -package uk.gov.hmcts.reform.pcs.ccd.util; - -public interface HasFeeAmount { - - void setFeeAmount(String feeAmount); -} diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/BasePageTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/BasePageTest.java index a7b80b04b3..d05e5efb46 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/BasePageTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/BasePageTest.java @@ -31,11 +31,10 @@ protected void setPageUnderTest(CcdPageConfiguration pageUnderTest) { event = buildPageInTestEvent(pageUnderTest); } - @SuppressWarnings({"unchecked", "rawtypes"}) protected void setDtoPageUnderTest(Class dtoClass, Consumer> pageSetup) { ConfigBuilderImpl configBuilder = createConfigBuilder(); - Event.EventBuilder eventBuilder = (Event.EventBuilder) configBuilder + Event.EventBuilder eventBuilder = configBuilder .decentralisedEvent(TEST_EVENT_ID, dtoClass, TEST_FIELD_PREFIX, null) .forAllStates(); pageSetup.accept(eventBuilder); @@ -53,14 +52,15 @@ protected AboutToStartOrSubmitResponse callMidEventHandler(PCSCa return getMidEventForPage().handle(caseDetails, null); } - @SuppressWarnings({"unchecked", "rawtypes"}) + @SuppressWarnings("unchecked") protected AboutToStartOrSubmitResponse callDtoMidEventHandler(D caseData) { - CaseDetails caseDetails = CaseDetails.builder() + CaseDetails caseDetails = CaseDetails.builder() .id(TEST_CASE_REFERENCE) .data(caseData) .build(); - return (AboutToStartOrSubmitResponse) getMidEventForPage().handle(caseDetails, null); + MidEvent midEvent = (MidEvent) getMidEventForPage(); + return midEvent.handle(caseDetails, null); } private Event buildPageInTestEvent(CcdPageConfiguration page) { @@ -92,7 +92,7 @@ private static Event.EventBuilder createEventBuilder( .forAllStates(); } - @SuppressWarnings({"unchecked", "rawtypes"}) + @SuppressWarnings("unchecked") private MidEvent getMidEventForPage() { Collection midEventHandlers = getEvent().getFields().getPagesToMidEvent().values(); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/CrossBorderPostcodeSelectionTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/CrossBorderPostcodeSelectionTest.java index 68714ba6f2..44f41b1f29 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/CrossBorderPostcodeSelectionTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/CrossBorderPostcodeSelectionTest.java @@ -13,8 +13,8 @@ import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; import uk.gov.hmcts.ccd.sdk.type.AddressUK; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; -import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; import uk.gov.hmcts.reform.pcs.ccd.domain.State; +import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; import uk.gov.hmcts.reform.pcs.ccd.page.BasePageTest; import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringList; import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringListElement; @@ -152,7 +152,6 @@ private static DynamicStringList createCountryListWithSelectedValue(LegislativeC @Test @DisplayName("Should not show Property Not Eligible page if property is eligible") void shouldNotShowNotEligibleOrNotAssignedPagesIfPropertyIsEligible() { - // Given: page visible (from MakeAClaim), PNE hidden var caseData = buildCrossBorderCaseWithFlags(LegislativeCountry.WALES); @@ -177,7 +176,6 @@ void shouldNotShowNotEligibleOrNotAssignedPagesIfPropertyIsEligible() { @DisplayName("NOT_ELIGIBLE shows PropertyNotEligible and keeps cross-border page visible") void shouldShowPropertyNotEligiblePageWhenCrossBorderPropertyIsNotEligible( LegislativeCountry selectedCountry) { - // Given: page visible (from MakeAClaim), PNE hidden var caseData = buildCrossBorderCaseWithFlags( selectedCountry @@ -223,5 +221,4 @@ private CreateClaimData buildCrossBorderCaseWithFlags(LegislativeCountry selecte .showCrossBorderPage(YesOrNo.YES) .build(); } - } diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/EnterPropertyAddressTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/EnterPropertyAddressTest.java index a3ae7cc7db..788585a428 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/EnterPropertyAddressTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/EnterPropertyAddressTest.java @@ -12,8 +12,8 @@ import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; import uk.gov.hmcts.ccd.sdk.type.AddressUK; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; -import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; import uk.gov.hmcts.reform.pcs.ccd.domain.State; +import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; import uk.gov.hmcts.reform.pcs.ccd.page.BasePageTest; import uk.gov.hmcts.reform.pcs.ccd.service.AddressValidator; import uk.gov.hmcts.reform.pcs.postcodecourt.exception.EligibilityCheckException; @@ -111,6 +111,7 @@ void shouldHandlePostcodeEligibilityCheck( // When AboutToStartOrSubmitResponse response = callDtoMidEventHandler(caseData); + // Then CreateClaimData resultData = response.getData(); assertThat(resultData.getShowCrossBorderPage()).isEqualTo(expectedShowCrossBorder); @@ -220,7 +221,7 @@ void shouldReturnValidationErrorsWhenAddressInvalid() { AboutToStartOrSubmitResponse response = callDtoMidEventHandler(caseData); // Then - assertThat(response.getErrorMessageOverride()).isEqualTo("error 1\nerror 2"); + assertThat(response.getErrors()).containsExactly("error 1", "error 2"); } private static Stream invalidLegislativeCountryScenarios() { diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PostcodeNotAssignedToCourtTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PostcodeNotAssignedToCourtTest.java index 43996324eb..6f3ffb717e 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PostcodeNotAssignedToCourtTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/createpossessionclaim/PostcodeNotAssignedToCourtTest.java @@ -12,8 +12,8 @@ import uk.gov.hmcts.ccd.sdk.api.Event.EventBuilder; import uk.gov.hmcts.ccd.sdk.api.FieldCollection.FieldCollectionBuilder; import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.UserRole; -import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; import uk.gov.hmcts.reform.pcs.ccd.domain.State; +import uk.gov.hmcts.reform.pcs.ccd.dto.CreateClaimData; import java.util.stream.Stream; diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplierTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplierTest.java index 3377d6bba7..43889373b2 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplierTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/util/FeeApplierTest.java @@ -87,7 +87,7 @@ void shouldSetUnableToRetrieveWhenFeeServiceReturnsNull() { when(feeService.getFee(feeType)).thenReturn(feeDetails); // When - underTest.applyFeeAmount(pcsCase, feeType); + underTest.applyFeeAmount(feeType, pcsCase::setFeeAmount); // Then verify(feeService).getFee(feeType); From 197bff5b2271dc2cae6af2e77e90691cc6321d2d Mon Sep 17 00:00:00 2001 From: Alex McAusland Date: Wed, 25 Mar 2026 13:34:27 +0000 Subject: [PATCH 7/7] Ignore duplicate DTO propertyAddress case field --- .../java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java index 083f67d4eb..22c6d45e19 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/dto/CreateClaimData.java @@ -16,6 +16,7 @@ @NoArgsConstructor @AllArgsConstructor public class CreateClaimData { + @CCD(ignore = true) private AddressUK propertyAddress; private LegislativeCountry legislativeCountry; private String feeAmount;