gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libeufin] 01/02: Activate camt.052 and pain.001 integration tests.


From: gnunet
Subject: [libeufin] 01/02: Activate camt.052 and pain.001 integration tests.
Date: Wed, 30 Nov 2022 22:36:42 +0100

This is an automated email from the git hooks/post-receive script.

ms pushed a commit to branch master
in repository libeufin.

commit e8a79ced5fb2bb303990070c1b1e0f0fda0da040
Author: MS <ms@taler.net>
AuthorDate: Wed Nov 30 22:33:54 2022 +0100

    Activate camt.052 and pain.001 integration tests.
---
 .../src/main/kotlin/tech/libeufin/nexus/Errors.kt  |   7 +-
 .../tech/libeufin/nexus/ebics/EbicsClient.kt       |  11 +-
 .../kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt |   5 +-
 nexus/src/test/kotlin/DownloadAndSubmit.kt         | 128 +++++++++++++++++++--
 sandbox/src/test/kotlin/BalanceTest.kt             |   1 -
 sandbox/src/test/kotlin/DBTest.kt                  |   1 -
 6 files changed, 140 insertions(+), 13 deletions(-)

diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Errors.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/Errors.kt
index d7f04e76..0cc340e8 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/Errors.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Errors.kt
@@ -20,8 +20,13 @@
 package tech.libeufin.nexus
 
 import io.ktor.http.HttpStatusCode
+import tech.libeufin.util.LibeufinErrorCode
 
