From 76ce02213f2bbedbfd9406ddc6eae851997fe9b3 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 31 Jan 2024 11:57:18 +0100 Subject: [PATCH 01/14] Attach receipt source inside of PaymentFlowTracker --- .../payments/receipt/PaymentReceiptHelper.kt | 2 +- .../payments/tracking/PaymentsFlowTracker.kt | 22 ++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/receipt/PaymentReceiptHelper.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/receipt/PaymentReceiptHelper.kt index 8832e65cfeb..daf1bbffaee 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/receipt/PaymentReceiptHelper.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/receipt/PaymentReceiptHelper.kt @@ -77,7 +77,7 @@ class PaymentReceiptHelper @Inject constructor( } } - private suspend fun isWCCanGenerateReceipts(): Boolean { + suspend fun isWCCanGenerateReceipts(): Boolean { val currentWooCoreVersion = getWoocommerceCorePluginVersion() return currentWooCoreVersion.semverCompareTo(WC_CAN_GENERATE_RECEIPTS_VERSION) >= 0 diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt index 9cdce47de8a..b6959450f9c 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt @@ -73,6 +73,7 @@ import com.woocommerce.android.ui.payments.cardreader.onboarding.PluginType import com.woocommerce.android.ui.payments.cardreader.onboarding.PluginType.STRIPE_EXTENSION_GATEWAY import com.woocommerce.android.ui.payments.cardreader.onboarding.PluginType.WOOCOMMERCE_PAYMENTS import com.woocommerce.android.ui.payments.hub.PaymentsHubViewModel.CashOnDeliverySource +import com.woocommerce.android.ui.payments.receipt.PaymentReceiptHelper import com.woocommerce.android.ui.payments.receipt.PaymentReceiptShare import com.woocommerce.android.ui.payments.taptopay.TapToPayAvailabilityStatus.Result.NotAvailable import javax.inject.Inject @@ -81,7 +82,8 @@ class PaymentsFlowTracker @Inject constructor( private val trackerWrapper: AnalyticsTrackerWrapper, private val appPrefsWrapper: AppPrefsWrapper, private val selectedSite: SelectedSite, - private val cardReaderTrackingInfoProvider: CardReaderTrackingInfoProvider + private val cardReaderTrackingInfoProvider: CardReaderTrackingInfoProvider, + private val paymentReceiptHelper: PaymentReceiptHelper, ) { @VisibleForTesting fun track( @@ -156,6 +158,13 @@ class PaymentsFlowTracker @Inject constructor( } } + private suspend fun getReceiptSource(): Pair = + if (paymentReceiptHelper.isWCCanGenerateReceipts()) { + "source" to "backend" + } else { + "source" to "local" + } + @Suppress("ComplexMethod") private fun getOnboardingNotCompletedReason(state: CardReaderOnboardingState): String? = when (state) { @@ -581,27 +590,30 @@ class PaymentsFlowTracker @Inject constructor( ) } - fun trackPaymentsReceiptSharingFailed(sharingResult: PaymentReceiptShare.ReceiptShareResult.Error) { + suspend fun trackPaymentsReceiptSharingFailed(sharingResult: PaymentReceiptShare.ReceiptShareResult.Error) { when (sharingResult) { is PaymentReceiptShare.ReceiptShareResult.Error.FileCreation -> { track( RECEIPT_EMAIL_FAILED, errorType = "file_creation_failed", - errorDescription = "File creation failed" + errorDescription = "File creation failed", + properties = mutableMapOf(getReceiptSource()) ) } is PaymentReceiptShare.ReceiptShareResult.Error.FileDownload -> { track( RECEIPT_EMAIL_FAILED, errorType = "file_download_failed", - errorDescription = "File download failed" + errorDescription = "File download failed", + properties = mutableMapOf(getReceiptSource()) ) } is PaymentReceiptShare.ReceiptShareResult.Error.Sharing -> { track( RECEIPT_EMAIL_FAILED, errorType = "no_app_found", - errorDescription = sharingResult.exception.message + errorDescription = sharingResult.exception.message, + properties = mutableMapOf(getReceiptSource()) ) } } From 976762d5fef4b3a3a2b76ca049f53e0e072f792c Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 31 Jan 2024 12:20:28 +0100 Subject: [PATCH 02/14] Added source prop to the all methods that track receipt events --- .../payments/tracking/PaymentsFlowTracker.kt | 49 ++++++++++++++----- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt index b6959450f9c..38b58c005a3 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt @@ -421,28 +421,53 @@ class PaymentsFlowTracker @Inject constructor( ) } - fun trackPrintReceiptTapped() { - track(RECEIPT_PRINT_TAPPED) + suspend fun trackPrintReceiptTapped() { + track( + RECEIPT_PRINT_TAPPED, + properties = mutableMapOf(getReceiptSource()) + ) + } + + suspend fun trackEmailReceiptTapped() { + track( + RECEIPT_EMAIL_TAPPED, + properties = mutableMapOf(getReceiptSource()) + ) } - fun trackEmailReceiptTapped() { - track(RECEIPT_EMAIL_TAPPED) + suspend fun trackEmailReceiptFailed() { + track( + RECEIPT_EMAIL_FAILED, + properties = mutableMapOf(getReceiptSource()) + ) } - fun trackEmailReceiptFailed() { - track(RECEIPT_EMAIL_FAILED) + suspend fun trackPrintReceiptCancelled() { + track( + RECEIPT_PRINT_CANCELED, + properties = mutableMapOf(getReceiptSource()) + ) } - fun trackPrintReceiptCancelled() { - track(RECEIPT_PRINT_CANCELED) + suspend fun trackPrintReceiptFailed() { + track( + RECEIPT_PRINT_FAILED, + properties = mutableMapOf(getReceiptSource()) + ) } - fun trackPrintReceiptFailed() { - track(RECEIPT_PRINT_FAILED) + suspend fun trackPrintReceiptSucceeded() { + track( + RECEIPT_PRINT_SUCCESS, + properties = mutableMapOf(getReceiptSource()) + ) } - fun trackPrintReceiptSucceeded() { - track(RECEIPT_PRINT_SUCCESS) + suspend fun trackReceiptViewTapped() { + track( + AnalyticsEvent.RECEIPT_VIEW_TAPPED, + properties = mutableMapOf(getReceiptSource()) + ) } fun trackPaymentCancelled(currentPaymentState: String?) { From d510551fb907e5418180f44320425b0b5ae1503e Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 31 Jan 2024 12:21:32 +0100 Subject: [PATCH 03/14] Removed redundant method --- .../cardreader/payment/CardReaderPaymentViewModel.kt | 5 ----- .../payments/cardreader/CardReaderPaymentViewModelTest.kt | 8 -------- 2 files changed, 13 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/CardReaderPaymentViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/CardReaderPaymentViewModel.kt index fc52388c3f9..c42ffc05783 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/CardReaderPaymentViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/CardReaderPaymentViewModel.kt @@ -756,11 +756,6 @@ class CardReaderPaymentViewModel } } - fun onEmailActivityNotFound() { - tracker.trackEmailReceiptFailed() - triggerEvent(ShowSnackbarInDialog(R.string.card_reader_payment_receipt_app_to_share_not_found)) - } - fun onPrintResult(result: PrintJobResult) { showPaymentSuccessfulState() diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/CardReaderPaymentViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/CardReaderPaymentViewModelTest.kt index a9cbfa61c5f..3b47aaaf39c 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/CardReaderPaymentViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/CardReaderPaymentViewModelTest.kt @@ -2568,14 +2568,6 @@ class CardReaderPaymentViewModelTest : BaseUnitTest() { assertThat(viewModel.event.value).isInstanceOf(Exit::class.java) } - @Test - fun `when email activity not found, then event tracked`() = - testBlocking { - viewModel.onEmailActivityNotFound() - - verify(tracker).trackEmailReceiptFailed() - } - @Test fun `given user presses back button, when re-fetching order, then ReFetchingOrderState shown`() = testBlocking { From 862156d6bed5a2d982f4e15a21d4946fa52b533e Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 31 Jan 2024 12:23:55 +0100 Subject: [PATCH 04/14] Launch to track receipt events --- .../cardreader/payment/CardReaderPaymentViewModel.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/CardReaderPaymentViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/CardReaderPaymentViewModel.kt index c42ffc05783..53ed4f52590 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/CardReaderPaymentViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/CardReaderPaymentViewModel.kt @@ -759,10 +759,12 @@ class CardReaderPaymentViewModel fun onPrintResult(result: PrintJobResult) { showPaymentSuccessfulState() - when (result) { - CANCELLED -> tracker.trackPrintReceiptCancelled() - FAILED -> tracker.trackPrintReceiptFailed() - STARTED -> tracker.trackPrintReceiptSucceeded() + launch { + when (result) { + CANCELLED -> tracker.trackPrintReceiptCancelled() + FAILED -> tracker.trackPrintReceiptFailed() + STARTED -> tracker.trackPrintReceiptSucceeded() + } } } From a466cc3d8a7f8cb02bd2fb5a19489cd3c35bce76 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 31 Jan 2024 12:30:53 +0100 Subject: [PATCH 05/14] Track all receipt related events via tracker class --- .../preview/ReceiptPreviewViewModel.kt | 25 ++++++++----------- .../payments/tracking/PaymentsFlowTracker.kt | 7 ------ 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/receipt/preview/ReceiptPreviewViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/receipt/preview/ReceiptPreviewViewModel.kt index ed7aa503ec5..1a24d00ab66 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/receipt/preview/ReceiptPreviewViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/receipt/preview/ReceiptPreviewViewModel.kt @@ -4,12 +4,6 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.SavedStateHandle import com.woocommerce.android.R.string -import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_EMAIL_TAPPED -import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_CANCELED -import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_FAILED -import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_SUCCESS -import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_TAPPED -import com.woocommerce.android.analytics.AnalyticsTrackerWrapper import com.woocommerce.android.ui.payments.receipt.PaymentReceiptShare import com.woocommerce.android.ui.payments.receipt.preview.ReceiptPreviewViewModel.ReceiptPreviewViewState.Content import com.woocommerce.android.ui.payments.receipt.preview.ReceiptPreviewViewModel.ReceiptPreviewViewState.Loading @@ -29,7 +23,6 @@ import javax.inject.Inject class ReceiptPreviewViewModel @Inject constructor( savedState: SavedStateHandle, - private val tracker: AnalyticsTrackerWrapper, private val paymentsFlowTracker: PaymentsFlowTracker, private val paymentReceiptShare: PaymentReceiptShare, ) : ScopedViewModel(savedState) { @@ -47,15 +40,17 @@ class ReceiptPreviewViewModel } fun onPrintClicked() { - tracker.track(RECEIPT_PRINT_TAPPED) - triggerEvent(PrintReceipt(args.receiptUrl, "receipt-order-${args.orderId}")) + launch { + paymentsFlowTracker.trackPrintReceiptTapped() + triggerEvent(PrintReceipt(args.receiptUrl, "receipt-order-${args.orderId}")) + } } fun onShareClicked() { launch { viewState.value = Loading - tracker.track(RECEIPT_EMAIL_TAPPED) + paymentsFlowTracker.trackEmailReceiptTapped() when (val sharingResult = paymentReceiptShare(args.receiptUrl, args.orderId)) { is PaymentReceiptShare.ReceiptShareResult.Error.FileCreation -> { paymentsFlowTracker.trackPaymentsReceiptSharingFailed(sharingResult) @@ -79,13 +74,13 @@ class ReceiptPreviewViewModel } fun onPrintResult(result: PrintJobResult) { - tracker.track( + launch { when (result) { - CANCELLED -> RECEIPT_PRINT_CANCELED - FAILED -> RECEIPT_PRINT_FAILED - STARTED -> RECEIPT_PRINT_SUCCESS + CANCELLED -> paymentsFlowTracker.trackPrintReceiptCancelled() + FAILED -> paymentsFlowTracker.trackPrintReceiptFailed() + STARTED -> paymentsFlowTracker.trackPrintReceiptSucceeded() } - ) + } } sealed class ReceiptPreviewViewState( diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt index 38b58c005a3..52271edf0cb 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt @@ -435,13 +435,6 @@ class PaymentsFlowTracker @Inject constructor( ) } - suspend fun trackEmailReceiptFailed() { - track( - RECEIPT_EMAIL_FAILED, - properties = mutableMapOf(getReceiptSource()) - ) - } - suspend fun trackPrintReceiptCancelled() { track( RECEIPT_PRINT_CANCELED, From 70635adf45e0abc73d80c4a57679abe9a4fb681f Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 31 Jan 2024 12:33:28 +0100 Subject: [PATCH 06/14] RECEIPT_URL_FETCHING_FAILS added an event --- .../kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt index 6b269a756c9..a6a748927a7 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt @@ -452,6 +452,7 @@ enum class AnalyticsEvent(val siteless: Boolean = false) { RECEIPT_PRINT_CANCELED, RECEIPT_PRINT_SUCCESS, RECEIPT_VIEW_TAPPED, + RECEIPT_URL_FETCHING_FAILS, // -- Top-level navigation MAIN_MENU_SETTINGS_TAPPED, From 53adb50ef2d5975806726e8eae344849bf3ce9ed Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 31 Jan 2024 12:38:48 +0100 Subject: [PATCH 07/14] RECEIPT_VIEW_TAPPED tracked --- .../android/ui/orders/details/OrderDetailTracker.kt | 9 +++++---- .../android/ui/payments/tracking/PaymentsFlowTracker.kt | 8 ++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailTracker.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailTracker.kt index b86ef2b5a92..195b3b88586 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailTracker.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailTracker.kt @@ -4,11 +4,13 @@ import com.woocommerce.android.analytics.AnalyticsEvent import com.woocommerce.android.analytics.AnalyticsTracker import com.woocommerce.android.analytics.AnalyticsTrackerWrapper import com.woocommerce.android.model.Order +import com.woocommerce.android.ui.payments.tracking.PaymentsFlowTracker import org.wordpress.android.fluxc.store.WCOrderStore import javax.inject.Inject class OrderDetailTracker @Inject constructor( - private val trackerWrapper: AnalyticsTrackerWrapper + private val trackerWrapper: AnalyticsTrackerWrapper, + private val paymentsFlowTracker: PaymentsFlowTracker, ) { fun trackCustomFieldsTapped() { trackerWrapper.track(AnalyticsEvent.ORDER_VIEW_CUSTOM_FIELDS_TAPPED) @@ -24,9 +26,8 @@ class OrderDetailTracker @Inject constructor( ) } - fun trackReceiptViewTapped(orderId: Long, orderStatus: Order.Status) { - trackerWrapper.track( - AnalyticsEvent.RECEIPT_VIEW_TAPPED, + suspend fun trackReceiptViewTapped(orderId: Long, orderStatus: Order.Status) { + paymentsFlowTracker.trackReceiptViewTapped( mapOf( AnalyticsTracker.KEY_ORDER_ID to orderId, AnalyticsTracker.KEY_STATUS to orderStatus diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt index 52271edf0cb..105f4efa171 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt @@ -456,10 +456,14 @@ class PaymentsFlowTracker @Inject constructor( ) } - suspend fun trackReceiptViewTapped() { + suspend fun trackReceiptViewTapped(properties: Map) { track( AnalyticsEvent.RECEIPT_VIEW_TAPPED, - properties = mutableMapOf(getReceiptSource()) + properties = properties.toMutableMap().also { + it.putAll( + mapOf(getReceiptSource()) + ) + } ) } From fd3966a94bfca3898ab0de69bd4d24809cea1488 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 31 Jan 2024 12:40:53 +0100 Subject: [PATCH 08/14] trackReceiptUrlFetchingFails method --- .../ui/payments/tracking/PaymentsFlowTracker.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt index 105f4efa171..eea12f6ad83 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt @@ -53,6 +53,7 @@ import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_CANCELED import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_FAILED import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_SUCCESS import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_TAPPED +import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_URL_FETCHING_FAILS import com.woocommerce.android.analytics.AnalyticsTracker import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_CASH_ON_DELIVERY_SOURCE import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_ERROR_DESC @@ -467,6 +468,18 @@ class PaymentsFlowTracker @Inject constructor( ) } + suspend fun trackReceiptUrlFetchingFails( + errorDescription: String, + errorType: String, + ) { + track( + RECEIPT_URL_FETCHING_FAILS, + properties = mutableMapOf(getReceiptSource()), + errorDescription = errorDescription, + errorType = errorType, + ) + } + fun trackPaymentCancelled(currentPaymentState: String?) { track( CARD_PRESENT_COLLECT_PAYMENT_CANCELLED, From bf278d4a0b9474f0b59ec99b62ca7b5108588788 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 31 Jan 2024 12:41:52 +0100 Subject: [PATCH 09/14] RECEIPT_VIEW_TAPPED imported statically --- .../android/ui/payments/tracking/PaymentsFlowTracker.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt index eea12f6ad83..bdbcc421ee9 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt @@ -54,6 +54,7 @@ import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_FAILED import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_SUCCESS import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_TAPPED import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_URL_FETCHING_FAILS +import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_VIEW_TAPPED import com.woocommerce.android.analytics.AnalyticsTracker import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_CASH_ON_DELIVERY_SOURCE import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_ERROR_DESC @@ -459,7 +460,7 @@ class PaymentsFlowTracker @Inject constructor( suspend fun trackReceiptViewTapped(properties: Map) { track( - AnalyticsEvent.RECEIPT_VIEW_TAPPED, + RECEIPT_VIEW_TAPPED, properties = properties.toMutableMap().also { it.putAll( mapOf(getReceiptSource()) @@ -635,6 +636,7 @@ class PaymentsFlowTracker @Inject constructor( properties = mutableMapOf(getReceiptSource()) ) } + is PaymentReceiptShare.ReceiptShareResult.Error.FileDownload -> { track( RECEIPT_EMAIL_FAILED, @@ -643,6 +645,7 @@ class PaymentsFlowTracker @Inject constructor( properties = mutableMapOf(getReceiptSource()) ) } + is PaymentReceiptShare.ReceiptShareResult.Error.Sharing -> { track( RECEIPT_EMAIL_FAILED, From 08122c25215cc9e68bfce5b70df417d3ff1049ca Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 31 Jan 2024 12:44:46 +0100 Subject: [PATCH 10/14] trackReceiptUrlFetchingFails in the order details screen --- .../android/ui/orders/details/OrderDetailViewModel.kt | 3 +++ .../android/ui/payments/tracking/PaymentsFlowTracker.kt | 6 +----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailViewModel.kt index b018d182f78..6b3df9c207f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailViewModel.kt @@ -351,6 +351,9 @@ class OrderDetailViewModel @Inject constructor( if (receiptResult.isSuccess) { triggerEvent(PreviewReceipt(order.billingAddress.email, receiptResult.getOrThrow(), order.id)) } else { + paymentsFlowTracker.trackReceiptUrlFetchingFails( + errorDescription = receiptResult.exceptionOrNull()?.message ?: "Unknown error", + ) triggerEvent(ShowSnackbar(string.receipt_fetching_error)) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt index bdbcc421ee9..ffd264fd820 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt @@ -469,15 +469,11 @@ class PaymentsFlowTracker @Inject constructor( ) } - suspend fun trackReceiptUrlFetchingFails( - errorDescription: String, - errorType: String, - ) { + suspend fun trackReceiptUrlFetchingFails(errorDescription: String) { track( RECEIPT_URL_FETCHING_FAILS, properties = mutableMapOf(getReceiptSource()), errorDescription = errorDescription, - errorType = errorType, ) } From efbed421734c0b6d1750d197c67dc6889f6cc28d Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 31 Jan 2024 12:45:40 +0100 Subject: [PATCH 11/14] On card card reader restult screen --- .../cardreader/payment/CardReaderPaymentViewModel.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/CardReaderPaymentViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/CardReaderPaymentViewModel.kt index 53ed4f52590..1bcbfff35aa 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/CardReaderPaymentViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/CardReaderPaymentViewModel.kt @@ -718,6 +718,9 @@ class CardReaderPaymentViewModel ) ) } else { + tracker.trackReceiptUrlFetchingFails( + errorDescription = receiptResult.exceptionOrNull()?.message ?: "Unknown error", + ) triggerEvent(ShowSnackbar(R.string.receipt_fetching_error)) } } @@ -749,6 +752,9 @@ class CardReaderPaymentViewModel } } } else { + tracker.trackReceiptUrlFetchingFails( + errorDescription = receiptResult.exceptionOrNull()?.message ?: "Unknown error", + ) triggerEvent(ShowSnackbar(R.string.receipt_fetching_error)) } From c6059f361b4f43ac21236a2eda80ad815e657f6b Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 31 Jan 2024 16:02:14 +0100 Subject: [PATCH 12/14] Tests compilable --- .../CardReaderPaymentViewModelTest.kt | 6 +++--- .../preview/ReceiptPreviewViewModelTest.kt | 19 ++++++------------- .../tracking/PaymentsFlowTrackerTest.kt | 12 ++++++++---- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/CardReaderPaymentViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/CardReaderPaymentViewModelTest.kt index 3b47aaaf39c..5f1f98229d4 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/CardReaderPaymentViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/CardReaderPaymentViewModelTest.kt @@ -2337,21 +2337,21 @@ class CardReaderPaymentViewModelTest : BaseUnitTest() { } @Test - fun `when OS accepts the print request, then print success event tracked`() { + fun `when OS accepts the print request, then print success event tracked`() = testBlocking { viewModel.onPrintResult(STARTED) verify(tracker).trackPrintReceiptSucceeded() } @Test - fun `when OS refuses the print request, then print failed event tracked`() { + fun `when OS refuses the print request, then print failed event tracked`() = testBlocking { viewModel.onPrintResult(FAILED) verify(tracker).trackPrintReceiptFailed() } @Test - fun `when manually cancels the print request, then print cancelled event tracked`() { + fun `when manually cancels the print request, then print cancelled event tracked`() = testBlocking { viewModel.onPrintResult(CANCELLED) verify(tracker).trackPrintReceiptCancelled() diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/receipt/preview/ReceiptPreviewViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/receipt/preview/ReceiptPreviewViewModelTest.kt index 3a8d0fa2a80..a76365c0dbc 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/receipt/preview/ReceiptPreviewViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/receipt/preview/ReceiptPreviewViewModelTest.kt @@ -2,12 +2,6 @@ package com.woocommerce.android.ui.payments.receipt.preview import androidx.lifecycle.SavedStateHandle import com.woocommerce.android.R -import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_EMAIL_TAPPED -import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_CANCELED -import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_FAILED -import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_SUCCESS -import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_TAPPED -import com.woocommerce.android.analytics.AnalyticsTrackerWrapper import com.woocommerce.android.ui.payments.receipt.PaymentReceiptShare import com.woocommerce.android.ui.payments.receipt.preview.ReceiptPreviewViewModel.ReceiptPreviewViewState.Content import com.woocommerce.android.ui.payments.receipt.preview.ReceiptPreviewViewModel.ReceiptPreviewViewState.Loading @@ -29,7 +23,6 @@ import org.mockito.kotlin.whenever class ReceiptPreviewViewModelTest : BaseUnitTest() { private lateinit var viewModel: ReceiptPreviewViewModel - private val tracker: AnalyticsTrackerWrapper = mock() private val paymentsFlowTracker: PaymentsFlowTracker = mock() private val paymentReceiptShare: PaymentReceiptShare = mock() @@ -41,7 +34,7 @@ class ReceiptPreviewViewModelTest : BaseUnitTest() { @Before fun setUp() { - viewModel = ReceiptPreviewViewModel(savedState, tracker, paymentsFlowTracker, paymentReceiptShare) + viewModel = ReceiptPreviewViewModel(savedState, paymentsFlowTracker, paymentReceiptShare) } @Test @@ -77,7 +70,7 @@ class ReceiptPreviewViewModelTest : BaseUnitTest() { testBlocking { viewModel.onShareClicked() - verify(tracker).track(RECEIPT_EMAIL_TAPPED) + verify(paymentsFlowTracker).trackEmailReceiptTapped() } @Test @@ -167,7 +160,7 @@ class ReceiptPreviewViewModelTest : BaseUnitTest() { testBlocking { viewModel.onPrintClicked() - verify(tracker).track(RECEIPT_PRINT_TAPPED) + verify(paymentsFlowTracker).trackPrintReceiptTapped() } @Test @@ -175,7 +168,7 @@ class ReceiptPreviewViewModelTest : BaseUnitTest() { testBlocking { viewModel.onPrintResult(FAILED) - verify(tracker).track(RECEIPT_PRINT_FAILED) + verify(paymentsFlowTracker).trackPrintReceiptFailed() } @Test @@ -183,7 +176,7 @@ class ReceiptPreviewViewModelTest : BaseUnitTest() { testBlocking { viewModel.onPrintResult(CANCELLED) - verify(tracker).track(RECEIPT_PRINT_CANCELED) + verify(paymentsFlowTracker).trackPrintReceiptCancelled() } @Test @@ -191,6 +184,6 @@ class ReceiptPreviewViewModelTest : BaseUnitTest() { testBlocking { viewModel.onPrintResult(STARTED) - verify(tracker).track(RECEIPT_PRINT_SUCCESS) + verify(paymentsFlowTracker).trackPrintReceiptSucceeded() } } diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTrackerTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTrackerTest.kt index 14e117d6353..e59c768f428 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTrackerTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTrackerTest.kt @@ -42,6 +42,7 @@ import com.woocommerce.android.ui.payments.cardreader.onboarding.PluginType.STRI import com.woocommerce.android.ui.payments.cardreader.onboarding.PluginType.WOOCOMMERCE_PAYMENTS import com.woocommerce.android.ui.payments.hub.PaymentsHubViewModel.CashOnDeliverySource.ONBOARDING import com.woocommerce.android.ui.payments.hub.PaymentsHubViewModel.CashOnDeliverySource.PAYMENTS_HUB +import com.woocommerce.android.ui.payments.receipt.PaymentReceiptHelper import com.woocommerce.android.viewmodel.BaseUnitTest import kotlinx.coroutines.ExperimentalCoroutinesApi import org.assertj.core.api.Assertions.assertThat @@ -93,11 +94,14 @@ class PaymentsFlowTrackerTest : BaseUnitTest() { ) } + private val paymentReceiptHelper: PaymentReceiptHelper = mock() + private val paymentsFlowTracker = PaymentsFlowTracker( trackerWrapper, appPrefsWrapper, selectedSite, - cardReaderTrackingInfoProvider + cardReaderTrackingInfoProvider, + paymentReceiptHelper, ) @Test @@ -1047,21 +1051,21 @@ class PaymentsFlowTrackerTest : BaseUnitTest() { } @Test - fun `when OS accepts the print request, then RECEIPT_PRINT_SUCCESS tracked`() { + fun `when OS accepts the print request, then RECEIPT_PRINT_SUCCESS tracked`() = testBlocking { paymentsFlowTracker.trackPrintReceiptSucceeded() verify(trackerWrapper).track(eq(RECEIPT_PRINT_SUCCESS), any()) } @Test - fun `when OS refuses the print request, then RECEIPT_PRINT_FAILED tracked`() { + fun `when OS refuses the print request, then RECEIPT_PRINT_FAILED tracked`() = testBlocking { paymentsFlowTracker.trackPrintReceiptFailed() verify(trackerWrapper).track(eq(RECEIPT_PRINT_FAILED), any()) } @Test - fun `when manually cancels the print request, then RECEIPT_PRINT_CANCELED tracked`() { + fun `when manually cancels the print request, then RECEIPT_PRINT_CANCELED tracked`() = testBlocking { paymentsFlowTracker.trackPrintReceiptCancelled() verify(trackerWrapper).track(eq(RECEIPT_PRINT_CANCELED), any()) From 6957125a316062db89ed81dfe6625ae5b0f0d3f9 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 31 Jan 2024 16:36:17 +0100 Subject: [PATCH 13/14] Tests of PaymentsFlowTracker --- .../payments/tracking/PaymentsFlowTracker.kt | 4 +- .../tracking/PaymentsFlowTrackerTest.kt | 157 +++++++++++++++--- 2 files changed, 140 insertions(+), 21 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt index ffd264fd820..0ffc92e1cb3 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTracker.kt @@ -162,9 +162,9 @@ class PaymentsFlowTracker @Inject constructor( private suspend fun getReceiptSource(): Pair = if (paymentReceiptHelper.isWCCanGenerateReceipts()) { - "source" to "backend" + AnalyticsTracker.KEY_SOURCE to "backend" } else { - "source" to "local" + AnalyticsTracker.KEY_SOURCE to "local" } @Suppress("ComplexMethod") diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTrackerTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTrackerTest.kt index e59c768f428..4f78bbd6d19 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTrackerTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/tracking/PaymentsFlowTrackerTest.kt @@ -26,7 +26,6 @@ import com.woocommerce.android.analytics.AnalyticsEvent.ENABLE_CASH_ON_DELIVERY_ import com.woocommerce.android.analytics.AnalyticsEvent.PAYMENTS_FLOW_ORDER_COLLECT_PAYMENT_TAPPED import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_EMAIL_TAPPED import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_CANCELED -import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_FAILED import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_SUCCESS import com.woocommerce.android.analytics.AnalyticsEvent.RECEIPT_PRINT_TAPPED import com.woocommerce.android.analytics.AnalyticsTracker @@ -77,13 +76,13 @@ class PaymentsFlowTrackerTest : BaseUnitTest() { } private val trackerWrapper: AnalyticsTrackerWrapper = mock() - private val appPrefsWrapper: AppPrefsWrapper = mock() { + private val appPrefsWrapper: AppPrefsWrapper = mock { on(it.getCardReaderPreferredPlugin(anyInt(), anyLong(), anyLong())).thenReturn(WOOCOMMERCE_PAYMENTS) } private val selectedSite: SelectedSite = mock { on(it.get()).thenReturn(SiteModel()) } - private val cardReaderTrackingInfoProvider: CardReaderTrackingInfoProvider = mock() { + private val cardReaderTrackingInfoProvider: CardReaderTrackingInfoProvider = mock { on { trackingInfo }.thenReturn( TrackingInfo( country = COUNTRY_CODE, @@ -1043,40 +1042,160 @@ class PaymentsFlowTrackerTest : BaseUnitTest() { } @Test - fun `when user clicks on print receipt button, then RECEIPT_PRINT_TAPPED tracked`() = + fun `given wc core can generate receipts, when trackPrintReceiptTapped, then RECEIPT_PRINT_TAPPED tracked`() = testBlocking { + whenever(paymentReceiptHelper.isWCCanGenerateReceipts()).thenReturn(true) + paymentsFlowTracker.trackPrintReceiptTapped() - verify(trackerWrapper).track(eq(RECEIPT_PRINT_TAPPED), any()) + verify(trackerWrapper).track( + eq(RECEIPT_PRINT_TAPPED), + check { assertThat(it["source"]).isEqualTo("backend") } + ) } @Test - fun `when OS accepts the print request, then RECEIPT_PRINT_SUCCESS tracked`() = testBlocking { - paymentsFlowTracker.trackPrintReceiptSucceeded() + fun `given new wc core can not generate receipts, when trackPrintReceiptTapped, then RECEIPT_PRINT_TAPPED tracked`() = + testBlocking { + whenever(paymentReceiptHelper.isWCCanGenerateReceipts()).thenReturn(false) - verify(trackerWrapper).track(eq(RECEIPT_PRINT_SUCCESS), any()) - } + paymentsFlowTracker.trackPrintReceiptTapped() + + verify(trackerWrapper).track( + eq(RECEIPT_PRINT_TAPPED), + check { assertThat(it["source"]).isEqualTo("local") } + ) + } @Test - fun `when OS refuses the print request, then RECEIPT_PRINT_FAILED tracked`() = testBlocking { - paymentsFlowTracker.trackPrintReceiptFailed() + fun `given wc core can generate receipts, when trackPrintReceiptSucceeded, then RECEIPT_PRINT_SUCCESS tracked`() = + testBlocking { + whenever(paymentReceiptHelper.isWCCanGenerateReceipts()).thenReturn(true) - verify(trackerWrapper).track(eq(RECEIPT_PRINT_FAILED), any()) - } + paymentsFlowTracker.trackPrintReceiptSucceeded() + + verify(trackerWrapper).track( + eq(RECEIPT_PRINT_SUCCESS), + check { assertThat(it["source"]).isEqualTo("backend") } + ) + } @Test - fun `when manually cancels the print request, then RECEIPT_PRINT_CANCELED tracked`() = testBlocking { - paymentsFlowTracker.trackPrintReceiptCancelled() + fun `given wc core can not generate receipts, when trackPrintReceiptSucceeded, then RECEIPT_PRINT_SUCCESS tracked`() = + testBlocking { + whenever(paymentReceiptHelper.isWCCanGenerateReceipts()).thenReturn(false) - verify(trackerWrapper).track(eq(RECEIPT_PRINT_CANCELED), any()) - } + paymentsFlowTracker.trackPrintReceiptSucceeded() + + verify(trackerWrapper).track( + eq(RECEIPT_PRINT_SUCCESS), + check { assertThat(it["source"]).isEqualTo("local") } + ) + } + + @Test + fun `given wc core can generate receipts, when trackPrintReceiptCancelled, then RECEIPT_PRINT_CANCELED tracked`() = + testBlocking { + whenever(paymentReceiptHelper.isWCCanGenerateReceipts()).thenReturn(true) + + paymentsFlowTracker.trackPrintReceiptCancelled() + + verify(trackerWrapper).track( + eq(RECEIPT_PRINT_CANCELED), + check { assertThat(it["source"]).isEqualTo("backend") } + ) + } + + @Test + fun `given wc core can not generate receipts, when trackPrintReceiptCancelled, then RECEIPT_PRINT_CANCELED tracked`() = + testBlocking { + whenever(paymentReceiptHelper.isWCCanGenerateReceipts()).thenReturn(false) + + paymentsFlowTracker.trackPrintReceiptCancelled() + + verify(trackerWrapper).track( + eq(RECEIPT_PRINT_CANCELED), + check { assertThat(it["source"]).isEqualTo("local") } + ) + } @Test - fun `when user clicks on send receipt button, then RECEIPT_EMAIL_TAPPED tracked`() = + fun `given wc core can generate receipts, when trackEmailReceiptTapped, then RECEIPT_EMAIL_TAPPED tracked`() = testBlocking { + whenever(paymentReceiptHelper.isWCCanGenerateReceipts()).thenReturn(true) + paymentsFlowTracker.trackEmailReceiptTapped() - verify(trackerWrapper).track(eq(RECEIPT_EMAIL_TAPPED), any()) + verify(trackerWrapper).track( + eq(RECEIPT_EMAIL_TAPPED), + check { assertThat(it["source"]).isEqualTo("backend") } + ) + } + + @Test + fun `given wc core can generate receipts, when trackPrintReceiptFailed, then RECEIPT_PRINT_FAILED tracked`() = + testBlocking { + whenever(paymentReceiptHelper.isWCCanGenerateReceipts()).thenReturn(true) + + paymentsFlowTracker.trackPrintReceiptFailed() + + verify(trackerWrapper).track( + eq(AnalyticsEvent.RECEIPT_PRINT_FAILED), + check { assertThat(it["source"]).isEqualTo("backend") } + ) + } + + @Test + fun `given wc core can not generate receipts, when trackPrintReceiptFailed, then RECEIPT_PRINT_FAILED tracked`() = + testBlocking { + whenever(paymentReceiptHelper.isWCCanGenerateReceipts()).thenReturn(false) + + paymentsFlowTracker.trackPrintReceiptFailed() + + verify(trackerWrapper).track( + eq(AnalyticsEvent.RECEIPT_PRINT_FAILED), + check { assertThat(it["source"]).isEqualTo("local") } + ) + } + + @Test + fun `given wc core can not generate receipts, when trackReceiptViewTapped, then RECEIPT_VIEW_TAPPED tracked`() = + testBlocking { + whenever(paymentReceiptHelper.isWCCanGenerateReceipts()).thenReturn(false) + + paymentsFlowTracker.trackReceiptViewTapped( + properties = mapOf( + "key" to "value" + ) + ) + + verify(trackerWrapper).track( + eq(AnalyticsEvent.RECEIPT_VIEW_TAPPED), + check { + assertThat(it["source"]).isEqualTo("local") + assertThat(it["key"]).isEqualTo("value") + } + ) + } + + @Test + fun `given wc core can generate receipts, when trackReceiptViewTapped, then RECEIPT_VIEW_TAPPED tracked`() = + testBlocking { + whenever(paymentReceiptHelper.isWCCanGenerateReceipts()).thenReturn(true) + + paymentsFlowTracker.trackReceiptViewTapped( + properties = mapOf( + "key" to "value" + ) + ) + + verify(trackerWrapper).track( + eq(AnalyticsEvent.RECEIPT_VIEW_TAPPED), + check { + assertThat(it["source"]).isEqualTo("backend") + assertThat(it["key"]).isEqualTo("value") + } + ) } @Test From 05560ccebb2ee6b369a1220ffa20a29875d2e69c Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 31 Jan 2024 16:40:39 +0100 Subject: [PATCH 14/14] Added a test of OrderDetailViewModel --- .../android/ui/orders/OrderDetailViewModelTest.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderDetailViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderDetailViewModelTest.kt index bdbafe61f95..9edc1eec8cf 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderDetailViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderDetailViewModelTest.kt @@ -1243,7 +1243,8 @@ class OrderDetailViewModelTest : BaseUnitTest() { whenever(orderDetailRepository.fetchOrderNotes(any())).thenReturn(false) whenever(addonsRepository.containsAddonsFrom(any())).thenReturn(false) - whenever(paymentReceiptHelper.getReceiptUrl(order.id)).thenReturn(Result.failure(Exception(""))) + val errorMessage = "error" + whenever(paymentReceiptHelper.getReceiptUrl(order.id)).thenReturn(Result.failure(Exception(errorMessage))) // WHEN viewModel.start() @@ -1252,6 +1253,9 @@ class OrderDetailViewModelTest : BaseUnitTest() { // THEN assertThat((viewModel.event.value as ShowSnackbar).message).isEqualTo(string.receipt_fetching_error) + verify(paymentsFlowTracker).trackReceiptUrlFetchingFails( + errorDescription = errorMessage + ) } @Test