mirror of
https://github.com/OpenBankProject/OBP-API.git
synced 2026-02-06 11:06:49 +00:00
refactor/(api): use ApiShortVersions constant for v7.0.0 version
Replace hardcoded "v7.0.0" string with ApiShortVersions.`v7.0.0`.toString in ResourceDocMiddleware and update test files accordingly to use the constant. This ensures consistency and easier maintenance when API version references need to be updated.
This commit is contained in:
parent
558ee1d404
commit
8e52e20c86
@ -10,6 +10,7 @@ import code.api.util.newstyle.ViewNewStyle
|
||||
import code.api.util.{APIUtil, ApiRole, CallContext, NewStyle}
|
||||
import code.util.Helper.MdcLoggable
|
||||
import com.openbankproject.commons.model._
|
||||
import com.openbankproject.commons.util.ApiShortVersions
|
||||
import com.github.dwickern.macros.NameOf.nameOf
|
||||
import net.liftweb.common.{Box, Empty, Full}
|
||||
import org.http4s._
|
||||
@ -86,7 +87,7 @@ object ResourceDocMiddleware extends MdcLoggable {
|
||||
def apply(resourceDocs: ArrayBuffer[ResourceDoc]): HttpRoutes[IO] => HttpRoutes[IO] = { routes =>
|
||||
Kleisli[HttpF, Request[IO], Response[IO]] { req: Request[IO] =>
|
||||
// Build initial CallContext from request
|
||||
OptionT.liftF(Http4sCallContextBuilder.fromRequest(req, "v7.0.0")).flatMap { cc =>
|
||||
OptionT.liftF(Http4sCallContextBuilder.fromRequest(req, ApiShortVersions.`v7.0.0`.toString)).flatMap { cc =>
|
||||
ResourceDocMatcher.findResourceDoc(req.method.name, req.uri.path, resourceDocs) match {
|
||||
case Some(resourceDoc) =>
|
||||
val ccWithDoc = ResourceDocMatcher.attachToCallContext(cc, resourceDoc)
|
||||
|
||||
@ -2,6 +2,7 @@ package code.api.util.http4s
|
||||
|
||||
import cats.effect.IO
|
||||
import cats.effect.unsafe.implicits.global
|
||||
import com.openbankproject.commons.util.ApiShortVersions
|
||||
import net.liftweb.common.{Empty, Full}
|
||||
import org.http4s._
|
||||
import org.http4s.dsl.io._
|
||||
@ -23,49 +24,51 @@ import org.scalatest.{FeatureSpec, GivenWhenThen, Matchers, Tag}
|
||||
class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenWhenThen {
|
||||
|
||||
object Http4sCallContextBuilderTag extends Tag("Http4sCallContextBuilder")
|
||||
private val v700 = ApiShortVersions.`v7.0.0`.toString
|
||||
private val base = s"/obp/$v700"
|
||||
|
||||
feature("Http4sCallContextBuilder - URL extraction") {
|
||||
|
||||
scenario("Extract URL with path only", Http4sCallContextBuilderTag) {
|
||||
Given("A request with path /obp/v7.0.0/banks")
|
||||
Given(s"A request with path $base/banks")
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("URL should match the request URI")
|
||||
callContext.url should equal("/obp/v7.0.0/banks")
|
||||
callContext.url should equal(s"$base/banks")
|
||||
}
|
||||
|
||||
scenario("Extract URL with query parameters", Http4sCallContextBuilderTag) {
|
||||
Given("A request with query parameters")
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks?limit=10&offset=0")
|
||||
uri = Uri.unsafeFromString(s"$base/banks?limit=10&offset=0")
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("URL should include query parameters")
|
||||
callContext.url should equal("/obp/v7.0.0/banks?limit=10&offset=0")
|
||||
callContext.url should equal(s"$base/banks?limit=10&offset=0")
|
||||
}
|
||||
|
||||
scenario("Extract URL with path parameters", Http4sCallContextBuilderTag) {
|
||||
Given("A request with path parameters")
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks/gh.29.de/accounts/test1")
|
||||
uri = Uri.unsafeFromString(s"$base/banks/gh.29.de/accounts/test1")
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("URL should include path parameters")
|
||||
callContext.url should equal("/obp/v7.0.0/banks/gh.29.de/accounts/test1")
|
||||
callContext.url should equal(s"$base/banks/gh.29.de/accounts/test1")
|
||||
}
|
||||
}
|
||||
|
||||
@ -75,7 +78,7 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
Given("A request with multiple headers")
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
).withHeaders(
|
||||
Header.Raw(org.typelevel.ci.CIString("Content-Type"), "application/json"),
|
||||
Header.Raw(org.typelevel.ci.CIString("Accept"), "application/json"),
|
||||
@ -83,7 +86,7 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("Headers should be converted to HTTPParam list")
|
||||
callContext.requestHeaders should not be empty
|
||||
@ -96,11 +99,11 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
Given("A request with no custom headers")
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("Headers list should be empty or contain only default headers")
|
||||
// http4s may add default headers, so we just check it's a list
|
||||
@ -115,11 +118,11 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
val jsonBody = """{"name": "Test Bank", "id": "test-bank-1"}"""
|
||||
val request = Request[IO](
|
||||
method = Method.POST,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
).withEntity(jsonBody)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("Body should be extracted as Some(string)")
|
||||
callContext.httpBody should be(Some(jsonBody))
|
||||
@ -129,11 +132,11 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
Given("A GET request with no body")
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("Body should be None")
|
||||
callContext.httpBody should be(None)
|
||||
@ -144,11 +147,11 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
val jsonBody = """{"name": "Updated Bank"}"""
|
||||
val request = Request[IO](
|
||||
method = Method.PUT,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks/test-bank-1")
|
||||
uri = Uri.unsafeFromString(s"$base/banks/test-bank-1")
|
||||
).withEntity(jsonBody)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("Body should be extracted")
|
||||
callContext.httpBody should be(Some(jsonBody))
|
||||
@ -162,13 +165,13 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
val requestId = "test-correlation-id-12345"
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
).withHeaders(
|
||||
Header.Raw(org.typelevel.ci.CIString("X-Request-ID"), requestId)
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("Correlation ID should match the header value")
|
||||
callContext.correlationId should equal(requestId)
|
||||
@ -178,11 +181,11 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
Given("A request without X-Request-ID header")
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("Correlation ID should be generated (UUID format)")
|
||||
callContext.correlationId should not be empty
|
||||
@ -198,13 +201,13 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
val clientIp = "192.168.1.100"
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
).withHeaders(
|
||||
Header.Raw(org.typelevel.ci.CIString("X-Forwarded-For"), clientIp)
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("IP address should match the header value")
|
||||
callContext.ipAddress should equal(clientIp)
|
||||
@ -215,13 +218,13 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
val forwardedFor = "192.168.1.100, 10.0.0.1, 172.16.0.1"
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
).withHeaders(
|
||||
Header.Raw(org.typelevel.ci.CIString("X-Forwarded-For"), forwardedFor)
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("IP address should be the first IP in the list")
|
||||
callContext.ipAddress should equal("192.168.1.100")
|
||||
@ -231,11 +234,11 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
Given("A request without X-Forwarded-For or remote address")
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("IP address should be empty string")
|
||||
callContext.ipAddress should equal("")
|
||||
@ -249,13 +252,13 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
val token = "eyJhbGciOiJIUzI1NiJ9.eyIiOiIifQ.test"
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
).withHeaders(
|
||||
Header.Raw(org.typelevel.ci.CIString("DirectLogin"), s"token=$token")
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("DirectLogin params should contain token")
|
||||
callContext.directLoginParams should contain key "token"
|
||||
@ -267,13 +270,13 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
val token = "eyJhbGciOiJIUzI1NiJ9.eyIiOiIifQ.test"
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
).withHeaders(
|
||||
Header.Raw(org.typelevel.ci.CIString("Authorization"), s"DirectLogin token=$token")
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("DirectLogin params should contain token")
|
||||
callContext.directLoginParams should contain key "token"
|
||||
@ -287,13 +290,13 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
Given("A request with DirectLogin username and password")
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
).withHeaders(
|
||||
Header.Raw(org.typelevel.ci.CIString("DirectLogin"), """username="testuser", password="testpass", consumer_key="key123"""")
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("DirectLogin params should contain all parameters")
|
||||
callContext.directLoginParams should contain key "username"
|
||||
@ -309,13 +312,13 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
val oauthHeader = """OAuth oauth_consumer_key="consumer123", oauth_token="token456", oauth_signature="sig789""""
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
).withHeaders(
|
||||
Header.Raw(org.typelevel.ci.CIString("Authorization"), oauthHeader)
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("OAuth params should be extracted")
|
||||
callContext.oAuthParams should contain key "oauth_consumer_key"
|
||||
@ -334,13 +337,13 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
val bearerToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.test.signature"
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
).withHeaders(
|
||||
Header.Raw(org.typelevel.ci.CIString("Authorization"), s"Bearer $bearerToken")
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("Authorization header should be stored")
|
||||
callContext.authReqHeaderField should equal(Full(s"Bearer $bearerToken"))
|
||||
@ -350,11 +353,11 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
Given("A request without Authorization header")
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("Auth header field should be Empty")
|
||||
callContext.authReqHeaderField should equal(Empty)
|
||||
@ -373,40 +376,40 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
Given("A POST request")
|
||||
val request = Request[IO](
|
||||
method = Method.POST,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("Verb should be POST")
|
||||
callContext.verb should equal("POST")
|
||||
}
|
||||
|
||||
scenario("Set implementedInVersion from parameter", Http4sCallContextBuilderTag) {
|
||||
Given("A request with API version v7.0.0")
|
||||
Given(s"A request with API version $v700")
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
)
|
||||
|
||||
When("Building CallContext with version parameter")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("implementedInVersion should match the parameter")
|
||||
callContext.implementedInVersion should equal("v7.0.0")
|
||||
callContext.implementedInVersion should equal(v700)
|
||||
}
|
||||
|
||||
scenario("Set startTime to current date", Http4sCallContextBuilderTag) {
|
||||
Given("A request")
|
||||
val request = Request[IO](
|
||||
method = Method.GET,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks")
|
||||
uri = Uri.unsafeFromString(s"$base/banks")
|
||||
)
|
||||
|
||||
When("Building CallContext")
|
||||
val beforeTime = new java.util.Date()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
val afterTime = new java.util.Date()
|
||||
|
||||
Then("startTime should be set and within reasonable range")
|
||||
@ -427,7 +430,7 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
|
||||
val request = Request[IO](
|
||||
method = Method.POST,
|
||||
uri = Uri.unsafeFromString("/obp/v7.0.0/banks?limit=10")
|
||||
uri = Uri.unsafeFromString(s"$base/banks?limit=10")
|
||||
).withHeaders(
|
||||
Header.Raw(org.typelevel.ci.CIString("Content-Type"), "application/json"),
|
||||
Header.Raw(org.typelevel.ci.CIString("DirectLogin"), s"token=$token"),
|
||||
@ -436,12 +439,12 @@ class Http4sCallContextBuilderTest extends FeatureSpec with Matchers with GivenW
|
||||
).withEntity(jsonBody)
|
||||
|
||||
When("Building CallContext")
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, "v7.0.0").unsafeRunSync()
|
||||
val callContext = Http4sCallContextBuilder.fromRequest(request, v700).unsafeRunSync()
|
||||
|
||||
Then("All fields should be populated correctly")
|
||||
callContext.url should equal("/obp/v7.0.0/banks?limit=10")
|
||||
callContext.url should equal(s"$base/banks?limit=10")
|
||||
callContext.verb should equal("POST")
|
||||
callContext.implementedInVersion should equal("v7.0.0")
|
||||
callContext.implementedInVersion should equal(v700)
|
||||
callContext.correlationId should equal(correlationId)
|
||||
callContext.ipAddress should equal(clientIp)
|
||||
callContext.httpBody should be(Some(jsonBody))
|
||||
|
||||
@ -2,6 +2,7 @@ package code.api.util.http4s
|
||||
|
||||
import code.api.util.APIUtil.ResourceDoc
|
||||
import code.api.util.ApiTag.ResourceDocTag
|
||||
import com.openbankproject.commons.util.ApiShortVersions
|
||||
import com.openbankproject.commons.util.ApiVersion
|
||||
import net.liftweb.json.JsonAST.JObject
|
||||
import org.http4s._
|
||||
@ -25,6 +26,8 @@ import scala.collection.mutable.ArrayBuffer
|
||||
class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThen {
|
||||
|
||||
object ResourceDocMatcherTag extends Tag("ResourceDocMatcher")
|
||||
private val v700 = ApiShortVersions.`v7.0.0`.toString
|
||||
private val base = s"/obp/$v700"
|
||||
|
||||
// Helper to create minimal ResourceDoc for testing
|
||||
private def createResourceDoc(
|
||||
@ -56,8 +59,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
createResourceDoc("GET", "/banks", "getBanks")
|
||||
)
|
||||
|
||||
When("Matching a GET request to /obp/v7.0.0/banks")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks")
|
||||
When(s"Matching a GET request to $base/banks")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should find the matching ResourceDoc")
|
||||
@ -71,8 +74,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
createResourceDoc("POST", "/banks", "createBank")
|
||||
)
|
||||
|
||||
When("Matching a POST request to /obp/v7.0.0/banks")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks")
|
||||
When(s"Matching a POST request to $base/banks")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks")
|
||||
val result = ResourceDocMatcher.findResourceDoc("POST", path, resourceDocs)
|
||||
|
||||
Then("Should find the matching ResourceDoc")
|
||||
@ -86,8 +89,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
createResourceDoc("GET", "/management/metrics", "getMetrics")
|
||||
)
|
||||
|
||||
When("Matching a GET request to /obp/v7.0.0/management/metrics")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/management/metrics")
|
||||
When(s"Matching a GET request to $base/management/metrics")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/management/metrics")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should find the matching ResourceDoc")
|
||||
@ -101,8 +104,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
createResourceDoc("GET", "/banks", "getBanks")
|
||||
)
|
||||
|
||||
When("Matching a POST request to /obp/v7.0.0/banks")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks")
|
||||
When(s"Matching a POST request to $base/banks")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks")
|
||||
val result = ResourceDocMatcher.findResourceDoc("POST", path, resourceDocs)
|
||||
|
||||
Then("Should return None")
|
||||
@ -115,8 +118,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
createResourceDoc("GET", "/banks", "getBanks")
|
||||
)
|
||||
|
||||
When("Matching a GET request to /obp/v7.0.0/accounts")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/accounts")
|
||||
When(s"Matching a GET request to $base/accounts")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/accounts")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should return None")
|
||||
@ -132,8 +135,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
createResourceDoc("GET", "/banks/BANK_ID", "getBank")
|
||||
)
|
||||
|
||||
When("Matching a GET request to /obp/v7.0.0/banks/gh.29.de")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/gh.29.de")
|
||||
When(s"Matching a GET request to $base/banks/gh.29.de")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/gh.29.de")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should find the matching ResourceDoc")
|
||||
@ -147,8 +150,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
createResourceDoc("GET", "/banks/BANK_ID/accounts", "getBankAccounts")
|
||||
)
|
||||
|
||||
When("Matching a GET request to /obp/v7.0.0/banks/test-bank-1/accounts")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/test-bank-1/accounts")
|
||||
When(s"Matching a GET request to $base/banks/test-bank-1/accounts")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/test-bank-1/accounts")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should find the matching ResourceDoc")
|
||||
@ -160,8 +163,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
Given("A matched ResourceDoc with BANK_ID")
|
||||
val resourceDoc = createResourceDoc("GET", "/banks/BANK_ID", "getBank")
|
||||
|
||||
When("Extracting path parameters from /obp/v7.0.0/banks/gh.29.de")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/gh.29.de")
|
||||
When(s"Extracting path parameters from $base/banks/gh.29.de")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/gh.29.de")
|
||||
val params = ResourceDocMatcher.extractPathParams(path, resourceDoc)
|
||||
|
||||
Then("Should extract BANK_ID value")
|
||||
@ -178,8 +181,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
createResourceDoc("GET", "/banks/BANK_ID/accounts/ACCOUNT_ID", "getBankAccount")
|
||||
)
|
||||
|
||||
When("Matching a GET request to /obp/v7.0.0/banks/gh.29.de/accounts/test1")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/gh.29.de/accounts/test1")
|
||||
When(s"Matching a GET request to $base/banks/gh.29.de/accounts/test1")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/gh.29.de/accounts/test1")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should find the matching ResourceDoc")
|
||||
@ -191,8 +194,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
Given("A matched ResourceDoc with BANK_ID and ACCOUNT_ID")
|
||||
val resourceDoc = createResourceDoc("GET", "/banks/BANK_ID/accounts/ACCOUNT_ID", "getBankAccount")
|
||||
|
||||
When("Extracting path parameters from /obp/v7.0.0/banks/gh.29.de/accounts/test1")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/gh.29.de/accounts/test1")
|
||||
When(s"Extracting path parameters from $base/banks/gh.29.de/accounts/test1")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/gh.29.de/accounts/test1")
|
||||
val params = ResourceDocMatcher.extractPathParams(path, resourceDoc)
|
||||
|
||||
Then("Should extract both BANK_ID and ACCOUNT_ID values")
|
||||
@ -208,8 +211,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
createResourceDoc("GET", "/banks/BANK_ID/accounts/ACCOUNT_ID/transactions", "getTransactions")
|
||||
)
|
||||
|
||||
When("Matching a GET request to /obp/v7.0.0/banks/test-bank/accounts/acc-123/transactions")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/test-bank/accounts/acc-123/transactions")
|
||||
When(s"Matching a GET request to $base/banks/test-bank/accounts/acc-123/transactions")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/test-bank/accounts/acc-123/transactions")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should find the matching ResourceDoc")
|
||||
@ -226,8 +229,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
createResourceDoc("GET", "/banks/BANK_ID/accounts/ACCOUNT_ID/VIEW_ID/transactions", "getTransactionsForView")
|
||||
)
|
||||
|
||||
When("Matching a GET request to /obp/v7.0.0/banks/gh.29.de/accounts/test1/owner/transactions")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/gh.29.de/accounts/test1/owner/transactions")
|
||||
When(s"Matching a GET request to $base/banks/gh.29.de/accounts/test1/owner/transactions")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/gh.29.de/accounts/test1/owner/transactions")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should find the matching ResourceDoc")
|
||||
@ -239,8 +242,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
Given("A matched ResourceDoc with BANK_ID, ACCOUNT_ID and VIEW_ID")
|
||||
val resourceDoc = createResourceDoc("GET", "/banks/BANK_ID/accounts/ACCOUNT_ID/VIEW_ID/transactions", "getTransactionsForView")
|
||||
|
||||
When("Extracting path parameters from /obp/v7.0.0/banks/gh.29.de/accounts/test1/owner/transactions")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/gh.29.de/accounts/test1/owner/transactions")
|
||||
When(s"Extracting path parameters from $base/banks/gh.29.de/accounts/test1/owner/transactions")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/gh.29.de/accounts/test1/owner/transactions")
|
||||
val params = ResourceDocMatcher.extractPathParams(path, resourceDoc)
|
||||
|
||||
Then("Should extract all three parameter values")
|
||||
@ -258,8 +261,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
createResourceDoc("GET", "/banks/BANK_ID/accounts/ACCOUNT_ID/VIEW_ID/account", "getAccountForView")
|
||||
)
|
||||
|
||||
When("Matching a GET request to /obp/v7.0.0/banks/test-bank/accounts/acc-1/public/account")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/test-bank/accounts/acc-1/public/account")
|
||||
When(s"Matching a GET request to $base/banks/test-bank/accounts/acc-1/public/account")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/test-bank/accounts/acc-1/public/account")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should find the matching ResourceDoc")
|
||||
@ -277,7 +280,7 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
)
|
||||
|
||||
When("Matching a GET request with counterparty ID")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/gh.29.de/accounts/test1/owner/counterparties/ff010868-ac7d-4f96-9fc5-70dd5757e891")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/gh.29.de/accounts/test1/owner/counterparties/ff010868-ac7d-4f96-9fc5-70dd5757e891")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should find the matching ResourceDoc")
|
||||
@ -290,7 +293,7 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
val resourceDoc = createResourceDoc("GET", "/banks/BANK_ID/accounts/ACCOUNT_ID/VIEW_ID/counterparties/COUNTERPARTY_ID", "getCounterparty")
|
||||
|
||||
When("Extracting path parameters")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/gh.29.de/accounts/test1/owner/counterparties/ff010868-ac7d-4f96-9fc5-70dd5757e891")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/gh.29.de/accounts/test1/owner/counterparties/ff010868-ac7d-4f96-9fc5-70dd5757e891")
|
||||
val params = ResourceDocMatcher.extractPathParams(path, resourceDoc)
|
||||
|
||||
Then("Should extract all parameter values including COUNTERPARTY_ID")
|
||||
@ -311,7 +314,7 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
)
|
||||
|
||||
When("Matching a DELETE request")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/management/counterparties/counterparty-123")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/management/counterparties/counterparty-123")
|
||||
val result = ResourceDocMatcher.findResourceDoc("DELETE", path, resourceDocs)
|
||||
|
||||
Then("Should find the matching ResourceDoc")
|
||||
@ -331,7 +334,7 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
)
|
||||
|
||||
When("Matching a request that doesn't match any ResourceDoc")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/accounts")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/accounts")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should return None")
|
||||
@ -344,8 +347,8 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
createResourceDoc("GET", "/banks", "getBanks")
|
||||
)
|
||||
|
||||
When("Matching a DELETE request to /obp/v7.0.0/banks")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks")
|
||||
When(s"Matching a DELETE request to $base/banks")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks")
|
||||
val result = ResourceDocMatcher.findResourceDoc("DELETE", path, resourceDocs)
|
||||
|
||||
Then("Should return None")
|
||||
@ -359,7 +362,7 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
)
|
||||
|
||||
When("Matching a request with different segment count")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/gh.29.de")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/gh.29.de")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should return None")
|
||||
@ -373,7 +376,7 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
)
|
||||
|
||||
When("Matching a request with different literal segment")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/gh.29.de/transactions")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/gh.29.de/transactions")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should return None")
|
||||
@ -388,7 +391,7 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
val resourceDoc = createResourceDoc("GET", "/banks", "getBanks")
|
||||
|
||||
When("Extracting path parameters")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks")
|
||||
val params = ResourceDocMatcher.extractPathParams(path, resourceDoc)
|
||||
|
||||
Then("Should return empty map")
|
||||
@ -400,7 +403,7 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
val resourceDoc = createResourceDoc("GET", "/banks/BANK_ID", "getBank")
|
||||
|
||||
When("Extracting path parameters with special characters")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/gh.29.de-test_bank")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/gh.29.de-test_bank")
|
||||
val params = ResourceDocMatcher.extractPathParams(path, resourceDoc)
|
||||
|
||||
Then("Should extract the full value including special characters")
|
||||
@ -413,7 +416,7 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
val resourceDoc = createResourceDoc("GET", "/banks/BANK_ID", "getBank")
|
||||
|
||||
When("Extracting parameters from path with different segment count")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/accounts")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/accounts")
|
||||
val params = ResourceDocMatcher.extractPathParams(path, resourceDoc)
|
||||
|
||||
Then("Should return empty map due to segment count mismatch")
|
||||
@ -458,9 +461,9 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
val resourceDoc = createResourceDoc("GET", "/banks", "getBanks")
|
||||
val originalContext = code.api.util.CallContext(
|
||||
correlationId = "test-correlation-id",
|
||||
url = "/obp/v7.0.0/banks",
|
||||
url = s"$base/banks",
|
||||
verb = "GET",
|
||||
implementedInVersion = "v7.0.0"
|
||||
implementedInVersion = v700
|
||||
)
|
||||
|
||||
When("Attaching ResourceDoc to CallContext")
|
||||
@ -486,7 +489,7 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
)
|
||||
|
||||
When("Matching a specific request")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks/gh.29.de/accounts")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks/gh.29.de/accounts")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should select the most specific matching ResourceDoc")
|
||||
@ -502,7 +505,7 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
)
|
||||
|
||||
When("Matching a request")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should return the first matching ResourceDoc")
|
||||
@ -520,7 +523,7 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
)
|
||||
|
||||
When("Matching with lowercase get")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/banks")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/banks")
|
||||
val result = ResourceDocMatcher.findResourceDoc("get", path, resourceDocs)
|
||||
|
||||
Then("Should find the matching ResourceDoc")
|
||||
@ -535,7 +538,7 @@ class ResourceDocMatcherTest extends FeatureSpec with Matchers with GivenWhenThe
|
||||
)
|
||||
|
||||
When("Matching with different case /Banks")
|
||||
val path = Uri.Path.unsafeFromString("/obp/v7.0.0/Banks")
|
||||
val path = Uri.Path.unsafeFromString(s"$base/Banks")
|
||||
val result = ResourceDocMatcher.findResourceDoc("GET", path, resourceDocs)
|
||||
|
||||
Then("Should not match (case-sensitive)")
|
||||
|
||||
Loading…
Reference in New Issue
Block a user