Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create ApiMockServer - a generic mock server to de-duplicate creation of mock servers #719

Merged
merged 18 commits into from
Mar 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class ProbationIntegrationEPFGateway(
HttpMethod.GET,
"/case-details/$id/$eventNumber",
authenticationHeader(),
UpstreamApi.NDELIUS,
UpstreamApi.EFFECTIVE_PROPOSAL_FRAMEWORK,
)

return when (result) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ enum class UpstreamApi {
PROBATION_OFFENDER_SEARCH,
NDELIUS,
ASSESS_RISKS_AND_NEEDS,
EFFECTIVE_PROPOSAL_FRAMEWORK,
ADJUDICATIONS,
CVL,
CASE_NOTES,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import org.springframework.http.HttpMethod
import org.springframework.http.HttpStatus
import org.springframework.web.reactive.function.client.WebClientResponseException
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.WebClientWrapper.WebClientWrapperResponse
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.GenericApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.TestApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError
import java.io.File
Expand All @@ -35,7 +35,7 @@ data class TestDomainModel(

class WebClientWrapperTest :
DescribeSpec({
val mockServer = GenericApiMockServer()
val mockServer = TestApiMockServer()
val id = "ABC1234"
val headers = mapOf("foo" to "bar")

Expand Down Expand Up @@ -125,7 +125,7 @@ class WebClientWrapperTest :
{
"sourceName": "Paul"
},
{
{
"sourceName": "Paul"
}
]
Expand Down Expand Up @@ -154,7 +154,7 @@ class WebClientWrapperTest :
{
"sourceName": "Paul"
},
{
{
"sourceName": "Paul"
}
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean
import org.springframework.web.reactive.function.client.WebClientResponseException
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.AdjudicationsGateway
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.HmppsAuthGateway
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.AdjudicationsApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.ApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.HmppsAuthMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi

@ActiveProfiles("test")
@ContextConfiguration(
Expand All @@ -28,7 +29,9 @@ class AdjudicationsGatewayTest(
val adjudicationsGateway: AdjudicationsGateway,
) : DescribeSpec(
{
val adjudicationsApiMockServer = AdjudicationsApiMockServer()
val id = "123"
val path = "/reported-adjudications/prisoner/$id"
val adjudicationsApiMockServer = ApiMockServer.create(UpstreamApi.ADJUDICATIONS)
beforeEach {
adjudicationsApiMockServer.start()

Expand All @@ -48,7 +51,7 @@ class AdjudicationsGatewayTest(
}

it("upstream API returns an error, throw exception") {
adjudicationsApiMockServer.stubGetReportedAdjudicationsForPerson("123", "", HttpStatus.BAD_REQUEST)
adjudicationsApiMockServer.stubForGet(path, "", HttpStatus.BAD_REQUEST)
val response =
shouldThrow<WebClientResponseException> {
adjudicationsGateway.getReportedAdjudicationsForPerson(id = "123")
Expand All @@ -57,8 +60,8 @@ class AdjudicationsGatewayTest(
}

it("returns adjudicationResponse") {
adjudicationsApiMockServer.stubGetReportedAdjudicationsForPerson(
"123",
adjudicationsApiMockServer.stubForGet(
path,
"""
[
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ import org.springframework.test.context.ContextConfiguration
import org.springframework.test.context.bean.override.mockito.MockitoBean
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.AssessRisksAndNeedsGateway
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.HmppsAuthGateway
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.AssessRisksAndNeedsApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.ApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.HmppsAuthMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Need
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Needs
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError
import java.time.LocalDateTime

Expand All @@ -31,14 +32,15 @@ class GetNeedsForPersonTest(
val assessRisksAndNeedsGateway: AssessRisksAndNeedsGateway,
) : DescribeSpec(
{
val assessRisksAndNeedsApiMockServer = AssessRisksAndNeedsApiMockServer()
val deliusCrn = "X777776"
val path = "/needs/crn/$deliusCrn"
val assessRisksAndNeedsApiMockServer = ApiMockServer.create(UpstreamApi.ASSESS_RISKS_AND_NEEDS)

beforeEach {
assessRisksAndNeedsApiMockServer.start()
Mockito.reset(hmppsAuthGateway)
assessRisksAndNeedsApiMockServer.stubGetNeedsForPerson(
deliusCrn,
assessRisksAndNeedsApiMockServer.stubForGet(
path,
"""
{
"assessedOn": "2023-02-13T12:43:38",
Expand Down Expand Up @@ -110,8 +112,8 @@ class GetNeedsForPersonTest(
}

it("returns an empty list when a needs section has no data") {
assessRisksAndNeedsApiMockServer.stubGetNeedsForPerson(
deliusCrn,
assessRisksAndNeedsApiMockServer.stubForGet(
path,
"""
{
"assessedOn": "2023-02-13T12:43:38",
Expand Down Expand Up @@ -146,7 +148,7 @@ class GetNeedsForPersonTest(
}

it("returns an error when 404 NOT FOUND is returned because no person is found") {
assessRisksAndNeedsApiMockServer.stubGetNeedsForPerson(deliusCrn, "", HttpStatus.NOT_FOUND)
assessRisksAndNeedsApiMockServer.stubForGet(path, "", HttpStatus.NOT_FOUND)

val response = assessRisksAndNeedsGateway.getNeedsForPerson(deliusCrn)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,14 @@ import org.springframework.test.context.ContextConfiguration
import org.springframework.test.context.bean.override.mockito.MockitoBean
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.AssessRisksAndNeedsGateway
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.HmppsAuthGateway
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.AssessRisksAndNeedsApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.ApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.HmppsAuthMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.GeneralPredictor
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.GroupReconviction
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskOfSeriousRecidivism
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskPredictorScore
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.SexualPredictor
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.ViolencePredictor
import java.time.LocalDateTime
Expand All @@ -35,14 +36,15 @@ class GetRiskPredictorScoresForPersonTest(
val assessRisksAndNeedsGateway: AssessRisksAndNeedsGateway,
) : DescribeSpec(
{
val assessRisksAndNeedsApiMockServer = AssessRisksAndNeedsApiMockServer()
val deliusCrn = "X777776"
val path = "/risks/crn/$deliusCrn/predictors/all"
val assessRisksAndNeedsApiMockServer = ApiMockServer.create(UpstreamApi.ASSESS_RISKS_AND_NEEDS)

beforeEach {
assessRisksAndNeedsApiMockServer.start()
Mockito.reset(hmppsAuthGateway)
assessRisksAndNeedsApiMockServer.stubGetRiskPredictorScoresForPerson(
deliusCrn,
assessRisksAndNeedsApiMockServer.stubForGet(
path,
"""
[
{
Expand Down Expand Up @@ -101,23 +103,23 @@ class GetRiskPredictorScoresForPersonTest(
}

it("returns an empty list when no risk predictor scores are found") {
assessRisksAndNeedsApiMockServer.stubGetRiskPredictorScoresForPerson(deliusCrn, "[]")
assessRisksAndNeedsApiMockServer.stubForGet(path, "[]")

val response = assessRisksAndNeedsGateway.getRiskPredictorScoresForPerson(deliusCrn)

response.data.shouldBe(emptyList())
}

it("returns a 404 NOT FOUND status code when no person is found") {
assessRisksAndNeedsApiMockServer.stubGetRiskPredictorScoresForPerson(deliusCrn, "", HttpStatus.NOT_FOUND)
assessRisksAndNeedsApiMockServer.stubForGet(path, "", HttpStatus.NOT_FOUND)

val response = assessRisksAndNeedsGateway.getRiskPredictorScoresForPerson(deliusCrn)

response.hasError(UpstreamApiError.Type.ENTITY_NOT_FOUND).shouldBeTrue()
}

it("returns a 403 FORBIDDEN status code when forbidden") {
assessRisksAndNeedsApiMockServer.stubGetRiskPredictorScoresForPerson(deliusCrn, "", HttpStatus.FORBIDDEN)
assessRisksAndNeedsApiMockServer.stubForGet(path, "", HttpStatus.FORBIDDEN)

val response = assessRisksAndNeedsGateway.getRiskPredictorScoresForPerson(deliusCrn)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,14 @@ import org.springframework.test.context.ContextConfiguration
import org.springframework.test.context.bean.override.mockito.MockitoBean
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.AssessRisksAndNeedsGateway
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.HmppsAuthGateway
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.AssessRisksAndNeedsApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.ApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.HmppsAuthMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.OtherRisks
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Risk
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskSummary
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskToSelf
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Risks
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError
import java.io.File
import java.time.LocalDateTime
Expand All @@ -35,14 +36,15 @@ class GetRisksForPersonTest(
val assessRisksAndNeedsGateway: AssessRisksAndNeedsGateway,
) : DescribeSpec(
{
val assessRisksAndNeedsApiMockServer = AssessRisksAndNeedsApiMockServer()
val deliusCrn = "X777776"
val path = "/risks/crn/$deliusCrn"
val assessRisksAndNeedsApiMockServer = ApiMockServer.create(UpstreamApi.ASSESS_RISKS_AND_NEEDS)

beforeEach {
assessRisksAndNeedsApiMockServer.start()
Mockito.reset(hmppsAuthGateway)
assessRisksAndNeedsApiMockServer.stubGetRisksForPerson(
deliusCrn,
assessRisksAndNeedsApiMockServer.stubForGet(
path,
File(
"src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/assessrisksandneeds/fixtures/GetRisksResponse.json",
).readText(),
Expand Down Expand Up @@ -148,7 +150,7 @@ class GetRisksForPersonTest(
}

it("returns a 404 NOT FOUND status code when no person is found") {
assessRisksAndNeedsApiMockServer.stubGetRisksForPerson(deliusCrn, "", HttpStatus.NOT_FOUND)
assessRisksAndNeedsApiMockServer.stubForGet(path, "", HttpStatus.NOT_FOUND)

val response = assessRisksAndNeedsGateway.getRiskSeriousHarmForPerson(deliusCrn)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean
import org.springframework.web.reactive.function.client.WebClientResponseException
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.CaseNotesGateway
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.HmppsAuthGateway
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.CaseNotesApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.ApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.HmppsAuthMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.filters.CaseNoteFilter
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi
Expand All @@ -34,8 +34,10 @@ class CaseNotesGatewayTest(
private val caseNotesGateway: CaseNotesGateway,
) : DescribeSpec(
{
val id = "123"
val pathNoParams = "/case-notes/$id"
val caseNotesApiMockServer = ApiMockServer.create(UpstreamApi.CASE_NOTES)

val caseNotesApiMockServer = CaseNotesApiMockServer()
beforeEach {
caseNotesApiMockServer.start()

Expand All @@ -57,7 +59,7 @@ class CaseNotesGatewayTest(
}

it("upstream API returns an error, throw exception") {
caseNotesApiMockServer.stubGetCaseNotes("123", "", "", HttpStatus.BAD_REQUEST)
caseNotesApiMockServer.stubForGet(pathNoParams, "", HttpStatus.BAD_REQUEST)
val response =
shouldThrow<WebClientResponseException> {
caseNotesGateway.getCaseNotesForPerson(id = "123", CaseNoteFilter(hmppsId = ""))
Expand All @@ -66,7 +68,7 @@ class CaseNotesGatewayTest(
}

it("upstream API returns an forbidden error, throw forbidden exception") {
caseNotesApiMockServer.stubGetCaseNotes("123", "", "", HttpStatus.FORBIDDEN)
caseNotesApiMockServer.stubForGet(pathNoParams, "", HttpStatus.FORBIDDEN)
val response = caseNotesGateway.getCaseNotesForPerson(id = "123", CaseNoteFilter(hmppsId = ""))
response.errors.shouldHaveSize(1)
response.errors
Expand Down Expand Up @@ -144,7 +146,7 @@ class CaseNotesGatewayTest(
"empty": false
}
"""
caseNotesApiMockServer.stubGetCaseNotes("123", "", responseJson, HttpStatus.OK)
caseNotesApiMockServer.stubForGet(pathNoParams, responseJson, HttpStatus.OK)
val response = caseNotesGateway.getCaseNotesForPerson(id = "123", CaseNoteFilter(hmppsId = ""))
response.data.count().shouldBe(2)
response.data.shouldExist { it -> it.caseNoteId == "131231" }
Expand Down Expand Up @@ -217,8 +219,8 @@ class CaseNotesGatewayTest(
"empty": false
}
"""
val params = "?locationId=mockLocation&startDate=2024-01-02&endDate=2024-01-03"
caseNotesApiMockServer.stubGetCaseNotes("123", params, responseJson, HttpStatus.OK)
val pathWithParams = "/case-notes/$id?locationId=mockLocation&startDate=2024-01-02&endDate=2024-01-03"
caseNotesApiMockServer.stubForGet(pathWithParams, responseJson, HttpStatus.OK)
val response = caseNotesGateway.getCaseNotesForPerson(id = "123", filter)
response.data.count().shouldBe(2)
response.data.shouldExist { it -> it.caseNoteId == "131231" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ import org.springframework.test.context.ContextConfiguration
import org.springframework.test.context.bean.override.mockito.MockitoBean
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.HmppsAuthGateway
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.PersonalRelationshipsGateway
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.ApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.HmppsAuthMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.PersonalRelationshipsApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError

Expand All @@ -35,7 +35,7 @@ class GetContactsGatewayTest(
val page = 1
val size = 10
val pathWithQueryParams = "$getContactsPath?page=$page&size=$size"
val personalRelationshipsApiMockServer = PersonalRelationshipsApiMockServer()
val personalRelationshipsApiMockServer = ApiMockServer.create(UpstreamApi.PERSONAL_RELATIONSHIPS)

beforeEach {
personalRelationshipsApiMockServer.start()
Expand Down Expand Up @@ -124,7 +124,7 @@ class GetContactsGatewayTest(
}
""".trimIndent()

personalRelationshipsApiMockServer.stubPersonalRelationshipsApiResponse(pathWithQueryParams, body = exampleData, HttpStatus.OK)
personalRelationshipsApiMockServer.stubForGet(pathWithQueryParams, body = exampleData, HttpStatus.OK)

val response = personalRelationshipsGateway.getContacts(prisonerId, page, size)
response.data.shouldNotBeNull()
Expand All @@ -137,7 +137,7 @@ class GetContactsGatewayTest(
}

it("returns a 404 when visit is not found") {
personalRelationshipsApiMockServer.stubPersonalRelationshipsApiResponse(pathWithQueryParams, body = "", HttpStatus.NOT_FOUND)
personalRelationshipsApiMockServer.stubForGet(pathWithQueryParams, body = "", HttpStatus.NOT_FOUND)

val response = personalRelationshipsGateway.getContacts(prisonerId, page, size)
response.errors.shouldHaveSize(1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ import org.springframework.test.context.ContextConfiguration
import org.springframework.test.context.bean.override.mockito.MockitoBean
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.CreateAndVaryLicenceGateway
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.HmppsAuthGateway
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.CreateAndVaryLicenceApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.ApiMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.HmppsAuthMockServer
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError

@ActiveProfiles("test")
Expand All @@ -28,13 +29,14 @@ class GetLicenceConditionsTests(
private val createAndVaryLicenceGateway: CreateAndVaryLicenceGateway,
) : DescribeSpec(
{
val createAndVaryLicenceApiMockServer = CreateAndVaryLicenceApiMockServer()
val conditionId = 12345
val path = "/public/licences/id/$conditionId"
val createAndVaryLicenceApiMockServer = ApiMockServer.create(UpstreamApi.CVL)

beforeEach {
createAndVaryLicenceApiMockServer.start()
createAndVaryLicenceApiMockServer.stubGetLicenceConditions(
conditionId,
createAndVaryLicenceApiMockServer.stubForGet(
path,
"""
{
"conditions":
Expand Down Expand Up @@ -77,8 +79,8 @@ class GetLicenceConditionsTests(
}

it("returns an error when 404 NOT FOUND is returned") {
createAndVaryLicenceApiMockServer.stubGetLicenceConditions(
conditionId,
createAndVaryLicenceApiMockServer.stubForGet(
path,
"""
[{
"developerMessage": "cannot find person"
Expand Down
Loading