From eda60d1bfedc72d6e6ef4a06b3f5fd5ffd25cd19 Mon Sep 17 00:00:00 2001 From: malinajirka Date: Tue, 9 Sep 2025 08:31:17 +0200 Subject: [PATCH 1/4] Migrate WooPosItemsSearchEmptyStateRepository --- .../items/search/WooPosItemsSearchEmptyStateRepository.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosItemsSearchEmptyStateRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosItemsSearchEmptyStateRepository.kt index c92b19e08433..dd6e6868ef40 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosItemsSearchEmptyStateRepository.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosItemsSearchEmptyStateRepository.kt @@ -1,7 +1,7 @@ package com.woocommerce.android.ui.woopos.home.items.search -import com.woocommerce.android.model.Product import com.woocommerce.android.ui.woopos.common.data.WooPosPopularProductsProvider +import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2 import com.woocommerce.android.ui.woopos.util.datastore.WooPosPreferencesRepository import kotlinx.coroutines.flow.first import javax.inject.Inject @@ -10,7 +10,7 @@ class WooPosItemsSearchEmptyStateRepository @Inject constructor( private val preferencesRepository: WooPosPreferencesRepository, private val popularProductsProvider: WooPosPopularProductsProvider, ) { - suspend fun getPopularItems(): List = popularProductsProvider.getPopularProducts() + suspend fun getPopularItems(): List = popularProductsProvider.getPopularProducts() suspend fun getLastSearches(): List = preferencesRepository.recentProductSearches.first() From f4172387d5f7b4c97713024192b4220ac98fdbfa Mon Sep 17 00:00:00 2001 From: malinajirka Date: Tue, 9 Sep 2025 08:31:32 +0200 Subject: [PATCH 2/4] Migrate WooPosItemsSearchViewModel --- .../search/WooPosItemsSearchViewModel.kt | 17 +++--- .../search/WooPosItemsSearchViewModelTest.kt | 54 +++++++++---------- 2 files changed, 35 insertions(+), 36 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosItemsSearchViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosItemsSearchViewModel.kt index db0b0c89f295..4eac2800fc4f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosItemsSearchViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosItemsSearchViewModel.kt @@ -2,8 +2,7 @@ package com.woocommerce.android.ui.woopos.home.items.search import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.woocommerce.android.model.Product -import com.woocommerce.android.ui.products.ProductType +import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2 import com.woocommerce.android.ui.woopos.home.ChildToParentEvent import com.woocommerce.android.ui.woopos.home.ChildToParentEvent.SearchEvent.RecentSearchSelected import com.woocommerce.android.ui.woopos.home.ParentToChildrenEvent @@ -148,7 +147,7 @@ class WooPosItemsSearchViewModel @Inject constructor( } childToParentEventSender.sendToParent(ChildToParentEvent.SearchEvent.Started) - var result: Result> + var result: Result> val searchTimeMillis = measureTimeMillis { result = dataSource.searchRemoteProducts(query) } @@ -287,7 +286,7 @@ class WooPosItemsSearchViewModel @Inject constructor( } } - private suspend fun List.toContentState( + private suspend fun List.toContentState( searchQuery: String, paginationState: WooPosPaginationState = WooPosPaginationState.None, ) = WooPosItemsSearchViewState.Content( @@ -296,21 +295,21 @@ class WooPosItemsSearchViewModel @Inject constructor( paginationState = paginationState, ) - private suspend fun Product.toViewModelProduct(): WooPosItemSelectionViewState.Product = - if (productType == ProductType.VARIABLE) { + private suspend fun WooPosProductModelVersion2.toViewModelProduct(): WooPosItemSelectionViewState.Product = + if (type == WooPosProductModelVersion2.WooPosProductType.VARIABLE) { WooPosItemSelectionViewState.Product.Variable( id = this.remoteId, name = this.name, - price = priceFormat(this.price), + price = priceFormat(this.pricing.displayPrice), imageUrl = this.firstImageUrl, - numOfVariations = this.numVariations, + numOfVariations = this.variationIds.size, variationIds = this.variationIds ) } else { WooPosItemSelectionViewState.Product.Simple( id = this.remoteId, name = this.name, - price = priceFormat(this.price), + price = priceFormat(this.pricing.displayPrice), imageUrl = this.firstImageUrl, ) } diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosItemsSearchViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosItemsSearchViewModelTest.kt index dca3180c6ad2..7c88a4e7d841 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosItemsSearchViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/home/items/search/WooPosItemsSearchViewModelTest.kt @@ -1,7 +1,7 @@ package com.woocommerce.android.ui.woopos.home.items.search import app.cash.turbine.test -import com.woocommerce.android.ui.products.ProductTestUtils +import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2 import com.woocommerce.android.ui.woopos.home.ChildToParentEvent import com.woocommerce.android.ui.woopos.home.ParentToChildrenEvent import com.woocommerce.android.ui.woopos.home.WooPosChildrenToParentEventSender @@ -13,6 +13,7 @@ import com.woocommerce.android.ui.woopos.util.WooPosCoroutineTestRule import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEventConstant import com.woocommerce.android.ui.woopos.util.format.WooPosFormatPrice +import com.woocommerce.android.ui.woopos.util.generateWooPosProduct import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.flow.emptyFlow @@ -51,11 +52,11 @@ class WooPosItemsSearchViewModelTest { private val mockAnalyticsTracker: WooPosItemsSearchAnalyticsTracker = mock() private val defaultQuery = "test query" - private val defaultProduct = ProductTestUtils.generateProduct( + private val defaultProduct = generateWooPosProduct( productId = 1, productName = "Test Product", amount = "10.0", - productType = "simple" + productType = WooPosProductModelVersion2.WooPosProductType.SIMPLE ) @Before @@ -280,13 +281,12 @@ class WooPosItemsSearchViewModelTest { runTest { // GIVEN val variableProduct = - ProductTestUtils.generateProduct( + generateWooPosProduct( productId = 1, productName = "Variable Product", amount = "10.0", - productType = "variable", - isVariable = true, - variationIds = "[101,102,103]" + productType = WooPosProductModelVersion2.WooPosProductType.VARIABLE, + variationIds = listOf(101L, 102L, 103L) ) mockSuccessfulSearch(defaultQuery, listOf(variableProduct)) @@ -312,11 +312,11 @@ class WooPosItemsSearchViewModelTest { @Test fun `given content state and more pages available, when end of list reached, then load more data`() = runTest { // GIVEN - val additionalProduct = ProductTestUtils.generateProduct( + val additionalProduct = generateWooPosProduct( productId = 2, productName = "Test Product 2", amount = "20.0", - productType = "simple" + productType = WooPosProductModelVersion2.WooPosProductType.SIMPLE ) mockSuccessfulSearch(defaultQuery, listOf(defaultProduct)) @@ -346,11 +346,11 @@ class WooPosItemsSearchViewModelTest { fun `given content state and more pages available, when end of list reached, then track ItemsNextPageLoaded event`() = runTest { // GIVEN - val additionalProduct = ProductTestUtils.generateProduct( + val additionalProduct = generateWooPosProduct( productId = 2, productName = "Test Product 2", amount = "20.0", - productType = "simple" + productType = WooPosProductModelVersion2.WooPosProductType.SIMPLE ) mockSuccessfulSearch(defaultQuery, listOf(defaultProduct)) @@ -393,18 +393,18 @@ class WooPosItemsSearchViewModelTest { @Test fun `given cached products, when search performed, then cached results shown while loading`() = runTest { // GIVEN - val cachedProduct = ProductTestUtils.generateProduct( + val cachedProduct = generateWooPosProduct( productId = 1, productName = "Cached Product", amount = "10.0", - productType = "simple" + productType = WooPosProductModelVersion2.WooPosProductType.SIMPLE ) - val remoteProduct = ProductTestUtils.generateProduct( + val remoteProduct = generateWooPosProduct( productId = 2, productName = "Remote Product", amount = "20.0", - productType = "simple" + productType = WooPosProductModelVersion2.WooPosProductType.SIMPLE ) mockCachedThenRemoteSearch(defaultQuery, cachedProduct, remoteProduct) @@ -437,11 +437,11 @@ class WooPosItemsSearchViewModelTest { whenever(mockEmptyStateProvider.getLastSearches()).thenReturn(emptyList()) val products = listOf( - ProductTestUtils.generateProduct( + generateWooPosProduct( productId = 1, productName = "Test Product", amount = "10.0", - productType = "simple" + productType = WooPosProductModelVersion2.WooPosProductType.SIMPLE ) ) @@ -479,11 +479,11 @@ class WooPosItemsSearchViewModelTest { // GIVEN val query = "test query" val products = listOf( - ProductTestUtils.generateProduct( + generateWooPosProduct( productId = 1, productName = "Test Product", amount = "10.0", - productType = "simple" + productType = WooPosProductModelVersion2.WooPosProductType.SIMPLE ) ) @@ -517,11 +517,11 @@ class WooPosItemsSearchViewModelTest { // GIVEN val query = "test query" val products = listOf( - ProductTestUtils.generateProduct( + generateWooPosProduct( productId = 1, productName = "Test Product", amount = "10.0", - productType = "simple" + productType = WooPosProductModelVersion2.WooPosProductType.SIMPLE ) ) @@ -557,11 +557,11 @@ class WooPosItemsSearchViewModelTest { // GIVEN val query = "test query" val products = listOf( - ProductTestUtils.generateProduct( + generateWooPosProduct( productId = 1, productName = "Test Product", amount = "10.0", - productType = "simple" + productType = WooPosProductModelVersion2.WooPosProductType.SIMPLE ) ) @@ -784,7 +784,7 @@ class WooPosItemsSearchViewModelTest { ) } - private fun mockSuccessfulSearch(query: String, products: List) { + private fun mockSuccessfulSearch(query: String, products: List) { wheneverBlocking { mockDataSource.searchLocalProducts(query) }.thenReturn(emptyList()) wheneverBlocking { mockDataSource.searchRemoteProducts(query) }.thenReturn(Result.success(products)) whenever(mockParentToChildrenEventReceiver.events).thenReturn( @@ -800,7 +800,7 @@ class WooPosItemsSearchViewModelTest { ) } - private suspend fun mockSuccessfulPagination(query: String, products: List) { + private suspend fun mockSuccessfulPagination(query: String, products: List) { whenever(mockDataSource.hasMorePages).thenReturn(true) whenever(mockDataSource.loadMore(query)).thenReturn( Result.success(products) @@ -816,8 +816,8 @@ class WooPosItemsSearchViewModelTest { private fun mockCachedThenRemoteSearch( query: String, - cachedProduct: com.woocommerce.android.model.Product, - remoteProduct: com.woocommerce.android.model.Product + cachedProduct: WooPosProductModelVersion2, + remoteProduct: WooPosProductModelVersion2 ) { wheneverBlocking { mockDataSource.searchLocalProducts(query) }.thenReturn(listOf(cachedProduct)) wheneverBlocking { From 44471ed4acd807825468a7434a828c31c25144ea Mon Sep 17 00:00:00 2001 From: malinajirka Date: Tue, 9 Sep 2025 08:34:08 +0200 Subject: [PATCH 3/4] Rename WooPosProductTestUtils --- .../ui/woopos/util/WooPosProductTestUtils.kt | 31 ++++++++++++++++++ .../ui/woopos/util/WooPosProductUtils.kt | 32 ------------------- 2 files changed, 31 insertions(+), 32 deletions(-) create mode 100644 WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/util/WooPosProductTestUtils.kt delete mode 100644 WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/util/WooPosProductUtils.kt diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/util/WooPosProductTestUtils.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/util/WooPosProductTestUtils.kt new file mode 100644 index 000000000000..d9433e3fd67c --- /dev/null +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/util/WooPosProductTestUtils.kt @@ -0,0 +1,31 @@ +package com.woocommerce.android.ui.woopos.util + +import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2 + +fun generateWooPosProduct( + productId: Long = 1, + parentId: Long? = null, + productName: String = "Product 1", + status: WooPosProductModelVersion2.WooPosProductStatus = WooPosProductModelVersion2.WooPosProductStatus.PUBLISH, + amount: String = "10.0", + productType: WooPosProductModelVersion2.WooPosProductType = WooPosProductModelVersion2.WooPosProductType.SIMPLE, + isDownloadable: Boolean = false, + images: List = emptyList(), + variationIds: List = emptyList(), +) = WooPosProductModelVersion2( + remoteId = productId, + name = productName, + pricing = WooPosProductModelVersion2.WooPosPricing.RegularPricing(amount.toBigDecimal()), + type = productType, + isDownloadable = isDownloadable, + parentId = parentId, + sku = "", + globalUniqueId = "", + status = status, + description = "", + shortDescription = "", + lastModified = "", + images = images, + variationIds = variationIds, +) + diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/util/WooPosProductUtils.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/util/WooPosProductUtils.kt deleted file mode 100644 index ffe870f0f347..000000000000 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/util/WooPosProductUtils.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.woocommerce.android.ui.woopos.util - -import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2 -import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2.WooPosPricing -import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2.WooPosProductImage -import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2.WooPosProductStatus -import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2.WooPosProductType - -fun generateWooPosProduct( - productId: Long = 1, - parentId: Long? = null, - productName: String = "Product 1", - status: WooPosProductStatus = WooPosProductStatus.PUBLISH, - amount: String = "10.0", - productType: WooPosProductType = WooPosProductType.SIMPLE, - isDownloadable: Boolean = false, - images: List = emptyList() -) = WooPosProductModelVersion2( - remoteId = productId, - name = productName, - pricing = WooPosPricing.RegularPricing(amount.toBigDecimal()), - type = productType, - isDownloadable = isDownloadable, - parentId = parentId, - sku = "", - globalUniqueId = "", - status = status, - description = "", - shortDescription = "", - lastModified = "", - images = images, -) From 5ddabe07527097e92be2771ed372f04f61aa7c79 Mon Sep 17 00:00:00 2001 From: malinajirka Date: Tue, 9 Sep 2025 08:34:28 +0200 Subject: [PATCH 4/4] Migrate WooPosVariationMapper --- .../android/ui/woopos/common/data/WooPosVariationMapper.kt | 5 ++--- .../android/ui/woopos/util/WooPosProductTestUtils.kt | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/common/data/WooPosVariationMapper.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/common/data/WooPosVariationMapper.kt index 527b4551e967..2d6cdf8af007 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/common/data/WooPosVariationMapper.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/common/data/WooPosVariationMapper.kt @@ -4,7 +4,6 @@ import com.google.gson.Gson import com.google.gson.JsonSyntaxException import com.google.gson.reflect.TypeToken import com.woocommerce.android.R -import com.woocommerce.android.model.Product import com.woocommerce.android.model.ProductVariation import com.woocommerce.android.ui.woopos.common.data.models.WooPosProductModelVersion2 import com.woocommerce.android.util.WooLog @@ -118,7 +117,7 @@ class WooPosVariationMapper @Inject constructor( } } - fun getName(variation: WooPosVariation, parentProduct: Product? = null): String { + fun getName(variation: WooPosVariation, parentProduct: WooPosProductModelVersion2? = null): String { return parentProduct?.variationEnabledAttributes?.joinToString(" - ") { attribute -> val option = variation.attributes.firstOrNull { it.name == attribute.name } option?.option ?: "Any ${attribute.name}" @@ -172,5 +171,5 @@ fun WooPosVariation.getNameForPOS( resourceProvider: ResourceProvider, ): String = mapper.getNameForPOS(this, parentProduct, resourceProvider) -fun WooPosVariation.getName(mapper: WooPosVariationMapper, parentProduct: Product? = null): String = +fun WooPosVariation.getName(mapper: WooPosVariationMapper, parentProduct: WooPosProductModelVersion2? = null): String = mapper.getName(this, parentProduct) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/util/WooPosProductTestUtils.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/util/WooPosProductTestUtils.kt index d9433e3fd67c..c2f194ec30ed 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/util/WooPosProductTestUtils.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/util/WooPosProductTestUtils.kt @@ -28,4 +28,3 @@ fun generateWooPosProduct( images = images, variationIds = variationIds, ) -