diff options
author | Torsten Grote <t@grobox.de> | 2020-05-14 11:01:07 -0300 |
---|---|---|
committer | Torsten Grote <t@grobox.de> | 2020-05-15 14:26:42 -0300 |
commit | 171a1ae228b801d5c0d54c6c7e7ad8aa458d6bce (patch) | |
tree | 765016dc7b6bc9d3c10fe69ec50f52b9e94b3366 /wallet/src | |
parent | bedd7b05eb0b5ee69cd5f35b283e713cf8af29dc (diff) | |
download | taler-android-171a1ae228b801d5c0d54c6c7e7ad8aa458d6bce.tar.gz taler-android-171a1ae228b801d5c0d54c6c7e7ad8aa458d6bce.tar.bz2 taler-android-171a1ae228b801d5c0d54c6c7e7ad8aa458d6bce.zip |
[wallet] clean up old history code that not needed anymore
The history is now only for debugging visible in dev mode,
so it is sufficient to show JSON and not parse all its fields.
Diffstat (limited to 'wallet/src')
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) - } - -} |