diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/locationsinsideprison/api/LocationsInsidePrisonAPIClient.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/locationsinsideprison/api/LocationsInsidePrisonAPIClient.kt index 967a140957..14d6b1bfc3 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/locationsinsideprison/api/LocationsInsidePrisonAPIClient.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/locationsinsideprison/api/LocationsInsidePrisonAPIClient.kt @@ -10,6 +10,7 @@ import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.RetryApi import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.locationsinsideprison.model.Location import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.locationsinsideprison.model.ServiceUsingLocationDto.ServiceType import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.api.typeReference +import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.model.LocationGroup import java.util.* @Service @@ -58,4 +59,15 @@ class LocationsInsidePrisonAPIClient( .bodyToMono(typeReference>()) .retryWhen(backoffSpec.withRetryContext(Context.of("api", "locations-inside-prison-api", "path", "/locations/prison/{prisonCode}/non-residential-usage-type/{usageType}"))) .awaitSingle() + + suspend fun getLocationGroups(prisonCode: String): List = locationsInsidePrisonApiWebClient.get() + .uri { uriBuilder: UriBuilder -> + uriBuilder + .path("/locations/prison/{prisonCode}/groups") + .build(prisonCode) + } + .retrieve() + .bodyToMono(typeReference>()) + .retryWhen(backoffSpec.withRetryContext(Context.of("api", "locations-inside-prison-api", "path", "/locations/prison/{prisonCode}/groups"))) + .awaitSingle() } diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/prisonapi/api/PrisonApiClient.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/prisonapi/api/PrisonApiClient.kt index 3821065820..f7fb97824e 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/prisonapi/api/PrisonApiClient.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/prisonapi/api/PrisonApiClient.kt @@ -15,7 +15,6 @@ import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.RetryApi import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.maybeQueryParam import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.model.InmateDetail import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.model.Location -import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.model.LocationGroup import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.overrides.Education import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.overrides.LocationSummary import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.overrides.Movement @@ -208,16 +207,6 @@ class PrisonApiClient( .bodyToMono(typeReference>()) .retryWhen(backoffSpec.withRetryContext(Context.of("api", "prison-api", "path", "/api/agencies/{agencyId}/locations/type/{type}"))) - fun getLocationGroups(agencyId: String): Mono> = prisonApiWebClient.get() - .uri { uriBuilder: UriBuilder -> - uriBuilder - .path("/api/agencies/{agencyId}/locations/groups") - .build(agencyId) - } - .retrieve() - .bodyToMono(typeReference>()) - .retryWhen(backoffSpec.withRetryContext(Context.of("api", "prison-api", "path", "/api/agencies/{agencyId}/locations/groups"))) - suspend fun getEventLocationsForPrison(prisonCode: String): PrisonLocations = getEventLocationsAsync(prisonCode).associateBy(Location::locationId) fun getReferenceCode(domain: String, code: String): Mono = prisonApiWebClient.get() diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/resource/LocationController.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/resource/LocationController.kt index 3fccd51684..883f8977dd 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/resource/LocationController.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/resource/LocationController.kt @@ -134,7 +134,7 @@ class LocationController( @PreAuthorize("hasAnyRole('PRISON', 'ACTIVITY_ADMIN')") fun getLocationGroups( @PathVariable("prisonCode") prisonCode: String, - ): List? = locationGroupServiceSelector.getLocationGroups(prisonCode) + ): List = locationGroupServiceSelector.getLocationGroups(prisonCode) @Deprecated("Use the /prison/{prisonCode}/location-prefixes endpoint below that return location prefixes for a specified locationKey and list of sub-locations") @GetMapping( diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromLocationsInsidePrisonApiService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromLocationsInsidePrisonApiService.kt new file mode 100644 index 0000000000..6cc98f084d --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromLocationsInsidePrisonApiService.kt @@ -0,0 +1,19 @@ +package uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.service + +import kotlinx.coroutines.runBlocking +import org.springframework.stereotype.Service +import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.locationsinsideprison.api.LocationsInsidePrisonAPIClient +import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.model.Location +import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.model.LocationGroup +import java.util.function.Predicate + +@Service("defaultLocationGroupService") +class LocationGroupFromLocationsInsidePrisonApiService(private val locationsInsidePrisonApiClient: LocationsInsidePrisonAPIClient) : LocationGroupService { + + override fun getLocationGroups(prisonCode: String): List = runBlocking { locationsInsidePrisonApiClient.getLocationGroups(prisonCode) } + + override fun locationGroupFilter(prisonCode: String, groupName: String): Predicate { + val prefixToMatch = "$prisonCode-${groupName.replace('_', '-')}-" + return Predicate { it.locationPrefix?.startsWith(prefixToMatch) ?: false } + } +} diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromPrisonApiService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromPrisonApiService.kt deleted file mode 100644 index 7af709abf8..0000000000 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromPrisonApiService.kt +++ /dev/null @@ -1,18 +0,0 @@ -package uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.service - -import org.springframework.stereotype.Service -import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.api.PrisonApiClient -import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.model.Location -import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.model.LocationGroup -import java.util.function.Predicate - -@Service("defaultLocationGroupService") -class LocationGroupFromPrisonApiService(private val prisonApiClient: PrisonApiClient) : LocationGroupService { - - override fun getLocationGroups(agencyId: String): List? = prisonApiClient.getLocationGroups(agencyId).block() - - override fun locationGroupFilter(agencyId: String, groupName: String): Predicate { - val prefixToMatch = "$agencyId-${groupName.replace('_', '-')}-" - return Predicate { it.locationPrefix?.startsWith(prefixToMatch) ?: false } - } -} diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromPropertiesService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromPropertiesService.kt index 65426903e2..9501639a36 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromPropertiesService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromPropertiesService.kt @@ -18,43 +18,43 @@ class LocationGroupFromPropertiesService( ) : LocationGroupService { /** - * Return the set of Location Groups for an agency, including any nested sub-groups. + * Return the set of Location Groups for a prisonCode, including any nested sub-groups. * - * @param agencyId The agency identifier + * @param prisonCode The prison identifier * @return A list of LocationGroup, sorted by name, with each item containing its nested LocationGroups, also sorted by name. */ - override fun getLocationGroups(agencyId: String): List { + override fun getLocationGroups(prisonCode: String): List { val fullKeys = groupsProperties.stringPropertyNames() return fullKeys.asSequence() - .filter { it.startsWith(agencyId) } - .map { it.substring(agencyId.length + 1) } + .filter { it.startsWith(prisonCode) } + .map { it.substring(prisonCode.length + 1) } .filterNot { it.contains("_") } .sorted() - .map { LocationGroup(it, it, getAvailableSubGroups(agencyId, it)) } + .map { LocationGroup(it, it, getAvailableSubGroups(prisonCode, it)) } .toList() } /** - * Get the available sub-groups (sub-locations) for the named group/agency. + * Get the available sub-groups (sub-locations) for the named group/prisonCode. * - * @param agencyId The agency identifier - * @param groupName The name of a group + * @param prisonCode The prison identifier + * @param groupName The name of a group * @return Alphabetically sorted List of subgroups matching the criteria */ - private fun getAvailableSubGroups(agencyId: String, groupName: String): List { + private fun getAvailableSubGroups(prisonCode: String, groupName: String): List { val fullKeys = groupsProperties.stringPropertyNames() - val agencyAndGroupName = "${agencyId}_${groupName}_" + val prisonCodeAndGroupName = "${prisonCode}_${groupName}_" return fullKeys.asSequence() - .filter { it.startsWith(agencyAndGroupName) } - .map { it.substring(agencyAndGroupName.length) } + .filter { it.startsWith(prisonCodeAndGroupName) } + .map { it.substring(prisonCodeAndGroupName.length) } .sorted() .map { LocationGroup(it, it, emptyList()) } .toList() } - override fun locationGroupFilter(agencyId: String, groupName: String): Predicate { - val patterns = groupsProperties.getProperty("${agencyId}_$groupName") - ?: throw EntityNotFoundException("Group $groupName does not exist for agencyId $agencyId.") + override fun locationGroupFilter(prisonCode: String, groupName: String): Predicate { + val patterns = groupsProperties.getProperty("${prisonCode}_$groupName") + ?: throw EntityNotFoundException("Group $groupName does not exist for prisonCode $prisonCode.") val patternStrings = patterns.split(",") return patternStrings.asSequence() .map(Pattern::compile) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupService.kt index 9c62de6a60..3dd7ef3504 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupService.kt @@ -5,6 +5,6 @@ import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonap import java.util.function.Predicate interface LocationGroupService { - fun getLocationGroups(agencyId: String): List? - fun locationGroupFilter(agencyId: String, groupName: String): Predicate + fun getLocationGroups(prisonCode: String): List + fun locationGroupFilter(prisonCode: String, groupName: String): Predicate } diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupServiceSelector.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupServiceSelector.kt index 74de0aae71..597a7c42e9 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupServiceSelector.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupServiceSelector.kt @@ -14,17 +14,17 @@ class LocationGroupServiceSelector( @Value("\${prison-locations.using-regex-config}") private val prisonsUsingRegexConfig: String, ) : LocationGroupService { - override fun getLocationGroups(agencyId: String): List? = if (isUsingRegexConfig(agencyId)) { - overrideService.getLocationGroups(agencyId) + override fun getLocationGroups(prisonCode: String): List = if (isUsingRegexConfig(prisonCode)) { + overrideService.getLocationGroups(prisonCode) } else { - defaultService.getLocationGroups(agencyId) + defaultService.getLocationGroups(prisonCode) } - override fun locationGroupFilter(agencyId: String, groupName: String): Predicate = if (isUsingRegexConfig(agencyId)) { - overrideService.locationGroupFilter(agencyId, groupName) + override fun locationGroupFilter(prisonCode: String, groupName: String): Predicate = if (isUsingRegexConfig(prisonCode)) { + overrideService.locationGroupFilter(prisonCode, groupName) } else { - defaultService.locationGroupFilter(agencyId, groupName) + defaultService.locationGroupFilter(prisonCode, groupName) } - private fun isUsingRegexConfig(agencyId: String): Boolean = prisonsUsingRegexConfig.split(",").contains(agencyId) + private fun isUsingRegexConfig(prisonCode: String): Boolean = prisonsUsingRegexConfig.split(",").contains(prisonCode) } diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/locationsinsideprison/api/LocationsInsidePrisonAPIClientTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/locationsinsideprison/api/LocationsInsidePrisonAPIClientTest.kt index c7091d9bca..15d9cfbbb0 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/locationsinsideprison/api/LocationsInsidePrisonAPIClientTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/locationsinsideprison/api/LocationsInsidePrisonAPIClientTest.kt @@ -9,8 +9,10 @@ import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows +import org.springframework.http.HttpStatus import org.springframework.web.reactive.function.client.WebClient import org.springframework.web.reactive.function.client.WebClientRequestException +import org.springframework.web.reactive.function.client.WebClientResponseException import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.RetryApiService import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.locationsinsideprison.model.ServiceUsingLocationDto.ServiceType import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.helpers.dpsLocation @@ -64,7 +66,7 @@ class LocationsInsidePrisonAPIClientTest { } @Test - fun `should return locations for for service type`() { + fun `should return locations for service type`() { val mockLocations = mockServer.stubLocationsForServiceType() runBlocking { @@ -103,4 +105,39 @@ class LocationsInsidePrisonAPIClientTest { } } } + + @Test + fun `getLocationGroups - success`(): Unit = runBlocking { + val prisonCode = "MDI" + mockServer.stubGetLocationGroups(prisonCode, "locationsinsideprisonapi/location-groups-1.json") + val locationGroups = apiClient.getLocationGroups(prisonCode) + + assertThat(locationGroups).hasSize(1) + + locationGroups.first().apply { + assertThat(name).isEqualTo("Group Name") + assertThat(key).isEqualTo("Group key") + children.first().apply { + assertThat(name).isEqualTo("Child Group Name") + assertThat(key).isEqualTo("Child Group key") + assertThat(children).isEmpty() + } + } + + assertThat(locationGroups.first().children).hasSize(1) + } + + @Test + fun `getLocationGroups - not found`(): Unit = runBlocking { + val prisonCode = "LEI" + mockServer.stubGetLocationGroupsNotFound(prisonCode) + + val exception = assertThrows { + apiClient.getLocationGroups(prisonCode) + } + + assertThat(exception.statusCode).isEqualTo(HttpStatus.NOT_FOUND) + assertThat(exception.message).contains("404 Not Found from GET http://localhost:8093/locations/prison/LEI/groups") + assertThat(exception.responseBodyAsString).contains("Location groups not found for prison") + } } diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/prisonapi/api/PrisonApiClientTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/prisonapi/api/PrisonApiClientTest.kt index d82f986d1a..d3f8209ce7 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/prisonapi/api/PrisonApiClientTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/client/prisonapi/api/PrisonApiClientTest.kt @@ -241,24 +241,6 @@ class PrisonApiClientTest { .hasMessage("404 Not Found from GET http://localhost:8999/api/agencies/LEI/locations/type/CELL") } - @Test - fun `getLocationGroups - success`() { - val agencyId = "MDI" - prisonApiMockServer.stubGetLocationGroups(agencyId, "prisonapi/location-groups-1.json") - val locationGroups = prisonApiClient.getLocationGroups(agencyId).block()!! - assertThat(locationGroups).hasSize(1) - assertThat(locationGroups.first().children.first().name).isEqualTo("Child Group Name") - } - - @Test - fun `getLocationGroups - not found`() { - val agencyId = "LEI" - prisonApiMockServer.stubGetLocationGroupsNotFound(agencyId) - assertThatThrownBy { prisonApiClient.getLocationGroups(agencyId).block() } - .isInstanceOf(WebClientResponseException::class.java) - .hasMessage("404 Not Found from GET http://localhost:8999/api/agencies/LEI/locations/groups") - } - @Test fun `getStudyArea - success`() { prisonApiMockServer.stubGetReferenceCode("STUDY_AREA", "ENGLA", "prisonapi/study-area-code-ENGLA.json") diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/integration/LocationIntegrationTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/integration/LocationIntegrationTest.kt index a59e51a060..a194cd32a7 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/integration/LocationIntegrationTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/integration/LocationIntegrationTest.kt @@ -131,11 +131,11 @@ class LocationIntegrationTest : IntegrationTestBase() { } @Test - fun `location groups - success - none in properties so should fetch from prison API`() { - val result = this::class.java.getResource("/__files/prisonapi/LEI_location_groups.json")?.readText() + fun `location groups - success - none in properties so should fetch from locations inside prison API`() { + val result = this::class.java.getResource("/__files/locationsinsideprisonapi/LEI_location_groups.json")?.readText() val prisonCode = "LEI" - prisonApiMockServer.stubGetLocationGroups(prisonCode, "prisonapi/LEI_location_groups.json") + locationsInsidePrisonApiMockServer.stubGetLocationGroups(prisonCode, "locationsinsideprisonapi/LEI_location_groups.json") webTestClient.get() .uri { uriBuilder: UriBuilder -> @@ -155,8 +155,6 @@ class LocationIntegrationTest : IntegrationTestBase() { val result = this::class.java.getResource("/__files/prisonapi/location-groups-2.json")?.readText() val prisonCode = "MDI" - prisonApiMockServer.stubGetLocationGroups(prisonCode, "prisonapi/location-groups-1.json") - webTestClient.get() .uri { uriBuilder: UriBuilder -> uriBuilder @@ -174,7 +172,7 @@ class LocationIntegrationTest : IntegrationTestBase() { fun `get location groups - not found`() { val prisonCode = "XXX" - prisonApiMockServer.stubGetLocationGroupsNotFound(prisonCode) + locationsInsidePrisonApiMockServer.stubGetLocationGroupsNotFound(prisonCode) val errorResponse = webTestClient.get() .uri { uriBuilder: UriBuilder -> diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/integration/wiremock/LocationsInsidePrisonApiMockServer.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/integration/wiremock/LocationsInsidePrisonApiMockServer.kt index 836be21a0a..2c7f020637 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/integration/wiremock/LocationsInsidePrisonApiMockServer.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/integration/wiremock/LocationsInsidePrisonApiMockServer.kt @@ -122,4 +122,28 @@ class LocationsInsidePrisonApiMockServer : MockServer(8093) { return responseLocation } + + fun stubGetLocationGroups(prisonCode: String, jsonResponseFile: String) { + stubFor( + WireMock.get(WireMock.urlEqualTo("/locations/prison/$prisonCode/groups")) + .willReturn( + WireMock.aResponse() + .withHeader("Content-Type", "application/json") + .withBodyFile(jsonResponseFile) + .withStatus(200), + ), + ) + } + + fun stubGetLocationGroupsNotFound(prisonCode: String) { + stubFor( + WireMock.get(WireMock.urlEqualTo("/locations/prison/$prisonCode/groups")) + .willReturn( + WireMock.aResponse() + .withHeader("Content-Type", "application/json") + .withBodyFile("locationsinsideprisonapi/location-group-404.json") + .withStatus(404), + ), + ) + } } diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/integration/wiremock/PrisonApiMockServer.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/integration/wiremock/PrisonApiMockServer.kt index 24807c8dcd..b22f3b1cd0 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/integration/wiremock/PrisonApiMockServer.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/integration/wiremock/PrisonApiMockServer.kt @@ -297,30 +297,6 @@ class PrisonApiMockServer : MockServer(8999) { ) } - fun stubGetLocationGroups(agencyId: String, jsonResponseFile: String) { - stubFor( - WireMock.get(WireMock.urlEqualTo("/api/agencies/$agencyId/locations/groups")) - .willReturn( - WireMock.aResponse() - .withHeader("Content-Type", "application/json") - .withBodyFile(jsonResponseFile) - .withStatus(200), - ), - ) - } - - fun stubGetLocationGroupsNotFound(agencyId: String) { - stubFor( - WireMock.get(WireMock.urlEqualTo("/api/agencies/$agencyId/locations/groups")) - .willReturn( - WireMock.aResponse() - .withHeader("Content-Type", "application/json") - .withBodyFile("prisonapi/location-group-404.json") - .withStatus(404), - ), - ) - } - fun stubGetLocation(locationId: Long, jsonResponseFile: String, includeInactive: Boolean? = null) { stubFor( WireMock.get(WireMock.urlEqualTo("/api/locations/$locationId" + (includeInactive?.let { "?includeInactive=$includeInactive" } ?: ""))) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromPrisonApiServiceTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromLocationsInsidePrisonApiServiceTest.kt similarity index 57% rename from src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromPrisonApiServiceTest.kt rename to src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromLocationsInsidePrisonApiServiceTest.kt index b608d5fc9f..8cb8068df8 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromPrisonApiServiceTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsactivitiesmanagementapi/service/LocationGroupFromLocationsInsidePrisonApiServiceTest.kt @@ -1,15 +1,19 @@ package uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.service +import kotlinx.coroutines.runBlocking import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.mockito.kotlin.mock -import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.api.PrisonApiClient +import org.mockito.kotlin.verifyBlocking +import org.mockito.kotlin.whenever +import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.locationsinsideprison.api.LocationsInsidePrisonAPIClient import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.model.Location +import uk.gov.justice.digital.hmpps.hmppsactivitiesmanagementapi.client.prisonapi.model.LocationGroup -class LocationGroupFromPrisonApiServiceTest { +class LocationGroupFromLocationsInsidePrisonApiServiceTest { - private val prisonApiClient: PrisonApiClient = mock() - private val service = LocationGroupFromPrisonApiService(prisonApiClient) + private val locationsInsidePrisonApiClient: LocationsInsidePrisonAPIClient = mock() + private val service = LocationGroupFromLocationsInsidePrisonApiService(locationsInsidePrisonApiClient) private val cellA1: Location = aLocation(locationId = -320L, locationType = "CELL", description = "LEI-A-1-001", parentLocationId = -32L) @@ -27,6 +31,27 @@ class LocationGroupFromPrisonApiServiceTest { .containsExactlyInAnyOrder(cellA1, cellA3) } + @Test + fun `getLocationGroups returns groups from the API client`() { + runBlocking { + val locationGroup = LocationGroup(name = "Wing A", key = "A", children = emptyList()) + + whenever(locationsInsidePrisonApiClient.getLocationGroups("LEI")).thenReturn(listOf(locationGroup)) + + val result = service.getLocationGroups("LEI") + + assertThat(result).isNotNull + assertThat(result).hasSize(1) + + result.first().apply { + assertThat(name).isEqualTo("Wing A") + assertThat(key).isEqualTo("A") + assertThat(children).isEmpty() + } + verifyBlocking(locationsInsidePrisonApiClient) { getLocationGroups("LEI") } + } + } + private fun aLocation(locationId: Long, locationType: String, description: String, parentLocationId: Long): Location = Location( locationId = locationId, locationType = locationType, diff --git a/src/test/resources/__files/prisonapi/LEI_location_groups.json b/src/test/resources/__files/locationsinsideprisonapi/LEI_location_groups.json similarity index 100% rename from src/test/resources/__files/prisonapi/LEI_location_groups.json rename to src/test/resources/__files/locationsinsideprisonapi/LEI_location_groups.json diff --git a/src/test/resources/__files/prisonapi/location-group-404.json b/src/test/resources/__files/locationsinsideprisonapi/location-group-404.json similarity index 100% rename from src/test/resources/__files/prisonapi/location-group-404.json rename to src/test/resources/__files/locationsinsideprisonapi/location-group-404.json diff --git a/src/test/resources/__files/prisonapi/location-groups-1.json b/src/test/resources/__files/locationsinsideprisonapi/location-groups-1.json similarity index 100% rename from src/test/resources/__files/prisonapi/location-groups-1.json rename to src/test/resources/__files/locationsinsideprisonapi/location-groups-1.json