diff --git a/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/it/DailyListPayloadIT.java b/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/it/DailyListPayloadIT.java index a214f4b4b..f0bf3d2a3 100644 --- a/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/it/DailyListPayloadIT.java +++ b/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/it/DailyListPayloadIT.java @@ -39,7 +39,7 @@ public void setUp() { updateHearingSteps.whenHearingIsUpdatedForListing(); updateHearingSteps.verifyHearingAllocatedWhenQueryingFromAPIWithJmsDelay(); - dailyListPayloadSteps = new DailyListPayloadSteps(updatedHearingData); + dailyListPayloadSteps = new DailyListPayloadSteps(hearingsData, updatedHearingData); } @Test diff --git a/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/it/WeekCommencingListPayloadIT.java b/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/it/WeekCommencingListPayloadIT.java index a1e299a46..435eb7636 100644 --- a/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/it/WeekCommencingListPayloadIT.java +++ b/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/it/WeekCommencingListPayloadIT.java @@ -43,7 +43,7 @@ public void setUp() { updateHearingSteps.whenHearingIsUpdatedForListing(); updateHearingSteps.verifyHearingAllocatedWhenQueryingFromAPIWithJmsDelay(); - weekCommencingListPayloadSteps = new DailyListPayloadSteps(updatedHearingData); + weekCommencingListPayloadSteps = new DailyListPayloadSteps(hearingsData, updatedHearingData); } @Test diff --git a/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/steps/DailyListPayloadSteps.java b/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/steps/DailyListPayloadSteps.java index 65402897b..d2004d86d 100644 --- a/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/steps/DailyListPayloadSteps.java +++ b/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/steps/DailyListPayloadSteps.java @@ -13,13 +13,16 @@ import static uk.gov.moj.cpp.listing.it.util.RestPollerHelper.pollWithDelayForJms; import static uk.gov.moj.cpp.listing.utils.PropertyUtil.getBaseUri; import static uk.gov.moj.cpp.listing.utils.PropertyUtil.readConfig; +import static uk.gov.moj.cpp.listing.utils.ReferenceDataStub.stubGetProsecutorPoliceFlag; import static uk.gov.moj.cpp.listing.utils.ReferenceDataStub.stubGetReferenceDataCourtMappings; import static uk.gov.moj.cpp.listing.utils.ReferenceDataStub.stubGetReferenceDataCpCourtRooms; +import static uk.gov.moj.cpp.listing.utils.ReferenceDataStub.stubGetReferenceDataJudiciaries; import static uk.gov.moj.cpp.listing.utils.ReferenceDataStub.stubGetReferenceDataXhibitCourtRoomMappings; import static uk.gov.moj.cpp.listing.utils.ReferenceDataStub.stubOrganisationUnit; import uk.gov.moj.cpp.listing.it.AbstractIT; import uk.gov.moj.cpp.listing.steps.data.CourtCentreData; +import uk.gov.moj.cpp.listing.steps.data.HearingsData; import uk.gov.moj.cpp.listing.steps.data.UpdatedHearingData; import java.time.LocalTime; @@ -29,10 +32,12 @@ public class DailyListPayloadSteps extends AbstractIT { private static final String MEDIA_TYPE = "application/vnd.listing.search.daily.list.payload+json"; private static final String DEFAULT_DURATION_HOURS_MINS = "6:30"; private static final LocalTime DEFAULT_START_TIME = LocalTime.of(10, 0); + private static final String EXPECTED_JUDICIARY_NAME = "Recorder Ainsworth judge"; + private static final String EXPECTED_PROSECUTOR_ORGANISATION_NAME = "Transport for London"; private final UpdatedHearingData updatedHearingData; - public DailyListPayloadSteps(final UpdatedHearingData updatedHearingData) { + public DailyListPayloadSteps(final HearingsData hearingsData, final UpdatedHearingData updatedHearingData) { this.updatedHearingData = updatedHearingData; stubGetReferenceDataCourtMappings(new CourtCentreData( updatedHearingData.getCourtCentreId(), @@ -43,6 +48,8 @@ public DailyListPayloadSteps(final UpdatedHearingData updatedHearingData) { stubGetReferenceDataCpCourtRooms(updatedHearingData.getCourtRoomId(), 1970); stubGetReferenceDataXhibitCourtRoomMappings(updatedHearingData.getCourtRoomId()); stubOrganisationUnit(updatedHearingData.getCourtCentreId()); + stubGetReferenceDataJudiciaries(updatedHearingData.getJudiciary().get(0).getJudicialId()); + stubGetProsecutorPoliceFlag(hearingsData.getHearingData().get(0).getListedCases().get(0).getAuthorityId()); } public void verifyDailyListPayloadContainsHearing(final String publishCourtListType) { @@ -61,10 +68,13 @@ public void verifyDailyListPayloadContainsHearing(final String publishCourtListT withJsonPath("$.courtLists[0].crestCourtSite", notNullValue()), withJsonPath("$.courtLists[0].sittings", notNullValue()), withJsonPath("$.courtLists[0].sittings[0].sittingDate", notNullValue()), + withJsonPath("$.courtLists[0].sittings[0].judiciary[0].judiciaryName", is(EXPECTED_JUDICIARY_NAME)), withJsonPath("$.courtLists[0].sittings[0].hearings", notNullValue()), withJsonPath("$.courtLists[0].sittings[0].hearings[0].startTime", notNullValue()), withJsonPath("$.courtLists[0].sittings[0].hearings[0].hearingType.id", - is(updatedHearingData.getHearingTypData().getTypeId().toString())) + is(updatedHearingData.getHearingTypData().getTypeId().toString())), + withJsonPath("$.courtLists[0].sittings[0].hearings[0].prosecutor.organisationName", + is(EXPECTED_PROSECUTOR_ORGANISATION_NAME)) ))); } @@ -87,10 +97,13 @@ public void verifyWeekCommencingListPayloadContainsHearing(final String publishC withJsonPath("$.courtLists[0].crestCourtSite", notNullValue()), withJsonPath("$.courtLists[0].sittings", notNullValue()), withJsonPath("$.courtLists[0].sittings[0].sittingDate", notNullValue()), + withJsonPath("$.courtLists[0].sittings[0].judiciary[0].judiciaryName", is(EXPECTED_JUDICIARY_NAME)), withJsonPath("$.courtLists[0].sittings[0].hearings", notNullValue()), withJsonPath("$.courtLists[0].sittings[0].hearings[0].startTime", notNullValue()), withJsonPath("$.courtLists[0].sittings[0].hearings[0].hearingType.id", - is(updatedHearingData.getHearingTypData().getTypeId().toString())) + is(updatedHearingData.getHearingTypData().getTypeId().toString())), + withJsonPath("$.courtLists[0].sittings[0].hearings[0].prosecutor.organisationName", + is(EXPECTED_PROSECUTOR_ORGANISATION_NAME)) ))); } } diff --git a/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApi.java b/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApi.java index 023e37956..627a80017 100644 --- a/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApi.java +++ b/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApi.java @@ -26,13 +26,16 @@ import uk.gov.moj.cpp.listing.domain.CourtListType; import uk.gov.moj.cpp.listing.domain.referencedata.OrganisationUnit; import uk.gov.moj.cpp.listing.query.api.service.ReferenceDataService; +import uk.gov.moj.cpp.listing.query.document.generator.JudiciaryNameMapper; import uk.gov.moj.cpp.listing.query.document.generator.StandardPublicCourtListTemplateAssembler; import uk.gov.moj.cpp.listing.query.view.HearingQueryView; import uk.gov.moj.cpp.listing.query.view.service.ProgressionService; import java.io.IOException; import java.time.LocalDate; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; @@ -78,6 +81,15 @@ public class HearingQueryApi { public static final String CREST_COURT_SITE = "crestCourtSite"; private static final String WEEK_COMMENCING_START_DATE = "weekCommencingStartDate"; private static final String WEEK_COMMENCING_END_DATE = "weekCommencingEndDate"; + private static final String SITTINGS = "sittings"; + private static final String JUDICIARY = "judiciary"; + private static final String JUDICIAL_ID = "judicialId"; + private static final String JUDICIARY_NAME = "judiciaryName"; + private static final String JUDICIARIES = "judiciaries"; + private static final String ID = "id"; + private static final String PROSECUTOR = "prosecutor"; + private static final String PROSECUTOR_ID = "prosecutorId"; + private static final String FULL_NAME = "fullName"; @Inject private HearingQueryView hearingQueryView; @@ -104,6 +116,9 @@ public class HearingQueryApi { @Inject private JsonObjectToObjectConverter jsonObjectToObjectConverter; + @Inject + private JudiciaryNameMapper judiciaryNameMapper; + @Handles("listing.search.hearings") public JsonEnvelope searchHearings(final JsonEnvelope query) { return enrichWithApplicationTypeCode(hearingQueryView.searchHearings(query)); @@ -229,10 +244,12 @@ public JsonEnvelope getDailyList(final JsonEnvelope query) { final String welshAddress2 = courtCentreJson.getString("welshAddress2", null); final JsonObject responsePayload = response.payloadAsJsonObject(); + final Map judiciaryNamesById = resolveJudiciaryNames(responsePayload, query); + final Map prosecutorOrganisationNamesById = resolveProsecutorOrganisationNames(responsePayload, query); final JsonObjectBuilder enrichedBuilder = JsonObjects.createObjectBuilder(); responsePayload.forEach((key, value) -> { if (COURT_LISTS.equals(key)) { - enrichedBuilder.add(COURT_LISTS, enrichCourtListsWithAddress(responsePayload.getJsonArray(COURT_LISTS), address1, address2, welshAddress1, welshAddress2)); + enrichedBuilder.add(COURT_LISTS, enrichCourtListsWithAddress(responsePayload.getJsonArray(COURT_LISTS), address1, address2, welshAddress1, welshAddress2, judiciaryNamesById, prosecutorOrganisationNamesById)); } else { enrichedBuilder.add(key, value); } @@ -258,7 +275,7 @@ public JsonEnvelope getDailyList(final JsonEnvelope query) { return envelopeFrom(metadataFrom(query.metadata()).withName("listing.search.daily.list.payload"), enrichedBuilder.build()); } - private JsonArray enrichCourtListsWithAddress(final JsonArray courtLists, final String address1, final String address2, final String welshAddress1, final String welshAddress2) { + private JsonArray enrichCourtListsWithAddress(final JsonArray courtLists, final String address1, final String address2, final String welshAddress1, final String welshAddress2, final Map judiciaryNamesById, final Map prosecutorOrganisationNamesById) { final JsonArrayBuilder enrichedCourtListsBuilder = createArrayBuilder(); courtLists.getValuesAs(JsonObject.class).forEach(courtList -> { final JsonObject crestCourtSite = courtList.getJsonObject(CREST_COURT_SITE); @@ -280,6 +297,8 @@ private JsonArray enrichCourtListsWithAddress(final JsonArray courtLists, final courtList.forEach((key, value) -> { if (CREST_COURT_SITE.equals(key)) { enrichedCourtListBuilder.add(CREST_COURT_SITE, enrichedSiteBuilder.build()); + } else if (SITTINGS.equals(key)) { + enrichedCourtListBuilder.add(SITTINGS, enrichSittings(courtList.getJsonArray(SITTINGS), judiciaryNamesById, prosecutorOrganisationNamesById)); } else { enrichedCourtListBuilder.add(key, value); } @@ -289,6 +308,116 @@ private JsonArray enrichCourtListsWithAddress(final JsonArray courtLists, final return enrichedCourtListsBuilder.build(); } + private Map resolveJudiciaryNames(final JsonObject responsePayload, final JsonEnvelope query) { + if (!responsePayload.containsKey(COURT_LISTS)) { + return Map.of(); + } + + final List judicialIds = responsePayload.getJsonArray(COURT_LISTS).getValuesAs(JsonObject.class).stream() + .filter(courtList -> courtList.containsKey(SITTINGS)) + .flatMap(courtList -> courtList.getJsonArray(SITTINGS).getValuesAs(JsonObject.class).stream()) + .filter(sitting -> sitting.containsKey(JUDICIARY)) + .flatMap(sitting -> sitting.getJsonArray(JUDICIARY).getValuesAs(JsonObject.class).stream()) + .filter(judiciary -> judiciary.containsKey(JUDICIAL_ID)) + .map(judiciary -> UUID.fromString(judiciary.getString(JUDICIAL_ID))) + .distinct() + .collect(Collectors.toList()); + + if (judicialIds.isEmpty()) { + return Map.of(); + } + + final JsonObject judiciariesPayload = referenceDataService.getJudiciariesByIdList(judicialIds, query).payloadAsJsonObject(); + return judiciariesPayload.getJsonArray(JUDICIARIES).getValuesAs(JsonObject.class).stream() + .collect(Collectors.toMap(judge -> judge.getString(ID), judiciaryNameMapper::getName)); + } + + private Map resolveProsecutorOrganisationNames(final JsonObject responsePayload, final JsonEnvelope query) { + if (!responsePayload.containsKey(COURT_LISTS)) { + return Map.of(); + } + + final List prosecutorIds = responsePayload.getJsonArray(COURT_LISTS).getValuesAs(JsonObject.class).stream() + .filter(courtList -> courtList.containsKey(SITTINGS)) + .flatMap(courtList -> courtList.getJsonArray(SITTINGS).getValuesAs(JsonObject.class).stream()) + .filter(sitting -> sitting.containsKey(HEARINGS)) + .flatMap(sitting -> sitting.getJsonArray(HEARINGS).getValuesAs(JsonObject.class).stream()) + .filter(hearing -> hearing.containsKey(PROSECUTOR)) + .map(hearing -> hearing.getJsonObject(PROSECUTOR)) + .filter(prosecutor -> prosecutor.containsKey(PROSECUTOR_ID)) + .map(prosecutor -> prosecutor.getString(PROSECUTOR_ID)) + .distinct() + .collect(Collectors.toList()); + + final Map organisationNamesById = new HashMap<>(); + prosecutorIds.forEach(prosecutorId -> { + final JsonEnvelope prosecutorEnvelope = referenceDataService.getProsecutorById(prosecutorId, query); + if (!prosecutorEnvelope.payloadIsNull()) { + final JsonObject prosecutorPayload = prosecutorEnvelope.payloadAsJsonObject(); + if (prosecutorPayload.containsKey(FULL_NAME)) { + organisationNamesById.put(prosecutorId, prosecutorPayload.getString(FULL_NAME)); + } + } + }); + return organisationNamesById; + } + + private JsonArray enrichSittings(final JsonArray sittings, final Map judiciaryNamesById, final Map prosecutorOrganisationNamesById) { + final JsonArrayBuilder enrichedSittingsBuilder = createArrayBuilder(); + sittings.getValuesAs(JsonObject.class).forEach(sitting -> { + final JsonObjectBuilder enrichedSittingBuilder = JsonObjects.createObjectBuilder(); + sitting.forEach((key, value) -> { + if (JUDICIARY.equals(key)) { + enrichedSittingBuilder.add(JUDICIARY, enrichJudiciaryWithNames(sitting.getJsonArray(JUDICIARY), judiciaryNamesById)); + } else if (HEARINGS.equals(key)) { + enrichedSittingBuilder.add(HEARINGS, enrichHearingsWithProsecutorOrganisationNames(sitting.getJsonArray(HEARINGS), prosecutorOrganisationNamesById)); + } else { + enrichedSittingBuilder.add(key, value); + } + }); + enrichedSittingsBuilder.add(enrichedSittingBuilder.build()); + }); + return enrichedSittingsBuilder.build(); + } + + private JsonArray enrichHearingsWithProsecutorOrganisationNames(final JsonArray hearings, final Map prosecutorOrganisationNamesById) { + final JsonArrayBuilder enrichedHearingsBuilder = createArrayBuilder(); + hearings.getValuesAs(JsonObject.class).forEach(hearing -> { + final JsonObjectBuilder enrichedHearingBuilder = JsonObjects.createObjectBuilder(); + hearing.forEach((key, value) -> { + if (PROSECUTOR.equals(key)) { + final JsonObject prosecutor = hearing.getJsonObject(PROSECUTOR); + final String organisationName = prosecutor.containsKey(PROSECUTOR_ID) + ? prosecutorOrganisationNamesById.get(prosecutor.getString(PROSECUTOR_ID)) + : null; + if (organisationName != null) { + enrichedHearingBuilder.add(PROSECUTOR, JsonObjects.createObjectBuilder().add(ORGANISATION_NAME, organisationName).build()); + } else { + enrichedHearingBuilder.add(key, value); + } + } else { + enrichedHearingBuilder.add(key, value); + } + }); + enrichedHearingsBuilder.add(enrichedHearingBuilder.build()); + }); + return enrichedHearingsBuilder.build(); + } + + private JsonArray enrichJudiciaryWithNames(final JsonArray judiciaryArray, final Map judiciaryNamesById) { + final JsonArrayBuilder enrichedJudiciaryBuilder = createArrayBuilder(); + judiciaryArray.getValuesAs(JsonObject.class).forEach(judiciary -> { + final JsonObjectBuilder enrichedJudiciaryEntryBuilder = JsonObjects.createObjectBuilder(); + judiciary.forEach(enrichedJudiciaryEntryBuilder::add); + final String judiciaryName = judiciaryNamesById.get(judiciary.getString(JUDICIAL_ID, null)); + if (judiciaryName != null) { + enrichedJudiciaryEntryBuilder.add(JUDICIARY_NAME, judiciaryName); + } + enrichedJudiciaryBuilder.add(enrichedJudiciaryEntryBuilder.build()); + }); + return enrichedJudiciaryBuilder.build(); + } + @Handles("listing.search.hearing") public JsonEnvelope searchForHearingById(final JsonEnvelope query) { ensureThatHearingIdIsAValidUUID(query); diff --git a/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataService.java b/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataService.java index 1639581b1..3196aad00 100644 --- a/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataService.java +++ b/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataService.java @@ -36,6 +36,7 @@ public class ReferenceDataService { private static final String HEARING_TYPE_ID = "id"; private static final String REFERENCEDATA_QUERY_HEARING_TYPES = "referencedata.query.hearing-types"; private static final String WELSH_HEARING_DESCRIPTION = "welshHearingDescription"; + private static final String REFERENCEDATA_QUERY_PROSECUTOR = "referencedata.query.prosecutor"; @Inject private Enveloper enveloper; @@ -66,6 +67,17 @@ public JsonEnvelope getJudiciariesByIdList(final List judiciaryIds, final return requester.requestAsAdmin(envelopeFrom(requestEnvelope.metadata(), requestEnvelope.payload())); } + public JsonEnvelope getProsecutorById(final String prosecutorId, final JsonEnvelope event) { + final JsonObject payload = createObjectBuilder().add("id", prosecutorId).build(); + LOGGER.info("'referencedata.query.prosecutor' request with payload {}", payload); + + final Envelope requestEnvelope = Enveloper.envelop(payload) + .withName(REFERENCEDATA_QUERY_PROSECUTOR) + .withMetadataFrom(event); + + return requester.requestAsAdmin(envelopeFrom(requestEnvelope.metadata(), requestEnvelope.payload())); + } + public Optional isHearingLanguageWelsh(final JsonEnvelope envelope, final String courtCentreId) { final JsonEnvelope courtCentreEnvelope = getCourtCentreById(UUID.fromString(courtCentreId), envelope); final JsonObject jsonObject = courtCentreEnvelope.payloadAsJsonObject(); diff --git a/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApiTest.java b/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApiTest.java index 355917da6..f26d3aa78 100644 --- a/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApiTest.java +++ b/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApiTest.java @@ -51,6 +51,7 @@ import uk.gov.moj.cpp.listing.domain.referencedata.OrganisationUnit; import uk.gov.moj.cpp.listing.query.api.service.ReferenceDataService; import uk.gov.moj.cpp.listing.query.api.util.FileUtil; +import uk.gov.moj.cpp.listing.query.document.generator.JudiciaryNameMapper; import uk.gov.moj.cpp.listing.query.document.generator.StandardPublicCourtListTemplateAssembler; import uk.gov.moj.cpp.listing.query.view.HearingQueryView; import uk.gov.moj.cpp.listing.query.view.service.ProgressionService; @@ -132,6 +133,9 @@ public class HearingQueryApiTest { @Mock private JsonObjectToObjectConverter jsonObjectToObjectConverter; + @Mock + private JudiciaryNameMapper judiciaryNameMapper; + @Captor private ArgumentCaptor requesterCaptor; @@ -868,6 +872,161 @@ public void shouldGetDailyListWithoutEndDate() { assertThat(enrichedSite.getString("courtCentreAddress2"), is(address2)); } + @Test + void shouldGetDailyListWithJudiciaryName() { + final String courtCentreId = randomUUID().toString(); + final String startDate = "2026-05-07"; + final String publishCourtListType = "FINAL"; + final String judicialId = randomUUID().toString(); + final String judiciaryName = "His Honour Judge Williams"; + + final JsonEnvelope query = envelopeFrom( + metadataBuilder() + .withId(randomUUID()) + .withName("listing.search.daily.list.payload"), + createObjectBuilder() + .add("courtCentreId", courtCentreId) + .add("startDate", startDate) + .add("publishCourtListType", publishCourtListType) + .build()); + + final JsonObject judiciaryEntry = createObjectBuilder() + .add("judicialId", judicialId) + .add("isBenchChairman", true) + .build(); + + final JsonObject sitting = createObjectBuilder() + .add("sittingDate", startDate) + .add("judiciary", createArrayBuilder().add(judiciaryEntry).build()) + .build(); + + final JsonObject courtListPayload = createObjectBuilder() + .add("courtCentreId", courtCentreId) + .add("courtLists", createArrayBuilder() + .add(createObjectBuilder() + .add("crestCourtSite", createObjectBuilder() + .add("crestCourtSiteId", "415") + .add("crestCourtSiteName", "Kingston Crown Court") + .add("courtType", "CROWN") + .build()) + .add("sittings", createArrayBuilder().add(sitting).build()) + .build()) + .build()) + .build(); + + final JsonEnvelope courtListResponse = envelopeFrom( + metadataBuilder().withId(randomUUID()).withName("listing.courtlist"), + courtListPayload); + + final JsonObject courtCentreEnvelopePayload = createObjectBuilder().add("isWelsh", false).build(); + final JsonEnvelope courtCentreEnvelope = envelopeFrom( + metadataBuilder().withId(randomUUID()).withName("referencedata.query.courtroom"), + courtCentreEnvelopePayload); + + final JsonObject judiciaryReferenceData = createObjectBuilder() + .add("judiciaries", createArrayBuilder() + .add(createObjectBuilder().add("id", judicialId).add("surname", "Williams").build()) + .build()) + .build(); + final JsonEnvelope judiciaryReferenceDataEnvelope = envelopeFrom( + metadataBuilder().withId(randomUUID()).withName("referencedata.query.judiciaries"), + judiciaryReferenceData); + + when(hearingQueryView.retrieveCourtList(any(JsonEnvelope.class))).thenReturn(courtListResponse); + when(referenceDataService.isHearingLanguageWelsh(any(), eq(courtCentreId))).thenReturn(Optional.of(false)); + when(referenceDataService.getCourtCentreById(any(UUID.class), any(JsonEnvelope.class))).thenReturn(courtCentreEnvelope); + when(referenceDataService.getJudiciariesByIdList(eq(List.of(fromString(judicialId))), any(JsonEnvelope.class))).thenReturn(judiciaryReferenceDataEnvelope); + when(judiciaryNameMapper.getName(any(JsonObject.class))).thenReturn(judiciaryName); + + final JsonObject resultPayload = hearingQueryApi.getDailyList(query).payloadAsJsonObject(); + + final JsonObject enrichedJudiciary = resultPayload.getJsonArray("courtLists").getJsonObject(0) + .getJsonArray("sittings").getJsonObject(0) + .getJsonArray("judiciary").getJsonObject(0); + + assertThat(enrichedJudiciary.getString("judicialId"), is(judicialId)); + assertThat(enrichedJudiciary.getString("judiciaryName"), is(judiciaryName)); + } + + @Test + void shouldGetDailyListWithProsecutorOrganisationName() { + final String courtCentreId = randomUUID().toString(); + final String startDate = "2026-05-07"; + final String publishCourtListType = "FINAL"; + final String prosecutorId = randomUUID().toString(); + final String organisationName = "Cardiff and Vale LDU"; + + final JsonEnvelope query = envelopeFrom( + metadataBuilder() + .withId(randomUUID()) + .withName("listing.search.daily.list.payload"), + createObjectBuilder() + .add("courtCentreId", courtCentreId) + .add("startDate", startDate) + .add("publishCourtListType", publishCourtListType) + .build()); + + final JsonObject hearing = createObjectBuilder() + .add("startTime", "2026-05-07T10:00:00") + .add("prosecutor", createObjectBuilder() + .add("prosecutorId", prosecutorId) + .add("prosecutorCode", "CPS-EM") + .build()) + .build(); + + final JsonObject sitting = createObjectBuilder() + .add("sittingDate", startDate) + .add("judiciary", createArrayBuilder().build()) + .add("hearings", createArrayBuilder().add(hearing).build()) + .build(); + + final JsonObject courtListPayload = createObjectBuilder() + .add("courtCentreId", courtCentreId) + .add("courtLists", createArrayBuilder() + .add(createObjectBuilder() + .add("crestCourtSite", createObjectBuilder() + .add("crestCourtSiteId", "415") + .add("crestCourtSiteName", "Kingston Crown Court") + .add("courtType", "CROWN") + .build()) + .add("sittings", createArrayBuilder().add(sitting).build()) + .build()) + .build()) + .build(); + + final JsonEnvelope courtListResponse = envelopeFrom( + metadataBuilder().withId(randomUUID()).withName("listing.courtlist"), + courtListPayload); + + final JsonObject courtCentreEnvelopePayload = createObjectBuilder().add("isWelsh", false).build(); + final JsonEnvelope courtCentreEnvelope = envelopeFrom( + metadataBuilder().withId(randomUUID()).withName("referencedata.query.courtroom"), + courtCentreEnvelopePayload); + + final JsonObject prosecutorReferenceData = createObjectBuilder() + .add("id", prosecutorId) + .add("fullName", organisationName) + .build(); + final JsonEnvelope prosecutorReferenceDataEnvelope = envelopeFrom( + metadataBuilder().withId(randomUUID()).withName("referencedata.query.prosecutor"), + prosecutorReferenceData); + + when(hearingQueryView.retrieveCourtList(any(JsonEnvelope.class))).thenReturn(courtListResponse); + when(referenceDataService.isHearingLanguageWelsh(any(), eq(courtCentreId))).thenReturn(Optional.of(false)); + when(referenceDataService.getCourtCentreById(any(UUID.class), any(JsonEnvelope.class))).thenReturn(courtCentreEnvelope); + when(referenceDataService.getProsecutorById(eq(prosecutorId), any(JsonEnvelope.class))).thenReturn(prosecutorReferenceDataEnvelope); + + final JsonObject resultPayload = hearingQueryApi.getDailyList(query).payloadAsJsonObject(); + + final JsonObject enrichedHearing = resultPayload.getJsonArray("courtLists").getJsonObject(0) + .getJsonArray("sittings").getJsonObject(0) + .getJsonArray("hearings").getJsonObject(0); + + final JsonObject enrichedProsecutor = enrichedHearing.getJsonObject("prosecutor"); + assertThat(enrichedProsecutor.getString("organisationName"), is(organisationName)); + assertThat(enrichedProsecutor.containsKey("prosecutorId"), is(false)); + } + @Test void shouldGetDailyListWithEndDate() { final String courtCentreId = randomUUID().toString(); diff --git a/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataServiceTest.java b/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataServiceTest.java index 927668fcb..07e404009 100644 --- a/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataServiceTest.java +++ b/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataServiceTest.java @@ -96,6 +96,27 @@ public void shouldGetJudiciariesByIdList() { assertThat(requestEnvelope.metadata().name(), is("referencedata.query.judiciaries")); } + @Test + public void shouldGetProsecutorById() { + final JsonEnvelope eventEnvelope = generateEmptyEnvelope(); + final JsonEnvelope returnedResponseEnvelope = generateEmptyEnvelope(); + when(requester.requestAsAdmin(any(JsonEnvelope.class))).thenReturn(returnedResponseEnvelope); + + final String prosecutorId = randomUUID().toString(); + final JsonEnvelope responseEnvelope = referenceDataService.getProsecutorById(prosecutorId, eventEnvelope); + + verify(requester).requestAsAdmin(argumentCaptorForRequestEnvelope.capture()); + final JsonEnvelope requestEnvelope = argumentCaptorForRequestEnvelope.getValue(); + assertThat(requestEnvelope.metadata().name(), is("referencedata.query.prosecutor")); + final JsonObject expectedPayload = createObjectBuilder() + .add("id", prosecutorId) + .build(); + final JsonObject payloadOfRequestEnvelope = requestEnvelope.payloadAsJsonObject(); + assertThat(payloadOfRequestEnvelope, is(expectedPayload)); + + assertThat(responseEnvelope, is(returnedResponseEnvelope)); + } + @Test public void shouldGetIsHearingLanguageWelsh() {