aboutsummaryrefslogtreecommitdiff
path: root/wallet/src
diff options
context:
space:
mode:
Diffstat (limited to 'wallet/src')
-rw-r--r--wallet/src/main/java/net/taler/wallet/history/DevHistoryAdapter.kt35
-rw-r--r--wallet/src/main/java/net/taler/wallet/history/DevHistoryManager.kt11
-rw-r--r--wallet/src/main/java/net/taler/wallet/history/HistoryEvent.kt373
-rw-r--r--wallet/src/main/java/net/taler/wallet/history/ReserveTransaction.kt59
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt1
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt7
-rw-r--r--wallet/src/test/java/net/taler/wallet/history/HistoryEventTest.kt488
-rw-r--r--wallet/src/test/java/net/taler/wallet/history/ReserveHistoryEventTest.kt53
8 files changed, 43 insertions, 984 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/history/DevHistoryAdapter.kt b/wallet/src/main/java/net/taler/wallet/history/DevHistoryAdapter.kt
index 88db90c..a2684e1 100644
--- a/wallet/src/main/java/net/taler/wallet/history/DevHistoryAdapter.kt
+++ b/wallet/src/main/java/net/taler/wallet/history/DevHistoryAdapter.kt
@@ -30,13 +30,14 @@ import net.taler.common.exhaustive
import net.taler.common.toRelativeTime
import net.taler.wallet.R
import net.taler.wallet.history.DevHistoryAdapter.HistoryViewHolder
+import net.taler.wallet.transactions.AmountType
-@Deprecated("Replaced by TransactionAdapter")
internal class DevHistoryAdapter(
- private val listener: OnEventClickListener,
- private var history: History = History()
+ private val listener: OnEventClickListener
) : Adapter<HistoryViewHolder>() {
+ private var history: List<HistoryEvent> = ArrayList()
+
init {
setHasStableIds(false)
}
@@ -54,7 +55,7 @@ internal class DevHistoryAdapter(
holder.bind(transaction)
}
- fun update(updatedHistory: History) {
+ fun update(updatedHistory: List<HistoryEvent>) {
this.history = updatedHistory
this.notifyDataSetChanged()
}
@@ -73,19 +74,7 @@ internal class DevHistoryAdapter(
open fun bind(historyEvent: HistoryEvent) {
v.setOnClickListener { listener.onTransactionClicked(historyEvent) }
icon.setImageResource(historyEvent.icon)
-
- title.text = if (historyEvent.title == null) {
- when (historyEvent) {
- is RefreshHistoryEvent -> getRefreshTitle(historyEvent)
- is OrderAcceptedHistoryEvent -> context.getString(R.string.transaction_order_accepted)
- is OrderRefusedHistoryEvent -> context.getString(R.string.transaction_order_refused)
- is TipAcceptedHistoryEvent -> context.getString(R.string.transaction_tip_accepted)
- is TipDeclinedHistoryEvent -> context.getString(R.string.transaction_tip_declined)
- is ReserveBalanceUpdatedHistoryEvent -> context.getString(R.string.transaction_reserve_balance_updated)
- else -> historyEvent::class.java.simpleName
- }
- } else historyEvent.title
-
+ title.text = historyEvent.title
time.text = historyEvent.timestamp.ms.toRelativeTime(context)
bindAmount(historyEvent.displayAmount)
}
@@ -116,18 +105,6 @@ internal class DevHistoryAdapter(
}
}
- private fun getRefreshTitle(transaction: RefreshHistoryEvent): String {
- val res = when (transaction.refreshReason) {
- RefreshReason.MANUAL -> R.string.transaction_refresh_reason_manual
- RefreshReason.PAY -> R.string.transaction_refresh_reason_pay
- RefreshReason.REFUND -> R.string.transaction_refresh_reason_refund
- RefreshReason.ABORT_PAY -> R.string.transaction_refresh_reason_abort_pay
- RefreshReason.RECOUP -> R.string.transaction_refresh_reason_recoup
- RefreshReason.BACKUP_RESTORED -> R.string.transaction_refresh_reason_backup_restored
- }
- return context.getString(R.string.transaction_refresh) + " " + context.getString(res)
- }
-
}
}
diff --git a/wallet/src/main/java/net/taler/wallet/history/DevHistoryManager.kt b/wallet/src/main/java/net/taler/wallet/history/DevHistoryManager.kt
index 72967b2..9052d6e 100644
--- a/wallet/src/main/java/net/taler/wallet/history/DevHistoryManager.kt
+++ b/wallet/src/main/java/net/taler/wallet/history/DevHistoryManager.kt
@@ -26,10 +26,11 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import net.taler.wallet.backend.WalletBackendApi
import org.json.JSONObject
+import java.util.*
sealed class HistoryResult {
object Error : HistoryResult()
- class Success(val history: History) : HistoryResult()
+ class Success(val history: List<HistoryEvent>) : HistoryResult()
}
class DevHistoryManager(
@@ -59,7 +60,7 @@ class DevHistoryManager(
mHistory.postValue(HistoryResult.Error)
return
}
- val history = History()
+ val history = LinkedList<HistoryEvent>()
val json = result.getJSONArray("history")
for (i in 0 until json.length()) {
val event: HistoryEvent = mapper.readValue(json.getString(i))
@@ -68,11 +69,7 @@ class DevHistoryManager(
}
history.reverse() // show latest first
mProgress.postValue(false)
- mHistory.postValue(
- HistoryResult.Success(
- history
- )
- )
+ mHistory.postValue(HistoryResult.Success(history))
}
}
diff --git a/wallet/src/main/java/net/taler/wallet/history/HistoryEvent.kt b/wallet/src/main/java/net/taler/wallet/history/HistoryEvent.kt
index 1618988..3cbe7d7 100644
--- a/wallet/src/main/java/net/taler/wallet/history/HistoryEvent.kt
+++ b/wallet/src/main/java/net/taler/wallet/history/HistoryEvent.kt
@@ -17,10 +17,6 @@
package net.taler.wallet.history
import androidx.annotation.DrawableRes
-import androidx.annotation.LayoutRes
-import com.fasterxml.jackson.annotation.JsonInclude
-import com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY
-import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.annotation.JsonSubTypes
import com.fasterxml.jackson.annotation.JsonSubTypes.Type
import com.fasterxml.jackson.annotation.JsonTypeInfo
@@ -30,81 +26,14 @@ import com.fasterxml.jackson.annotation.JsonTypeName
import net.taler.common.Amount
import net.taler.common.Timestamp
import net.taler.wallet.R
-import net.taler.wallet.cleanExchange
+import net.taler.wallet.transactions.AmountType
import org.json.JSONObject
-enum class ReserveType {
- /**
- * Manually created.
- */
- @JsonProperty("manual")
- MANUAL,
-
- /**
- * Withdrawn from a bank that has "tight" Taler integration
- */
- @JsonProperty("taler-bank-withdraw")
- @Suppress("unused")
- TALER_BANK_WITHDRAW,
-}
-
-@JsonInclude(NON_EMPTY)
-class ReserveCreationDetail(val type: ReserveType, val bankUrl: String?)
-
-enum class RefreshReason {
- @JsonProperty("manual")
- @Suppress("unused")
- MANUAL,
-
- @JsonProperty("pay")
- PAY,
-
- @JsonProperty("refund")
- @Suppress("unused")
- REFUND,
-
- @JsonProperty("abort-pay")
- @Suppress("unused")
- ABORT_PAY,
-
- @JsonProperty("recoup")
- @Suppress("unused")
- RECOUP,
-
- @JsonProperty("backup-restored")
- @Suppress("unused")
- BACKUP_RESTORED
-}
-
-@JsonInclude(NON_EMPTY)
-class ReserveShortInfo(
- /**
- * The exchange that the reserve will be at.
- */
- val exchangeBaseUrl: String,
- /**
- * Key to query more details
- */
- val reservePub: String,
- /**
- * Detail about how the reserve has been created.
- */
- val reserveCreationDetail: ReserveCreationDetail
-)
-
-sealed class AmountType {
- object Positive : AmountType()
- object Negative : AmountType()
- object Neutral : AmountType()
-}
-
class DisplayAmount(
val amount: Amount,
val type: AmountType
)
-typealias History = ArrayList<HistoryEvent>
-
@JsonTypeInfo(
use = NAME,
include = PROPERTY,
@@ -142,377 +71,129 @@ ReserveCreated = "reserve-created",
abstract class HistoryEvent(
val timestamp: Timestamp,
val eventId: String,
- @get:LayoutRes
- open val detailPageLayout: Int = 0,
@get:DrawableRes
- open val icon: Int = R.drawable.ic_account_balance,
- open val showToUser: Boolean = false
+ open val icon: Int = R.drawable.ic_account_balance
) {
- abstract val title: String?
- open lateinit var json: JSONObject
+ val title: String get() = this::class.java.simpleName
open val displayAmount: DisplayAmount? = null
- open fun isCurrency(currency: String): Boolean = true
+ lateinit var json: JSONObject
}
-
-class UnknownHistoryEvent(timestamp: Timestamp, eventId: String) : HistoryEvent(timestamp, eventId) {
- override val title: String? = null
-}
+class UnknownHistoryEvent(timestamp: Timestamp, eventId: String) : HistoryEvent(timestamp, eventId)
@JsonTypeName("exchange-added")
class ExchangeAddedEvent(
timestamp: Timestamp,
- eventId: String,
- val exchangeBaseUrl: String,
- val builtIn: Boolean
-) : HistoryEvent(timestamp, eventId) {
- override val title = cleanExchange(exchangeBaseUrl)
-}
+ eventId: String
+) : HistoryEvent(timestamp, eventId)
@JsonTypeName("exchange-updated")
class ExchangeUpdatedEvent(
timestamp: Timestamp,
- eventId: String,
- val exchangeBaseUrl: String
-) : HistoryEvent(timestamp, eventId) {
- override val title = cleanExchange(exchangeBaseUrl)
-}
-
+ eventId: String
+) : HistoryEvent(timestamp, eventId)
@JsonTypeName("reserve-balance-updated")
class ReserveBalanceUpdatedHistoryEvent(
timestamp: Timestamp,
eventId: String,
- /**
- * Condensed information about the reserve.
- */
- val reserveShortInfo: ReserveShortInfo,
- /**
- * Amount currently left in the reserve.
- */
- val reserveBalance: Amount,
- /**
- * Amount we expected to be in the reserve at that time,
- * considering ongoing withdrawals from that reserve.
- */
- val reserveAwaitedAmount: Amount,
- /**
- * Amount that hasn't been withdrawn yet.
- */
- val reserveUnclaimedAmount: Amount
+ val reserveBalance: Amount
) : HistoryEvent(timestamp, eventId) {
- override val title: String? = null
- override val displayAmount = DisplayAmount(
- reserveBalance,
- AmountType.Neutral
- )
- override fun isCurrency(currency: String) = reserveBalance.currency == currency
+ override val displayAmount = DisplayAmount(reserveBalance, AmountType.Neutral)
}
@JsonTypeName("withdrawn")
class WithdrawHistoryEvent(
timestamp: Timestamp,
eventId: String,
- /**
- * Exchange that was withdrawn from.
- */
- val exchangeBaseUrl: String,
- /**
- * Unique identifier for the withdrawal session, can be used to
- * query more detailed information from the wallet.
- */
- val withdrawalGroupId: String,
- val withdrawalSource: WithdrawalSource,
- /**
- * Amount that has been subtracted from the reserve's balance
- * for this withdrawal.
- */
- val amountWithdrawnRaw: Amount,
- /**
- * Amount that actually was added to the wallet's balance.
- */
val amountWithdrawnEffective: Amount
) : HistoryEvent(timestamp, eventId) {
- override val detailPageLayout = R.layout.fragment_transaction_withdrawal
- override val title = cleanExchange(exchangeBaseUrl)
override val icon = R.drawable.transaction_withdrawal
- override val showToUser = true
- override val displayAmount = DisplayAmount(
- amountWithdrawnEffective,
- AmountType.Positive
- )
- override fun isCurrency(currency: String) = amountWithdrawnRaw.currency == currency
+ override val displayAmount = DisplayAmount(amountWithdrawnEffective, AmountType.Positive)
}
@JsonTypeName("order-accepted")
class OrderAcceptedHistoryEvent(
timestamp: Timestamp,
- eventId: String,
- /**
- * Condensed info about the order.
- */
- val orderShortInfo: OrderShortInfo
+ eventId: String
) : HistoryEvent(timestamp, eventId) {
override val icon = R.drawable.ic_add_circle
- override val title: String? = null
- override fun isCurrency(currency: String) = orderShortInfo.amount.currency == currency
}
@JsonTypeName("order-refused")
class OrderRefusedHistoryEvent(
timestamp: Timestamp,
- eventId: String,
- /**
- * Condensed info about the order.
- */
- val orderShortInfo: OrderShortInfo
+ eventId: String
) : HistoryEvent(timestamp, eventId) {
override val icon = R.drawable.ic_cancel
- override val title: String? = null
- override fun isCurrency(currency: String) = orderShortInfo.amount.currency == currency
}
@JsonTypeName("payment-sent")
class PaymentHistoryEvent(
timestamp: Timestamp,
eventId: String,
- /**
- * Condensed info about the order that we already paid for.
- */
- val orderShortInfo: OrderShortInfo,
- /**
- * Set to true if the payment has been previously sent
- * to the merchant successfully, possibly with a different session ID.
- */
- val replay: Boolean,
- /**
- * Number of coins that were involved in the payment.
- */
- val numCoins: Int,
- /**
- * Amount that was paid, including deposit and wire fees.
- */
- val amountPaidWithFees: Amount,
- /**
- * Session ID that the payment was (re-)submitted under.
- */
- val sessionId: String?
+ val amountPaidWithFees: Amount
) : HistoryEvent(timestamp, eventId) {
- override val detailPageLayout = R.layout.fragment_transaction_payment
- override val title = orderShortInfo.summary
override val icon = R.drawable.ic_cash_usd_outline
- override val showToUser = true
- override val displayAmount = DisplayAmount(
- amountPaidWithFees,
- AmountType.Negative
- )
- override fun isCurrency(currency: String) = orderShortInfo.amount.currency == currency
+ override val displayAmount = DisplayAmount(amountPaidWithFees, AmountType.Negative)
}
@JsonTypeName("payment-aborted")
class PaymentAbortedHistoryEvent(
timestamp: Timestamp,
eventId: String,
- /**
- * Condensed info about the order that we already paid for.
- */
- val orderShortInfo: OrderShortInfo,
- /**
- * Amount that was lost due to refund and refreshing fees.
- */
- val amountLost: Amount
+ amountLost: Amount
) : HistoryEvent(timestamp, eventId) {
- override val title = orderShortInfo.summary
override val icon = R.drawable.transaction_payment_aborted
- override val showToUser = true
- override val displayAmount = DisplayAmount(
- amountLost,
- AmountType.Negative
- )
- override fun isCurrency(currency: String) = orderShortInfo.amount.currency == currency
+ override val displayAmount = DisplayAmount(amountLost, AmountType.Negative)
}
@JsonTypeName("refreshed")
class RefreshHistoryEvent(
timestamp: Timestamp,
eventId: String,
- /**
- * Amount that is now available again because it has
- * been refreshed.
- */
val amountRefreshedEffective: Amount,
- /**
- * Amount that we spent for refreshing.
- */
- val amountRefreshedRaw: Amount,
- /**
- * Why was the refreshing done?
- */
- val refreshReason: RefreshReason,
- val numInputCoins: Int,
- val numRefreshedInputCoins: Int,
- val numOutputCoins: Int,
- /**
- * Identifier for a refresh group, contains one or
- * more refresh session IDs.
- */
- val refreshGroupId: String
+ val amountRefreshedRaw: Amount
) : HistoryEvent(timestamp, eventId) {
override val icon = R.drawable.transaction_refresh
- override val title: String? = null
- override val showToUser = !(amountRefreshedRaw - amountRefreshedEffective).isZero()
- override val displayAmount: DisplayAmount?
- get() {
- return if (showToUser) DisplayAmount(
- amountRefreshedRaw - amountRefreshedEffective,
- AmountType.Negative
- )
- else null
- }
-
- override fun isCurrency(currency: String) = amountRefreshedRaw.currency == currency
+ override val displayAmount =
+ DisplayAmount(amountRefreshedRaw - amountRefreshedEffective, AmountType.Negative)
}
@JsonTypeName("order-redirected")
class OrderRedirectedHistoryEvent(
timestamp: Timestamp,
- eventId: String,
- /**
- * Condensed info about the new order that contains a
- * product (identified by the fulfillment URL) that we've already paid for.
- */
- val newOrderShortInfo: OrderShortInfo,
- /**
- * Condensed info about the order that we already paid for.
- */
- val alreadyPaidOrderShortInfo: OrderShortInfo
+ eventId: String
) : HistoryEvent(timestamp, eventId) {
override val icon = R.drawable.ic_directions
- override val title = newOrderShortInfo.summary
- override fun isCurrency(currency: String) = newOrderShortInfo.amount.currency == currency
}
@JsonTypeName("tip-accepted")
class TipAcceptedHistoryEvent(
timestamp: Timestamp,
eventId: String,
- /**
- * Unique identifier for the tip to query more information.
- */
- val tipId: String,
- /**
- * Raw amount of the tip, without extra fees that apply.
- */
- val tipRaw: Amount
+ tipRaw: Amount
) : HistoryEvent(timestamp, eventId) {
override val icon = R.drawable.transaction_tip_accepted
- override val title: String? = null
- override val showToUser = true
- override val displayAmount = DisplayAmount(
- tipRaw,
- AmountType.Positive
- )
- override fun isCurrency(currency: String) = tipRaw.currency == currency
+ override val displayAmount = DisplayAmount(tipRaw, AmountType.Positive)
}
@JsonTypeName("tip-declined")
class TipDeclinedHistoryEvent(
timestamp: Timestamp,
eventId: String,
- /**
- * Unique identifier for the tip to query more information.
- */
- val tipId: String,
- /**
- * Raw amount of the tip, without extra fees that apply.
- */
- val tipAmount: Amount
+ tipAmount: Amount
) : HistoryEvent(timestamp, eventId) {
override val icon = R.drawable.transaction_tip_declined
- override val title: String? = null
- override val showToUser = true
- override val displayAmount = DisplayAmount(
- tipAmount,
- AmountType.Neutral
- )
- override fun isCurrency(currency: String) = tipAmount.currency == currency
+ override val displayAmount = DisplayAmount(tipAmount, AmountType.Neutral)
}
@JsonTypeName("refund")
class RefundHistoryEvent(
timestamp: Timestamp,
eventId: String,
- val orderShortInfo: OrderShortInfo,
- /**
- * Unique identifier for this refund.
- * (Identifies multiple refund permissions that were obtained at once.)
- */
- val refundGroupId: String,
- /**
- * Part of the refund that couldn't be applied because
- * the refund permissions were expired.
- */
- val amountRefundedInvalid: Amount,
- /**
- * Amount that has been refunded by the merchant.
- */
- val amountRefundedRaw: Amount,
- /**
- * Amount will be added to the wallet's balance after fees and refreshing.
- */
val amountRefundedEffective: Amount
) : HistoryEvent(timestamp, eventId) {
override val icon = R.drawable.transaction_refund
- override val title = orderShortInfo.summary
- override val detailPageLayout = R.layout.fragment_transaction_payment
- override val showToUser = true
- override val displayAmount = DisplayAmount(
- amountRefundedEffective,
- AmountType.Positive
- )
- override fun isCurrency(currency: String) = amountRefundedRaw.currency == currency
+ override val displayAmount = DisplayAmount(amountRefundedEffective, AmountType.Positive)
}
-
-@JsonTypeInfo(
- use = NAME,
- include = PROPERTY,
- property = "type"
-)
-@JsonSubTypes(
- Type(value = WithdrawalSourceReserve::class, name = "reserve")
-)
-abstract class WithdrawalSource
-
-@Suppress("unused")
-@JsonTypeName("tip")
-class WithdrawalSourceTip(
- val tipId: String
-) : WithdrawalSource()
-
-@JsonTypeName("reserve")
-class WithdrawalSourceReserve(
- val reservePub: String
-) : WithdrawalSource()
-
-data class OrderShortInfo(
- /**
- * Wallet-internal identifier of the proposal.
- */
- val proposalId: String,
- /**
- * Order ID, uniquely identifies the order within a merchant instance.
- */
- val orderId: String,
- /**
- * Base URL of the merchant.
- */
- val merchantBaseUrl: String,
- /**
- * Amount that must be paid for the contract.
- */
- val amount: Amount,
- /**
- * Summary of the proposal, given by the merchant.
- */
- val summary: String
-)
diff --git a/wallet/src/main/java/net/taler/wallet/history/ReserveTransaction.kt b/wallet/src/main/java/net/taler/wallet/history/ReserveTransaction.kt
deleted file mode 100644
index 6c8fdaa..0000000
--- a/wallet/src/main/java/net/taler/wallet/history/ReserveTransaction.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
- */
-
-package net.taler.wallet.history
-
-import com.fasterxml.jackson.annotation.JsonProperty
-import com.fasterxml.jackson.annotation.JsonSubTypes
-import com.fasterxml.jackson.annotation.JsonTypeInfo
-import com.fasterxml.jackson.annotation.JsonTypeInfo.As.PROPERTY
-import com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME
-import com.fasterxml.jackson.annotation.JsonTypeName
-import net.taler.common.Timestamp
-
-
-@JsonTypeInfo(
- use = NAME,
- include = PROPERTY,
- property = "type"
-)
-@JsonSubTypes(
- JsonSubTypes.Type(value = ReserveDepositTransaction::class, name = "DEPOSIT")
-)
-abstract class ReserveTransaction
-
-
-@JsonTypeName("DEPOSIT")
-class ReserveDepositTransaction(
- /**
- * Amount withdrawn.
- */
- val amount: String,
- /**
- * Sender account payto://-URL
- */
- @JsonProperty("sender_account_url")
- val senderAccountUrl: String,
- /**
- * Transfer details uniquely identifying the transfer.
- */
- @JsonProperty("wire_reference")
- val wireReference: String,
- /**
- * Timestamp of the incoming wire transfer.
- */
- val timestamp: Timestamp
-) : ReserveTransaction()
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt
index 044a054..a2cd2e8 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt
@@ -34,7 +34,6 @@ import androidx.recyclerview.widget.RecyclerView.ViewHolder
import net.taler.common.exhaustive
import net.taler.common.toRelativeTime
import net.taler.wallet.R
-import net.taler.wallet.history.AmountType
import net.taler.wallet.transactions.TransactionAdapter.TransactionViewHolder
internal class TransactionAdapter(
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt
index 2a0da3c..7310142 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt
@@ -32,7 +32,6 @@ import net.taler.common.ContractProduct
import net.taler.common.Timestamp
import net.taler.wallet.R
import net.taler.wallet.cleanExchange
-import net.taler.wallet.history.AmountType
@JsonTypeInfo(use = NAME, include = PROPERTY, property = "type")
@JsonSubTypes(
@@ -60,6 +59,12 @@ abstract class Transaction(
abstract fun getTitle(context: Context): String
}
+sealed class AmountType {
+ object Positive : AmountType()
+ object Negative : AmountType()
+ object Neutral : AmountType()
+}
+
@JsonTypeName("withdrawal")
class TransactionWithdrawal(
transactionId: String,
diff --git a/wallet/src/test/java/net/taler/wallet/history/HistoryEventTest.kt b/wallet/src/test/java/net/taler/wallet/history/HistoryEventTest.kt
deleted file mode 100644
index 109b8dc..0000000
--- a/wallet/src/test/java/net/taler/wallet/history/HistoryEventTest.kt
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
- */
-
-package net.taler.wallet.history
-
-import com.fasterxml.jackson.databind.ObjectMapper
-import com.fasterxml.jackson.module.kotlin.KotlinModule
-import com.fasterxml.jackson.module.kotlin.readValue
-import net.taler.common.Amount
-import net.taler.wallet.history.ExchangeAddedEvent
-import net.taler.wallet.history.ExchangeUpdatedEvent
-import net.taler.wallet.history.HistoryEvent
-import net.taler.wallet.history.OrderAcceptedHistoryEvent
-import net.taler.wallet.history.OrderRedirectedHistoryEvent
-import net.taler.wallet.history.OrderRefusedHistoryEvent
-import net.taler.wallet.history.OrderShortInfo
-import net.taler.wallet.history.PaymentAbortedHistoryEvent
-import net.taler.wallet.history.PaymentHistoryEvent
-import net.taler.wallet.history.RefreshHistoryEvent
-import net.taler.wallet.history.RefreshReason.PAY
-import net.taler.wallet.history.RefundHistoryEvent
-import net.taler.wallet.history.ReserveBalanceUpdatedHistoryEvent
-import net.taler.wallet.history.ReserveShortInfo
-import net.taler.wallet.history.ReserveType.MANUAL
-import net.taler.wallet.history.TipAcceptedHistoryEvent
-import net.taler.wallet.history.TipDeclinedHistoryEvent
-import net.taler.wallet.history.UnknownHistoryEvent
-import net.taler.wallet.history.WithdrawHistoryEvent
-import net.taler.wallet.history.WithdrawalSourceReserve
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertTrue
-import org.junit.Test
-import kotlin.random.Random
-
-class HistoryEventTest {
-
- private val mapper = ObjectMapper().registerModule(KotlinModule())
-
- private val timestamp = Random.nextLong()
- private val exchangeBaseUrl = "https://exchange.test.taler.net/"
- private val orderShortInfo = OrderShortInfo(
- proposalId = "EP5MH4R5C9RMNA06YS1QGEJ3EY682PY8R1SGRFRP74EV735N3ATG",
- orderId = "2019.364-01RAQ68DQ7AWR",
- merchantBaseUrl = "https://backend.demo.taler.net/public/instances/FSF/",
- amount = Amount.fromJSONString("KUDOS:0.5"),
- summary = "Essay: Foreword"
- )
-
- @Test
- fun `test ExchangeAddedEvent`() {
- val builtIn = Random.nextBoolean()
- val json = """{
- "type": "exchange-added",
- "builtIn": $builtIn,
- "eventId": "exchange-added;https%3A%2F%2Fexchange.test.taler.net%2F",
- "exchangeBaseUrl": "https:\/\/exchange.test.taler.net\/",
- "timestamp": {
- "t_ms": $timestamp
- }
- }""".trimIndent()
- val event: ExchangeAddedEvent = mapper.readValue(json)
-
- assertEquals(builtIn, event.builtIn)
- assertEquals(exchangeBaseUrl, event.exchangeBaseUrl)
- assertEquals(timestamp, event.timestamp.ms)
- }
-
- @Test
- fun `test ExchangeUpdatedEvent`() {
- val json = """{
- "type": "exchange-updated",
- "eventId": "exchange-updated;https%3A%2F%2Fexchange.test.taler.net%2F",
- "exchangeBaseUrl": "https:\/\/exchange.test.taler.net\/",
- "timestamp": {
- "t_ms": $timestamp
- }
- }""".trimIndent()
- val event: ExchangeUpdatedEvent = mapper.readValue(json)
-
- assertEquals(exchangeBaseUrl, event.exchangeBaseUrl)
- assertEquals(timestamp, event.timestamp.ms)
- }
-
- @Test
- fun `test ReserveShortInfo`() {
- val json = """{
- "exchangeBaseUrl": "https:\/\/exchange.test.taler.net\/",
- "reserveCreationDetail": {
- "type": "manual"
- },
- "reservePub": "BRT2P0YMQSD5F48V9XHVNH73ZTS6EZC0KCQCPGPZQWTSQB77615G"
- }""".trimIndent()
- val info: ReserveShortInfo = mapper.readValue(json)
-
- assertEquals(exchangeBaseUrl, info.exchangeBaseUrl)
- assertEquals(MANUAL, info.reserveCreationDetail.type)
- assertEquals("BRT2P0YMQSD5F48V9XHVNH73ZTS6EZC0KCQCPGPZQWTSQB77615G", info.reservePub)
- }
-
- @Test
- fun `test ReserveBalanceUpdatedTransaction`() {
- val json = """{
- "type": "reserve-balance-updated",
- "eventId": "reserve-balance-updated;K0H10Q6HB9WH0CKHQQMNH5C6GA7A9AR1E2XSS9G1KG3ZXMBVT26G",
- "reserveAwaitedAmount": "TESTKUDOS:23",
- "reserveUnclaimedAmount": "TESTKUDOS:0.01",
- "reserveBalance": "TESTKUDOS:10",
- "timestamp": {
- "t_ms": $timestamp
- },
- "reserveShortInfo": {
- "exchangeBaseUrl": "https:\/\/exchange.test.taler.net\/",
- "reserveCreationDetail": {
- "type": "manual"
- },
- "reservePub": "BRT2P0YMQSD5F48V9XHVNH73ZTS6EZC0KCQCPGPZQWTSQB77615G"
- }
- }""".trimIndent()
- val transaction: ReserveBalanceUpdatedHistoryEvent = mapper.readValue(json)
-
- assertEquals(timestamp, transaction.timestamp.ms)
- assertEquals("TESTKUDOS:23", transaction.reserveAwaitedAmount.toJSONString())
- assertEquals("TESTKUDOS:10", transaction.reserveBalance.toJSONString())
- assertEquals("TESTKUDOS:0.01", transaction.reserveUnclaimedAmount.toJSONString())
- assertEquals(exchangeBaseUrl, transaction.reserveShortInfo.exchangeBaseUrl)
- }
-
- @Test
- fun `test WithdrawTransaction`() {
- val json = """{
- "type": "withdrawn",
- "withdrawalGroupId": "974FT7JDNR20EQKNR21G1HV9PB6T5AZHYHX9NHR51Q30ZK3T10S0",
- "eventId": "withdrawn;974FT7JDNR20EQKNR21G1HV9PB6T5AZHYHX9NHR51Q30ZK3T10S0",
- "amountWithdrawnEffective": "TESTKUDOS:9.8",
- "amountWithdrawnRaw": "TESTKUDOS:10",
- "exchangeBaseUrl": "https:\/\/exchange.test.taler.net\/",
- "timestamp": {
- "t_ms": $timestamp
- },
- "withdrawalSource": {
- "type": "reserve",
- "reservePub": "BRT2P0YMQSD5F48V9XHVNH73ZTS6EZC0KCQCPGPZQWTSQB77615G"
- }
- }""".trimIndent()
- val event: WithdrawHistoryEvent = mapper.readValue(json)
-
- assertEquals(
- "974FT7JDNR20EQKNR21G1HV9PB6T5AZHYHX9NHR51Q30ZK3T10S0",
- event.withdrawalGroupId
- )
- assertEquals("TESTKUDOS:9.8", event.amountWithdrawnEffective.toJSONString())
- assertEquals("TESTKUDOS:10", event.amountWithdrawnRaw.toJSONString())
- assertTrue(event.withdrawalSource is WithdrawalSourceReserve)
- assertEquals(
- "BRT2P0YMQSD5F48V9XHVNH73ZTS6EZC0KCQCPGPZQWTSQB77615G",
- (event.withdrawalSource as WithdrawalSourceReserve).reservePub
- )
- assertEquals(exchangeBaseUrl, event.exchangeBaseUrl)
- assertEquals(timestamp, event.timestamp.ms)
- }
-
- @Test
- fun `test OrderShortInfo`() {
- val json = """{
- "amount": "KUDOS:0.5",
- "orderId": "2019.364-01RAQ68DQ7AWR",
- "merchantBaseUrl": "https:\/\/backend.demo.taler.net\/public\/instances\/FSF\/",
- "proposalId": "EP5MH4R5C9RMNA06YS1QGEJ3EY682PY8R1SGRFRP74EV735N3ATG",
- "summary": "Essay: Foreword"
- }""".trimIndent()
- val info: OrderShortInfo = mapper.readValue(json)
-
- assertEquals("KUDOS:0.5", info.amount.toJSONString())
- assertEquals("2019.364-01RAQ68DQ7AWR", info.orderId)
- assertEquals("Essay: Foreword", info.summary)
- }
-
- @Test
- fun `test OrderAcceptedTransaction`() {
- val json = """{
- "type": "order-accepted",
- "eventId": "order-accepted;EP5MH4R5C9RMNA06YS1QGEJ3EY682PY8R1SGRFRP74EV735N3ATG",
- "orderShortInfo": {
- "amount": "${orderShortInfo.amount.toJSONString()}",
- "orderId": "${orderShortInfo.orderId}",
- "merchantBaseUrl": "${orderShortInfo.merchantBaseUrl}",
- "proposalId": "${orderShortInfo.proposalId}",
- "summary": "${orderShortInfo.summary}"
- },
- "timestamp": {
- "t_ms": $timestamp
- }
- }""".trimIndent()
- val transaction: OrderAcceptedHistoryEvent = mapper.readValue(json)
-
- assertEquals(orderShortInfo, transaction.orderShortInfo)
- assertEquals(timestamp, transaction.timestamp.ms)
- }
-
- @Test
- fun `test OrderRefusedTransaction`() {
- val json = """{
- "type": "order-refused",
- "eventId": "order-refused;9RJGAYXKWX0Y3V37H66606SXSA7V2CV255EBFS4G1JSH6W1EG7F0",
- "orderShortInfo": {
- "amount": "${orderShortInfo.amount.toJSONString()}",
- "orderId": "${orderShortInfo.orderId}",
- "merchantBaseUrl": "${orderShortInfo.merchantBaseUrl}",
- "proposalId": "${orderShortInfo.proposalId}",
- "summary": "${orderShortInfo.summary}"
- },
- "timestamp": {
- "t_ms": $timestamp
- }
- }""".trimIndent()
- val transaction: OrderRefusedHistoryEvent = mapper.readValue(json)
-
- assertEquals(orderShortInfo, transaction.orderShortInfo)
- assertEquals(timestamp, transaction.timestamp.ms)
- }
-
- @Test
- fun `test PaymentTransaction`() {
- val json = """{
- "type": "payment-sent",
- "eventId": "payment-sent;EP5MH4R5C9RMNA06YS1QGEJ3EY682PY8R1SGRFRP74EV735N3ATG",
- "orderShortInfo": {
- "amount": "${orderShortInfo.amount.toJSONString()}",
- "orderId": "${orderShortInfo.orderId}",
- "merchantBaseUrl": "${orderShortInfo.merchantBaseUrl}",
- "proposalId": "${orderShortInfo.proposalId}",
- "summary": "${orderShortInfo.summary}"
- },
- "replay": false,
- "sessionId": "e4f436c4-3c5c-4aee-81d2-26e425c09520",
- "timestamp": {
- "t_ms": $timestamp
- },
- "numCoins": 6,
- "amountPaidWithFees": "KUDOS:0.6"
- }""".trimIndent()
- val event: PaymentHistoryEvent = mapper.readValue(json)
-
- assertEquals(orderShortInfo, event.orderShortInfo)
- assertEquals(false, event.replay)
- assertEquals(6, event.numCoins)
- assertEquals("KUDOS:0.6", event.amountPaidWithFees.toJSONString())
- assertEquals("e4f436c4-3c5c-4aee-81d2-26e425c09520", event.sessionId)
- assertEquals(timestamp, event.timestamp.ms)
- }
-
- @Test
- fun `test PaymentTransaction without sessionId`() {
- val json = """{
- "type": "payment-sent",
- "eventId": "payment-sent;EP5MH4R5C9RMNA06YS1QGEJ3EY682PY8R1SGRFRP74EV735N3ATG",
- "orderShortInfo": {
- "amount": "${orderShortInfo.amount.toJSONString()}",
- "orderId": "${orderShortInfo.orderId}",
- "merchantBaseUrl": "${orderShortInfo.merchantBaseUrl}",
- "proposalId": "${orderShortInfo.proposalId}",
- "summary": "${orderShortInfo.summary}"
- },
- "replay": true,
- "timestamp": {
- "t_ms": $timestamp
- },
- "numCoins": 6,
- "amountPaidWithFees": "KUDOS:0.6"
- }""".trimIndent()
- val event: PaymentHistoryEvent = mapper.readValue(json)
-
- assertEquals(orderShortInfo, event.orderShortInfo)
- assertEquals(true, event.replay)
- assertEquals(6, event.numCoins)
- assertEquals("KUDOS:0.6", event.amountPaidWithFees.toJSONString())
- assertEquals(null, event.sessionId)
- assertEquals(timestamp, event.timestamp.ms)
- }
-
- @Test
- fun `test PaymentAbortedTransaction`() {
- val json = """{
- "type": "payment-aborted",
- "eventId": "payment-sent;898724XGQ1GGMZB4WY3KND582NSP74FZ60BX0Y87FF81H0FJ8XD0",
- "orderShortInfo": {
- "amount": "${orderShortInfo.amount.toJSONString()}",
- "orderId": "${orderShortInfo.orderId}",
- "merchantBaseUrl": "${orderShortInfo.merchantBaseUrl}",
- "proposalId": "${orderShortInfo.proposalId}",
- "summary": "${orderShortInfo.summary}"
- },
- "timestamp": {
- "t_ms": $timestamp
- },
- "amountLost": "KUDOS:0.1"
- }""".trimIndent()
- val transaction: PaymentAbortedHistoryEvent = mapper.readValue(json)
-
- assertEquals(orderShortInfo, transaction.orderShortInfo)
- assertEquals("KUDOS:0.1", transaction.amountLost.toJSONString())
- assertEquals(timestamp, transaction.timestamp.ms)
- }
-
- @Test
- fun `test TipAcceptedTransaction`() {
- val json = """{
- "type": "tip-accepted",
- "timestamp": {
- "t_ms": $timestamp
- },
- "eventId": "tip-accepted;898724XGQ1GGMZB4WY3KND582NSP74FZ60BX0Y87FF81H0FJ8XD0",
- "tipId": "tip-accepted;898724XGQ1GGMZB4WY3KND582NSP74FZ60BX0Y87FF81H0FJ8XD0",
- "tipRaw": "KUDOS:4"
- }""".trimIndent()
- val transaction: TipAcceptedHistoryEvent = mapper.readValue(json)
-
- assertEquals(
- "tip-accepted;898724XGQ1GGMZB4WY3KND582NSP74FZ60BX0Y87FF81H0FJ8XD0",
- transaction.tipId
- )
- assertEquals("KUDOS:4", transaction.tipRaw.toJSONString())
- assertEquals(timestamp, transaction.timestamp.ms)
- }
-
- @Test
- fun `test TipDeclinedTransaction`() {
- val json = """{
- "type": "tip-declined",
- "timestamp": {
- "t_ms": $timestamp
- },
- "eventId": "tip-accepted;898724XGQ1GGMZB4WY3KND582NSP74FZ60BX0Y87FF81H0FJ8XD0",
- "tipId": "tip-accepted;998724XGQ1GGMZB4WY3KND582NSP74FZ60BX0Y87FF81H0FJ8XD0",
- "tipAmount": "KUDOS:4"
- }""".trimIndent()
- val transaction: TipDeclinedHistoryEvent = mapper.readValue(json)
-
- assertEquals(
- "tip-accepted;998724XGQ1GGMZB4WY3KND582NSP74FZ60BX0Y87FF81H0FJ8XD0",
- transaction.tipId
- )
- assertEquals("KUDOS:4", transaction.tipAmount.toJSONString())
- assertEquals(timestamp, transaction.timestamp.ms)
- }
-
- @Test
- fun `test RefundTransaction`() {
- val json = """{
- "type": "refund",
- "eventId": "refund;898724XGQ1GGMZB4WY3KND582NSP74FZ60BX0Y87FF81H0FJ8XD0",
- "refundGroupId": "refund;998724",
- "orderShortInfo": {
- "amount": "${orderShortInfo.amount.toJSONString()}",
- "orderId": "${orderShortInfo.orderId}",
- "merchantBaseUrl": "${orderShortInfo.merchantBaseUrl}",
- "proposalId": "${orderShortInfo.proposalId}",
- "summary": "${orderShortInfo.summary}"
- },
- "timestamp": {
- "t_ms": $timestamp
- },
- "amountRefundedRaw": "KUDOS:1",
- "amountRefundedInvalid": "KUDOS:0.5",
- "amountRefundedEffective": "KUDOS:0.4"
- }""".trimIndent()
- val event: RefundHistoryEvent = mapper.readValue(json)
-
- assertEquals("refund;998724", event.refundGroupId)
- assertEquals("KUDOS:1", event.amountRefundedRaw.toJSONString())
- assertEquals("KUDOS:0.5", event.amountRefundedInvalid.toJSONString())
- assertEquals("KUDOS:0.4", event.amountRefundedEffective.toJSONString())
- assertEquals(orderShortInfo, event.orderShortInfo)
- assertEquals(timestamp, event.timestamp.ms)
- }
-
- @Test
- fun `test RefreshTransaction`() {
- val json = """{
- "type": "refreshed",
- "refreshGroupId": "8AVHKJFAN4QV4C11P56NEY83AJMGFF2KF412AN3Y0QBP09RSN640",
- "eventId": "refreshed;8AVHKJFAN4QV4C11P56NEY83AJMGFF2KF412AN3Y0QBP09RSN640",
- "timestamp": {
- "t_ms": $timestamp
- },
- "refreshReason": "pay",
- "amountRefreshedEffective": "KUDOS:0",
- "amountRefreshedRaw": "KUDOS:1",
- "numInputCoins": 6,
- "numOutputCoins": 0,
- "numRefreshedInputCoins": 1
- }""".trimIndent()
- val event: RefreshHistoryEvent = mapper.readValue(json)
-
- assertEquals("KUDOS:0", event.amountRefreshedEffective.toJSONString())
- assertEquals("KUDOS:1", event.amountRefreshedRaw.toJSONString())
- assertEquals(6, event.numInputCoins)
- assertEquals(0, event.numOutputCoins)
- assertEquals(1, event.numRefreshedInputCoins)
- assertEquals("8AVHKJFAN4QV4C11P56NEY83AJMGFF2KF412AN3Y0QBP09RSN640", event.refreshGroupId)
- assertEquals(PAY, event.refreshReason)
- assertEquals(timestamp, event.timestamp.ms)
- }
-
- @Test
- fun `test OrderRedirectedTransaction`() {
- val json = """{
- "type": "order-redirected",
- "eventId": "order-redirected;621J6D5SXG7M17TYA26945DYKNQZPW4600MZ1W8MADA1RRR49F8G",
- "alreadyPaidOrderShortInfo": {
- "amount": "KUDOS:0.5",
- "orderId": "2019.354-01P25CD66P8NG",
- "merchantBaseUrl": "https://backend.demo.taler.net/public/instances/FSF/",
- "proposalId": "898724XGQ1GGMZB4WY3KND582NSP74FZ60BX0Y87FF81H0FJ8XD0",
- "summary": "Essay: 1. The Free Software Definition"
- },
- "newOrderShortInfo": {
- "amount": "KUDOS:0.5",
- "orderId": "2019.364-01M4QH6KPMJY4",
- "merchantBaseUrl": "https://backend.demo.taler.net/public/instances/FSF/",
- "proposalId": "621J6D5SXG7M17TYA26945DYKNQZPW4600MZ1W8MADA1RRR49F8G",
- "summary": "Essay: 1. The Free Software Definition"
- },
- "timestamp": {
- "t_ms": $timestamp
- }
- }""".trimIndent()
- val transaction: OrderRedirectedHistoryEvent = mapper.readValue(json)
-
- assertEquals(
- "898724XGQ1GGMZB4WY3KND582NSP74FZ60BX0Y87FF81H0FJ8XD0",
- transaction.alreadyPaidOrderShortInfo.proposalId
- )
- assertEquals(
- "https://backend.demo.taler.net/public/instances/FSF/",
- transaction.alreadyPaidOrderShortInfo.merchantBaseUrl
- )
- assertEquals("2019.354-01P25CD66P8NG", transaction.alreadyPaidOrderShortInfo.orderId)
- assertEquals("KUDOS:0.5", transaction.alreadyPaidOrderShortInfo.amount.toJSONString())
- assertEquals(
- "Essay: 1. The Free Software Definition",
- transaction.alreadyPaidOrderShortInfo.summary
- )
-
- assertEquals(
- "621J6D5SXG7M17TYA26945DYKNQZPW4600MZ1W8MADA1RRR49F8G",
- transaction.newOrderShortInfo.proposalId
- )
- assertEquals(
- "https://backend.demo.taler.net/public/instances/FSF/",
- transaction.newOrderShortInfo.merchantBaseUrl
- )
- assertEquals("2019.364-01M4QH6KPMJY4", transaction.newOrderShortInfo.orderId)
- assertEquals("KUDOS:0.5", transaction.newOrderShortInfo.amount.toJSONString())
- assertEquals("Essay: 1. The Free Software Definition", transaction.newOrderShortInfo.summary)
-
- assertEquals(timestamp, transaction.timestamp.ms)
- }
-
- @Test
- fun `test UnknownTransaction`() {
- val json = """{
- "type": "does not exist",
- "timestamp": {
- "t_ms": $timestamp
- },
- "eventId": "does-not-exist;898724XGQ1GGMZB4WY3KND582NSP74FZ60BX0Y87FF81H0FJ8XD0"
- }""".trimIndent()
- val event: HistoryEvent = mapper.readValue(json)
-
- assertEquals(UnknownHistoryEvent::class.java, event.javaClass)
- assertEquals(timestamp, event.timestamp.ms)
- }
-
-}
diff --git a/wallet/src/test/java/net/taler/wallet/history/ReserveHistoryEventTest.kt b/wallet/src/test/java/net/taler/wallet/history/ReserveHistoryEventTest.kt
deleted file mode 100644
index f09d7b6..0000000
--- a/wallet/src/test/java/net/taler/wallet/history/ReserveHistoryEventTest.kt
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
- */
-
-package net.taler.wallet.history
-
-import com.fasterxml.jackson.databind.ObjectMapper
-import com.fasterxml.jackson.module.kotlin.KotlinModule
-import com.fasterxml.jackson.module.kotlin.readValue
-import net.taler.wallet.history.ReserveDepositTransaction
-import org.junit.Assert.assertEquals
-import org.junit.Test
-import kotlin.random.Random
-
-class ReserveHistoryEventTest {
-
- private val mapper = ObjectMapper().registerModule(KotlinModule())
-
- private val timestamp = Random.nextLong()
-
- @Test
- fun `test ExchangeAddedEvent`() {
- val senderAccountUrl = "payto://x-taler-bank/bank.test.taler.net/894"
- val json = """{
- "amount": "TESTKUDOS:10",
- "sender_account_url": "payto:\/\/x-taler-bank\/bank.test.taler.net\/894",
- "timestamp": {
- "t_ms": $timestamp
- },
- "wire_reference": "00000000004TR",
- "type": "DEPOSIT"
- }""".trimIndent()
- val transaction: ReserveDepositTransaction = mapper.readValue(json)
-
- assertEquals("TESTKUDOS:10", transaction.amount)
- assertEquals(senderAccountUrl, transaction.senderAccountUrl)
- assertEquals("00000000004TR", transaction.wireReference)
- assertEquals(timestamp, transaction.timestamp.ms)
- }
-
-}