diff --git a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelper.java b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelper.java index 2d144399f..f72d98a4c 100644 --- a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelper.java +++ b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelper.java @@ -4,6 +4,7 @@ import static java.lang.System.lineSeparator; import static java.util.UUID.fromString; import static java.util.stream.Collectors.joining; +import static org.apache.commons.lang3.StringUtils.isNotBlank; import static uk.gov.justice.core.courts.JudicialResult.judicialResult; import uk.gov.justice.core.courts.JudicialResult; @@ -96,14 +97,19 @@ public static JudicialResultPrompt.Builder populatePromptDefinitionAttributesBas .stream() .filter(prompt -> prompt.getString("id").equals(jsPrompt.getId().toString())) .filter(prompt -> prompt.containsKey(DURATION)) - .filter(prompt -> duration.equals(prompt.getString(DURATION)) - ||duration.toUpperCase().contains(prompt.getString(DURATION).toUpperCase()) - || prompt.getString(DURATION).toUpperCase().contains(duration.toUpperCase())) + .filter(prompt -> isNotBlank(prompt.getString(DURATION)) && isNotBlank(duration)) + .filter(prompt -> isDurationStringMatchesPromptValue(duration, prompt)) .findFirst(); return populatePrompt(jsPrompt, promptJson); } + private static boolean isDurationStringMatchesPromptValue(final String duration, final JsonObject prompt) { + final String alphaOnlyPattern = "[^a-zA-Z]"; + final String promptValue = prompt.getString(DURATION).replaceAll(alphaOnlyPattern, ""); + return duration.equals(promptValue) || duration.toUpperCase().contains(promptValue.toUpperCase()) || promptValue.toUpperCase().contains(duration.toUpperCase()); + } + @SuppressWarnings("squid:S00112") private static JudicialResultPrompt.Builder populatePrompt(final JPrompt jsPrompt, final Optional promptJson) { diff --git a/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelperTest.java b/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelperTest.java index 4a109c5da..2b484c286 100644 --- a/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelperTest.java +++ b/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelperTest.java @@ -13,6 +13,7 @@ import java.util.HashMap; import java.util.UUID; +import javax.json.Json; import javax.json.JsonObject; import org.junit.jupiter.api.BeforeEach; @@ -33,7 +34,7 @@ public void setUp() { @Test public void shouldPopulatePromptDefinitionAttributesForYearsDuration() { final JudicialResultPrompt.Builder builder = JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( - DDP_DISQUALIFICATION_PERIOD, resultDefinition, "Year(s)"); + DDP_DISQUALIFICATION_PERIOD, resultDefinition, "Years"); final JudicialResultPrompt prompt = builder.build(); @@ -51,7 +52,7 @@ public void shouldPopulatePromptDefinitionAttributesForYearsDuration() { @Test public void shouldPopulatePromptDefinitionAttributesForMonthsDuration() { final JudicialResultPrompt.Builder builder = JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( - DDP_DISQUALIFICATION_PERIOD, resultDefinition, "MONTH"); + DDP_DISQUALIFICATION_PERIOD, resultDefinition, "Months"); final JudicialResultPrompt prompt = builder.build(); @@ -69,7 +70,7 @@ public void shouldPopulatePromptDefinitionAttributesForMonthsDuration() { @Test public void shouldPopulatePromptDefinitionAttributesForDaysDuration() { final JudicialResultPrompt.Builder builder = JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( - DDP_DISQUALIFICATION_PERIOD, resultDefinition, "Day(s)"); + DDP_DISQUALIFICATION_PERIOD, resultDefinition, "Days"); final JudicialResultPrompt prompt = builder.build(); @@ -84,10 +85,78 @@ public void shouldPopulatePromptDefinitionAttributesForDaysDuration() { assertThat(prompt.getIsFinancialImposition(), is(false)); } + @Test + public void shouldPopulatePromptDefinitionAttributesWhenDurationDiffersOnlyByCase() { + final JudicialResultPrompt.Builder builder = JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( + DDP_DISQUALIFICATION_PERIOD, resultDefinition, "months"); + + final JudicialResultPrompt prompt = builder.build(); + + assertThat(prompt.getJudicialResultPromptTypeId(), is(DISQUALIFICATION_PERIOD_PROMPT_ID)); + assertThat(prompt.getPromptReference(), is("disqualificationPeriod")); + } + + @Test + public void shouldPopulatePromptDefinitionAttributesWhenDurationIsSingularFormOfPromptValue() { + final JudicialResultPrompt.Builder builder = JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( + DDP_DISQUALIFICATION_PERIOD, resultDefinition, "Year"); + + final JudicialResultPrompt prompt = builder.build(); + + assertThat(prompt.getJudicialResultPromptTypeId(), is(DISQUALIFICATION_PERIOD_PROMPT_ID)); + assertThat(prompt.getPromptReference(), is("disqualificationPeriod")); + } + + @Test + public void shouldPopulatePromptDefinitionAttributesWhenPromptValueIsSubstringOfDuration() { + final JudicialResultPrompt.Builder builder = JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( + DDP_DISQUALIFICATION_PERIOD, resultDefinition, "CalendarDays"); + + final JudicialResultPrompt prompt = builder.build(); + + assertThat(prompt.getJudicialResultPromptTypeId(), is(DISQUALIFICATION_PERIOD_PROMPT_ID)); + assertThat(prompt.getPromptReference(), is("disqualificationPeriod")); + } + @Test public void shouldThrowRuntimeExceptionWhenPromptNotFoundForDuration() { assertThrows(RuntimeException.class, () -> JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( - JPrompt.AMOUNT_OF_FINE, resultDefinition, "Year(s)")); + JPrompt.AMOUNT_OF_FINE, resultDefinition, "Years")); + } + + @Test + public void shouldThrowRuntimeExceptionWhenDurationDoesNotMatchAnyPromptValue() { + assertThrows(RuntimeException.class, () -> + JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( + DDP_DISQUALIFICATION_PERIOD, resultDefinition, "Weeks")); + } + + @Test + public void shouldThrowRuntimeExceptionWhenDurationIsBlank() { + assertThrows(RuntimeException.class, () -> + JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( + DDP_DISQUALIFICATION_PERIOD, resultDefinition, "")); + } + + @Test + public void shouldThrowRuntimeExceptionWhenDurationIsNull() { + assertThrows(RuntimeException.class, () -> + JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( + DDP_DISQUALIFICATION_PERIOD, resultDefinition, null)); + } + + @Test + public void shouldThrowRuntimeExceptionWhenMatchingPromptHasBlankDurationValue() { + final JsonObject resultDefinitionWithBlankDuration = Json.createObjectBuilder() + .add("prompts", Json.createArrayBuilder() + .add(Json.createObjectBuilder() + .add("id", DISQUALIFICATION_PERIOD_PROMPT_ID.toString()) + .add("duration", ""))) + .build(); + + assertThrows(RuntimeException.class, () -> + JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( + DDP_DISQUALIFICATION_PERIOD, resultDefinitionWithBlankDuration, "Years")); } -} +} \ No newline at end of file