-data class NexusError(val statusCode: HttpStatusCode, val reason: String) :
+data class NexusError(
+    val statusCode: HttpStatusCode,
+    val reason: String,
+    val code: LibeufinErrorCode? = null
+    ) :
     Exception("$reason (HTTP status $statusCode)")
 
 fun NexusAssert(condition: Boolean, errorMsg: String): Boolean {
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsClient.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsClient.kt
index 4a7a7c28..95f6f5ec 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsClient.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsClient.kt
@@ -243,8 +243,15 @@ suspend fun doEbicsUploadTransaction(
         EbicsReturnCode.EBICS_OK -> {
         }
         else -> {
-            throw NexusError(HttpStatusCode.InternalServerError,
-                "Unexpected EBICS technical return code: 
${txResp.technicalReturnCode}"
+            throw EbicsProtocolError(
+                /**
+                 * 500 because Nexus walked until having the
+                 * bank rejecting the operation instead of it
+                 * detecting the problem.
+                 */
+                HttpStatusCode.InternalServerError,
+                "Unexpected EBICS technical return code: 
${txResp.technicalReturnCode}",
+                txResp.technicalReturnCode
             )
         }
     }
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt
index a232bfd1..a8069977 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt
@@ -542,7 +542,10 @@ class EbicsBankConnectionProtocol: BankConnectionProtocol {
                 // to lose the database transaction data.
                 TransactionManager.current().commit()
                 throw NexusError(
-                    HttpStatusCode.InternalServerError, "Pain.001 message is 
invalid."
+                    HttpStatusCode.InternalServerError,
+                    "Attempted Pain.001 
(${paymentInitiation.paymentInformationId})" +
+                            " message is invalid.  Not sent to the bank.",
+                    LibeufinErrorCode.LIBEUFIN_EC_INVALID_STATE
                 )
             }
             object {
diff --git a/nexus/src/test/kotlin/DownloadAndSubmit.kt 
b/nexus/src/test/kotlin/DownloadAndSubmit.kt
index 243ae0a8..3ab0841a 100644
--- a/nexus/src/test/kotlin/DownloadAndSubmit.kt
+++ b/nexus/src/test/kotlin/DownloadAndSubmit.kt
@@ -1,3 +1,4 @@
+import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
 import io.ktor.application.*
 import io.ktor.client.*
 import io.ktor.client.request.*
@@ -15,7 +16,12 @@ import org.w3c.dom.Document
 import tech.libeufin.nexus.*
 import tech.libeufin.nexus.bankaccount.addPaymentInitiation
 import tech.libeufin.nexus.bankaccount.fetchBankAccountTransactions
+import tech.libeufin.nexus.bankaccount.submitAllPaymentInitiations
 import tech.libeufin.nexus.ebics.EbicsBankConnectionProtocol
+import tech.libeufin.nexus.ebics.doEbicsUploadTransaction
+import tech.libeufin.nexus.ebics.getEbicsSubscriberDetails
+import tech.libeufin.nexus.iso20022.NexusPaymentInitiationData
+import tech.libeufin.nexus.iso20022.createPain001document
 import tech.libeufin.nexus.server.FetchLevel
 import tech.libeufin.nexus.server.FetchSpecAllJson
 import tech.libeufin.nexus.server.FetchSpecJson
@@ -44,9 +50,9 @@ data class EbicsResponses(
 
 /**
  * Minimal server responding always the 'init' field of a EbicsResponses
- * object along a download EBICS message.  Suitable to set arbitrary data
+ * object to a download EBICS message.  Suitable to set arbitrary data
  * in said response.  Signs the response assuming the client is the one
- * created a MakeEnv.kt.
+ * created in MakeEnv.kt.
  */
 fun getCustomEbicsServer(r: EbicsResponses, endpoint: String = "/ebicsweb"): 
Application.() -> Unit {
     val ret: Application.() -> Unit = {
@@ -91,10 +97,9 @@ fun getCustomEbicsServer(r: EbicsResponses, endpoint: String 
= "/ebicsweb"): App
  * and having had access to runTask and TaskSchedule, that
  * are now 'private'.
  */
-// @Ignore
 class DownloadAndSubmit {
     /**
-     * Instruct the server to return invalid CAMT content.
+     * Download a C52 report from the bank.
      */
     @Test
     fun download() {
@@ -104,7 +109,7 @@ class DownloadAndSubmit {
                 "foo",
                 "default",
                 "Show up in logging!",
-                "TESTKUDOS:5"
+                "TESTKUDOS:1"
             )
             wireTransfer(
                 "bank",
@@ -114,7 +119,6 @@ class DownloadAndSubmit {
                 "TESTKUDOS:5"
             )
             withTestApplication(sandboxApp) {
-                val conn = EbicsBankConnectionProtocol()
                 runBlocking {
                     fetchBankAccountTransactions(
                         client,
@@ -125,10 +129,19 @@ class DownloadAndSubmit {
                         "foo"
                     )
                 }
+                transaction {
+                    // FIXME: assert on the subject.
+                    assert(
+                        NexusBankTransactionEntity[1].amount == "1" &&
+                                NexusBankTransactionEntity[2].amount == "5"
+                    )
+                }
             }
         }
     }
-
+    /**
+     * Upload one payment instruction to the bank.
+     */
     @Test
     fun upload() {
         withNexusAndSandboxUser {
@@ -156,6 +169,107 @@ class DownloadAndSubmit {
                         1L
                     )
                 }
+                transaction {
+                    val payment = BankAccountTransactionEntity[1]
+                    assert(payment.debtorIban == FOO_USER_IBAN &&
+                            payment.subject == "test payment" &&
+                            payment.direction == "DBIT"
+                    )
+                }
+            }
+        }
+    }
+
+    /**
+     * Upload one payment instruction charging one IBAN
+     * that does not belong to the requesting EBICS subscriber.
+     */
+    @Test
+    fun unallowedDebtorIban() {
+        withNexusAndSandboxUser {
+            withTestApplication(sandboxApp) {
+                runBlocking {
+                    val bar = transaction { 
NexusBankAccountEntity.findByName("bar") }
+                    val painMessage = createPain001document(
+                        NexusPaymentInitiationData(
+                            debtorIban = bar!!.iban,
+                            debtorBic = bar!!.bankCode,
+                            debtorName = bar!!.accountHolder,
+                            currency = "TESTKUDOS",
+                            amount = "1",
+                            creditorIban = getIban(),
+                            creditorName = "Get",
+                            creditorBic = "SANDBOXX",
+                            paymentInformationId = "entropy-0",
+                            preparationTimestamp = 1970L,
+                            subject = "Unallowed",
+                            messageId = "entropy-1",
+                            endToEndId = null,
+                            instructionId = null
+                        )
+                    )
+                    val unallowedSubscriber = transaction { 
getEbicsSubscriberDetails("foo") }
+                    var thrown = false
+                    try {
+                        doEbicsUploadTransaction(
+                            client,
+                            unallowedSubscriber,
+                            "CCT",
+                            painMessage.toByteArray(Charsets.UTF_8),
+                            EbicsStandardOrderParams()
+                        )
+                    } catch (e: EbicsProtocolError) {
+                        if (e.ebicsTechnicalCode ==
+                                
EbicsReturnCode.EBICS_ACCOUNT_AUTHORISATION_FAILED
+                        )
+                            thrown = true
+                    }
+                    assert(thrown)
+                }
+            }
+        }
+    }
+
+    /**
+     * Submit one payment instruction with a invalid Pain.001
+     * document, and check that it was marked as invalid.  Hence,
+     * the error is expected only by the first submission, since
+     * the second won't pick the invalid payment.
+     */
+    @Test
+    fun invalidPain001() {
+        withNexusAndSandboxUser {
+            withTestApplication(sandboxApp) {
+                val conn = EbicsBankConnectionProtocol()
+                runBlocking {
+                    // Create Pain.001 to be submitted.
+                    addPaymentInitiation(
+                        Pain001Data(
+                            creditorIban = getIban(),
+                            creditorBic = "not-a-BIC",
+                            creditorName = "Tester",
+                            subject = "test payment",
+                            sum = Amount(1),
+                            currency = "TESTKUDOS"
+                        ),
+                        transaction {
+                            NexusBankAccountEntity.findByName(
+                                "foo"
+                            ) ?: throw Exception("Test failed")
+                        }
+                    )
+                    // Encounters errors.
+                    var thrown = false
+                    try {
+                        submitAllPaymentInitiations(client, "foo")
+                    } catch (e: NexusError) {
+                        assert((e.code == 
LibeufinErrorCode.LIBEUFIN_EC_INVALID_STATE))
+                        thrown = true
+                    }
+                    assert(thrown)
+                    // No errors, since it should not retry.
+                    submitAllPaymentInitiations(client, "foo")
+                }
             }
         }
     }
diff --git a/sandbox/src/test/kotlin/BalanceTest.kt 
b/sandbox/src/test/kotlin/BalanceTest.kt
index 287bd8a9..f4f99584 100644
--- a/sandbox/src/test/kotlin/BalanceTest.kt
+++ b/sandbox/src/test/kotlin/BalanceTest.kt
@@ -25,7 +25,6 @@ class BalanceTest {
                     allowRegistrations = true
                     name = "default"
                     withSignupBonus = false
-                    uiTitle = "test"
                 }
                 val one = BankAccountEntity.new {
                     iban = "IBAN 1"
diff --git a/sandbox/src/test/kotlin/DBTest.kt 
b/sandbox/src/test/kotlin/DBTest.kt
index 21afbeae..c74ebce1 100644
--- a/sandbox/src/test/kotlin/DBTest.kt
+++ b/sandbox/src/test/kotlin/DBTest.kt
@@ -71,7 +71,6 @@ class DBTest {
                     allowRegistrations = true
                     name = "default"
                     withSignupBonus = false
-                    uiTitle = "test"
                 }
                 val bankAccount = BankAccountEntity.new {
                     iban = "iban"

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]