From dce35fc26b9cd84654d41e6b8bc5d12513bc9148 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 30 Jul 2026 03:18:34 -0700 Subject: [PATCH] Updated on 2026-08-14 --- .../tangempay/TangemPayAnalyticsEvents.kt | 10 ++++++ .../tangempay/model/TangemPayCardPageModel.kt | 2 ++ .../tangempay/model/TangemPayDetailsModel.kt | 2 ++ .../model/TangemPayDetailsModelTest.kt | 34 +++++++++++++++++++ 4 files changed, 48 insertions(+) diff --git a/domain/visa/src/main/kotlin/com/tangem/domain/tangempay/TangemPayAnalyticsEvents.kt b/domain/visa/src/main/kotlin/com/tangem/domain/tangempay/TangemPayAnalyticsEvents.kt index 057fd1e52d..cb5cfdd04a 100644 --- a/domain/visa/src/main/kotlin/com/tangem/domain/tangempay/TangemPayAnalyticsEvents.kt +++ b/domain/visa/src/main/kotlin/com/tangem/domain/tangempay/TangemPayAnalyticsEvents.kt @@ -319,6 +319,11 @@ sealed class TangemPayAnalyticsEvents( event = "Success Screen Activation", ) + class VaPreparationPopupShowed : TangemPayAnalyticsEvents( + categoryName = "Visa VA Topup", + event = "Preparation Popup Showed", + ) + class VaConditionsPopupShowed : TangemPayAnalyticsEvents( categoryName = "Visa VA Topup", event = "Conditions Popup Showed", @@ -334,6 +339,11 @@ sealed class TangemPayAnalyticsEvents( event = "Banking Details Showed", ) + class VaDetailsErrorShowed : TangemPayAnalyticsEvents( + categoryName = "Visa VA Topup", + event = "Details Error Showed", + ) + class VaShareDetailsButtonClicked : TangemPayAnalyticsEvents( categoryName = "Visa VA Topup", event = "Share Details Button Clicked", diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayCardPageModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayCardPageModel.kt index e52ebe3b00..6864903654 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayCardPageModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayCardPageModel.kt @@ -476,6 +476,7 @@ internal class TangemPayCardPageModel @Inject constructor( } fun showVaBankingDetailsError() { + analytics.send(TangemPayAnalyticsEvents.VaDetailsErrorShowed()) bottomSheetNavigation.dismiss() bottomSheetNavigation.activate( TangemPayCardNavigation.VaBankingDetailsError(userWalletId = userWalletId), @@ -483,6 +484,7 @@ internal class TangemPayCardPageModel @Inject constructor( } private fun showVaPreparing() { + analytics.send(TangemPayAnalyticsEvents.VaPreparationPopupShowed()) bottomSheetNavigation.dismiss() uiMessageSender.send(message = TangemPayMessagesFactory.createVaPreparingMessage()) } diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt index 25963d5a36..ed1d482bed 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt @@ -380,6 +380,7 @@ internal class TangemPayDetailsModel @Inject constructor( } fun showVaBankingDetailsError() { + analytics.send(TangemPayAnalyticsEvents.VaDetailsErrorShowed()) bottomSheetNavigation.dismiss() bottomSheetNavigation.activate( TangemPayDetailsNavigation.VaBankingDetailsError(userWalletId = userWalletId), @@ -387,6 +388,7 @@ internal class TangemPayDetailsModel @Inject constructor( } private fun showVaPreparing() { + analytics.send(TangemPayAnalyticsEvents.VaPreparationPopupShowed()) bottomSheetNavigation.dismiss() uiMessageSender.send(message = TangemPayMessagesFactory.createVaPreparingMessage()) } diff --git a/features/tangempay/details/impl/src/test/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModelTest.kt b/features/tangempay/details/impl/src/test/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModelTest.kt index 6a1a18c533..0a44652574 100644 --- a/features/tangempay/details/impl/src/test/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModelTest.kt +++ b/features/tangempay/details/impl/src/test/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModelTest.kt @@ -7,6 +7,7 @@ import com.tangem.core.decompose.model.MutableParamsContainer import com.tangem.domain.models.StatusSource import com.tangem.domain.models.account.AccountStatus import com.tangem.domain.models.account.PaymentAccountStatusValue +import com.tangem.domain.models.account.VirtualAccountOnramp import com.tangem.domain.models.pay.TangemPayCardFrozenState import com.tangem.domain.models.pay.TangemPayDetailsInitialRoute import com.tangem.domain.models.wallet.UserWalletId @@ -30,6 +31,7 @@ import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.MethodSource import java.math.BigDecimal @@ -82,6 +84,36 @@ internal class TangemPayDetailsModelTest { model.onDestroy() } + @Test + fun `GIVEN virtual account is processing WHEN bank transfer clicked THEN preparation popup event sent`() = + runTest { + // GIVEN + val model = createModel(testScope = this, virtualAccount = VirtualAccountOnramp.Processing) + advanceUntilIdle() + + // WHEN + model.onClickBankTransfer() + + // THEN + verify(exactly = 1) { analytics.send(ofType()) } + verify(exactly = 0) { analytics.send(ofType()) } + model.onDestroy() + } + + @Test + fun `GIVEN loaded status WHEN banking details error shown THEN details error event sent`() = runTest { + // GIVEN + val model = createModel(testScope = this) + advanceUntilIdle() + + // WHEN + model.showVaBankingDetailsError() + + // THEN + verify(exactly = 1) { analytics.send(ofType()) } + model.onDestroy() + } + private fun createModel( testScope: TestScope, statusSource: StatusSource = StatusSource.ACTUAL, @@ -89,11 +121,13 @@ internal class TangemPayDetailsModelTest { availableForWithdrawal: BigDecimal = BigDecimal.ZERO, accountError: PaymentAccountStatusValue.Error? = null, statusValue: PaymentAccountStatusValue? = null, + virtualAccount: VirtualAccountOnramp? = null, ): TangemPayDetailsModel { val loaded: PaymentAccountStatusValue.Loaded = mockk(relaxed = true) { every { source } returns statusSource every { error } returns accountError every { customerId } returns "customer-id" + every { this@mockk.virtualAccount } returns virtualAccount every { cards } returns listOf(tangemPayCard()) every { balance } returns PaymentAccountStatusValue.Balance( fiatBalance = PaymentAccountStatusValue.FiatBalance(