gnunet-svn
[Top][All Lists]
Advanced

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

[libeufin] branch master updated: Testing amount serialization.


From: gnunet
Subject: [libeufin] branch master updated: Testing amount serialization.
Date: Sat, 30 Sep 2023 11:08:46 +0200

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

ms pushed a commit to branch master
in repository libeufin.

The following commit(s) were added to refs/heads/master by this push:
     new 83fe3f1e Testing amount serialization.
83fe3f1e is described below

commit 83fe3f1e623b0857f04e8da755f760694f5a900d
Author: MS <ms@taler.net>
AuthorDate: Sat Sep 30 11:08:14 2023 +0200

    Testing amount serialization.
---
 .../main/kotlin/tech/libeufin/bank/BankMessages.kt |  6 ++++--
 .../tech/libeufin/bank/CorebankApiHandlers.kt      |  2 +-
 bank/src/main/kotlin/tech/libeufin/bank/Main.kt    |  7 +++----
 bank/src/main/kotlin/tech/libeufin/bank/helpers.kt | 13 ++++++------
 bank/src/test/kotlin/AmountTest.kt                 | 24 +++++++++++-----------
 bank/src/test/kotlin/JsonTest.kt                   |  7 +++++++
 6 files changed, 34 insertions(+), 25 deletions(-)

diff --git a/bank/src/main/kotlin/tech/libeufin/bank/BankMessages.kt 
b/bank/src/main/kotlin/tech/libeufin/bank/BankMessages.kt
index aa399b53..d2a667fc 100644
--- a/bank/src/main/kotlin/tech/libeufin/bank/BankMessages.kt
+++ b/bank/src/main/kotlin/tech/libeufin/bank/BankMessages.kt
@@ -185,7 +185,9 @@ class TalerAmount(
     }
 
     override fun toString(): String {
-        return "$currency:$value.$frac"
+        val fracNoTrailingZero = this.frac.toString().dropLastWhile { it == 
'0' }
+        if (fracNoTrailingZero.isEmpty()) return "$currency:$value"
+        return "$currency:$value.$fracNoTrailingZero"
     }
 }
 
@@ -374,7 +376,7 @@ data class AccountData(
     val name: String,
     val balance: Balance,
     val payto_uri: String,
-    val debit_threshold: String,
+    val debit_threshold: TalerAmount,
     val contact_data: ChallengeContactData? = null,
     val cashout_payto_uri: String? = null,
 )
