diff options
author | MS <ms@taler.net> | 2023-09-30 11:08:14 +0200 |
---|---|---|
committer | MS <ms@taler.net> | 2023-09-30 11:08:36 +0200 |
commit | 83fe3f1e623b0857f04e8da755f760694f5a900d (patch) | |
tree | eb2356ea5c633b1f1a177166b055704cfab4defb | |
parent | 8344295468529d906af8abc12ea6244bf6a9a73e (diff) | |
download | libeufin-83fe3f1e623b0857f04e8da755f760694f5a900d.tar.gz libeufin-83fe3f1e623b0857f04e8da755f760694f5a900d.tar.bz2 libeufin-83fe3f1e623b0857f04e8da755f760694f5a900d.zip |
Testing amount serialization.
-rw-r--r-- | bank/src/main/kotlin/tech/libeufin/bank/BankMessages.kt | 6 | ||||
-rw-r--r-- | bank/src/main/kotlin/tech/libeufin/bank/CorebankApiHandlers.kt | 2 | ||||
-rw-r--r-- | bank/src/main/kotlin/tech/libeufin/bank/Main.kt | 7 | ||||
-rw-r--r-- | bank/src/main/kotlin/tech/libeufin/bank/helpers.kt | 13 | ||||
-rw-r--r-- | bank/src/test/kotlin/AmountTest.kt | 24 | ||||
-rw-r--r-- | 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 |