gnunet-svn
[Top][All Lists]
Advanced

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

[libeufin] 03/04: Fixes after wallet harness tests.


From: gnunet
Subject: [libeufin] 03/04: Fixes after wallet harness tests.
Date: Sat, 13 Nov 2021 12:52:16 +0100

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

ms pushed a commit to branch master
in repository libeufin.

commit c384fd4a41146ca6e5a0a3f4c3eb06b96d9f0dbe
Author: ms <ms@taler.net>
AuthorDate: Sat Nov 13 10:23:17 2021 +0100

    Fixes after wallet harness tests.
    
    - Implement sign-up bonus
    - Do communicate debit balances
---
 .../src/main/kotlin/tech/libeufin/sandbox/DB.kt    | 13 ++++++---
 .../tech/libeufin/sandbox/EbicsProtocolBackend.kt  | 30 +++++++--------------
 .../main/kotlin/tech/libeufin/sandbox/Helpers.kt   | 31 +++++++++++++++++-----
 .../src/main/kotlin/tech/libeufin/sandbox/Main.kt  | 28 ++++++++++++-------
 .../kotlin/tech/libeufin/sandbox/bankAccount.kt    |  6 -----
 sandbox/src/test/kotlin/BalanceTest.kt             |  8 ++++++
 6 files changed, 70 insertions(+), 46 deletions(-)

diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt 
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
index e5f6a695..6e86b844 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
@@ -370,10 +370,16 @@ object BankAccountsTable : IntIdTable() {
     val iban = text("iban")
     val bic = text("bic").default("SANDBOXX")
     val label = text("label").uniqueIndex("accountLabelIndex")
-    val isDebit = bool("isDebit").default(false)
     /**
-     * Allow to assign "admin" - who doesn't have a customer DB entry -
-     * as the owner.  That allows tests using the --no-auth option to go on.
+     * This field is the username of the customer that owns the
+     * bank account.  Some actors do not have a customer registered,
+     * but they can still specify their "username" - merely a label
+     * that identifies their operations - to this field.
+     *
+     * Two examples of such actors are: "admin" and "bank".  Note:
+     * "admin" cannot act as the bank, because it participates in
+     * tests and therefore should not have its balance affected by
+     * awarding sign-up bonuses.
      */
     val owner = text("owner")
     val isPublic = bool("isPublic").default(false)
@@ -386,7 +392,6 @@ class BankAccountEntity(id: EntityID<Int>) : IntEntity(id) {
     var iban by BankAccountsTable.iban
     var bic by BankAccountsTable.bic
     var label by BankAccountsTable.label
-    var isDebit by BankAccountsTable.isDebit
     var owner by BankAccountsTable.owner
     var isPublic by BankAccountsTable.isPublic
     var demoBank by DemobankConfigEntity referencedOn 
BankAccountsTable.demoBank
diff --git 
a/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt 
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt
index 491ace6a..fe6c20ab 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt
@@ -243,6 +243,12 @@ private fun getRelatedParty(branch: XmlElementBuilder, 
payment: RawPayment) {
     }
 }
 
+// This should fix #6269.
+private fun getCreditDebitInd(balance: BigDecimal): String {
+    if (balance < BigDecimal.ZERO) return "DBIT"
+    return "CRDT"
+}
+
 fun buildCamtString(
     type: Int,
     subscriberIban: String,
@@ -342,14 +348,10 @@ fun buildCamtString(
                         }
                         element("Amt") {
                             attribute("Ccy", "EUR")
-                            if (balancePrcd < BigDecimal.ZERO) {
-                                text(balancePrcd.abs().toPlainString())
-                            } else {
-                                text(balancePrcd.toPlainString())
-                            }
+                            balancePrcd.abs().toPlainString()
                         }
                         element("CdtDbtInd") {
-                            text("CRDT")
+                            getCreditDebitInd(balancePrcd)
                         }
                         element("Dt/Dt") {
                             // date of this balance
@@ -365,22 +367,10 @@ fun buildCamtString(
                         }
                         element("Amt") {
                             attribute("Ccy", "EUR")
-                            // FIXME: the balance computation still not 
working properly
-                            
//text(balanceForAccount(subscriberIban).toString())
-                            if (balanceClbd < BigDecimal.ZERO) {
-                                text(balanceClbd.abs().toPlainString())
-                            } else {
-                                text(balanceClbd.toPlainString())
-                            }
+                            balanceClbd.abs().toPlainString()
                         }
                         element("CdtDbtInd") {
-                            // a temporary value to get the camt to validate.
-                            // Should be fixed along #6269
-                            if (balanceClbd < BigDecimal.ZERO) {
-                                text("DBIT")
-                            } else {
-                                text("CRDT")
-                            }
+                            getCreditDebitInd(balanceClbd)
                         }
                         element("Dt/Dt") {
                             text(dashedDate)
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Helpers.kt 
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Helpers.kt
index 2e927000..5451ca25 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Helpers.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Helpers.kt
@@ -133,8 +133,10 @@ fun getCustomer(username: String): DemobankCustomerEntity {
  * Get person name from a customer's username.
  */
 fun getPersonNameFromCustomer(ownerUsername: String): String {
-    return if (ownerUsername == "admin") "admin" else {
-        return transaction {
+    return when (ownerUsername) {
+        "admin" -> "admin" // Could be changed to Admin, or some different 
value.
+        "bank" -> "The Bank"
+        else -> transaction {
             val ownerCustomer = DemobankCustomerEntity.find(
                 DemobankCustomersTable.username eq ownerUsername
             ).firstOrNull() ?: throw internalServerError(
@@ -144,6 +146,15 @@ fun getPersonNameFromCustomer(ownerUsername: String): 
String {
         }
     }
 }
+fun getFirstDemobank(): DemobankConfigEntity {
+  return transaction {
+      DemobankConfigEntity.all().firstOrNull() ?: throw SandboxError(
+          HttpStatusCode.InternalServerError,
+          "Cannot find one demobank, please create one!"
+      )
+  }
+}
+
 fun getDefaultDemobank(): DemobankConfigEntity {
     return transaction {
         DemobankConfigEntity.find {
@@ -321,17 +332,25 @@ fun getBankAccountFromSubscriber(subscriber: 
EbicsSubscriberEntity): BankAccount
     }
 }
 
+fun BankAccountEntity.bonus(amount: String) {
+    wireTransfer(
+        "bank",
+        this.label,
+        this.demoBank.name,
+        "Sign-up bonus",
+        amount
+    )
+}
+
 fun ensureDemobank(call: ApplicationCall): DemobankConfigEntity {
     return ensureDemobank(call.getUriComponent("demobankid"))
 }
 
 private fun ensureDemobank(name: String): DemobankConfigEntity {
     return transaction {
-        val res = DemobankConfigEntity.find {
+        DemobankConfigEntity.find {
             DemobankConfigsTable.name eq name
-        }.firstOrNull()
-        if (res == null) throw internalServerError("Demobank '$name' never 
created")
-        res
+        }.firstOrNull() ?: throw internalServerError("Demobank '$name' never 
created")
     }
 }
 
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt 
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
index 6de99b99..77467916 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
@@ -310,6 +310,18 @@ class Serve : CliktCommand("Run sandbox HTTP server") {
             )
             exitProcess(0)
         }
+        /**
+         * Create the bank's bank account, to award the 100 Kudos
+         * when new customers open bank account.  */
+        transaction {
+            BankAccountEntity.new {
+                iban = getIban()
+                label = "bank" // used by the wire helper
+                owner = "bank" // used by the person name finder
+                // For now, the model assumes always one demobank
+                demoBank = getFirstDemobank()
+            }
+        }
         serverMain(port)
     }
 }
@@ -437,7 +449,6 @@ val sandboxApp: Application.() -> Unit = {
                 indentObjectsWith(DefaultIndenter("  ", "\n"))
             })
             registerModule(KotlinModule(nullisSameAsDefault = true))
-            //registerModule(JavaTimeModule())
         }
     }
     install(StatusPages) {
@@ -1216,16 +1227,11 @@ val sandboxApp: Application.() -> Unit = {
                     ) throw forbidden(
                             "Customer '$username' cannot access bank account 
'$accountAccessed'"
                         )
-                    val creditDebitIndicator = if (bankAccount.isDebit) {
-                        "debit"
-                    } else {
-                        "credit"
-                    }
                     val balance = balanceForAccount(bankAccount)
                     call.respond(object {
-                        val balance = {
-                            val amount = "${demobank.currency}:${balance}"
-                            val credit_debit_indicator = creditDebitIndicator
+                        val balance = object {
+                            val amount = 
"${demobank.currency}:${balance.abs(). toPlainString()}"
+                            val credit_debit_indicator = if (balance < 
BigDecimal.ZERO) "debit" else "credit"
                         }
                         val paytoUri = buildIbanPaytoUri(
                             iban = bankAccount.iban,
@@ -1314,11 +1320,13 @@ val sandboxApp: Application.() -> Unit = {
                             username = req.username
                             passwordHash = CryptoUtil.hashpw(req.password)
                         }
+                        bankAccount.bonus("${demobank.currency}:100")
                         bankAccount
                     }
+                    val balance = balanceForAccount(bankAccount)
                     call.respond(object {
                         val balance = {
-                            val amount = "${demobank.currency}:0"
+                            val amount = "${demobank.currency}:${balance}"
                             val credit_debit_indicator = "CRDT"
                         }
                         val paytoUri = buildIbanPaytoUri(
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt 
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt
index b775bac2..873371d0 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/bankAccount.kt
@@ -54,12 +54,6 @@ fun balanceForAccount(bankAccount: BankAccountEntity): 
BigDecimal {
             balance -= amount
         }
     }
-    /**
-     * FIXME: for negative accounts, temporarily return 0, so as to make
-     * the current CAMT generator happy.  Negative amounts need to have their
-     * onw sub-tree in the report, see bug: #6962
-     */
-    if (balance < BigDecimal.ZERO) return BigDecimal.ZERO
     return balance
 }
 
diff --git a/sandbox/src/test/kotlin/BalanceTest.kt 
b/sandbox/src/test/kotlin/BalanceTest.kt
index ef0ac19d..956a2e90 100644
--- a/sandbox/src/test/kotlin/BalanceTest.kt
+++ b/sandbox/src/test/kotlin/BalanceTest.kt
@@ -4,6 +4,7 @@ import org.jetbrains.exposed.sql.transactions.transaction
 import org.junit.Test
 import tech.libeufin.sandbox.*
 import tech.libeufin.util.millis
+import java.math.BigDecimal
 import java.time.LocalDateTime
 
 class BalanceTest {
@@ -86,4 +87,11 @@ class BalanceTest {
             }
         }
     }
+    @Test
+    fun balanceAbsTest() {
+        val minus = BigDecimal.ZERO - BigDecimal.ONE
+        val plus = BigDecimal.ONE
+        println(minus.abs().toPlainString())
+        println(plus.abs().toPlainString())
+    }
 }

-- 
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]