From 8e52e20c86bdd01b13dc0321fe19a25dfdaa0da7 Mon Sep 17 00:00:00 2001 From: hongwei Date: Wed, 28 Jan 2026 14:25:06 +0100 Subject: [PATCH] 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. --- .../util/http4s/ResourceDocMiddleware.scala | 3 +- .../http4s/Http4sCallContextBuilderTest.scala | 111 +++++++++--------- .../util/http4s/ResourceDocMatcherTest.scala | 93 ++++++++------- 3 files changed, 107 insertions(+), 100 deletions(-) diff --git a/obp-api/src/main/scala/code/api/util/http4s/ResourceDocMiddleware.scala b/obp-api/src/main/scala/code/api/util/http4s/ResourceDocMiddleware.scala index 78e946fb0..26fbaa18c 100644 --- a/obp-api/src/main/scala/code/api/util/http4s/ResourceDocMiddleware.scala +++ b/obp-api/src/main/scala/code/api/util/http4s/ResourceDocMiddleware.scala @@ -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) diff --git a/obp-api/src/test/scala/code/api/util/http4s/Http4sCallContextBuilderTest.scala b/obp-api/src/test/scala/code/api/util/http4s/Http4sCallContextBuilderTest.scala index d6d22baee..8c504a126 100644 --- a/obp-api/src/test/scala/code/api/util/http4s/Http4sCallContextBuilderTest.scala +++ b/obp-api/src/test/scala/code/api/util/http4s/Http4sCallContextBuilderTest.scala @@ -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)) diff --git a/obp-api/src/test/scala/code/api/util/http4s/ResourceDocMatcherTest.scala b/obp-api/src/test/scala/code/api/util/http4s/ResourceDocMatcherTest.scala index a686295aa..a2c7c5223 100644 --- a/obp-api/src/test/scala/code/api/util/http4s/ResourceDocMatcherTest.scala +++ b/obp-api/src/test/scala/code/api/util/http4s/ResourceDocMatcherTest.scala @@ -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)")