diff --git a/bank/src/main/kotlin/tech/libeufin/bank/CorebankApiHandlers.kt 
b/bank/src/main/kotlin/tech/libeufin/bank/CorebankApiHandlers.kt
index b11f29ac..ccd10d09 100644
--- a/bank/src/main/kotlin/tech/libeufin/bank/CorebankApiHandlers.kt
+++ b/bank/src/main/kotlin/tech/libeufin/bank/CorebankApiHandlers.kt
@@ -223,7 +223,7 @@ fun Routing.accountsMgmtHandlers(db: Database, ctx: 
BankApplicationContext) {
             AccountData(
                 name = customerData.name,
                 balance = balance,
-                debit_threshold = bankAccountData.maxDebt.toString(),
+                debit_threshold = bankAccountData.maxDebt,
                 payto_uri = bankAccountData.internalPaytoUri,
                 contact_data = ChallengeContactData(
                     email = customerData.email, phone = customerData.phone
diff --git a/bank/src/main/kotlin/tech/libeufin/bank/Main.kt 
b/bank/src/main/kotlin/tech/libeufin/bank/Main.kt
index f34212b4..29dd7e9d 100644
--- a/bank/src/main/kotlin/tech/libeufin/bank/Main.kt
+++ b/bank/src/main/kotlin/tech/libeufin/bank/Main.kt
@@ -160,8 +160,7 @@ object TalerProtocolTimestampSerializer : 
KSerializer<TalerProtocolTimestamp> {
             Instant.ofEpochSecond(ts)
         } catch (e: Exception) {
             logger.error("Could not get Instant from t_s: $ts: ${e.message}")
-            // Bank's fault.  API doesn't allow clients to pass this datatype.
-            throw internalServerError("Could not serialize this t_s: ${ts}")
+            throw badRequest("Could not serialize this t_s: ${ts}")
         }
         return TalerProtocolTimestamp(instant)
     }
@@ -190,13 +189,13 @@ object RelativeTimeSerializer : KSerializer<RelativeTime> 
{
                 return@encodeStructure
             }
             val dUs = try {
-                value.d_us.toNanos()
+                value.d_us.toNanos() / 1000L
             } catch (e: Exception) {
                 logger.error(e.message)
                 // Bank's fault, as each numeric value should be checked 
before entering the system.
                 throw internalServerError("Could not convert 
java.time.Duration to JSON")
             }
-            encodeLongElement(descriptor, 0, dUs / 1000L)
+            encodeLongElement(descriptor, 0, dUs)
         }
     }
 
diff --git a/bank/src/main/kotlin/tech/libeufin/bank/helpers.kt 
b/bank/src/main/kotlin/tech/libeufin/bank/helpers.kt
index a5200426..1f2d0b00 100644
--- a/bank/src/main/kotlin/tech/libeufin/bank/helpers.kt
+++ b/bank/src/main/kotlin/tech/libeufin/bank/helpers.kt
@@ -33,7 +33,8 @@ import java.net.URL
 import java.time.Instant
 import java.util.*
 
-const val FRACTION_BASE = 100000000
+
+const val AMOUNT_FRACTION_BASE = 100000000
 
 private val logger: Logger = 
LoggerFactory.getLogger("tech.libeufin.bank.helpers")
 
@@ -201,7 +202,7 @@ fun parseTalerAmount2(
     // Fraction is at most 8 digits, so it's always < than MAX_INT.
     val fraction: Int = match.destructured.component3().run {
         var frac = 0
-        var power = FRACTION_BASE
+        var power = AMOUNT_FRACTION_BASE
         if (this.isNotEmpty())
         // Skips the dot and processes the fractional chars.
             this.substring(1).forEach { chr ->
@@ -229,7 +230,7 @@ fun parseTalerAmount2(
  * responded to the client.
  */
 fun parseTalerAmount(
-    amount: String, fracDigits: FracDigits = FracDigits.EIGHT
+    amount: String, fracDigits: FracDigits = FracDigits.EIGHT // FIXME: 
fracDigits should come from config.
 ): TalerAmount {
     val maybeAmount = parseTalerAmount2(amount, fracDigits) ?: throw 
LibeufinBankException(
         httpStatus = HttpStatusCode.BadRequest, talerError = TalerError(
@@ -240,9 +241,9 @@ fun parseTalerAmount(
 }
 
 private fun normalizeAmount(amt: TalerAmount): TalerAmount {
-    if (amt.frac > FRACTION_BASE) {
-        val normalValue = amt.value + (amt.frac / FRACTION_BASE)
-        val normalFrac = amt.frac % FRACTION_BASE
+    if (amt.frac > AMOUNT_FRACTION_BASE) {
+        val normalValue = amt.value + (amt.frac / AMOUNT_FRACTION_BASE)
+        val normalFrac = amt.frac % AMOUNT_FRACTION_BASE
         return TalerAmount(
             value = normalValue, frac = normalFrac, currency = amt.currency
         )
diff --git a/bank/src/test/kotlin/AmountTest.kt 
b/bank/src/test/kotlin/AmountTest.kt
index 4677493e..55bac371 100644
--- a/bank/src/test/kotlin/AmountTest.kt
+++ b/bank/src/test/kotlin/AmountTest.kt
@@ -73,20 +73,20 @@ class AmountTest {
     @Test
     fun parseTalerAmountTest() {
         val one = "EUR:1"
-        var obj = parseTalerAmount(one)
-        assert(obj.value == 1L && obj.frac == 0 && obj.currency == "EUR")
+        var obj = parseTalerAmount2(one, FracDigits.TWO)
+        assert(obj!!.value == 1L && obj.frac == 0 && obj.currency == "EUR")
         val onePointZero = "EUR:1.00"
-        obj = parseTalerAmount(onePointZero)
-        assert(obj.value == 1L && obj.frac == 0)
+        obj = parseTalerAmount2(onePointZero, FracDigits.TWO)
+        assert(obj!!.value == 1L && obj.frac == 0)
         val onePointZeroOne = "EUR:1.01"
-        obj = parseTalerAmount(onePointZeroOne)
-        assert(obj.value == 1L && obj.frac == 1000000)
-        obj = parseTalerAmount("EUR:0.00000001")
-        assert(obj.value == 0L && obj.frac == 1)
+        obj = parseTalerAmount2(onePointZeroOne, FracDigits.TWO)
+        assert(obj!!.value == 1L && obj.frac == 1000000)
+        obj = parseTalerAmount2("EUR:0.00000001", FracDigits.EIGHT)
+        assert(obj!!.value == 0L && obj.frac == 1)
         // Setting two fractional digits.
-        obj = parseTalerAmount("EUR:0.01", FracDigits.TWO) // one cent
-        assert(obj.value == 0L && obj.frac == 1000000)
-        obj = parseTalerAmount("EUR:0.1", FracDigits.TWO) // ten cents
-        assert(obj.value == 0L && obj.frac == 10000000)
+        obj = parseTalerAmount2("EUR:0.01", FracDigits.TWO) // one cent
+        assert(obj!!.value == 0L && obj.frac == 1000000)
+        obj = parseTalerAmount2("EUR:0.1", FracDigits.TWO) // ten cents
+        assert(obj!!.value == 0L && obj.frac == 10000000)
     }
 }
\ No newline at end of file
diff --git a/bank/src/test/kotlin/JsonTest.kt b/bank/src/test/kotlin/JsonTest.kt
index 0f01faa1..4e60d43e 100644
--- a/bank/src/test/kotlin/JsonTest.kt
+++ b/bank/src/test/kotlin/JsonTest.kt
@@ -52,4 +52,11 @@ class JsonTest {
         assert("\"credit\"" == 
Json.encodeToString(CorebankCreditDebitInfo.credit))
         assert("\"debit\"" == 
Json.encodeToString(CorebankCreditDebitInfo.debit))
     }
+
+    // Testing JSON <--> TalerAmount
+    @Test
+    fun amountSerializer() {
+        val amt = Json.decodeFromString<TalerAmount>("\"KUDOS:4.4\"")
+        assert(Json.encodeToString(amt) == "\"KUDOS:4.4\"")
+    }
 }
\ No newline at end of file

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