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 a5e5e5b6113..32b5f9c2871 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt @@ -305,6 +305,8 @@ enum class AnalyticsEvent(val siteless: Boolean = false) { ORDER_FORM_ADD_GIFT_CARD_CTA_SHOWN, ORDER_FORM_ADD_GIFT_CARD_CTA_TAPPED, ORDER_FORM_GIFT_CARD_SET, + ORDER_SHIPPING_METHOD_SELECTED, + ORDER_ADD_SHIPPING_TAPPED, // -- Custom Amounts ORDER_CREATION_ADD_CUSTOM_AMOUNT_TAPPED, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt index 633d03d04aa..558fdc6bdce 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt @@ -295,6 +295,7 @@ class AnalyticsTracker private constructor( const val KEY_CUSTOM_AMOUNTS_COUNT = "custom_amounts_Count" const val KEY_CUSTOM_AMOUNT_TAX_STATUS = "tax_status" const val KEY_EXPANDED = "expanded" + const val KEY_SHIPPING_METHOD = "shipping_method" const val VALUE_CUSTOM_AMOUNT_TAX_STATUS_TAXABLE = "taxable" const val VALUE_CUSTOM_AMOUNT_TAX_STATUS_NONE = "none" diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt index 1ec638a88a8..1345f5b6ac4 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt @@ -61,6 +61,7 @@ import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_PRODUCT_ import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_SCANNING_BARCODE_FORMAT import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_SCANNING_FAILURE_REASON import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_SCANNING_SOURCE +import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_SHIPPING_METHOD import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_SOURCE import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_STATUS import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_TO @@ -1224,6 +1225,7 @@ class OrderCreateEditViewModel @Inject constructor( } fun onShippingButtonClicked() { + tracker.track(AnalyticsEvent.ORDER_ADD_SHIPPING_TAPPED) triggerEvent(EditShipping(currentDraft.shippingLines.firstOrNull { it.methodId != null })) } @@ -1502,7 +1504,10 @@ class OrderCreateEditViewModel @Inject constructor( fun onUpdatedShipping(shippingUpdateResult: ShippingUpdateResult) { tracker.track( ORDER_SHIPPING_METHOD_ADD, - mapOf(KEY_FLOW to flow) + buildMap { + put(KEY_FLOW, flow) + putIfNotNull(KEY_SHIPPING_METHOD to shippingUpdateResult.methodId) + } ) _orderDraft.update { draft -> val shipping: List = draft.shippingLines.map { shippingLine -> diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/shipping/OrderShippingViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/shipping/OrderShippingViewModel.kt index 4e66b984e57..eb9d161d8b9 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/shipping/OrderShippingViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/shipping/OrderShippingViewModel.kt @@ -3,6 +3,9 @@ package com.woocommerce.android.ui.orders.creation.shipping import android.os.Parcelable import androidx.lifecycle.SavedStateHandle import com.woocommerce.android.R +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.model.ShippingMethod import com.woocommerce.android.viewmodel.MultiLiveEvent @@ -20,7 +23,8 @@ import javax.inject.Inject class OrderShippingViewModel @Inject constructor( savedStateHandle: SavedStateHandle, private val resourceProvider: ResourceProvider, - private val getShippingMethodById: GetShippingMethodById + private val getShippingMethodById: GetShippingMethodById, + private val tracker: AnalyticsTrackerWrapper ) : ScopedViewModel(savedStateHandle) { private val navArgs: OrderShippingFragmentArgs by savedState.navArgs() @@ -93,6 +97,10 @@ class OrderShippingViewModel @Inject constructor( fun onMethodSelected(selected: ShippingMethod) { (viewState.value as? ViewState.ShippingState)?.let { + tracker.track( + AnalyticsEvent.ORDER_SHIPPING_METHOD_SELECTED, + mapOf(AnalyticsTracker.KEY_SHIPPING_METHOD to selected.id) + ) viewState.value = it.copy( method = selected, isSaveChangesEnabled = isSaveChangesEnabled(newMethodId = selected.id) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt index 4cd16102d53..0248f564f42 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/UnifiedOrderEditViewModelTest.kt @@ -27,6 +27,7 @@ import com.woocommerce.android.ui.orders.creation.configuration.ProductConfigura import com.woocommerce.android.ui.orders.creation.configuration.ProductRules import com.woocommerce.android.ui.orders.creation.navigation.OrderCreateEditNavigationTarget import com.woocommerce.android.ui.orders.creation.product.discount.CurrencySymbolFinder +import com.woocommerce.android.ui.orders.creation.shipping.ShippingUpdateResult import com.woocommerce.android.ui.orders.creation.taxes.GetAddressFromTaxRate import com.woocommerce.android.ui.orders.creation.taxes.GetTaxRatesInfoDialogViewState import com.woocommerce.android.ui.orders.creation.taxes.rates.GetTaxRateLabel @@ -309,6 +310,25 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { ) } + @Test + fun `when shipping line added or edited, send tracks event`() { + val result = ShippingUpdateResult( + id = 1L, + amount = BigDecimal.TEN, + name = "Other", + methodId = "other" + ) + sut.onUpdatedShipping(result) + + verify(tracker).track( + AnalyticsEvent.ORDER_SHIPPING_METHOD_ADD, + mapOf( + AnalyticsTracker.KEY_FLOW to tracksFlow, + AnalyticsTracker.KEY_SHIPPING_METHOD to result.methodId + ) + ) + } + @Test fun `when customer note added or edited, send tracks event`() { sut.onCustomerNoteEdited("") @@ -2478,6 +2498,13 @@ abstract class UnifiedOrderEditViewModelTest : BaseUnitTest() { ) ) } + + @Test + fun `when shipping button tapped, send tracks event`() { + sut.onShippingButtonClicked() + + verify(tracker).track(AnalyticsEvent.ORDER_ADD_SHIPPING_TAPPED) + } //endregion protected fun createSut(savedStateHandle: SavedStateHandle = savedState) { diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/shipping/OrderShippingViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/shipping/OrderShippingViewModelTest.kt index 9ba2485a7bf..31f911c5931 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/shipping/OrderShippingViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/creation/shipping/OrderShippingViewModelTest.kt @@ -1,6 +1,10 @@ package com.woocommerce.android.ui.orders.creation.shipping +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.model.ShippingMethod import com.woocommerce.android.util.getOrAwaitValue import com.woocommerce.android.viewmodel.BaseUnitTest import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -9,6 +13,7 @@ import kotlinx.coroutines.test.advanceTimeBy import org.assertj.core.api.Assertions.assertThat import org.junit.Test import org.mockito.kotlin.mock +import org.mockito.kotlin.verify import java.math.BigDecimal @OptIn(ExperimentalCoroutinesApi::class) @@ -29,11 +34,14 @@ class OrderShippingViewModelTest : BaseUnitTest() { private val getShippingMethodById: GetShippingMethodById = mock() + private val tracker: AnalyticsTrackerWrapper = mock() + fun setup(args: OrderShippingFragmentArgs) { viewModel = OrderShippingViewModel( savedStateHandle = args.toSavedStateHandle(), resourceProvider = mock(), - getShippingMethodById = getShippingMethodById + getShippingMethodById = getShippingMethodById, + tracker = tracker ) } @@ -87,6 +95,37 @@ class OrderShippingViewModelTest : BaseUnitTest() { .isEqualTo(name) } + @Test + fun `when editing method, then update the state`() { + setup(creationArgs) + val selected = ShippingMethod( + id = "other", + title = "Other" + ) + + viewModel.onMethodSelected(selected) + + val viewState = viewModel.viewState.value + assertThat((viewState as OrderShippingViewModel.ViewState.ShippingState).method) + .isEqualTo(selected) + } + + @Test + fun `when editing method, then track the method selected`() { + setup(creationArgs) + val selected = ShippingMethod( + id = "other", + title = "Other" + ) + + viewModel.onMethodSelected(selected) + + verify(tracker).track( + AnalyticsEvent.ORDER_SHIPPING_METHOD_SELECTED, + mapOf(AnalyticsTracker.KEY_SHIPPING_METHOD to selected.id) + ) + } + @Test fun `when done button is clicked, then update shipping line data`() { setup(creationArgs)