From ad1f3c0d8ee77a276b12a2f878b4c94fce8f1a97 Mon Sep 17 00:00:00 2001 From: Hafiz Rahman Date: Thu, 2 Jan 2025 15:20:11 +0700 Subject: [PATCH 1/3] Add unit tests related to onSelectionChanged() --- .../ui/orders/OrderListViewModelTest.kt | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt index e4c3b298726..dc077bebc56 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt @@ -996,6 +996,46 @@ class OrderListViewModelTest : BaseUnitTest() { assertFalse(isFetchingFirstPage!!) } + @Test + fun `when selection count changes to greater than 0, then enter selection mode`() = testBlocking { + viewModel.onSelectionChanged(2) + + assertThat(viewModel.isSelecting()).isTrue() + assertThat(viewModel.viewState.selectionCount).isEqualTo(2) + assertThat(viewModel.viewState.isAddOrderButtonVisible).isFalse() + assertThat(viewModel.viewState.orderListState).isEqualTo(OrderListViewModel.ViewState.OrderListState.Selecting) + } + + @Test + fun `when selection count changes to 0, then exit selection mode`() = testBlocking { + // First enter selection mode + viewModel.onSelectionChanged(2) + assertThat(viewModel.isSelecting()).isTrue() + + // Then exit + viewModel.onSelectionChanged(0) + + assertThat(viewModel.isSelecting()).isFalse() + assertThat(viewModel.viewState.selectionCount).isNull() + assertThat(viewModel.viewState.isAddOrderButtonVisible).isTrue() + assertThat(viewModel.viewState.orderListState).isEqualTo(OrderListViewModel.ViewState.OrderListState.Browsing) + } + + @Test + fun `when in selection mode and count changes but stays above 0, then update count only`() = testBlocking { + // Enter selection mode + viewModel.onSelectionChanged(2) + val initialState = viewModel.viewState.orderListState + + // Change count + viewModel.onSelectionChanged(3) + + assertThat(viewModel.viewState.selectionCount).isEqualTo(3) + assertThat(viewModel.viewState.orderListState).isEqualTo(initialState) + assertThat(viewModel.isSelecting()).isTrue() + } + + private companion object { const val ANY_SEARCH_QUERY = "search query" } From 3621b69ee6a0d95723c562f04fbccd4e4f6c5b2a Mon Sep 17 00:00:00 2001 From: Hafiz Rahman Date: Thu, 2 Jan 2025 15:41:59 +0700 Subject: [PATCH 2/3] Add unit tests related to opening the Order Status Dialog and bulk update handling. --- .../ui/orders/OrderListViewModelTest.kt | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt index dc077bebc56..e0deb4c692c 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt @@ -11,6 +11,7 @@ import com.woocommerce.android.analytics.AnalyticsTrackerWrapper import com.woocommerce.android.extensions.NotificationReceivedEvent import com.woocommerce.android.extensions.takeIfNotEqualTo import com.woocommerce.android.model.FeatureFeedbackSettings +import com.woocommerce.android.model.Order import com.woocommerce.android.model.RequestResult import com.woocommerce.android.notifications.NotificationChannelType import com.woocommerce.android.notifications.NotificationChannelsHandler @@ -1035,6 +1036,58 @@ class OrderListViewModelTest : BaseUnitTest() { assertThat(viewModel.isSelecting()).isTrue() } + @Test + fun `when bulk update clicked, then trigger dialog event with status options`() = testBlocking { + // Given + val statusOptions = listOf( + Order.OrderStatus(CoreOrderStatus.COMPLETED.value, "Completed"), + Order.OrderStatus(CoreOrderStatus.PROCESSING.value, "Processing") + ) + whenever(orderDetailRepository.getOrderStatusOptions()).thenReturn(statusOptions) + + // When + viewModel.onBulkUpdateStatusClicked() + + // Then + assertThat(viewModel.event.value).isInstanceOf(OrderListEvent.ShowUpdateStatusDialog::class.java) + } + + @Test + fun `given offline, when bulk update status requested, then show offline error and exit selection mode`() = testBlocking { + whenever(networkStatus.isConnected()).thenReturn(false) + + viewModel.onBulkOrderStatusChanged(listOf(1L, 2L), Order.Status.Completed) + + assertThat(viewModel.event.value).isInstanceOf(Event.ShowSnackbar::class.java) + assertThat((viewModel.event.value as Event.ShowSnackbar).message).isEqualTo(R.string.offline_error) + assertThat(viewModel.isSelecting()).isFalse() + } + + @Test + fun `when bulk update fails, then show error message and exit selection`() = testBlocking { + whenever(networkStatus.isConnected()).thenReturn(true) + whenever(orderListRepository.bulkUpdateOrderStatus(any(), any())).thenReturn(Result.failure(Exception())) + + viewModel.onBulkOrderStatusChanged(listOf(1L), Order.Status.Completed) + + assertThat(viewModel.event.value).isInstanceOf(Event.ShowSnackbar::class.java) + assertThat((viewModel.event.value as Event.ShowSnackbar).message).isEqualTo(R.string.error_generic) + assertThat(viewModel.isSelecting()).isFalse() + } + + @Test + fun `when bulk update completes successfully, then exit selection mode`() = testBlocking { + whenever(networkStatus.isConnected()).thenReturn(true) + whenever(orderListRepository.bulkUpdateOrderStatus(any(), any())).thenReturn(Result.success(Unit)) + + // First enter selection mode + viewModel.onSelectionChanged(1) + assertThat(viewModel.isSelecting()).isTrue() + + viewModel.onBulkOrderStatusChanged(listOf(1L), Order.Status.Completed) + + assertThat(viewModel.isSelecting()).isFalse() + } private companion object { const val ANY_SEARCH_QUERY = "search query" From d1d54eca7898e460aed587c2f79d849116cc4b32 Mon Sep 17 00:00:00 2001 From: Hafiz Rahman Date: Tue, 7 Jan 2025 14:22:51 +0700 Subject: [PATCH 3/3] Add missing brackets --- .../com/woocommerce/android/ui/orders/OrderListViewModelTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt index 058b154bac9..64a39847a1c 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/orders/OrderListViewModelTest.kt @@ -1088,6 +1088,7 @@ class OrderListViewModelTest : BaseUnitTest() { viewModel.onBulkOrderStatusChanged(listOf(1L), Order.Status.Completed) assertThat(viewModel.isSelecting()).isFalse() + } @Test fun `when selection count reaches limit, then show error message`() {