diff options
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) - } - -} |