summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMS <ms@taler.net>2023-09-30 11:08:14 +0200
committerMS <ms@taler.net>2023-09-30 11:08:36 +0200
commit83fe3f1e623b0857f04e8da755f760694f5a900d (patch)
treeeb2356ea5c633b1f1a177166b055704cfab4defb
parent8344295468529d906af8abc12ea6244bf6a9a73e (diff)
downloadlibeufin-83fe3f1e623b0857f04e8da755f760694f5a900d.tar.gz
libeufin-83fe3f1e623b0857f04e8da755f760694f5a900d.tar.bz2
libeufin-83fe3f1e623b0857f04e8da755f760694f5a900d.zip
Testing amount serialization.
-rw-r--r--bank/src/main/kotlin/tech/libeufin/bank/BankMessages.kt6
-rw-r--r--bank/src/main/kotlin/tech/libeufin/bank/CorebankApiHandlers.kt2
-rw-r--r--bank/src/main/kotlin/tech/libeufin/bank/Main.kt7
-rw-r--r--bank/src/main/kotlin/tech/libeufin/bank/helpers.kt13
-rw-r--r--bank/src/test/kotlin/AmountTest.kt24
-rw-r--r--bank/src/test/kotlin/JsonTest.kt7
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