feature/Filter scanned API versions based on api_enabled_versions and api_disabled_versions props; add APIUtil.versionIsAllowed check to getScannedApiVersions endpoint and comprehensive test coverage for version filtering

This commit is contained in:
hongwei 2025-12-11 18:46:36 +01:00
parent d9de077248
commit fc4585ea7d
2 changed files with 67 additions and 34 deletions

View File

@ -5,16 +5,10 @@ import code.DynamicEndpoint.DynamicEndpointSwagger
import code.accountattribute.AccountAttributeX
import code.api.Constant._
import code.api.ResourceDocs1_4_0.SwaggerDefinitionsJSON
import code.api.ResourceDocs1_4_0.SwaggerDefinitionsJSON.{
jsonDynamicResourceDoc,
_
}
import code.api.dynamic.endpoint.helper.practise.{
DynamicEndpointCodeGenerator,
PractiseEndpoint
}
import code.api.ResourceDocs1_4_0.SwaggerDefinitionsJSON.{jsonDynamicResourceDoc, _}
import code.api.dynamic.endpoint.helper.practise.{DynamicEndpointCodeGenerator, PractiseEndpoint}
import code.api.dynamic.endpoint.helper.{CompiledObjects, DynamicEndpointHelper}
import code.api.dynamic.entity.helper.{DynamicEntityHelper, DynamicEntityInfo}
import code.api.dynamic.entity.helper.DynamicEntityInfo
import code.api.util.APIUtil.{fullBoxOrException, _}
import code.api.util.ApiRole._
import code.api.util.ApiTag._
@ -31,20 +25,11 @@ import code.api.util.migration.Migration
import code.api.util.newstyle.AttributeDefinition._
import code.api.util.newstyle.Consumer._
import code.api.util.newstyle.UserCustomerLinkNewStyle.getUserCustomerLinks
import code.api.util.newstyle.{
BalanceNewStyle,
UserCustomerLinkNewStyle,
ViewNewStyle
}
import code.api.util.newstyle.{BalanceNewStyle, UserCustomerLinkNewStyle, ViewNewStyle}
import code.api.v1_2_1.{JSONFactory, PostTransactionTagJSON}
import code.api.v1_4_0.JSONFactory1_4_0
import code.api.v2_0_0.OBPAPI2_0_0.Implementations2_0_0
import code.api.v2_0_0.{
CreateEntitlementJSON,
CreateUserCustomerLinkJson,
EntitlementJSONs,
JSONFactory200
}
import code.api.v2_0_0.{CreateEntitlementJSON, CreateUserCustomerLinkJson, EntitlementJSONs, JSONFactory200}
import code.api.v2_1_0._
import code.api.v3_0_0.{CreateScopeJson, JSONFactory300}
import code.api.v3_1_0._
@ -54,15 +39,10 @@ import code.apicollection.MappedApiCollectionsProvider
import code.apicollectionendpoint.MappedApiCollectionEndpointsProvider
import code.authtypevalidation.JsonAuthTypeValidation
import code.bankconnectors.LocalMappedConnectorInternal._
import code.bankconnectors.{
Connector,
DynamicConnector,
InternalConnector,
LocalMappedConnectorInternal
}
import code.bankconnectors.{Connector, DynamicConnector, InternalConnector, LocalMappedConnectorInternal}
import code.connectormethod.{JsonConnectorMethod, JsonConnectorMethodMethodBody}
import code.consent.{ConsentStatus, Consents}
import code.dynamicEntity.{DynamicEntityCommons, ReferenceType}
import code.dynamicEntity.DynamicEntityCommons
import code.dynamicMessageDoc.JsonDynamicMessageDoc
import code.dynamicResourceDoc.JsonDynamicResourceDoc
import code.endpointMapping.EndpointMappingCommons
@ -82,10 +62,7 @@ import code.util.Helper.{MdcLoggable, ObpS, SILENCE_IS_GOLDEN, booleanToFuture}
import code.util.{Helper, JsonSchemaUtil}
import code.validation.JsonValidation
import code.views.Views
import code.webhook.{
BankAccountNotificationWebhookTrait,
SystemAccountNotificationWebhookTrait
}
import code.webhook.{BankAccountNotificationWebhookTrait, SystemAccountNotificationWebhookTrait}
import code.webuiprops.MappedWebUiPropsProvider.getWebUiPropsValue
import com.github.dwickern.macros.NameOf.nameOf
import com.networknt.schema.ValidationMessage
@ -110,10 +87,10 @@ import java.net.URLEncoder
import java.text.SimpleDateFormat
import java.util
import java.util.{Calendar, Date}
import scala.collection.JavaConverters._
import scala.collection.immutable.{List, Nil}
import scala.collection.mutable.ArrayBuffer
import scala.concurrent.Future
import scala.collection.JavaConverters._
trait APIMethods400 extends MdcLoggable {
self: RestHelper =>
@ -11796,10 +11773,10 @@ trait APIMethods400 extends MdcLoggable {
Future {
val versions: List[ScannedApiVersion] =
ApiVersion.allScannedApiVersion.asScala.toList.filter { version =>
version.urlPrefix.trim.nonEmpty
version.urlPrefix.trim.nonEmpty && APIUtil.versionIsAllowed(version)
}
(
ListResult("scanned_api_versions", versions),
ListResult("scanned_api_versions", versions),
HttpCode.`200`(cc.callContext)
)
}

View File

@ -25,6 +25,7 @@ TESOBE (http://www.tesobe.com/)
*/
package code.api.v4_0_0
import code.api.util.APIUtil
import code.api.util.ApiRole._
import code.api.v4_0_0.APIMethods400.Implementations4_0_0
import code.entitlement.Entitlement
@ -46,8 +47,63 @@ class GetScannedApiVersionsTest extends V400ServerSetup {
object VersionOfApi extends Tag(ApiVersion.v4_0_0.toString)
object ApiEndpoint extends Tag(nameOf(Implementations4_0_0.getScannedApiVersions))
feature("test props-api_disabled_versions, Get all scanned API versions should works") {
scenario("We get all the scanned API versions with disabled versions filtered out", ApiEndpoint, VersionOfApi) {
// api_disabled_versions=[OBPv3.0.0,BGv1.3]
setPropsValues("api_disabled_versions"-> "[OBPv3.0.0,BGv1.3]")
Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString)
When("We make a request v4.0.0")
val request = (v4_0_0_Request / "api" / "versions").GET
val response = makeGetRequest(request)
Then("We should get a 200")
response.code should equal(200)
val listResult = response.body.extract[ListResult[List[ScannedApiVersion]]]
val responseApiVersions = listResult.results
val scannedApiVersions = ApiVersion.allScannedApiVersion.asScala.toList.filter { version =>
version.urlPrefix.trim.nonEmpty && APIUtil.versionIsAllowed(version)
}
responseApiVersions should equal(scannedApiVersions)
// Verify that disabled versions are not included
responseApiVersions.exists(_.fullyQualifiedVersion == "OBPv3.0.0") should equal(false)
responseApiVersions.exists(_.fullyQualifiedVersion == "BGv1.3") should equal(false)
}
}
feature("test props-api_enabled_versions, Get all scanned API versions should works") {
scenario("We get all the scanned API versions with disabled versions filtered out", ApiEndpoint, VersionOfApi) {
// api_enabled_versions=[OBPv2.2.0,OBPv3.0.0,UKv2.0]
setPropsValues("api_enabled_versions"-> "[OBPv2.2.0,OBPv3.0.0,UKv2.0]")
Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString)
When("We make a request v4.0.0")
val request = (v4_0_0_Request / "api" / "versions").GET
val response = makeGetRequest(request)
Then("We should get a 200")
response.code should equal(200)
val listResult = response.body.extract[ListResult[List[ScannedApiVersion]]]
val responseApiVersions = listResult.results
val scannedApiVersions = ApiVersion.allScannedApiVersion.asScala.toList.filter { version =>
version.urlPrefix.trim.nonEmpty && APIUtil.versionIsAllowed(version)
}
responseApiVersions should equal(scannedApiVersions)
// Verify that disabled versions are not included
responseApiVersions.exists(_.fullyQualifiedVersion == "OBPv2.2.0") should equal(true)
responseApiVersions.exists(_.fullyQualifiedVersion == "OBPv3.0.0") should equal(true)
responseApiVersions.exists(_.fullyQualifiedVersion == "UKv2.0") should equal(true)
}
}
feature("Get all scanned API versions should works") {
scenario("We get all the scanned API versions", ApiEndpoint, VersionOfApi) {
Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString)
When("We make a request v4.0.0")