diff --git a/sjp-domain/sjp-domain-event/src/main/java/uk/gov/moj/cpp/sjp/event/transparency/PressTransparencyReportRequested.java b/sjp-domain/sjp-domain-event/src/main/java/uk/gov/moj/cpp/sjp/event/transparency/PressTransparencyReportRequested.java deleted file mode 100644 index 510abceabf..0000000000 --- a/sjp-domain/sjp-domain-event/src/main/java/uk/gov/moj/cpp/sjp/event/transparency/PressTransparencyReportRequested.java +++ /dev/null @@ -1,51 +0,0 @@ -package uk.gov.moj.cpp.sjp.event.transparency; - -import static java.util.UUID.randomUUID; - -import uk.gov.justice.domain.annotation.Event; - -import java.time.ZonedDateTime; -import java.util.UUID; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - -/** - * Event to indicate that the generation of a press transparency report has requested. Use either the JSON or PDF report generation requested events instead. - * - * @deprecated - */ -@Deprecated(forRemoval = true) -@Event(PressTransparencyReportRequested.EVENT_NAME) -@SuppressWarnings("squid:S1133") -public class PressTransparencyReportRequested { - public static final String EVENT_NAME = "sjp.events.press-transparency-report-requested"; - - private UUID pressTransparencyReportId = randomUUID(); - private ZonedDateTime requestedAt; - - @JsonCreator - public PressTransparencyReportRequested( - @JsonProperty("pressTransparencyReportId") final UUID reportId, - @JsonProperty("requestedAt") final ZonedDateTime requestedAt) { - if (reportId != null) { - this.pressTransparencyReportId = reportId; - } - this.requestedAt = requestedAt; - } - - public UUID getPressTransparencyReportId() { - return pressTransparencyReportId; - } - - public ZonedDateTime getRequestedAt() { - return requestedAt; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); - } -} diff --git a/sjp-domain/sjp-domain-event/src/main/java/uk/gov/moj/cpp/sjp/event/transparency/TransparencyReportRequested.java b/sjp-domain/sjp-domain-event/src/main/java/uk/gov/moj/cpp/sjp/event/transparency/TransparencyReportRequested.java deleted file mode 100644 index ddbc8eb156..0000000000 --- a/sjp-domain/sjp-domain-event/src/main/java/uk/gov/moj/cpp/sjp/event/transparency/TransparencyReportRequested.java +++ /dev/null @@ -1,57 +0,0 @@ -package uk.gov.moj.cpp.sjp.event.transparency; - -import static java.util.UUID.randomUUID; - -import uk.gov.justice.domain.annotation.Event; - -import java.time.ZonedDateTime; -import java.util.UUID; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - -/** - * Event to indicate that the generation of a press transparency report has requested. - * Use either the JSON or PDF report generation requested events instead. - * - * @deprecated - */ -@Deprecated(forRemoval = true) -@Event(TransparencyReportRequested.EVENT_NAME) -@SuppressWarnings("squid:S1133") -public class TransparencyReportRequested { - public static final String EVENT_NAME = "sjp.events.transparency-report-requested"; - - /** - * Default value assigned for event replay where old versions of this - * event don't have an id. - */ - private UUID transparencyReportId = randomUUID(); - - private ZonedDateTime requestedAt; - - @JsonCreator - public TransparencyReportRequested( - @JsonProperty("transparencyReportId") final UUID transparencyReportId, - @JsonProperty("requestedAt") final ZonedDateTime requestedAt) { - if (transparencyReportId != null) { - this.transparencyReportId = transparencyReportId; - } - this.requestedAt = requestedAt; - } - - public ZonedDateTime getRequestedAt() { - return requestedAt; - } - - public UUID getTransparencyReportId() { - return transparencyReportId; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); - } -} diff --git a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/PressTransparencyReportRequestedProcessor.java b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/PressTransparencyReportRequestedProcessor.java index 175cb2d0b6..6c1b79cbd9 100644 --- a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/PressTransparencyReportRequestedProcessor.java +++ b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/PressTransparencyReportRequestedProcessor.java @@ -34,15 +34,15 @@ import uk.gov.justice.services.messaging.JsonEnvelope; import uk.gov.justice.services.messaging.JsonObjects; import uk.gov.moj.cpp.sjp.domain.ListType; +import uk.gov.moj.cpp.sjp.event.processor.service.CourtListPublishingService; import uk.gov.moj.cpp.sjp.event.processor.service.ExportType; -import uk.gov.moj.cpp.sjp.event.processor.service.ReferenceDataOffencesService; -import uk.gov.moj.cpp.sjp.event.processor.service.ReferenceDataService; import uk.gov.moj.cpp.sjp.event.processor.service.SjpService; import uk.gov.moj.cpp.sjp.event.processor.utils.PayloadHelper; import uk.gov.moj.cpp.sjp.event.transparency.PressTransparencyJSONReportRequested; import uk.gov.moj.cpp.sjp.event.transparency.PressTransparencyPDFReportRequested; import java.io.ByteArrayInputStream; +import java.io.IOException; import java.time.LocalDate; import java.time.format.DateTimeParseException; import java.util.List; @@ -63,7 +63,9 @@ @ServiceComponent(EVENT_PROCESSOR) public class PressTransparencyReportRequestedProcessor { - public static final String PUBLIC_SJP_PRESS_TRANSPARENCY_REPORT_GENERATED = "public.sjp.press-transparency-report-generated"; + private static final String LIST_TYPE = "listType"; + private static final String SJP_PRESS_LIST = "SJP_PRESS_LIST"; + private static final String SJP_DELTA_PRESS_LIST = "SJP_DELTA_PRESS_LIST"; public static final String CASE_URN = "caseUrn"; public static final String FIRST_NAME = "firstName"; public static final String LAST_NAME = "lastName"; @@ -79,7 +81,6 @@ public class PressTransparencyReportRequestedProcessor { public static final String OFFENCES = "offences"; public static final String PROSECUTOR_NAME = "prosecutorName"; public static final String EMPTY = ""; - public static final String STRING_FORMAT_COMMA = " %s,"; public static final String STRING_FORMAT_COMMA_PREFIX = ", %s"; public static final String STRING_FORMAT = " %s"; public static final String SJP_OFFENCES = "sjpOffences"; @@ -103,14 +104,12 @@ public class PressTransparencyReportRequestedProcessor { @Inject private SjpService sjpService; @Inject - private ReferenceDataOffencesService referenceDataOffencesService; - @Inject - private ReferenceDataService referenceDataService; - @Inject private PayloadHelper payloadHelper; @Inject @FrameworkComponent(EVENT_PROCESSOR) private Sender sender; + @Inject + private CourtListPublishingService courtListPublishingService; private String getTemplateIdentifier(final String type, final String lang) { return "PressPendingCases" + type + lang; @@ -143,53 +142,45 @@ public void handlePressTransparencyPDFReportRequest(final JsonEnvelope envelope) public void handlePressTransparencyJSONReportRequest(final JsonEnvelope envelope) { payloadHelper.initCache(); - final List pendingCasesFromViewStore = getPendingCasesFromViewStore(envelope); final JsonObject eventPayload = envelope.payloadAsJsonObject(); final UUID reportId = fromString(eventPayload.getString(PRESS_TRANSPARENCY_REPORT_ID)); - final boolean isWelsh = WELSH.name().equalsIgnoreCase(eventPayload.getString(LANGUAGE)); - LOGGER.info("generating press transparency JSON report for press report {}", reportId); - sendPublicEvent(envelope, buildPayload(pendingCasesFromViewStore, true, envelope, isWelsh)); - } - - /** - * @deprecated with CCT-1587 now we are using two separate events for PDF and JSON report - * generation {@link PressTransparencyPDFReportRequested} and {@link - * PressTransparencyJSONReportRequested} - */ - @Deprecated(forRemoval = true) - @Handles("sjp.events.press-transparency-report-requested") - @Transactional - @SuppressWarnings({"squid:S00112", "squid:S1133"}) - public void handlePressTransparencyRequest(final JsonEnvelope envelope) { - payloadHelper.initCache(); + final String requestType = eventPayload.getString(REQUEST_TYPE); + final String language = eventPayload.getString(LANGUAGE); + LOGGER.info("handling press transparency JSON report request for press report {}, requestType {}, language {}", + reportId, requestType, language); final List pendingCasesFromViewStore = getPendingCasesFromViewStore(envelope); - final JsonObject eventPayload = envelope.payloadAsJsonObject(); - final UUID reportId = fromString(eventPayload.getString(PRESS_TRANSPARENCY_REPORT_ID)); - try { - final JsonObject payloadForDocumentGeneration = buildPayload(pendingCasesFromViewStore, false, envelope, false); - requestDocumentGeneration(envelope, reportId, payloadForDocumentGeneration); - sendPublicEvent(envelope, buildPayload(pendingCasesFromViewStore, true, envelope, false)); - storeReportMetadata(envelope, reportId, pendingCasesFromViewStore); - } catch (FileServiceException e) { - throw new RuntimeException("IO Exception happened during press transparency report generation", e); - } + LOGGER.info("fetched {} pending case(s) from view store for press report {}", pendingCasesFromViewStore.size(), reportId); + + final boolean isWelsh = WELSH.name().equalsIgnoreCase(language); + LOGGER.info("generating press transparency JSON report for press report {}", reportId); + publishCourtList(envelope, buildPayload(pendingCasesFromViewStore, true, envelope, isWelsh)); + LOGGER.info("completed handling press transparency JSON report request for press report {}", reportId); } - private void sendPublicEvent(final JsonEnvelope envelope, final JsonObject payloadForDocumentGeneration) { - LOGGER.info("publishing public event for sjp pending cases for public list in english"); + private void publishCourtList(final JsonEnvelope envelope, final JsonObject payloadForDocumentGeneration) { final String type = envelope.payloadAsJsonObject().getString(REQUEST_TYPE); final String language = envelope.payloadAsJsonObject().getString(LANGUAGE); - final JsonObjectBuilder pendingListEnglishBuilder = createObjectBuilder() + // FULL/DELTA is part of the CaTH list-type vocabulary, not a separate field: sending + // SJP_PRESS_LIST for delta content makes CaTH render it with the full-list template. + final String listType = FULL.name().equals(type) ? SJP_PRESS_LIST : SJP_DELTA_PRESS_LIST; + LOGGER.info("building sjp press court list publish request, listType {}, requestType {}, language {}", + listType, type, language); + final JsonObject courtListPublishRequest = createObjectBuilder() + .add(LIST_TYPE, listType) .add(LANGUAGE, language) .add(REQUEST_TYPE, type) - .add("listPayload", payloadForDocumentGeneration); - if (LOGGER.isInfoEnabled()) { - LOGGER.info("publishing Sjp public event for press report {}, {}", PUBLIC_SJP_PRESS_TRANSPARENCY_REPORT_GENERATED, payloadForDocumentGeneration); + .add("listPayload", payloadForDocumentGeneration) + .build(); + + LOGGER.info("publishing sjp press pending cases list to court list publishing service"); + try { + courtListPublishingService.publishCourtList(courtListPublishRequest.toString()); + LOGGER.info("publishing sjp press pending cases list to court list publishing service called successfully"); + } catch (IOException e) { + LOGGER.error("IO Exception happened while publishing sjp press court list", e); + throw new RuntimeException("IO Exception happened while publishing sjp press court list", e); } - sender.send(Envelope.envelopeFrom(metadataFrom(envelope.metadata()) - .withName(PUBLIC_SJP_PRESS_TRANSPARENCY_REPORT_GENERATED), - pendingListEnglishBuilder.build())); } private void storeReportMetadata(final JsonEnvelope envelope, @@ -427,7 +418,7 @@ private boolean hasDefendantDateOfBirth(final JsonObject pendingCase) { private Optional getPersonDefendantFullName(final JsonObject pendingCase) { if( JsonObjects.getString(pendingCase, FIRST_NAME).isPresent() || JsonObjects.getString(pendingCase, LAST_NAME).isPresent() ) { - return Optional.of((String) format("%s %s", pendingCase.getString(FIRST_NAME, ""), pendingCase.getString(LAST_NAME, "").toUpperCase())); + return Optional.of(format("%s %s", pendingCase.getString(FIRST_NAME, ""), pendingCase.getString(LAST_NAME, "").toUpperCase())); } return Optional.empty(); } diff --git a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/TransparencyReportRequestedProcessor.java b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/TransparencyReportRequestedProcessor.java index d78984bdea..2db0adf48b 100644 --- a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/TransparencyReportRequestedProcessor.java +++ b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/TransparencyReportRequestedProcessor.java @@ -31,16 +31,15 @@ import uk.gov.justice.services.messaging.JsonEnvelope; import uk.gov.justice.services.messaging.JsonObjects; import uk.gov.moj.cpp.sjp.domain.ListType; +import uk.gov.moj.cpp.sjp.event.processor.service.CourtListPublishingService; import uk.gov.moj.cpp.sjp.event.processor.service.ExportType; -import uk.gov.moj.cpp.sjp.event.processor.service.ReferenceDataOffencesService; -import uk.gov.moj.cpp.sjp.event.processor.service.ReferenceDataService; import uk.gov.moj.cpp.sjp.event.processor.service.SjpService; import uk.gov.moj.cpp.sjp.event.processor.utils.PayloadHelper; import uk.gov.moj.cpp.sjp.event.transparency.TransparencyJSONReportRequested; import uk.gov.moj.cpp.sjp.event.transparency.TransparencyPDFReportRequested; -import uk.gov.moj.cpp.sjp.event.transparency.TransparencyReportRequested; import java.io.ByteArrayInputStream; +import java.io.IOException; import java.time.LocalDate; import java.time.Period; import java.util.Comparator; @@ -67,7 +66,9 @@ public class TransparencyReportRequestedProcessor { private static final int DEFENDANT_IS_18 = 18; private static final String SJP_OFFENCES = "sjpOffences"; private static final String OFFENCES = "offences"; - private static final String PUBLIC_EVENT_SJP_PENDING_CASES_PUBLIC_LIST_GENERATED = "public.sjp.pending-cases-public-list-generated"; + private static final String LIST_TYPE = "listType"; + private static final String SJP_PUBLIC_LIST = "SJP_PUBLIC_LIST"; + private static final String SJP_DELTA_PUBLIC_LIST = "SJP_DELTA_PUBLIC_LIST"; public static final String DEFENDANT_NAME = "defendantName"; public static final String PROSECUTOR_NAME = "prosecutorName"; public static final String TITLE = "title"; @@ -88,12 +89,6 @@ public class TransparencyReportRequestedProcessor { @Inject private FileStorer fileStorer; - @Inject - private ReferenceDataService referenceDataService; - - @Inject - private ReferenceDataOffencesService referenceDataOffencesService; - @Inject private SjpService sjpService; @@ -104,6 +99,9 @@ public class TransparencyReportRequestedProcessor { @Inject private PayloadHelper payloadHelper; + @Inject + private CourtListPublishingService courtListPublishingService; + private String getTemplateIdentifier(final String type, final String lang) { return "PublicPendingCases" + type + lang; } @@ -140,67 +138,12 @@ public void createTransparencyJSONReport(final JsonEnvelope envelope) { final boolean isWelsh = WELSH.name().equalsIgnoreCase(eventPayload.getString(LANGUAGE)); LOGGER.info("generating public transparency JSON report {}", transparencyReportId); final List filteredCases = getFilteredCases(allPendingCasesFromViewStore); - sendPublicEvent(envelope, buildPayload(filteredCases, isWelsh, true, envelope)); + LOGGER.info("generating public transparency JSON report for press report {}", transparencyReportId); + publishCourtList(envelope, buildPayload(filteredCases, isWelsh, true, envelope)); + LOGGER.info("completed handling public transparency JSON report request for press report {}", transparencyReportId); storeReportMetadata(envelope, transparencyReportId, filteredCases); } - /** - * This method is deprecated with CCT-2079. Use the new method createTransparencyPDFReport or - * createTransparencyJSONReport - * - * @deprecated @Link{createTransparencyPDFReport} or @Link{createTransparencyJSONReport} - */ - @Deprecated(forRemoval = true) - @SuppressWarnings({"squid:S00112", "squid:S1133"}) - @Handles(TransparencyReportRequested.EVENT_NAME) - @Transactional - public void createTransparencyReport(final JsonEnvelope envelope) { - payloadHelper.initCache(); - - final JsonObject eventPayload = envelope.payloadAsJsonObject(); - final UUID transparencyReportId = fromString(eventPayload.getString(TRANSPARENCY_REPORT_ID)); - final List allPendingCasesFromViewStore = getPendingCasesFromViewStore(envelope); - final List filteredCases = getFilteredCases(allPendingCasesFromViewStore); - storeReportMetadata(envelope, transparencyReportId, filteredCases); - try { - final JsonObject payloadForDocumentGenerationEnglish = buildPayload(filteredCases, false, false, envelope); - final String englishPayloadFileName = String.format("transparency-report-template-parameters.english.%s.json", transparencyReportId); - final UUID englishPayloadFileId = storeDocumentGeneratorPayload(payloadForDocumentGenerationEnglish, englishPayloadFileName, "type", LANGUAGE); - requestDocumentGeneration(envelope, transparencyReportId, englishPayloadFileId, "type", LANGUAGE); - - final JsonObject payloadForPublicEventInEnglish = buildPayload(filteredCases, false, true, envelope); - if (LOGGER.isInfoEnabled()) { - LOGGER.info("publishing Sjp public event for english report {}, {}", PUBLIC_EVENT_SJP_PENDING_CASES_PUBLIC_LIST_GENERATED, payloadForPublicEventInEnglish); - } - final JsonObjectBuilder pendingListEnglishBuilder = createObjectBuilder() - .add(LANGUAGE, "ENGLISH") - .add(LIST_PAYLOAD, payloadForPublicEventInEnglish); - sender.send(Envelope.envelopeFrom(metadataFrom(envelope.metadata()) - .withName(PUBLIC_EVENT_SJP_PENDING_CASES_PUBLIC_LIST_GENERATED), - pendingListEnglishBuilder.build())); - - final JsonObject payloadForDocumentGenerationWelsh = buildPayload(filteredCases, true, false, envelope); - final String welshPayloadFileName = String.format("transparency-report-template-parameters.welsh.%s.json", transparencyReportId); - final UUID welshPayloadFileId = storeDocumentGeneratorPayload(payloadForDocumentGenerationWelsh, welshPayloadFileName, "type", LANGUAGE); - requestDocumentGeneration(envelope, transparencyReportId, welshPayloadFileId, "type", LANGUAGE); - - final JsonObject payloadForPublicEventInWelsh = buildPayload(filteredCases, true, true, envelope); - if (LOGGER.isInfoEnabled()) { - LOGGER.info("publishing Sjp public event for welsh report {}, {}", PUBLIC_EVENT_SJP_PENDING_CASES_PUBLIC_LIST_GENERATED, payloadForPublicEventInEnglish); - } - final JsonObjectBuilder pendingListWelshBuilder = createObjectBuilder() - .add(LANGUAGE, "WELSH") - .add(LIST_PAYLOAD, payloadForPublicEventInWelsh); - sender.send(Envelope.envelopeFrom(metadataFrom(envelope.metadata()) - .withName(PUBLIC_EVENT_SJP_PENDING_CASES_PUBLIC_LIST_GENERATED), - pendingListWelshBuilder.build())); - - } catch (FileServiceException e) { - throw new RuntimeException("IO Exception happened during transparency report generation", e); - } - } - - private void requestDocumentGeneration(final JsonEnvelope envelope, final UUID reportId, final JsonObject payload) throws FileServiceException { final String payloadFileName = String.format("transparency-report-template-parameters.%s.json", reportId.toString()); String type = envelope.payloadAsJsonObject().getString(REQUEST_TYPE).toLowerCase(); @@ -231,18 +174,29 @@ private void sendDocumentGenerationRequest(final JsonEnvelope eventEnvelope, ); } - private void sendPublicEvent(final JsonEnvelope envelope, final JsonObject payloadForDocumentGeneration) { - LOGGER.info("publishing public event for sjp pending cases for public list in english"); + private void publishCourtList(final JsonEnvelope envelope, final JsonObject payloadForDocumentGeneration) { + LOGGER.info("publishing sjp pending cases public list to court list publishing service"); final String type = envelope.payloadAsJsonObject().getString(REQUEST_TYPE); final String language = envelope.payloadAsJsonObject().getString(LANGUAGE); - final JsonObjectBuilder pendingListEnglishBuilder = createObjectBuilder() + // FULL/DELTA is part of the CaTH list-type vocabulary, not a separate field: sending + // SJP_PUBLIC_LIST for delta content makes CaTH render it with the full-list template. + final String listType = FULL.name().equals(type) ? SJP_PUBLIC_LIST : SJP_DELTA_PUBLIC_LIST; + LOGGER.info("building sjp public court list publish request, listType {}, requestType {}, language {}", + listType, type, language); + final JsonObject courtListPublishRequest = createObjectBuilder() + .add(LIST_TYPE, listType) .add(LANGUAGE, language) .add(REQUEST_TYPE, type) - .add(LIST_PAYLOAD, payloadForDocumentGeneration); + .add(LIST_PAYLOAD, payloadForDocumentGeneration) + .build(); + LOGGER.info("publishing sjp public court list pending cases list to court list publishing service"); - sender.send(Envelope.envelopeFrom(metadataFrom(envelope.metadata()) - .withName(PUBLIC_EVENT_SJP_PENDING_CASES_PUBLIC_LIST_GENERATED), - pendingListEnglishBuilder.build())); + try { + courtListPublishingService.publishCourtList(courtListPublishRequest.toString()); + } catch (IOException e) { + LOGGER.error("IO Exception happened while publishing sjp public court list", e); + throw new RuntimeException("IO Exception happened while publishing sjp public court list", e); + } } private List getPendingCasesFromViewStore(final JsonEnvelope envelope) { @@ -286,25 +240,6 @@ private JsonObject buildPayload(final List pendingCases, boolean isW .build(); } - private void requestDocumentGeneration(final JsonEnvelope eventEnvelope, - final UUID transparencyReportId, - final UUID payloadFileServiceUUID, final String type, final String language) { - - final JsonObject docGeneratorPayload = createObjectBuilder() - .add("originatingSource", "sjp") - .add(TEMPLATE_IDENTIFIER_STRING, payloadHelper.getTemplateIdentifier(type, language, ExportType.PUBLIC.name())) - .add(CONVERSION_FORMAT_STRING, CONVERSION_FORMAT) - .add("sourceCorrelationId", transparencyReportId.toString()) - .add("payloadFileServiceId", payloadFileServiceUUID.toString()) - .build(); - sender.sendAsAdmin( - Envelope.envelopeFrom( - metadataFrom(eventEnvelope.metadata()).withName("systemdocgenerator.generate-document"), - docGeneratorPayload - ) - ); - } - private UUID storeDocumentGeneratorPayload(final JsonObject documentGeneratorPayload, final String fileName, final String type, final String language) throws FileServiceException { final byte[] jsonPayloadInBytes = jsonObjectAsByteArray(documentGeneratorPayload); @@ -429,7 +364,7 @@ private String getDefendantLastName(final JsonObject pendingCase) { private Optional getPersonDefendantFullName(final JsonObject pendingCase) { if( JsonObjects.getString(pendingCase, FIRST_NAME).isPresent() || JsonObjects.getString(pendingCase, LAST_NAME).isPresent() ) { - return Optional.of((String) format("%s %s", pendingCase.getString(FIRST_NAME).length() > 0 ? pendingCase.getString(FIRST_NAME).toUpperCase().charAt(0) : "", capitalize(lowerCase(pendingCase.getString(LAST_NAME, ""))))); + return Optional.of(format("%s %s", pendingCase.getString(FIRST_NAME).length() > 0 ? pendingCase.getString(FIRST_NAME).toUpperCase().charAt(0) : "", capitalize(lowerCase(pendingCase.getString(LAST_NAME, ""))))); } return Optional.empty(); } diff --git a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/helper/HttpConnectionHelper.java b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/helper/HttpConnectionHelper.java index a4aa12c623..84294f1b68 100644 --- a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/helper/HttpConnectionHelper.java +++ b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/helper/HttpConnectionHelper.java @@ -10,21 +10,35 @@ import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class HttpConnectionHelper { + private static final Logger LOGGER = LoggerFactory.getLogger(HttpConnectionHelper.class); + private static final String CONTENT_TYPE = "content-type"; - private static final String APPLICATION_JSON_CONTENT_TYPE = "application/json"; + private static final String APPLICATION_JSON_CONTENT_TYPE = "application/vnd.courtlistpublishing-service.sjp.post+json"; public Integer getResponseCode(final String url, final String payload) throws IOException { + return getResponseCode(url, payload, UUID.randomUUID().toString()); + } + + public Integer getResponseCode(final String url, final String payload, final String userId) throws IOException { final HttpPost post = new HttpPost(url); post.addHeader(CONTENT_TYPE, APPLICATION_JSON_CONTENT_TYPE); - post.addHeader(HeaderConstants.USER_ID, UUID.randomUUID().toString()); + post.addHeader(HeaderConstants.USER_ID, userId); post.setEntity(new StringEntity(payload)); + LOGGER.info("sending POST request to url {}", url); try (CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = httpClient.execute(post)) { - return response.getStatusLine().getStatusCode(); + final int statusCode = response.getStatusLine().getStatusCode(); + LOGGER.info("received response from url {}, statusCode {}", url, statusCode); + return statusCode; + } catch (final IOException e) { + LOGGER.error("failed to send POST request to url {}", url, e); + throw e; } } } diff --git a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/service/ApplicationParameters.java b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/service/ApplicationParameters.java index 73ddfaf296..62a5bb4fa0 100644 --- a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/service/ApplicationParameters.java +++ b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/service/ApplicationParameters.java @@ -15,7 +15,11 @@ public class ApplicationParameters { @Value(key = "RELAY_CASE_ON_CPP_FUNCTION_PATH") private String relayCaseOnCppFunctionPath; - + @Inject + @Value(key = "COURT_LIST_PUBLISHING_SERVICE_URL", defaultValue = "http://localhost:8080/courtlistpublishing-service") + private String courtListPublishingServiceUrl; + + public String getAzureFunctionHostName() { return azureFunctionHostName; @@ -25,4 +29,9 @@ public String getRelayCaseOnCppFunctionPath() { return relayCaseOnCppFunctionPath; } + + public String getCourtListPublishingServiceUrl() { + + return courtListPublishingServiceUrl; + } } diff --git a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/service/CourtListPublishingService.java b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/service/CourtListPublishingService.java new file mode 100644 index 0000000000..54aceb0645 --- /dev/null +++ b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/service/CourtListPublishingService.java @@ -0,0 +1,40 @@ +package uk.gov.moj.cpp.sjp.event.processor.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import uk.gov.moj.cpp.sjp.event.processor.helper.HttpConnectionHelper; + +import java.io.IOException; + +import javax.inject.Inject; + +public class CourtListPublishingService { + + private static final Logger LOGGER = LoggerFactory.getLogger(CourtListPublishingService.class); + private static final String PUBLISH_SJP_COURT_LIST_PATH = "/api/court-list-publish/sjp/publishCourtList"; + + private final HttpConnectionHelper httpConnectionHelper; + + @Inject + private ApplicationParameters applicationParameters; + + @Inject + private SystemIdMapperService systemIdMapperService; + + public CourtListPublishingService() { + this.httpConnectionHelper = new HttpConnectionHelper(); + } + + public void publishCourtList(final String payload) throws IOException { + final String url = applicationParameters.getCourtListPublishingServiceUrl() + PUBLISH_SJP_COURT_LIST_PATH; + final String systemUserId = systemIdMapperService.getSystemUserId().toString(); + LOGGER.info("publishing court list to url {}, payload size {} bytes", url, payload.length()); + try { + final Integer responseCode = httpConnectionHelper.getResponseCode(url, payload, systemUserId); + LOGGER.info("publish court list response from url {}, responseCode {}", url, responseCode); + } catch (final IOException e) { + LOGGER.error("failed to publish court list to url {}", url, e); + throw e; + } + } +} diff --git a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/service/SjpService.java b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/service/SjpService.java index 7cb835080f..288680b3c9 100644 --- a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/service/SjpService.java +++ b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/service/SjpService.java @@ -82,7 +82,7 @@ public JsonObject getSessionDetails(final UUID sessionId, final JsonEnvelope env final JsonObject payload = createObjectBuilder().add(SESSION_ID, sessionId.toString()).build(); final JsonEnvelope request = envelopeFrom(metadataFrom(envelope.metadata()).withName("sjp.query.session"), payload); final JsonEnvelope response = requester.requestAsAdmin(request); - return response.payloadAsJsonObject(); + return response.payload() != JsonValue.NULL ? response.payloadAsJsonObject() : null; } public JsonObject getLatestAocpSessionDetails(final JsonEnvelope envelope) { diff --git a/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/PressTransparencyReportRequestedProcessorTest.java b/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/PressTransparencyReportRequestedProcessorTest.java index a82128ed24..6dae8cad07 100644 --- a/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/PressTransparencyReportRequestedProcessorTest.java +++ b/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/PressTransparencyReportRequestedProcessorTest.java @@ -40,15 +40,17 @@ import uk.gov.justice.services.fileservice.api.FileStorer; import uk.gov.justice.services.messaging.Envelope; import uk.gov.justice.services.messaging.JsonEnvelope; -import uk.gov.justice.services.messaging.spi.DefaultEnvelope; import uk.gov.moj.cpp.sjp.domain.DocumentRequestType; import uk.gov.moj.cpp.sjp.domain.ListType; +import uk.gov.moj.cpp.sjp.event.processor.service.CourtListPublishingService; import uk.gov.moj.cpp.sjp.event.processor.service.ReferenceDataOffencesService; import uk.gov.moj.cpp.sjp.event.processor.service.ReferenceDataService; import uk.gov.moj.cpp.sjp.event.processor.service.SjpService; import uk.gov.moj.cpp.sjp.event.processor.utils.PayloadHelper; +import java.io.IOException; import java.io.InputStream; +import java.io.StringReader; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; @@ -63,6 +65,7 @@ import java.util.UUID; import java.util.function.Function; +import javax.json.Json; import javax.json.JsonArray; import javax.json.JsonArrayBuilder; import javax.json.JsonObject; @@ -81,7 +84,6 @@ public class PressTransparencyReportRequestedProcessorTest { private static final DateTimeFormatter DOB_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - private static final String PUBLIC_EVENT_SJP_PENDING_CASES_PUBLIC_LIST_GENERATED = "public.sjp.press-transparency-report-generated"; private static final String STORE_PRESS_TRANSPARENCY_REPORT_DATA_COMMAND = "sjp.command.store-press-transparency-report-data"; private static final String EXPECTED_TEMPLATE_NAME_DELTA = "PressPendingCasesDeltaEnglish"; private static final String EXPECTED_TEMPLATE_NAME_FULL = "PressPendingCasesFullEnglish"; @@ -164,6 +166,8 @@ public class PressTransparencyReportRequestedProcessorTest { private PayloadHelper payloadHelper; @Mock private SjpService sjpService; + @Mock + private CourtListPublishingService courtListPublishingService; @Captor private ArgumentCaptor payloadForDocumentGenerationCaptor; @Captor @@ -171,7 +175,7 @@ public class PressTransparencyReportRequestedProcessorTest { @Captor private ArgumentCaptor storePressTransparencyReportCommandEnvelopeCaptor; @Captor - private ArgumentCaptor defaultEnvelopeArgumentCaptor; + private ArgumentCaptor courtListPublishRequestCaptor; @BeforeEach public void setUp() throws Exception { @@ -191,33 +195,6 @@ private void mockSjpService(final List sjpService, final List pendingCasesList = pendingCasesList(CASE_IDS, false, defendantDateOfBirth, false); - - mockCommon(sjpService.getPendingDeltaCases(any(), any()), pendingCasesList); - - processor.handlePressTransparencyRequest(PRIVATE_EVENT_PDF_ENVELOPE_DELTA); - - final JsonObject actual = getDocumentGeneratorPayloadFromFileStorer(); - - actual.getJsonArray("readyCases").forEach(rc -> - assertThat(rc.toString(), isJson(withJsonPath("$.dateOfBirth", equalTo(format(getAge(defendantDateOfBirth))))))); - - assertPayloadForDocumentGenerator(actual, pendingCasesList, NUMBER_OF_PENDING_CASES_FOR_EXPORT, false); - - verify(sender).sendAsAdmin(documentGenerationRequestCaptor.capture()); - - assertDocumentGenerationRequest(documentGenerationRequestCaptor.getValue(), EXPECTED_DOC_GENERATION_PAYLOAD_DELTA); - - verify(sender, times(1)).send(storePressTransparencyReportCommandEnvelopeCaptor.capture()); - assertPressTransparencyReportEnvelope(storePressTransparencyReportCommandEnvelopeCaptor.getValue(), REPORT_ID, CASE_IDS, DocumentRequestType.DELTA); - } - @Test public void shouldCreatePressTransparencyPDFReportDelta() throws FileServiceException { @@ -282,7 +259,7 @@ public void shouldCreatePressTransparencyPDFReportFull() throws FileServiceExcep } @Test - public void shouldCreatePressTransparencyJSONReportDelta() { + public void shouldCreatePressTransparencyJSONReportDelta() throws IOException { final String defendantDateOfBirth = "1980-06-12"; @@ -291,11 +268,10 @@ public void shouldCreatePressTransparencyJSONReportDelta() { mockSjpService(sjpService.getPendingDeltaCases(any(), any()), pendingCasesList); processor.handlePressTransparencyJSONReportRequest(PRIVATE_EVENT_ENVELOPE_JSON_DELTA); - verify(sender, times(1)).send(defaultEnvelopeArgumentCaptor.capture()); - final Envelope jsonEnvelope = defaultEnvelopeArgumentCaptor.getAllValues().get(0); - assertThat(jsonEnvelope.metadata().name(), is(PUBLIC_EVENT_SJP_PENDING_CASES_PUBLIC_LIST_GENERATED)); - final JsonObject eventPayload = (JsonObject) jsonEnvelope.payload(); - final JsonObject payload = eventPayload.getJsonObject("listPayload"); + verify(courtListPublishingService, times(1)).publishCourtList(courtListPublishRequestCaptor.capture()); + final JsonObject courtListPublishRequest = Json.createReader(new StringReader(courtListPublishRequestCaptor.getValue())).readObject(); + assertThat(courtListPublishRequest.getString("listType"), is("SJP_DELTA_PRESS_LIST")); + final JsonObject payload = courtListPublishRequest.getJsonObject("listPayload"); assertThat(payload.getInt("totalNumberOfRecords"), is(1)); final JsonArray readyCases = payload.getJsonArray("readyCases"); assertThat(1, is(readyCases.size())); @@ -307,7 +283,7 @@ public void shouldCreatePressTransparencyJSONReportDelta() { } @Test - public void shouldCreatePressTransparencyJSONReportFull() { + public void shouldCreatePressTransparencyJSONReportFull() throws IOException { final String defendantDateOfBirth = "1980-06-12"; @@ -316,11 +292,10 @@ public void shouldCreatePressTransparencyJSONReportFull() { mockSjpService(sjpService.getPendingCases(any(), any()), pendingCasesList); processor.handlePressTransparencyJSONReportRequest(PRIVATE_EVENT_ENVELOPE_JSON_FULL); - verify(sender, times(1)).send(defaultEnvelopeArgumentCaptor.capture()); - final Envelope jsonEnvelope = defaultEnvelopeArgumentCaptor.getAllValues().get(0); - assertThat(jsonEnvelope.metadata().name(), is(PUBLIC_EVENT_SJP_PENDING_CASES_PUBLIC_LIST_GENERATED)); - final JsonObject eventPayload = (JsonObject) jsonEnvelope.payload(); - final JsonObject payload = eventPayload.getJsonObject("listPayload"); + verify(courtListPublishingService, times(1)).publishCourtList(courtListPublishRequestCaptor.capture()); + final JsonObject courtListPublishRequest = Json.createReader(new StringReader(courtListPublishRequestCaptor.getValue())).readObject(); + assertThat(courtListPublishRequest.getString("listType"), is("SJP_PRESS_LIST")); + final JsonObject payload = courtListPublishRequest.getJsonObject("listPayload"); assertThat(payload.getInt("totalNumberOfRecords"), is(1)); final JsonArray readyCases = payload.getJsonArray("readyCases"); assertThat(1, is(readyCases.size())); @@ -341,44 +316,6 @@ private JsonObject getDocumentGeneratorPayloadFromFileStorer() throws FileServic return streamToJsonObject(payloadBytes); } - @Test - @SuppressWarnings("deprecation") - public void shouldCreatePressTransparencyWhenNoDateOfBirthReport() throws FileServiceException { - - final String defendantDateOfBirth = ""; - - final List pendingCasesList = pendingCasesList(CASE_IDS, false, defendantDateOfBirth, false); - - mockCommon(sjpService.getPendingDeltaCases(any(), any()), pendingCasesList); - - processor.handlePressTransparencyRequest(PRIVATE_EVENT_PDF_ENVELOPE_DELTA); - - final JsonObject actual = getDocumentGeneratorPayloadFromFileStorer(); - - assertThat(actual.containsKey("dateOfBirth"), is(false)); - - - } - - @Test - @SuppressWarnings("deprecation") - public void shouldExcludeYouthDefendants() throws FileServiceException { - - final String defendantDateOfBirth = "1980-06-12"; - - final List pendingCasesList = pendingCasesList(CASE_IDS, true, defendantDateOfBirth, false); - - mockCommon(sjpService.getPendingDeltaCases(any(), any()), pendingCasesList); - - processor.handlePressTransparencyRequest(PRIVATE_EVENT_PDF_ENVELOPE_DELTA); - - verify(fileStorer).store(any(JsonObject.class), payloadForDocumentGenerationCaptor.capture()); - - final InputStream payloadBytes = payloadForDocumentGenerationCaptor.getValue(); - final JsonObject payloadForDocumentGenerator = streamToJsonObject(payloadBytes); - - } - @Test public void shouldCreatePressTransparencyPDFWhenNoDateOfBirthReport() throws FileServiceException { diff --git a/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/TransparencyReportRequestedProcessorTest.java b/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/TransparencyReportRequestedProcessorTest.java index e34e2faab9..92d7050497 100644 --- a/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/TransparencyReportRequestedProcessorTest.java +++ b/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/TransparencyReportRequestedProcessorTest.java @@ -3,11 +3,10 @@ import static java.util.UUID.fromString; import static java.util.UUID.randomUUID; import static java.util.stream.Collectors.toList; +import static java.util.Collections.emptyList; import static java.util.stream.IntStream.range; -import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.everyItem; -import static org.hamcrest.Matchers.isEmptyOrNullString; import static org.hamcrest.Matchers.isIn; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.notNullValue; @@ -29,21 +28,24 @@ import uk.gov.justice.services.messaging.Envelope; import uk.gov.justice.services.messaging.JsonEnvelope; import uk.gov.justice.services.messaging.Metadata; -import uk.gov.justice.services.messaging.spi.DefaultEnvelope; import uk.gov.moj.cpp.sjp.domain.DocumentFormat; import uk.gov.moj.cpp.sjp.domain.DocumentRequestType; +import uk.gov.moj.cpp.sjp.event.processor.service.CourtListPublishingService; import uk.gov.moj.cpp.sjp.event.processor.service.ReferenceDataOffencesService; import uk.gov.moj.cpp.sjp.event.processor.service.ReferenceDataService; import uk.gov.moj.cpp.sjp.event.processor.service.SjpService; import uk.gov.moj.cpp.sjp.event.processor.utils.PayloadHelper; +import java.io.IOException; import java.io.InputStream; +import java.io.StringReader; import java.time.LocalDate; import java.util.LinkedList; import java.util.List; import java.util.Objects; import java.util.UUID; +import javax.json.Json; import javax.json.JsonArray; import javax.json.JsonArrayBuilder; import javax.json.JsonObject; @@ -60,8 +62,6 @@ @ExtendWith(MockitoExtension.class) public class TransparencyReportRequestedProcessorTest { - private static final String PUBLIC_EVENT_SJP_PENDING_CASES_PUBLIC_LIST_GENERATED = "public.sjp.pending-cases-public-list-generated"; - @InjectMocks private TransparencyReportRequestedProcessor processor; @@ -80,6 +80,9 @@ public class TransparencyReportRequestedProcessorTest { @Mock private SjpService sjpService; + @Mock + private CourtListPublishingService courtListPublishingService; + @Captor private ArgumentCaptor payloadForFileServiceCaptor; @@ -90,75 +93,11 @@ public class TransparencyReportRequestedProcessorTest { private ArgumentCaptor storeTransparencyReportCommandEnvelopeCaptor; @Captor - private ArgumentCaptor defaultEnvelopeArgumentCaptor; + private ArgumentCaptor courtListPublishRequestCaptor; @Mock private PayloadHelper payloadHelper; - @Test - @SuppressWarnings("deprecation") - public void shouldCreateTransparencyReport() throws FileServiceException { - final UUID englishPayloadFileUUID = randomUUID(); - final UUID welshPayloadFileUUID = randomUUID(); - final UUID transparencyReportId = randomUUID(); - final String expectedEnglishTemplateName = "PublicPendingCasesFullEnglish"; - - final String offenceTitle = "OffenceTitle"; - final String prosecutorName = "TFL"; - final String prosecutorEnglish = "Transport For London"; - final String prosecutorWelsh = "Transport For London - Welsh"; - final Integer numberOfPendingCasesForExport = 9; - final List caseIds = range(0, numberOfPendingCasesForExport) - .mapToObj(e -> randomUUID()).collect(toList()); - - // create 5 young offenders - final List youngOffenderCaseIds = range(0, 5) - .mapToObj(e -> randomUUID()).collect(toList()); - - // create 5 press restricted case ids - final List pressRestrictionCaseIds = range(0, 5) - .mapToObj(e -> randomUUID()).collect(toList()); - - when(payloadHelper.buildOffenceTitleFromOffenceArray(any(), eq(false), any())).thenReturn(offenceTitle); - when(payloadHelper.buildOffenceTitleFromOffenceArray(any(), eq(true), any())).thenReturn(offenceTitle); - when(payloadHelper.mapOffenceIntoOffenceTitleString(any(), eq(false), any())).thenReturn(offenceTitle); - when(payloadHelper.mapOffenceIntoOffenceTitleString(any(), eq(true), any())).thenReturn(offenceTitle); - when(payloadHelper.buildProsecutorName(eq(prosecutorName), eq(false), any())).thenReturn(prosecutorEnglish); - when(payloadHelper.buildProsecutorName(eq(prosecutorName), eq(true), any())).thenReturn(prosecutorWelsh); - when(payloadHelper.getStartDate(eq(false))).thenReturn("15 January 2024"); - when(payloadHelper.getStartDate(eq(true))).thenReturn("ers 21 Tachwedd"); - when(payloadHelper.getTemplateIdentifier(any(), any(), any())).thenReturn(expectedEnglishTemplateName); - - final List pendingCasesList = pendingCasesList(caseIds, youngOffenderCaseIds, pressRestrictionCaseIds); - when(sjpService.getPendingCases(any(), any())).thenReturn(pendingCasesList); - when(fileStorer.store(any(), any())) - .thenReturn(englishPayloadFileUUID) - .thenReturn(welshPayloadFileUUID); - - final JsonEnvelope privateEventEnvelope = envelopeFrom( - metadataWithRandomUUID("sjp.events.transparency-report-requested"), - createObjectBuilder() - .add("transparencyReportId", transparencyReportId.toString()) - .add("requestType", DocumentRequestType.FULL.name()) - .add("language", "ENGLISH") - .add("format", DocumentFormat.PDF.name()) - .build() - ); - processor.createTransparencyReport(privateEventEnvelope); - - verify(fileStorer, times(2)).store(any(JsonObject.class), payloadForFileServiceCaptor.capture()); - verify(sender, times(2)).sendAsAdmin(payloadForDocumentGenerationCaptor.capture()); - - final JsonObject payloadForEnglishPdf = streamToJsonObject(payloadForFileServiceCaptor.getAllValues().get(0)); - final JsonObject payloadForWelshPdf = streamToJsonObject(payloadForFileServiceCaptor.getAllValues().get(1)); - - assertPayloadForDocumentGenerator(payloadForEnglishPdf, pendingCasesList, numberOfPendingCasesForExport, false); - assertPayloadForDocumentGenerator(payloadForWelshPdf, pendingCasesList, numberOfPendingCasesForExport, true); - - verify(sender, times(1)).send(storeTransparencyReportCommandEnvelopeCaptor.capture()); - assertTransparencyReportEnvelope(storeTransparencyReportCommandEnvelopeCaptor.getAllValues().get(0), transparencyReportId, caseIds); - } - @Test public void shouldCreateTransparencyPDFReportFULL() throws FileServiceException { final String expectedEnglishTemplateName = "PublicPendingCasesFullEnglish"; @@ -273,16 +212,12 @@ public void shouldCreateTransparencyPDFReportDELTA() throws FileServiceException } @Test - public void shouldCreateTransparencyReportJSONFull() throws FileServiceException { - final String expectedEnglishTemplateName = "PublicPendingCasesFullEnglish"; - final UUID englishPayloadFileUUID = randomUUID(); - final UUID welshPayloadFileUUID = randomUUID(); + public void shouldCreateTransparencyReportJSONFull() throws IOException { final UUID transparencyReportId = randomUUID(); final String offenceTitle = "OffenceTitle"; final String prosecutorName = "TFL"; final String prosecutorEnglish = "Transport For London"; - final String prosecutorWelsh = "Transport For London - Welsh"; final Integer numberOfPendingCasesForExport = 9; final List caseIds = range(0, numberOfPendingCasesForExport) .mapToObj(e -> randomUUID()).collect(toList()); @@ -313,14 +248,13 @@ public void shouldCreateTransparencyReportJSONFull() throws FileServiceException ); processor.createTransparencyJSONReport(privateEventEnvelope); - verify(sender, times(1)).send(defaultEnvelopeArgumentCaptor.capture()); - final Envelope jsonEnvelope = defaultEnvelopeArgumentCaptor.getAllValues().get(0); - assertThat(jsonEnvelope.metadata().name(), is(PUBLIC_EVENT_SJP_PENDING_CASES_PUBLIC_LIST_GENERATED)); - final JsonObject eventPayload = (JsonObject) jsonEnvelope.payload(); - final JsonObject payload = eventPayload.getJsonObject("listPayload"); - assertThat(payload.getInt("totalNumberOfRecords"), is(9)); + verify(courtListPublishingService, times(1)).publishCourtList(courtListPublishRequestCaptor.capture()); + final JsonObject courtListPublishRequest = Json.createReader(new StringReader(courtListPublishRequestCaptor.getValue())).readObject(); + assertThat(courtListPublishRequest.getString("listType"), is("SJP_PUBLIC_LIST")); + final JsonObject payload = courtListPublishRequest.getJsonObject("listPayload"); + assertThat(payload.getInt("totalNumberOfRecords"), is(numberOfPendingCasesForExport)); final JsonArray readyCases = payload.getJsonArray("readyCases"); - assertThat(9, is(readyCases.size())); + assertThat(readyCases.size(), is(numberOfPendingCasesForExport)); readyCases.getValuesAs(JsonObject.class).forEach(jsonObject -> { assertThat(jsonObject.getJsonArray("sjpOffences"), notNullValue()); assertThat(jsonObject.getString("firstName"), is("A")); @@ -387,22 +321,6 @@ public void shouldCreateTransparencyReportJSONDELTA() throws FileServiceExceptio verify(sender, times(1)).send(storeTransparencyReportCommandEnvelopeCaptor.capture()); } - private void assertSJPPendingPublicListEnvelope(final Envelope jsonEnvelope, final String language, final Integer numberOfPendingCasesForExport, final String prosecutorName) { - assertThat(jsonEnvelope.metadata().name(), is(PUBLIC_EVENT_SJP_PENDING_CASES_PUBLIC_LIST_GENERATED)); - final JsonObject eventPayload = (JsonObject) jsonEnvelope.payload(); - final JsonObject payload = eventPayload.getJsonObject("listPayload"); - assertThat(payload.getInt("totalNumberOfRecords"), is(numberOfPendingCasesForExport)); - final JsonArray readyCases = payload.getJsonArray("readyCases"); - assertThat(numberOfPendingCasesForExport, is(readyCases.size())); - readyCases.getValuesAs(JsonObject.class).forEach(jsonObject -> { - assertThat(jsonObject.getString("prosecutorName"), is(prosecutorName)); - assertThat(jsonObject.getJsonArray("sjpOffences"), notNullValue()); - assertThat(jsonObject.getString("firstName"), not(isEmptyOrNullString())); - assertThat(jsonObject.getString("lastName"), not(isEmptyOrNullString())); - }); - } - - private void assertPayloadForDocumentGenerator(final JsonObject payload, final List pendingCasesList, final Integer totalNumberOfRecords, final Boolean isWelsh) { assertReadyCasesPayloadWithPendingCases(payload, pendingCasesList, "postcode"); @@ -573,4 +491,34 @@ private JsonObjectBuilder getPendingCaseWithPressRestriction(final List ca return pendingCase; } + + @Test + public void shouldPublishDeltaPublicListTypeWhenRequestTypeIsDelta() throws Exception { + final UUID transparencyReportId = randomUUID(); + + when(payloadHelper.mapOffenceIntoOffenceTitleString(any(), eq(false), any())).thenReturn("OffenceTitle"); + when(payloadHelper.buildProsecutorName(any(), eq(false), any())).thenReturn("Transport For London"); + when(payloadHelper.getStartDate(eq(false))).thenReturn("15 January 2024"); + + final List caseIds = range(0, 3).mapToObj(e -> randomUUID()).collect(toList()); + when(sjpService.getPendingDeltaCases(any(), any())) + .thenReturn(pendingCasesList(caseIds, emptyList(), emptyList())); + + final JsonEnvelope privateEventEnvelope = envelopeFrom( + metadataWithRandomUUID("sjp.events.transparency-json-report-requested"), + createObjectBuilder() + .add("transparencyReportId", transparencyReportId.toString()) + .add("format", DocumentFormat.JSON.name()) + .add("requestType", DocumentRequestType.DELTA.name()) + .add("language", "ENGLISH") + .build() + ); + + processor.createTransparencyJSONReport(privateEventEnvelope); + + verify(courtListPublishingService, times(1)).publishCourtList(courtListPublishRequestCaptor.capture()); + final JsonObject courtListPublishRequest = + Json.createReader(new StringReader(courtListPublishRequestCaptor.getValue())).readObject(); + assertThat(courtListPublishRequest.getString("listType"), is("SJP_DELTA_PUBLIC_LIST")); + } } diff --git a/sjp-event/sjp-event-processor/src/yaml/json/schema/public.sjp.pending-cases-public-list-generated.json b/sjp-event/sjp-event-processor/src/yaml/json/schema/public.sjp.pending-cases-public-list-generated.json deleted file mode 100644 index a4dc7303cc..0000000000 --- a/sjp-event/sjp-event-processor/src/yaml/json/schema/public.sjp.pending-cases-public-list-generated.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "http://cpp.moj.gov.uk/sjp/json/schema/event/public.sjp.pending-cases-public-list-generated.json", - "type": "object", - "properties": { - "requestType": { - "enum": [ - "FULL", - "DELTA" - ] - }, - "language": { - "enum": [ - "ENGLISH", - "WELSH", - "BI_LINGUAL" - ] - }, - "listPayload": { - "type": "object", - "properties": { - "generatedDateAndTime": { - "type": "string" - }, - "totalNumberOfRecords": { - "type": "integer" - }, - "startDate": { - "type": "string" - }, - "readyCases": { - "type": "array", - "items": { - "type": "object", - "properties": { - "defendantName": { - "type": "string" - }, - "prosecutorName": { - "type": "string" - }, - "legalEntityName": { - "type": "string" - }, - "firstName": { - "type": "string" - }, - "lastName": { - "type": "string" - }, - "postcode": { - "type": "string" - }, - "sjpOffences": { - "type": "array", - "items": { - "type": "object", - "properties": { - "title": { - "type": "string" - } - } - } - } - } - } - } - }, - "required": [ - "generatedDateAndTime", - "totalNumberOfRecords", - "readyCases" - ], - "additionalProperties": false - } - }, - "required": [ - "language", - "listPayload" - ], - "additionalProperties": false -} \ No newline at end of file diff --git a/sjp-event/sjp-event-processor/src/yaml/json/schema/public.sjp.press-transparency-report-generated.json b/sjp-event/sjp-event-processor/src/yaml/json/schema/public.sjp.press-transparency-report-generated.json deleted file mode 100644 index 4d7c48226a..0000000000 --- a/sjp-event/sjp-event-processor/src/yaml/json/schema/public.sjp.press-transparency-report-generated.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "$schema":"http://json-schema.org/draft-04/schema#", - "id":"http://cpp.moj.gov.uk/sjp/json/schema/event/public.sjp.press-transparency-report-generated.json", - "type":"object", - "properties":{ - "requestType": { - "type": "string", - "enum": [ - "FULL", - "DELTA" - ] - }, - "language":{ - "enum":[ - "ENGLISH", - "WELSH", - "BI_LINGUAL" - ] - }, - "listPayload":{ - "type":"object", - "properties":{ - "generatedDateAndTime":{ - "type":"string" - }, - "totalNumberOfRecords":{ - "type":"integer" - }, - "readyCases":{ - "type":"array", - "items":{ - "type":"object", - "properties":{ - "caseUrn":{ - "type":"string" - }, - "defendantName":{ - "type":"string" - }, - "dateOfBirth":{ - "type":"string" - }, - "age":{ - "type":"string" - }, - "prosecutorName":{ - "type":"string" - }, - "legalEntityName":{ - "type":"string" - }, - "title":{ - "type":"string" - }, - "firstName":{ - "type":"string" - }, - "lastName":{ - "type":"string" - }, - "addressLine1":{ - "type":"string" - }, - "addressLine2":{ - "type":"string" - }, - "addressLine3":{ - "type":"string" - }, - "town":{ - "type":"string" - }, - "county":{ - "type":"string" - }, - "postcode":{ - "type":"string" - }, - "sjpOffences":{ - "type":"array", - "items":{ - "type":"object", - "properties":{ - "title":{ - "type":"string" - }, - "wording":{ - "type":"string" - }, - "reportingRestriction":{ - "type":"boolean" - }, - "pressRestrictionName":{ - "type":"string" - } - } - } - } - } - } - } - }, - "required":[ - "generatedDateAndTime", - "totalNumberOfRecords", - "readyCases" - ] - } - }, - "required":[ - "language", - "listPayload" - ] -} \ No newline at end of file diff --git a/sjp-event/sjp-event-processor/src/yaml/json/schema/sjp.events.transparency-report-requested.json b/sjp-event/sjp-event-processor/src/yaml/json/schema/sjp.events.transparency-report-requested.json deleted file mode 100644 index 20a1091d60..0000000000 --- a/sjp-event/sjp-event-processor/src/yaml/json/schema/sjp.events.transparency-report-requested.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "http://justice.gov.uk/json/schemas/domains/sjp/events/transparency-report-requested.json", - "type": "object", - "properties": { - "requestedAt": { - "$ref": "http://justice.gov.uk/json/schemas/domains/sjp/temporal.json#/definitions/date-time" - }, - "transparencyReportId" : { - "$ref": "http://justice.gov.uk/domain/core/common/definitions.json#/definitions/uuid" - } - }, - "required": [ - "transparencyReportId", - "requestedAt" - ], - "additionalProperties": false -} diff --git a/sjp-event/sjp-event-processor/src/yaml/json/sjp.events.transparency-report-requested.json b/sjp-event/sjp-event-processor/src/yaml/json/sjp.events.transparency-report-requested.json deleted file mode 100644 index 78b1a1887c..0000000000 --- a/sjp-event/sjp-event-processor/src/yaml/json/sjp.events.transparency-report-requested.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "requestedAt": "2018-02-05T15:14:29.894Z", - "transparencyReportId" : "60ca064a-3d25-4157-a3d1-94e99d00c5a1" -} \ No newline at end of file diff --git a/sjp-event/sjp-event-processor/src/yaml/public-publications-descriptor.yaml b/sjp-event/sjp-event-processor/src/yaml/public-publications-descriptor.yaml index fb12a32995..1d41eeb064 100644 --- a/sjp-event/sjp-event-processor/src/yaml/public-publications-descriptor.yaml +++ b/sjp-event/sjp-event-processor/src/yaml/public-publications-descriptor.yaml @@ -140,15 +140,9 @@ subscriptions_descriptor: - name: public.sjp.events.conviction-court-resolved schema_uri: http://justice.gov.uk/json/schemas/domains/sjp/events/public.sjp.events.conviction-court-resolved.json - - name: public.sjp.pending-cases-public-list-generated - schema_uri: http://cpp.moj.gov.uk/sjp/json/schema/event/public.sjp.pending-cases-public-list-generated.json - - name: public.sjp.case-legal-soc-checked schema_uri: http://cpp.moj.gov.uk/sjp/json/schema/event/public.sjp.marked-as-legal-soc-checked.json - - name: public.sjp.press-transparency-report-generated - schema_uri: http://cpp.moj.gov.uk/sjp/json/schema/event/public.sjp.press-transparency-report-generated.json - - name: public.sjp.case-reserved schema_uri: http://cpp.moj.gov.uk/sjp/json/schema/event/public.sjp.case-reserved.json diff --git a/sjp-event/sjp-event-processor/src/yaml/subscriptions-descriptor.yaml b/sjp-event/sjp-event-processor/src/yaml/subscriptions-descriptor.yaml index 0cdee4dae1..1777d81b93 100644 --- a/sjp-event/sjp-event-processor/src/yaml/subscriptions-descriptor.yaml +++ b/sjp-event/sjp-event-processor/src/yaml/subscriptions-descriptor.yaml @@ -131,18 +131,12 @@ subscriptions_descriptor: - name: sjp.events.case-adjourned-to-later-sjp-hearing-recorded schema_uri: http://cpp.moj.gov.uk/sjp/event/case-adjourned-to-later-sjp-hearing-recorded.json - - name: sjp.events.transparency-report-requested - schema_uri: http://justice.gov.uk/json/schemas/domains/sjp/events/transparency-report-requested.json - - name: sjp.events.transparency-pdf-report-requested schema_uri: http://justice.gov.uk/json/schemas/domains/sjp/events/transparency-pdf-report-requested.json - name: sjp.events.transparency-json-report-requested schema_uri: http://justice.gov.uk/json/schemas/domains/sjp/events/transparency-json-report-requested.json - - name: sjp.events.press-transparency-report-requested - schema_uri: http://justice.gov.uk/json/schemas/domains/sjp/events/press-transparency-report-requested.json - - name: sjp.events.press-transparency-pdf-report-requested schema_uri: http://justice.gov.uk/json/schemas/domains/sjp/events/press-transparency-pdf-report-requested.json diff --git a/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/helper/AssignmentHelper.java b/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/helper/AssignmentHelper.java index ab1bdcffbd..5f620a1cda 100644 --- a/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/helper/AssignmentHelper.java +++ b/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/helper/AssignmentHelper.java @@ -11,7 +11,6 @@ import static uk.gov.moj.sjp.it.util.HttpClientUtil.makeGetCall; import static uk.gov.moj.sjp.it.util.HttpClientUtil.makePostCall; import static uk.gov.moj.sjp.it.util.RestPollerWithDefaults.POLL_INTERVAL; -import static uk.gov.moj.sjp.it.util.RestPollerWithDefaults.TIMEOUT_IN_SECONDS; import uk.gov.justice.services.messaging.JsonEnvelope; import uk.gov.moj.cpp.sjp.event.session.CaseAssigned; @@ -28,6 +27,8 @@ public class AssignmentHelper { + private static final long ASSIGNMENT_TIMEOUT_IN_SECONDS = 20L; + public static UUID requestCaseAssignmentAsync(final UUID sessionId, final UUID userId) { final String contentType = "application/vnd.sjp.assign-next-case+json"; final String url = String.format("/sessions/%s", sessionId); @@ -66,11 +67,11 @@ public static boolean isCaseAssignedToUser(final UUID caseId, final UUID userId) } public static boolean pollUntilCaseAssignedToUser(final UUID caseId, final UUID userId) { - return await().pollInterval(POLL_INTERVAL).atMost(TIMEOUT_IN_SECONDS, SECONDS).until(() -> isCaseAssignedToUser(caseId, userId), is(true)); + return await().pollInterval(POLL_INTERVAL).atMost(ASSIGNMENT_TIMEOUT_IN_SECONDS, SECONDS).until(() -> isCaseAssignedToUser(caseId, userId), is(true)); } public static boolean pollUntilCaseNotAssignedToUser(final UUID caseId, final UUID userId) { - return await().pollInterval(POLL_INTERVAL).atMost(TIMEOUT_IN_SECONDS, SECONDS).until(() -> isCaseAssignedToUser(caseId, userId), is(false)); + return await().pollInterval(POLL_INTERVAL).atMost(ASSIGNMENT_TIMEOUT_IN_SECONDS, SECONDS).until(() -> isCaseAssignedToUser(caseId, userId), is(false)); } public static void pollCaseUnassigned(final UUID caseId) { diff --git a/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/stub/CourtListPublishingServiceStub.java b/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/stub/CourtListPublishingServiceStub.java new file mode 100644 index 0000000000..b65724b544 --- /dev/null +++ b/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/stub/CourtListPublishingServiceStub.java @@ -0,0 +1,51 @@ +package uk.gov.moj.sjp.it.stub; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.findAll; +import static com.github.tomakehurst.wiremock.client.WireMock.post; +import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; +import static java.util.Collections.emptyList; +import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.stream.Collectors.toList; +import static org.apache.http.HttpStatus.SC_OK; +import static org.awaitility.Awaitility.await; +import static uk.gov.moj.sjp.it.util.RestPollerWithDefaults.POLL_INTERVAL; +import static uk.gov.moj.sjp.it.util.RestPollerWithDefaults.TIMEOUT_IN_SECONDS; + +import java.util.Collection; +import java.util.List; + +import com.github.tomakehurst.wiremock.verification.LoggedRequest; +import org.awaitility.core.ConditionTimeoutException; +import org.hamcrest.Matcher; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CourtListPublishingServiceStub { + + private static final String PUBLISH_COURT_LIST_URL = "/courtlistpublishing-service/api/court-list-publish/sjp/publishCourtList"; + private final static Logger LOGGER = LoggerFactory.getLogger(CourtListPublishingServiceStub.class); + + public static void stubPublishCourtListEndpoint() { + stubFor(post(urlPathEqualTo(PUBLISH_COURT_LIST_URL)) + .willReturn(aResponse().withStatus(SC_OK))); + } + + public static List pollCourtListPublishRequests(final Matcher> matcher) { + try { + return await().pollInterval(POLL_INTERVAL) + .atMost(TIMEOUT_IN_SECONDS, SECONDS).until(() -> + findAll(postRequestedFor(urlPathEqualTo(PUBLISH_COURT_LIST_URL))) + .stream() + .map(LoggedRequest::getBodyAsString) + .map(JSONObject::new) + .collect(toList()), matcher); + } catch (final ConditionTimeoutException timeoutException) { + LOGGER.info("Exception while finding the captured requests in wire mock:" + timeoutException); + return emptyList(); + } + } +} diff --git a/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/test/PleadOnlineIT.java b/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/test/PleadOnlineIT.java index cbecb3e6f1..1ca95d0bd9 100644 --- a/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/test/PleadOnlineIT.java +++ b/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/test/PleadOnlineIT.java @@ -1059,7 +1059,7 @@ public void shouldPleaNotGuiltyWithoutFinancialMeansWithPublicEvent() { pleaPayload.remove("financialMeans"); assertThat(pleaPayload.has("financialMeans"), is(false)); assertThat(pleaPayload.has("outgoings"), is(true)); - final JsonPath response = pleadOnlineWithPublicEvent(pleaPayload); + final JsonPath response = pleadOnlineWithPublicEvent(pleaPayload, false); verifyResponseCase(response, TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_FINANCIAL_MEANS_CASE_RESPONSE); verifyResponseOnlinePlea(TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_FINANCIAL_MEANS_RESPONSE, notGuilty); } @@ -1072,7 +1072,7 @@ public void shouldPleaNotGuiltyWithoutFinancialMeans() { pleaPayload.remove("financialMeans"); assertThat(pleaPayload.has("financialMeans"), is(false)); assertThat(pleaPayload.has("outgoings"), is(true)); - final JsonPath response = pleadOnline(pleaPayload); + final JsonPath response = pleadOnline(pleaPayload, false); verifyResponseCase(response, TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_FINANCIAL_MEANS_CASE_RESPONSE); verifyResponseOnlinePlea(TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_FINANCIAL_MEANS_RESPONSE, notGuilty); } @@ -1084,7 +1084,7 @@ public void shouldPleaNotGuiltyWithoutOutgoingsWithPublicEvent() { pleaPayload.remove("outgoings"); assertThat(pleaPayload.has("financialMeans"), is(true)); assertThat(pleaPayload.has("outgoings"), is(false)); - final JsonPath response = pleadOnlineWithPublicEvent(pleaPayload); + final JsonPath response = pleadOnlineWithPublicEvent(pleaPayload, false); verifyResponseCase(response, TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_FINANCIAL_MEANS_CASE_RESPONSE); verifyResponseOnlinePlea(TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_OUTGOINGS_RESPONSE, notGuilty); } @@ -1096,7 +1096,7 @@ public void shouldPleaNotGuiltyWithoutOutgoings() { pleaPayload.remove("outgoings"); assertThat(pleaPayload.has("financialMeans"), is(true)); assertThat(pleaPayload.has("outgoings"), is(false)); - final JsonPath response = pleadOnline(pleaPayload); + final JsonPath response = pleadOnline(pleaPayload, false); verifyResponseCase(response, TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_FINANCIAL_MEANS_CASE_RESPONSE); verifyResponseOnlinePlea(TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_OUTGOINGS_RESPONSE, notGuilty); } @@ -1111,7 +1111,7 @@ public void shouldPleaNotGuiltyAndUpdateDefendantDetailsWithPublicEvent() { pleaPayload.getJSONObject("personalDetails").put("nationalInsuranceNumber", "SR569876FD"); assertThat(pleaPayload.has("financialMeans"), is(true)); assertThat(pleaPayload.has("outgoings"), is(false)); - final JsonPath response = pleadOnlineWithPublicEvent(pleaPayload); + final JsonPath response = pleadOnlineWithPublicEvent(pleaPayload, false); verifyResponseCase(response, TEMPLATE_PLEA_NOT_GUILTY_WITH_CHANGED_DETAILS_CASE_RESPONSE); verifyResponseOnlinePlea(TEMPLATE_PLEA_NOT_GUILTY_WITH_CHANGED_DETAILS_RESPONSE, notGuilty); @@ -1127,7 +1127,7 @@ public void shouldPleaNotGuiltyAndUpdateDefendantDetails() { pleaPayload.getJSONObject("personalDetails").put("nationalInsuranceNumber", "SR569876FD"); assertThat(pleaPayload.has("financialMeans"), is(true)); assertThat(pleaPayload.has("outgoings"), is(false)); - final JsonPath response = pleadOnline(pleaPayload); + final JsonPath response = pleadOnline(pleaPayload, false); verifyResponseCase(response, TEMPLATE_PLEA_NOT_GUILTY_WITH_CHANGED_DETAILS_CASE_RESPONSE); verifyResponseOnlinePlea(TEMPLATE_PLEA_NOT_GUILTY_WITH_CHANGED_DETAILS_RESPONSE, notGuilty); @@ -1141,7 +1141,7 @@ public void shouldPleaNotGuiltyWithoutFinancialMeansAndOutgoingsWithPublicEvent( pleaPayload.remove("outgoings"); assertThat(pleaPayload.has("financialMeans"), is(false)); assertThat(pleaPayload.has("outgoings"), is(false)); - final JsonPath response = pleadOnlineWithPublicEvent(pleaPayload); + final JsonPath response = pleadOnlineWithPublicEvent(pleaPayload, false); verifyResponseCase(response, TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_FINANCIAL_MEANS_CASE_RESPONSE); verifyResponseOnlinePlea(TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_FINANCIAL_MEANS_AND_OUTGOINGS_RESPONSE, notGuilty); } @@ -1154,7 +1154,7 @@ public void shouldPleaNotGuiltyWithoutFinancialMeansAndOutgoings() { pleaPayload.remove("outgoings"); assertThat(pleaPayload.has("financialMeans"), is(false)); assertThat(pleaPayload.has("outgoings"), is(false)); - final JsonPath response = pleadOnline(pleaPayload); + final JsonPath response = pleadOnline(pleaPayload, false); verifyResponseCase(response, TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_FINANCIAL_MEANS_CASE_RESPONSE); verifyResponseOnlinePlea(TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_FINANCIAL_MEANS_AND_OUTGOINGS_RESPONSE, notGuilty); } @@ -1165,7 +1165,7 @@ public void shouldPleaNotGuiltyWithEmptyFinancialMeansWithPublicEvent() { final JSONObject pleaPayload = getOnlinePleaPayload(notGuilty); pleaPayload.put("financialMeans", createObjectBuilder().build()); assertThat(pleaPayload.getJSONObject("financialMeans").keySet(), is(empty())); - final JsonPath response = pleadOnlineWithPublicEvent(pleaPayload); + final JsonPath response = pleadOnlineWithPublicEvent(pleaPayload, false); verifyResponseCase(response, TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_FINANCIAL_MEANS_CASE_RESPONSE); verifyResponseOnlinePlea(TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_FINANCIAL_MEANS_RESPONSE, notGuilty); } @@ -1176,7 +1176,7 @@ public void shouldPleaNotGuiltyWithEmptyFinancialMeans() { final JSONObject pleaPayload = getOnlinePleaPayload(notGuilty); pleaPayload.put("financialMeans", createObjectBuilder().build()); assertThat(pleaPayload.getJSONObject("financialMeans").keySet(), is(empty())); - final JsonPath response = pleadOnline(pleaPayload); + final JsonPath response = pleadOnline(pleaPayload, false); verifyResponseCase(response, TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_FINANCIAL_MEANS_CASE_RESPONSE); verifyResponseOnlinePlea(TEMPLATE_PLEA_NOT_GUILTY_WITHOUT_FINANCIAL_MEANS_RESPONSE, notGuilty); } @@ -1186,7 +1186,7 @@ public void shouldPleaGuiltyWithFinancialMeansWithPublicEvent() { final PleaType guilty = GUILTY; final JSONObject pleaPayload = getOnlinePleaPayload(guilty); assertThat(pleaPayload.has("financialMeans"), is(true)); - final JsonPath response = pleadOnlineWithPublicEvent(pleaPayload); + final JsonPath response = pleadOnlineWithPublicEvent(pleaPayload, true); verifyResponseCase(response, TEMPLATE_PLEA_GUILTY_WITH_FINANCIAL_MEANS_CASE_RESPONSE); verifyResponseOnlinePlea(TEMPLATE_PLEA_GUILTY_WITH_FINANCIAL_MEANS_RESPONSE, guilty); } @@ -1196,7 +1196,7 @@ public void shouldPleaGuiltyWithFinancialMeans() { final PleaType guilty = GUILTY; final JSONObject pleaPayload = getOnlinePleaPayload(guilty); assertThat(pleaPayload.has("financialMeans"), is(true)); - final JsonPath response = pleadOnline(pleaPayload); + final JsonPath response = pleadOnline(pleaPayload, true); verifyResponseCase(response, TEMPLATE_PLEA_GUILTY_WITH_FINANCIAL_MEANS_CASE_RESPONSE); verifyResponseOnlinePlea(TEMPLATE_PLEA_GUILTY_WITH_FINANCIAL_MEANS_RESPONSE, guilty); } @@ -1462,7 +1462,7 @@ private JsonPath fillTemplate(final String nameFile, final Map v return JsonPath.from(new StrSubstitutor(values).replace(getPayload(nameFile))); } - private JsonPath pleadOnlineWithPublicEvent(final JSONObject pleaPayload) { + private JsonPath pleadOnlineWithPublicEvent(final JSONObject pleaPayload, final boolean expectedReadyForDecision) { final PleaType pleaType = PleaType.valueOf(pleaPayload.getJSONArray("offences").getJSONObject(0).getString("plea")); try (final PleadOnlineHelper pleadOnlineHelper = new PleadOnlineHelper(createCasePayloadBuilder.getId())) { pleadOnlineHelper.pleadOnlinePublicEvent(stringToJsonObjectConverter.convert(pleaPayload.toString())); @@ -1470,13 +1470,14 @@ private JsonPath pleadOnlineWithPublicEvent(final JSONObject pleaPayload) { withJsonPath("defendant.offences[0].plea", is(pleaType.name())), withJsonPath("defendant.offences[0].pleaMethod", is(PleaMethod.ONLINE.name())), withJsonPath("defendant.offences[0].pleaDate", notNullValue()), - withJsonPath("onlinePleaReceived", is(true)) + withJsonPath("onlinePleaReceived", is(true)), + withJsonPath("readyForDecision", is(expectedReadyForDecision)) }; return pleadOnlineHelper.verifyPleaUpdated(createCasePayloadBuilder.getId(), pleaMatchers); } } - private JsonPath pleadOnline(final JSONObject pleaPayload) { + private JsonPath pleadOnline(final JSONObject pleaPayload, final boolean expectedReadyForDecision) { final PleaType pleaType = PleaType.valueOf(pleaPayload.getJSONArray("offences").getJSONObject(0).getString("plea")); try (final PleadOnlineHelper pleadOnlineHelper = new PleadOnlineHelper(createCasePayloadBuilder.getId())) { pleadOnlineHelper.pleadOnline(pleaPayload.toString()); @@ -1484,7 +1485,8 @@ private JsonPath pleadOnline(final JSONObject pleaPayload) { withJsonPath("defendant.offences[0].plea", is(pleaType.name())), withJsonPath("defendant.offences[0].pleaMethod", is(PleaMethod.ONLINE.name())), withJsonPath("defendant.offences[0].pleaDate", notNullValue()), - withJsonPath("onlinePleaReceived", is(true)) + withJsonPath("onlinePleaReceived", is(true)), + withJsonPath("readyForDecision", is(expectedReadyForDecision)) }; return pleadOnlineHelper.verifyPleaUpdated(createCasePayloadBuilder.getId(), pleaMatchers); } diff --git a/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/test/PressTransparencyReportIT.java b/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/test/PressTransparencyReportIT.java index 59b2a2b408..467f3fb351 100644 --- a/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/test/PressTransparencyReportIT.java +++ b/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/test/PressTransparencyReportIT.java @@ -22,6 +22,8 @@ import static uk.gov.moj.sjp.it.stub.ReferenceDataServiceStub.stubAllReferenceData; import static uk.gov.moj.sjp.it.stub.ReferenceDataServiceStub.stubAnyQueryOffences; import static uk.gov.moj.sjp.it.stub.ReferenceDataServiceStub.stubEnforcementAreaByPostcode; +import static uk.gov.moj.sjp.it.stub.CourtListPublishingServiceStub.pollCourtListPublishRequests; +import static uk.gov.moj.sjp.it.stub.CourtListPublishingServiceStub.stubPublishCourtListEndpoint; import static uk.gov.moj.sjp.it.stub.ReferenceDataServiceStub.stubProsecutorQuery; import static uk.gov.moj.sjp.it.stub.ReferenceDataServiceStub.stubRegionByPostcode; import static uk.gov.moj.sjp.it.stub.SysDocGeneratorStub.pollSysDocGenerationRequests; @@ -68,7 +70,6 @@ public class PressTransparencyReportIT extends BaseIntegrationTest { private static final String SJP_EVENTS_PRESS_TRANSPARENCY_REPORT_GENERATION_STARTED = "sjp.events.press-transparency-pdf-report-generation-started"; private static final String SJP_EVENTS_PRESS_TRANSPARENCY_REPORT_METADATA_ADDED = "sjp.events.press-transparency-pdf-report-metadata-added"; private static final String SJP_EVENTS_PRESS_TRANSPARENCY_REPORT_GENERATION_FAILED = "sjp.events.press-transparency-pdf-report-generation-failed"; - private static final String SJP_PUBLIC_EVENT_PRESS_TRANSPARENCY_REPORT_GENERATED = "public.sjp.press-transparency-report-generated"; private final UUID caseId1 = randomUUID(), caseId2 = randomUUID(); private final UUID offenceId1 = randomUUID(), offenceId2 = randomUUID(); private PressTransparencyReportHelper pressTransparencyReportHelper = new PressTransparencyReportHelper(); @@ -78,6 +79,7 @@ public void beforeEachTest() throws Exception { resetAllRequests(); cleanViewStore(); stubGenerateDocumentEndPoint(); + stubPublishCourtListEndpoint(); stubAllIndividualProsecutorsQueries(); stubAnyQueryOffences(); stubAllReferenceData(); @@ -173,7 +175,16 @@ public void shouldGeneratePressTransparencyPDFReports() throws IOException { } @Test - public void shouldGeneratePressTransparencyJsonReports() { + public void shouldGeneratePressTransparencyJsonReportsFull() { + verifyGeneratePressTransparencyJsonReport("FULL", "SJP_PRESS_LIST"); + } + + @Test + public void shouldGeneratePressTransparencyJsonReportsDelta() { + verifyGeneratePressTransparencyJsonReport("DELTA", "SJP_DELTA_PRESS_LIST"); + } + + private void verifyGeneratePressTransparencyJsonReport(final String requestType, final String expectedListType) { final CreateCase.DefendantBuilder defendant1 = defaultDefendant() .withRandomLastName(); @@ -191,34 +202,25 @@ public void shouldGeneratePressTransparencyJsonReports() { final JsonObject payload = createObjectBuilder() .add("format", "JSON") - .add("requestType", "DELTA") + .add("requestType", requestType) .add("language", "ENGLISH") .build(); final EventListener eventListener = new EventListener() .withMaxWaitTime(50000) - .subscribe( - SJP_EVENTS_PRESS_TRANSPARENCY_REPORT_REQUESTED_JSON, - SJP_PUBLIC_EVENT_PRESS_TRANSPARENCY_REPORT_GENERATED - ) + .subscribe(SJP_EVENTS_PRESS_TRANSPARENCY_REPORT_REQUESTED_JSON) .run(() -> pressTransparencyReportHelper.requestToGeneratePressTransparencyReport(payload)); final Optional transparencyReportRequestedEvent = eventListener.popEvent(SJP_EVENTS_PRESS_TRANSPARENCY_REPORT_REQUESTED_JSON); - final Optional transparencyReportStartedEvent = eventListener.popEvent(SJP_PUBLIC_EVENT_PRESS_TRANSPARENCY_REPORT_GENERATED); - assertThat(transparencyReportRequestedEvent.isPresent(), is(true)); - assertThat(transparencyReportStartedEvent.isPresent(), is(true)); + final List courtListPublishRequests = pollCourtListPublishRequests(hasSize(1)); + final JSONObject courtListPublishRequest = courtListPublishRequests.get(0); - final String pressTransparencyReportId = transparencyReportRequestedEvent - .map(requestedEvent -> requestedEvent.payloadAsJsonObject().getString("pressTransparencyReportId")) - .orElse(""); - - final JsonEnvelope transparencyReportStartedEnvelope = transparencyReportStartedEvent.get(); - final JsonObject transparencyReportStartedPayload = transparencyReportStartedEnvelope.payloadAsJsonObject(); + assertThat(courtListPublishRequest.getString("listType"), is(expectedListType)); - JsonArray readyCases = transparencyReportStartedPayload.getJsonObject("listPayload").getJsonArray("readyCases"); - assertThat(readyCases.size(), is(2)); + final JSONObject listPayload = courtListPublishRequest.getJSONObject("listPayload"); + assertThat(listPayload.getJSONArray("readyCases").length(), is(2)); } @Test diff --git a/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/test/TransparencyReportIT.java b/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/test/TransparencyReportIT.java index 22900113b1..59a159341e 100644 --- a/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/test/TransparencyReportIT.java +++ b/sjp-integration-test/src/test/java/uk/gov/moj/sjp/it/test/TransparencyReportIT.java @@ -22,6 +22,8 @@ import static uk.gov.moj.sjp.it.stub.ReferenceDataServiceStub.stubAllReferenceData; import static uk.gov.moj.sjp.it.stub.ReferenceDataServiceStub.stubAnyQueryOffences; import static uk.gov.moj.sjp.it.stub.ReferenceDataServiceStub.stubEnforcementAreaByPostcode; +import static uk.gov.moj.sjp.it.stub.CourtListPublishingServiceStub.pollCourtListPublishRequests; +import static uk.gov.moj.sjp.it.stub.CourtListPublishingServiceStub.stubPublishCourtListEndpoint; import static uk.gov.moj.sjp.it.stub.ReferenceDataServiceStub.stubProsecutorQuery; import static uk.gov.moj.sjp.it.stub.ReferenceDataServiceStub.stubRegionByPostcode; import static uk.gov.moj.sjp.it.stub.SysDocGeneratorStub.pollSysDocGenerationRequests; @@ -67,21 +69,22 @@ public class TransparencyReportIT extends BaseIntegrationTest { private static final String SJP_EVENTS_TRANSPARENCY_REPORT_GENERATION_STARTED = "sjp.events.transparency-pdf-report-generation-started"; private static final String SJP_EVENTS_TRANSPARENCY_REPORT_METADATA_ADDED = "sjp.events.transparency-pdf-report-metadata-added"; private static final String SJP_EVENTS_TRANSPARENCY_REPORT_GENERATION_FAILED = "sjp.events.transparency-pdf-report-generation-failed"; - private static final String SJP_PUBLIC_EVENT_TRANSPARENCY_REPORT_GENERATED = "public.sjp.pending-cases-public-list-generated"; public static final String TRANSPARENCY_REPORT_ID = "transparencyReportId"; private final UUID caseId1 = randomUUID(), caseId2 = randomUUID(); private final UUID offenceId1 = randomUUID(), offenceId2 = randomUUID(); - private TransparencyReportHelper transparencyReportHelper = new TransparencyReportHelper(); + private final TransparencyReportHelper transparencyReportHelper = new TransparencyReportHelper(); @BeforeEach public void beforeEachTest() throws Exception { resetAllRequests(); cleanViewStore(); stubGenerateDocumentEndPoint(); + stubPublishCourtListEndpoint(); stubAllIndividualProsecutorsQueries(); stubAnyQueryOffences(); stubAllReferenceData(); + setupIdMapperStub(); } @@ -175,7 +178,16 @@ public void shouldGenerateTransparencyPDFReports() throws IOException { } @Test - public void shouldGenerateTransparencyJsonReports() { + public void shouldGenerateTransparencyJsonReportsFull() { + verifyGenerateTransparencyJsonReport("FULL", "SJP_PUBLIC_LIST"); + } + + @Test + public void shouldGenerateTransparencyJsonReportsDelta() { + verifyGenerateTransparencyJsonReport("DELTA", "SJP_DELTA_PUBLIC_LIST"); + } + + private void verifyGenerateTransparencyJsonReport(final String requestType, final String expectedListType) { final CreateCase.DefendantBuilder defendant1 = defaultDefendant() .withRandomLastName(); @@ -193,29 +205,25 @@ public void shouldGenerateTransparencyJsonReports() { final JsonObject payload = createObjectBuilder() .add("format", "JSON") - .add("requestType", "DELTA") + .add("requestType", requestType) .add("language", "ENGLISH") .build(); final EventListener eventListener = new EventListener() .withMaxWaitTime(50000) - .subscribe( - SJP_EVENTS_TRANSPARENCY_REPORT_REQUESTED_JSON, - SJP_PUBLIC_EVENT_TRANSPARENCY_REPORT_GENERATED - ) + .subscribe(SJP_EVENTS_TRANSPARENCY_REPORT_REQUESTED_JSON) .run(() -> transparencyReportHelper.requestToGenerateTransparencyReport(payload)); final Optional transparencyReportRequestedEvent = eventListener.popEvent(SJP_EVENTS_TRANSPARENCY_REPORT_REQUESTED_JSON); - final Optional transparencyReportStartedEvent = eventListener.popEvent(SJP_PUBLIC_EVENT_TRANSPARENCY_REPORT_GENERATED); - assertThat(transparencyReportRequestedEvent.isPresent(), is(true)); - assertThat(transparencyReportStartedEvent.isPresent(), is(true)); - final JsonEnvelope transparencyReportStartedEnvelope = transparencyReportStartedEvent.get(); - final JsonObject transparencyReportStartedPayload = transparencyReportStartedEnvelope.payloadAsJsonObject(); + final List courtListPublishRequests = pollCourtListPublishRequests(hasSize(1)); + final JSONObject courtListPublishRequest = courtListPublishRequests.get(0); + + assertThat(courtListPublishRequest.getString("listType"), is(expectedListType)); - JsonArray readyCases = transparencyReportStartedPayload.getJsonObject("listPayload").getJsonArray("readyCases"); - assertThat(readyCases.size(), is(2)); + final JSONObject listPayload = courtListPublishRequest.getJSONObject("listPayload"); + assertThat(listPayload.getJSONArray("readyCases").length(), is(2)); } @Test