From 0bb322a8743fd3f4832f0b21f32e37fb1573cf55 Mon Sep 17 00:00:00 2001 From: hongwei Date: Thu, 13 Oct 2022 21:07:02 +0200 Subject: [PATCH 1/6] refactor/tweaked the ViewIdNotSupported error message --- obp-api/src/main/scala/code/api/util/ErrorMessages.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obp-api/src/main/scala/code/api/util/ErrorMessages.scala b/obp-api/src/main/scala/code/api/util/ErrorMessages.scala index 1f41db8ca..f7537cee8 100644 --- a/obp-api/src/main/scala/code/api/util/ErrorMessages.scala +++ b/obp-api/src/main/scala/code/api/util/ErrorMessages.scala @@ -287,7 +287,7 @@ object ErrorMessages { val CreateCardError = "OBP-30032: Could not insert the Card" val UpdateCardError = "OBP-30033: Could not update the Card" - val ViewIdNotSupported = "OBP-30034: This ViewId is do not supported. Only support four now: Owner, Accountant, Auditor, StageOne, SmallPaymentVerified, _Public." + val ViewIdNotSupported = "OBP-30034: This ViewId is do not supported. Only support four now: Owner, Accountant, Auditor, StageOne, Standard, _Public." val UserCustomerLinkNotFound = "OBP-30035: User Customer Link not found" From e8153e4b3cd45fb9f132f8246e76737990af35d5 Mon Sep 17 00:00:00 2001 From: hongwei Date: Mon, 24 Oct 2022 14:19:24 +0200 Subject: [PATCH 2/6] refactor/added the role canGetAdapterInfoAtOneBank and canGetAdapterInfo --- .../main/scala/code/api/util/ApiRole.scala | 6 ++ .../scala/code/api/v3_0_0/APIMethods300.scala | 9 +- .../scala/code/api/v3_1_0/APIMethods310.scala | 9 +- .../code/api/v3_0_0/GetAdapterInfoTest.scala | 85 +++++++++++++++++++ .../code/api/v3_1_0/GetAdapterInfoTest.scala | 32 ++++++- 5 files changed, 132 insertions(+), 9 deletions(-) create mode 100644 obp-api/src/test/scala/code/api/v3_0_0/GetAdapterInfoTest.scala diff --git a/obp-api/src/main/scala/code/api/util/ApiRole.scala b/obp-api/src/main/scala/code/api/util/ApiRole.scala index 28d98c3be..653b2d60c 100644 --- a/obp-api/src/main/scala/code/api/util/ApiRole.scala +++ b/obp-api/src/main/scala/code/api/util/ApiRole.scala @@ -355,6 +355,12 @@ object ApiRole { case class CanGetConfig(requiresBankId: Boolean = false) extends ApiRole lazy val canGetConfig = CanGetConfig() + case class CanGetAdapterInfo(requiresBankId: Boolean = false) extends ApiRole + lazy val canGetAdapterInfo = CanGetAdapterInfo() + + case class CanGetAdapterInfoAtOneBank(requiresBankId: Boolean = false) extends ApiRole + lazy val canGetAdapterInfoAtOneBank = CanGetAdapterInfoAtOneBank() + case class CanGetDatabaseInfo(requiresBankId: Boolean = false) extends ApiRole lazy val canGetDatabaseInfo = CanGetDatabaseInfo() diff --git a/obp-api/src/main/scala/code/api/v3_0_0/APIMethods300.scala b/obp-api/src/main/scala/code/api/v3_0_0/APIMethods300.scala index e47464ef3..37a3c27a7 100644 --- a/obp-api/src/main/scala/code/api/v3_0_0/APIMethods300.scala +++ b/obp-api/src/main/scala/code/api/v3_0_0/APIMethods300.scala @@ -1007,16 +1007,19 @@ trait APIMethods300 { """.stripMargin, emptyObjectJson, adapterInfoJsonV300, - List(UserNotLoggedIn, UnknownError), - List(apiTagApi, apiTagNewStyle)) + List(UserNotLoggedIn, UserHasMissingRoles, UnknownError), + List(apiTagApi, apiTagNewStyle), + Some(List(canGetAdapterInfoAtOneBank)) + ) lazy val getAdapterInfoForBank: OBPEndpoint = { case "banks" :: BankId(bankId) :: "adapter" :: Nil JsonGet _ => { cc => for { - (_, callContext) <- anonymousAccess(cc) + (Full(u), callContext) <- authenticatedAccess(cc) (_, callContext) <- NewStyle.function.getBank(bankId, callContext) + _ <- NewStyle.function.hasEntitlement(bankId.value, u.userId, ApiRole.canGetAdapterInfoAtOneBank, callContext) (ai, callContext) <- NewStyle.function.getAdapterInfo(callContext) } yield { (createAdapterInfoJson(ai), callContext) diff --git a/obp-api/src/main/scala/code/api/v3_1_0/APIMethods310.scala b/obp-api/src/main/scala/code/api/v3_1_0/APIMethods310.scala index 6c56141b7..7a4673397 100644 --- a/obp-api/src/main/scala/code/api/v3_1_0/APIMethods310.scala +++ b/obp-api/src/main/scala/code/api/v3_1_0/APIMethods310.scala @@ -1054,15 +1054,18 @@ trait APIMethods310 { """.stripMargin, emptyObjectJson, adapterInfoJsonV300, - List(UserNotLoggedIn, UnknownError), - List(apiTagApi, apiTagNewStyle)) + List(UserNotLoggedIn,UserHasMissingRoles, UnknownError), + List(apiTagApi, apiTagNewStyle), + Some(List(canGetAdapterInfo)) + ) lazy val getAdapterInfo: OBPEndpoint = { case "adapter" :: Nil JsonGet _ => { cc => for { - (_, callContext) <- anonymousAccess(cc) + (Full(u), callContext) <- authenticatedAccess(cc) + _ <- NewStyle.function.hasEntitlement("", u.userId, ApiRole.canGetAdapterInfo, callContext) (ai,_) <- NewStyle.function.getAdapterInfo(callContext) } yield { (createAdapterInfoJson(ai), HttpCode.`200`(callContext)) diff --git a/obp-api/src/test/scala/code/api/v3_0_0/GetAdapterInfoTest.scala b/obp-api/src/test/scala/code/api/v3_0_0/GetAdapterInfoTest.scala new file mode 100644 index 000000000..c3c7a1e0f --- /dev/null +++ b/obp-api/src/test/scala/code/api/v3_0_0/GetAdapterInfoTest.scala @@ -0,0 +1,85 @@ +/** +Open Bank Project - API +Copyright (C) 2011-2019, TESOBE GmbH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +Email: contact@tesobe.com +TESOBE GmbH +Osloerstrasse 16/17 +Berlin 13359, Germany + +This product includes software developed at +TESOBE (http://www.tesobe.com/) + */ +package code.api.v3_0_0 + +import code.api.util.ApiRole.canGetAdapterInfoAtOneBank +import code.api.util.ErrorMessages.{UserHasMissingRoles, UserNotLoggedIn} +import code.api.v3_0_0.OBPAPI3_0_0.Implementations3_0_0 +import code.api.util.APIUtil.OAuth._ +import code.entitlement.Entitlement +import code.setup.DefaultUsers +import com.github.dwickern.macros.NameOf.nameOf +import com.openbankproject.commons.model.ErrorMessage +import com.openbankproject.commons.util.ApiVersion +import org.scalatest.Tag + +class GetAdapterInfoTest extends V300ServerSetup with DefaultUsers { + + /** + * Test tags + * Example: To run tests with tag "getPermissions": + * mvn test -D tagsToInclude + * + * This is made possible by the scalatest maven plugin + */ + object VersionOfApi extends Tag(ApiVersion.v3_0_0.toString) + object ApiEndpoint extends Tag(nameOf(Implementations3_0_0.getAdapterInfoForBank)) + + feature("Get Adapter Info v3.1.0") + { + scenario(s"$UserNotLoggedIn error case", ApiEndpoint, VersionOfApi) { + When("We make a request v3.1.0") + val request310 = (v3_0Request /"banks"/testBankId1.value/ "adapter").GET + val response310 = makeGetRequest(request310) + Then("We should get a 401") + response310.code should equal(401) + And("error should be " + UserNotLoggedIn) + response310.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) + } + scenario(s"$UserHasMissingRoles error case", ApiEndpoint, VersionOfApi) { + When("We make a request v3.1.0") + val request310 = (v3_0Request / "banks"/testBankId1.value/ "adapter").GET <@ (user1) + val response310 = makeGetRequest(request310) + Then("We should get a 403") + response310.code should equal(403) + And("error should be " + UserHasMissingRoles + canGetAdapterInfoAtOneBank) + response310.body.extract[ErrorMessage].message contains (UserHasMissingRoles + canGetAdapterInfoAtOneBank) shouldBe (true) + } + scenario("We will try to get adapter info", ApiEndpoint, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, canGetAdapterInfoAtOneBank.toString) + When("We make a request v3.1.0") + val request310 = (v3_0Request / "banks"/testBankId1.value/ "adapter").GET <@ (user1) + val response310 = makeGetRequest(request310) + Then("We should get a 200") + response310.code should equal(200) + Then("We should get a 200") + response310.code should equal(200) + response310.body.extract[AdapterInfoJsonV300].name should equal("LocalMappedConnector") + } + } + + +} diff --git a/obp-api/src/test/scala/code/api/v3_1_0/GetAdapterInfoTest.scala b/obp-api/src/test/scala/code/api/v3_1_0/GetAdapterInfoTest.scala index d30f6c865..ed9c5ca9c 100644 --- a/obp-api/src/test/scala/code/api/v3_1_0/GetAdapterInfoTest.scala +++ b/obp-api/src/test/scala/code/api/v3_1_0/GetAdapterInfoTest.scala @@ -27,11 +27,17 @@ package code.api.v3_1_0 import com.openbankproject.commons.util.ApiVersion import code.api.v3_0_0.AdapterInfoJsonV300 +import code.api.util.APIUtil.OAuth._ +import code.api.util.ApiRole.{CanCreateAccountAttributeAtOneBank, canGetAdapterInfo} +import code.api.util.ErrorMessages.{UserHasMissingRoles, UserNotLoggedIn} +import code.setup.{APIResponse, DefaultUsers} import code.api.v3_1_0.OBPAPI3_1_0.Implementations3_1_0 +import code.entitlement.Entitlement import com.github.dwickern.macros.NameOf.nameOf +import com.openbankproject.commons.model.ErrorMessage import org.scalatest.Tag -class GetAdapterInfoTest extends V310ServerSetup { +class GetAdapterInfoTest extends V310ServerSetup with DefaultUsers { /** * Test tags @@ -45,14 +51,34 @@ class GetAdapterInfoTest extends V310ServerSetup { feature("Get Adapter Info v3.1.0") { - scenario("We will try to get adapter info", ApiEndpoint, VersionOfApi) { + scenario(s"$UserNotLoggedIn error case", ApiEndpoint, VersionOfApi) { When("We make a request v3.1.0") val request310 = (v3_1_0_Request / "adapter").GET val response310 = makeGetRequest(request310) + Then("We should get a 401") + response310.code should equal(401) + And("error should be " + UserNotLoggedIn) + response310.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) + } + scenario(s"$UserHasMissingRoles error case", ApiEndpoint, VersionOfApi) { + When("We make a request v3.1.0") + val request310 = (v3_1_0_Request / "adapter").GET <@ (user1) + val response310 = makeGetRequest(request310) + Then("We should get a 403") + response310.code should equal(403) + And("error should be " + UserHasMissingRoles + canGetAdapterInfo) + response310.body.extract[ErrorMessage].message should equal (UserHasMissingRoles + canGetAdapterInfo) + } + scenario("We will try to get adapter info", ApiEndpoint, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, canGetAdapterInfo.toString) + When("We make a request v3.1.0") + val request310 = (v3_1_0_Request / "adapter").GET <@ (user1) + val response310 = makeGetRequest(request310) + Then("We should get a 200") + response310.code should equal(200) Then("We should get a 200") response310.code should equal(200) response310.body.extract[AdapterInfoJsonV300].name should equal("LocalMappedConnector") - } } From 007cc73ed6b757126933f507088e4bfd67c18415 Mon Sep 17 00:00:00 2001 From: hongwei Date: Mon, 24 Oct 2022 16:02:06 +0200 Subject: [PATCH 3/6] feature/OBPv500 added the new version getAdapterInfo --- .../MessageDocsSwaggerDefinitions.scala | 13 +-- .../scala/code/api/util/ExampleValue.scala | 6 ++ .../scala/code/api/v5_0_0/APIMethods500.scala | 32 ++++++- .../code/api/v5_0_0/JSONFactory5.0.0.scala | 25 +++++- .../bankconnectors/LocalMappedConnector.scala | 20 +++-- .../rest/RestConnector_vMar2019.scala | 6 +- .../code/api/v5_0_0/GetAdapterInfoTest.scala | 87 +++++++++++++++++++ .../commons/model/CommonModelTrait.scala | 3 +- 8 files changed, 175 insertions(+), 17 deletions(-) create mode 100644 obp-api/src/test/scala/code/api/v5_0_0/GetAdapterInfoTest.scala diff --git a/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/MessageDocsSwaggerDefinitions.scala b/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/MessageDocsSwaggerDefinitions.scala index 51087f681..79069feb6 100644 --- a/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/MessageDocsSwaggerDefinitions.scala +++ b/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/MessageDocsSwaggerDefinitions.scala @@ -95,10 +95,11 @@ object MessageDocsSwaggerDefinitions val inboundStatusMessage = InboundStatusMessage( - source ="String", - status ="String", - errorCode ="String", - text= "String" + source = sourceExample.value, + status = statusExample.value, + errorCode = errorCodeExample.value, + text = textExample.value, + duration= Some(durationExample.value), ) val inboundStatus = Status("Status errorCode", List(inboundStatusMessage)) @@ -109,8 +110,8 @@ object MessageDocsSwaggerDefinitions errorCode ="", backendMessages = List(inboundStatusMessage), name = usernameExample.value, - version = "", - git_commit = "String", + version = versionExample.value, + git_commit = gitCommitExample.value, date = DateWithMsExampleString ) diff --git a/obp-api/src/main/scala/code/api/util/ExampleValue.scala b/obp-api/src/main/scala/code/api/util/ExampleValue.scala index e777e20c3..2d3af2e00 100644 --- a/obp-api/src/main/scala/code/api/util/ExampleValue.scala +++ b/obp-api/src/main/scala/code/api/util/ExampleValue.scala @@ -718,6 +718,12 @@ object ExampleValue { lazy val statusExample = ConnectorField(NoExampleProvided,NoDescriptionProvided) glossaryItems += makeGlossaryItem("status", statusExample) + + lazy val errorCodeExample = ConnectorField(NoExampleProvided,NoDescriptionProvided) + glossaryItems += makeGlossaryItem("errorCode", statusExample) + + lazy val textExample = ConnectorField(NoExampleProvided,NoDescriptionProvided) + glossaryItems += makeGlossaryItem("text", statusExample) lazy val canSeeTransactionBalanceExample = ConnectorField(NoExampleProvided,NoDescriptionProvided) glossaryItems += makeGlossaryItem("can_see_transaction_balance", canSeeTransactionBalanceExample) diff --git a/obp-api/src/main/scala/code/api/v5_0_0/APIMethods500.scala b/obp-api/src/main/scala/code/api/v5_0_0/APIMethods500.scala index bc65a3dac..2dd674f7c 100644 --- a/obp-api/src/main/scala/code/api/v5_0_0/APIMethods500.scala +++ b/obp-api/src/main/scala/code/api/v5_0_0/APIMethods500.scala @@ -33,7 +33,7 @@ import net.liftweb.http.rest.RestHelper import net.liftweb.json import net.liftweb.json.{Extraction, compactRender, prettyRender} import net.liftweb.util.Helpers.tryo -import net.liftweb.util.Props +import net.liftweb.util.{Helpers, Props} import java.util.concurrent.ThreadLocalRandom import code.accountattribute.AccountAttributeX @@ -1678,6 +1678,36 @@ trait APIMethods500 { } } } + + resourceDocs += ResourceDoc( + getAdapterInfo, + implementedInApiVersion, + nameOf(getAdapterInfo), + "GET", + "/adapter", + "Get Adapter Info", + s"""Get basic information about the Adapter. + | + |${authenticationRequiredMessage(false)} + | + """.stripMargin, + emptyObjectJson, + adapterInfoJsonV300, + List($UserNotLoggedIn, UserHasMissingRoles, UnknownError), + List(apiTagApi, apiTagNewStyle), + Some(List(canGetAdapterInfo)) + ) + lazy val getAdapterInfo: OBPEndpoint = { + case "adapter" :: Nil JsonGet _ => { + cc => + for { + (_, callContext) <- SS.user + (adapterInfo,_) <- NewStyle.function.getAdapterInfo(callContext) + } yield { + (JSONFactory500.createAdapterInfoJson(adapterInfo,cc.startTime.getOrElse(Helpers.now).getTime), HttpCode.`200`(callContext)) + } + } + } } } diff --git a/obp-api/src/main/scala/code/api/v5_0_0/JSONFactory5.0.0.scala b/obp-api/src/main/scala/code/api/v5_0_0/JSONFactory5.0.0.scala index 9382f09ce..8279312df 100644 --- a/obp-api/src/main/scala/code/api/v5_0_0/JSONFactory5.0.0.scala +++ b/obp-api/src/main/scala/code/api/v5_0_0/JSONFactory5.0.0.scala @@ -35,13 +35,14 @@ import code.api.v1_3_0.JSONFactory1_3_0.{cardActionsToString, createAccountJson, import code.api.v1_3_0.{PinResetJSON, ReplacementJSON} import code.api.v1_4_0.JSONFactory1_4_0.CustomerFaceImageJson import code.api.v2_1_0.CustomerCreditRatingJSON -import code.api.v3_0_0.{CustomerAttributeResponseJsonV300, JSONFactory300} +import code.api.v3_0_0.{AdapterInfoJsonV300, CustomerAttributeResponseJsonV300, JSONFactory300} import code.api.v3_1_0.{AccountAttributeResponseJson, AccountBasicV310, CustomerWithAttributesJsonV310, PhysicalCardWithAttributesJsonV310, PostConsentEntitlementJsonV310} import code.api.v4_0_0.BankAttributeBankResponseJsonV400 import code.bankattribute.BankAttribute import code.customeraccountlinks.CustomerAccountLinkTrait -import com.openbankproject.commons.model.{AccountAttribute, AccountRouting, AccountRoutingJsonV121, AmountOfMoneyJsonV121, Bank, BankAccount, CardAttribute, Customer, CustomerAttribute, PhysicalCardTrait, User, UserAuthContext, UserAuthContextUpdate, View, ViewBasic} +import com.openbankproject.commons.model.{AccountAttribute, AccountRouting, AccountRoutingJsonV121, AmountOfMoneyJsonV121, Bank, BankAccount, CardAttribute, Customer, CustomerAttribute, InboundAdapterInfoInternal, InboundStatusMessage, PhysicalCardTrait, User, UserAuthContext, UserAuthContextUpdate, View, ViewBasic} import net.liftweb.json.JsonAST.JValue +import net.liftweb.util.Helpers import scala.collection.immutable import scala.collection.immutable.List @@ -370,6 +371,15 @@ case class CustomerAccountLinksJson( links:List[CustomerAccountLinkJson] ) +case class AdapterInfoJsonV500( + name: String, + version: String, + git_commit: String, + date: String, + total_duration: String, + backend_messages: List[InboundStatusMessage], +) + object JSONFactory500 { @@ -594,6 +604,17 @@ object JSONFactory500 { def createCustomerAccountLinksJon(customerAccountLinks: List[CustomerAccountLinkTrait]): CustomerAccountLinksJson = { CustomerAccountLinksJson(customerAccountLinks.map(createCustomerAccountLinkJson)) + } + + def createAdapterInfoJson(inboundAdapterInfoInternal: InboundAdapterInfoInternal, startTime: Long): AdapterInfoJsonV500 = { + AdapterInfoJsonV500( + name = inboundAdapterInfoInternal.name, + version = inboundAdapterInfoInternal.version, + git_commit = inboundAdapterInfoInternal.git_commit, + date = inboundAdapterInfoInternal.date, + total_duration = s"${Helpers.now.getTime - startTime} ms", + backend_messages = inboundAdapterInfoInternal.backendMessages + ) } } diff --git a/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala b/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala index 6461b6553..c0b64a85a 100644 --- a/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala +++ b/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala @@ -87,14 +87,13 @@ import com.tesobe.model.UpdateBankAccount import com.twilio.Twilio import com.twilio.rest.api.v2010.account.Message import com.twilio.`type`.PhoneNumber - import net.liftweb.common._ import net.liftweb.json import net.liftweb.json.JsonAST.JField import net.liftweb.json.{JArray, JBool, JInt, JObject, JString, JValue} import net.liftweb.mapper.{By, _} import net.liftweb.util.Helpers.{hours, now, time, tryo} -import net.liftweb.util.Mailer +import net.liftweb.util.{Helpers, Mailer} import net.liftweb.util.Mailer.{From, PlainMailBodyType, Subject, To} import org.iban4j import org.iban4j.{CountryCode, IbanFormat} @@ -126,15 +125,26 @@ object LocalMappedConnector extends Connector with MdcLoggable { implicit override val nameOfConnector = LocalMappedConnector.getClass.getSimpleName // - override def getAdapterInfo(callContext: Option[CallContext]): Future[Box[(InboundAdapterInfoInternal, Option[CallContext])]] = Future( + override def getAdapterInfo(callContext: Option[CallContext]): Future[Box[(InboundAdapterInfoInternal, Option[CallContext])]] = Future { + val startTime = Helpers.now.getTime + val source = APIUtil.getPropsValue("db.driver","org.h2.Driver") Full(InboundAdapterInfoInternal( errorCode = "", - backendMessages = Nil, + backendMessages = List( + InboundStatusMessage( + source = source, + status = "Success", + errorCode = "", + text =s"Get data from $source database", + duration = Some(s"${Helpers.now.getTime - startTime} ms") + ) + ), name = "LocalMappedConnector", version = "mapped", git_commit = APIUtil.gitCommit, date = DateWithMsFormat.format(new Date()) - ), callContext)) + ), callContext) + } override def validateAndCheckIbanNumber(iban: String, callContext: Option[CallContext]): OBPReturnType[Box[IbanChecker]] = Future { import org.iban4j.CountryCode diff --git a/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala b/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala index af8eee7ee..ce899be6b 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala @@ -115,7 +115,8 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable backendMessages=List( InboundStatusMessage(source=sourceExample.value, status=inboundStatusMessageStatusExample.value, errorCode=inboundStatusMessageErrorCodeExample.value, - text=inboundStatusMessageTextExample.value)), + text=inboundStatusMessageTextExample.value + )), name=inboundAdapterInfoInternalNameExample.value, version=inboundAdapterInfoInternalVersionExample.value, git_commit=inboundAdapterInfoInternalGit_commitExample.value, @@ -6474,7 +6475,8 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable backendMessages=List( InboundStatusMessage(source=sourceExample.value, status=inboundStatusMessageStatusExample.value, errorCode=inboundStatusMessageErrorCodeExample.value, - text=inboundStatusMessageTextExample.value))), + text=inboundStatusMessageTextExample.value + ))), data=FooBar(name = "James Brown", number = 1234567890, fooBarId = Some("foobar-id-value"))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) diff --git a/obp-api/src/test/scala/code/api/v5_0_0/GetAdapterInfoTest.scala b/obp-api/src/test/scala/code/api/v5_0_0/GetAdapterInfoTest.scala new file mode 100644 index 000000000..d0eb02c11 --- /dev/null +++ b/obp-api/src/test/scala/code/api/v5_0_0/GetAdapterInfoTest.scala @@ -0,0 +1,87 @@ +/** +Open Bank Project - API +Copyright (C) 2011-2019, TESOBE GmbH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +Email: contact@tesobe.com +TESOBE GmbH +Osloerstrasse 16/17 +Berlin 13359, Germany + +This product includes software developed at +TESOBE (http://www.tesobe.com/) + */ +package code.api.v5_0_0 + +import code.api.util.ApiRole.canGetAdapterInfo +import code.api.util.ErrorMessages.{UserHasMissingRoles, UserNotLoggedIn} +import code.api.v3_0_0.AdapterInfoJsonV300 +import code.api.v5_0_0.OBPAPI5_0_0.Implementations5_0_0 +import code.api.util.APIUtil.OAuth._ +import code.entitlement.Entitlement +import code.setup.DefaultUsers +import com.github.dwickern.macros.NameOf.nameOf +import com.openbankproject.commons.model.ErrorMessage +import com.openbankproject.commons.util.ApiVersion +import org.scalatest.Tag + +class GetAdapterInfoTest extends V500ServerSetup with DefaultUsers { + + /** + * Test tags + * Example: To run tests with tag "getPermissions": + * mvn test -D tagsToInclude + * + * This is made possible by the scalatest maven plugin + */ + object VersionOfApi extends Tag(ApiVersion.v5_0_0.toString) + object ApiEndpoint extends Tag(nameOf(Implementations5_0_0.getAdapterInfo)) + + feature("Get Adapter Info v5.0.0") + { + scenario(s"$UserNotLoggedIn error case", ApiEndpoint, VersionOfApi) { + When("We make a request v5.0.0") + val request310 = (v5_0_0_Request / "adapter").GET + val response310 = makeGetRequest(request310) + Then("We should get a 401") + response310.code should equal(401) + And("error should be " + UserNotLoggedIn) + response310.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) + } + scenario(s"$UserHasMissingRoles error case", ApiEndpoint, VersionOfApi) { + When("We make a request v5.0.0") + val request310 = (v5_0_0_Request / "adapter").GET <@ (user1) + val response310 = makeGetRequest(request310) + Then("We should get a 403") + response310.code should equal(403) + And("error should be " + UserHasMissingRoles + canGetAdapterInfo) + response310.body.extract[ErrorMessage].message should equal (UserHasMissingRoles + canGetAdapterInfo) + } + scenario("We will try to get adapter info", ApiEndpoint, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, canGetAdapterInfo.toString) + When("We make a request v5.0.0") + val request310 = (v5_0_0_Request / "adapter").GET <@ (user1) + val response310 = makeGetRequest(request310) + Then("We should get a 200") + response310.code should equal(200) + Then("We should get a 200") + response310.code should equal(200) + response310.body.extract[AdapterInfoJsonV500].name should equal("LocalMappedConnector") + response310.body.extract[AdapterInfoJsonV500].total_duration.length >0 shouldBe(true) + } + } + + +} diff --git a/obp-commons/src/main/scala/com/openbankproject/commons/model/CommonModelTrait.scala b/obp-commons/src/main/scala/com/openbankproject/commons/model/CommonModelTrait.scala index 37e361c19..f2be23e85 100644 --- a/obp-commons/src/main/scala/com/openbankproject/commons/model/CommonModelTrait.scala +++ b/obp-commons/src/main/scala/com/openbankproject/commons/model/CommonModelTrait.scala @@ -65,7 +65,8 @@ case class InboundStatusMessage( source: String, status: String, errorCode: String, - text: String + text: String, + duration: Option[String] = None //added from V500 ) case class Status( From 9238ad3aa1a73c467bb38e57911191ac705139c2 Mon Sep 17 00:00:00 2001 From: hongwei Date: Mon, 24 Oct 2022 16:55:26 +0200 Subject: [PATCH 4/6] test/fixed the RestConnector_vMar2019 test --- .../rest/RestConnector_vMar2019.scala | 6 ++---- .../RestConnector_vMar2019_frozen_meta_data | Bin 113040 -> 113075 bytes 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala b/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala index ce899be6b..af8eee7ee 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala @@ -115,8 +115,7 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable backendMessages=List( InboundStatusMessage(source=sourceExample.value, status=inboundStatusMessageStatusExample.value, errorCode=inboundStatusMessageErrorCodeExample.value, - text=inboundStatusMessageTextExample.value - )), + text=inboundStatusMessageTextExample.value)), name=inboundAdapterInfoInternalNameExample.value, version=inboundAdapterInfoInternalVersionExample.value, git_commit=inboundAdapterInfoInternalGit_commitExample.value, @@ -6475,8 +6474,7 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable backendMessages=List( InboundStatusMessage(source=sourceExample.value, status=inboundStatusMessageStatusExample.value, errorCode=inboundStatusMessageErrorCodeExample.value, - text=inboundStatusMessageTextExample.value - ))), + text=inboundStatusMessageTextExample.value))), data=FooBar(name = "James Brown", number = 1234567890, fooBarId = Some("foobar-id-value"))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) diff --git a/obp-api/src/test/scala/code/connector/RestConnector_vMar2019_frozen_meta_data b/obp-api/src/test/scala/code/connector/RestConnector_vMar2019_frozen_meta_data index 9a70a17d063129cb614c3f09a95e93bd6cf67000..2c9e711f032a0860018ba1a0872813af5eefbaa1 100644 GIT binary patch delta 73 zcmbR6nQilDwuUW?r(5|LI?7oX7#LVf7&uZ&izXYoONg@-=a&{GrcvV*rcY7u5g& delta 76 zcmdn|nQg*nwuUW?r(2a7kC!m873Y^0C8vTIC5a`a#U%`!sYONkMb7ytKtYzthSn0( YFX%IJLI~?DM%l>)I_%ry+ZaQP0Z<(pbN~PV From fadf5392cb0ab5c7cc214670683f2f691203a74a Mon Sep 17 00:00:00 2001 From: hongwei Date: Wed, 26 Oct 2022 10:14:27 +0200 Subject: [PATCH 5/6] refactor/tweaked the error message --- obp-api/src/main/scala/code/api/util/ErrorMessages.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obp-api/src/main/scala/code/api/util/ErrorMessages.scala b/obp-api/src/main/scala/code/api/util/ErrorMessages.scala index f7537cee8..dcd1ea231 100644 --- a/obp-api/src/main/scala/code/api/util/ErrorMessages.scala +++ b/obp-api/src/main/scala/code/api/util/ErrorMessages.scala @@ -287,7 +287,7 @@ object ErrorMessages { val CreateCardError = "OBP-30032: Could not insert the Card" val UpdateCardError = "OBP-30033: Could not update the Card" - val ViewIdNotSupported = "OBP-30034: This ViewId is do not supported. Only support four now: Owner, Accountant, Auditor, StageOne, Standard, _Public." + val ViewIdNotSupported = "OBP-30034: This ViewId is not supported. Only support four now: Owner, Accountant, Auditor, StageOne, Standard, _Public." val UserCustomerLinkNotFound = "OBP-30035: User Customer Link not found" From 7908bf4b6aa1fbf47eeba2a87070502009ed7949 Mon Sep 17 00:00:00 2001 From: hongwei Date: Wed, 26 Oct 2022 10:15:48 +0200 Subject: [PATCH 6/6] refactor/fixed the ExampleValue --- obp-api/src/main/scala/code/api/util/ExampleValue.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/obp-api/src/main/scala/code/api/util/ExampleValue.scala b/obp-api/src/main/scala/code/api/util/ExampleValue.scala index 2d3af2e00..6e153f99b 100644 --- a/obp-api/src/main/scala/code/api/util/ExampleValue.scala +++ b/obp-api/src/main/scala/code/api/util/ExampleValue.scala @@ -720,10 +720,10 @@ object ExampleValue { glossaryItems += makeGlossaryItem("status", statusExample) lazy val errorCodeExample = ConnectorField(NoExampleProvided,NoDescriptionProvided) - glossaryItems += makeGlossaryItem("errorCode", statusExample) + glossaryItems += makeGlossaryItem("errorCode", errorCodeExample) lazy val textExample = ConnectorField(NoExampleProvided,NoDescriptionProvided) - glossaryItems += makeGlossaryItem("text", statusExample) + glossaryItems += makeGlossaryItem("text", textExample) lazy val canSeeTransactionBalanceExample = ConnectorField(NoExampleProvided,NoDescriptionProvided) glossaryItems += makeGlossaryItem("can_see_transaction_balance", canSeeTransactionBalanceExample)