Skip to content

Commit

Permalink
Merge pull request #12811 from woocommerce/issue/12807-support-for-va…
Browse files Browse the repository at this point in the history
…riable-products-feature-flag

Add feature flag for non-simple product types project
  • Loading branch information
samiuelson authored Oct 30, 2024
2 parents ab75773 + 6a260b9 commit 9c96e74
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 21 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.woocommerce.android.ui.woopos.featureflags

import com.woocommerce.android.util.FeatureFlag
import javax.inject.Inject

class IsNonSimpleProductTypesEnabled @Inject constructor() {
operator fun invoke(): Boolean {
return FeatureFlag.POS_NON_SIMPLE_PRODUCT_TYPES.isEnabled()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.woocommerce.android.model.Product
import com.woocommerce.android.ui.products.ProductStatus
import com.woocommerce.android.ui.products.ProductType
import com.woocommerce.android.ui.products.selector.ProductListHandler
import com.woocommerce.android.ui.woopos.featureflags.IsNonSimpleProductTypesEnabled
import com.woocommerce.android.util.WooLog
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
Expand All @@ -20,7 +21,10 @@ import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class WooPosProductsDataSource @Inject constructor(private val handler: ProductListHandler) {
class WooPosProductsDataSource @Inject constructor(
private val handler: ProductListHandler,
private val isNonSimpleProductTypesEnabled: IsNonSimpleProductTypesEnabled,
) {
private var productCache: List<Product> = emptyList()
private val cacheMutex = Mutex()

Expand All @@ -36,10 +40,15 @@ class WooPosProductsDataSource @Inject constructor(private val handler: ProductL

val result = handler.loadFromCacheAndFetch(
searchType = ProductListHandler.SearchType.DEFAULT,
filters = mapOf(
WCProductStore.ProductFilterOption.TYPE to ProductType.SIMPLE.value,
WCProductStore.ProductFilterOption.STATUS to ProductStatus.PUBLISH.value
)
filters =
if (isNonSimpleProductTypesEnabled()) {
mapOf(WCProductStore.ProductFilterOption.STATUS to ProductStatus.PUBLISH.value)
} else {
mapOf(
WCProductStore.ProductFilterOption.TYPE to ProductType.SIMPLE.value,
WCProductStore.ProductFilterOption.STATUS to ProductStatus.PUBLISH.value
)
}
)

if (result.isSuccess) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ enum class FeatureFlag {
ENDLESS_CAMPAIGNS_SUPPORT,
CUSTOM_FIELDS,
REVAMP_WOO_SHIPPING,
OBJECTIVE_SECTION;
OBJECTIVE_SECTION,
POS_NON_SIMPLE_PRODUCT_TYPES;

fun isEnabled(context: Context? = null): Boolean {
return when (this) {
Expand All @@ -28,7 +29,8 @@ enum class FeatureFlag {
WC_SHIPPING_BANNER,
BETTER_CUSTOMER_SEARCH_M2,
ORDER_CREATION_AUTO_TAX_RATE,
REVAMP_WOO_SHIPPING -> PackageUtils.isDebugBuild()
REVAMP_WOO_SHIPPING,
POS_NON_SIMPLE_PRODUCT_TYPES -> PackageUtils.isDebugBuild()

NEW_SHIPPING_SUPPORT,
INBOX,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.woocommerce.android.ui.woopos.home.products

import com.woocommerce.android.ui.products.ProductStatus
import com.woocommerce.android.ui.products.ProductTestUtils
import com.woocommerce.android.ui.products.ProductType
import com.woocommerce.android.ui.products.selector.ProductListHandler
import com.woocommerce.android.ui.woopos.featureflags.IsNonSimpleProductTypesEnabled
import com.woocommerce.android.ui.woopos.util.WooPosCoroutineTestRule
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.first
Expand All @@ -12,7 +15,9 @@ import org.assertj.core.api.Assertions.assertThat
import org.junit.Rule
import org.mockito.kotlin.any
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import org.wordpress.android.fluxc.store.WCProductStore
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.test.Test
import kotlin.test.assertFalse
Expand Down Expand Up @@ -65,13 +70,14 @@ class WooPosProductsDataSourceTest {
)

private val handler: ProductListHandler = mock()
private val isNonSimpleProductTypesEnabled: IsNonSimpleProductTypesEnabled = mock()

@Test
fun `given force refresh, when loadSimpleProducts called, then should clear cache`() = runTest {
// GIVEN
whenever(handler.canLoadMore).thenReturn(AtomicBoolean(true))
whenever(handler.productsFlow).thenReturn(flowOf(sampleProducts))
val sut = WooPosProductsDataSource(handler)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

// Pre-populate the cache
sut.loadSimpleProducts(forceRefreshProducts = false).first()
Expand All @@ -96,7 +102,7 @@ class WooPosProductsDataSourceTest {
whenever(handler.canLoadMore).thenReturn(AtomicBoolean(true))
whenever(handler.productsFlow).thenReturn(flowOf(sampleProducts))
whenever(handler.loadFromCacheAndFetch(any(), any(), any())).thenReturn(Result.success(Unit))
val sut = WooPosProductsDataSource(handler)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

// WHEN
sut.loadSimpleProducts(forceRefreshProducts = false).first()
Expand All @@ -115,7 +121,7 @@ class WooPosProductsDataSourceTest {
whenever(handler.canLoadMore).thenReturn(AtomicBoolean(true))
whenever(handler.productsFlow).thenReturn(flowOf(sampleProducts))
whenever(handler.loadFromCacheAndFetch(any(), any(), any())).thenReturn(Result.success(Unit))
val sut = WooPosProductsDataSource(handler)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

// WHEN
sut.loadSimpleProducts(forceRefreshProducts = false).first()
Expand All @@ -139,7 +145,7 @@ class WooPosProductsDataSourceTest {
val exception = Exception("Remote load failed")
whenever(handler.loadFromCacheAndFetch(any(), any(), any())).thenReturn(Result.success(Unit))

val sut = WooPosProductsDataSource(handler)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

// Prepopulate the cache by calling loadSimpleProducts once
sut.loadSimpleProducts(forceRefreshProducts = false).first()
Expand Down Expand Up @@ -168,7 +174,7 @@ class WooPosProductsDataSourceTest {
flowOf(sampleProducts + additionalProducts)
)
whenever(handler.loadMore()).thenReturn(Result.success(Unit))
val sut = WooPosProductsDataSource(handler)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

sut.loadSimpleProducts(forceRefreshProducts = false).first()

Expand All @@ -193,7 +199,7 @@ class WooPosProductsDataSourceTest {
whenever(handler.productsFlow).thenReturn(flowOf(sampleProducts))
val exception = Exception("Load more failed")
whenever(handler.loadMore()).thenReturn(Result.failure(exception))
val sut = WooPosProductsDataSource(handler)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

sut.loadSimpleProducts(forceRefreshProducts = false).first()

Expand All @@ -219,7 +225,7 @@ class WooPosProductsDataSourceTest {
val exception = Exception("Remote load failed")
whenever(handler.loadFromCacheAndFetch(any(), any(), any())).thenReturn(Result.failure(exception))

val sut = WooPosProductsDataSource(handler)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

// WHEN
val flow = sut.loadSimpleProducts(forceRefreshProducts = false).toList()
Expand All @@ -240,7 +246,7 @@ class WooPosProductsDataSourceTest {
whenever(handler.canLoadMore).thenReturn(AtomicBoolean(true))
whenever(handler.productsFlow).thenReturn(flowOf(emptyList()))
whenever(handler.loadFromCacheAndFetch(any(), any(), any())).thenReturn(Result.success(Unit))
val sut = WooPosProductsDataSource(handler)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

// WHEN
val flow = sut.loadSimpleProducts(forceRefreshProducts = false).toList()
Expand Down Expand Up @@ -280,7 +286,7 @@ class WooPosProductsDataSourceTest {
)
)
whenever(handler.loadFromCacheAndFetch(any(), any(), any())).thenReturn(Result.success(Unit))
val sut = WooPosProductsDataSource(handler)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

// WHEN
val flow = sut.loadSimpleProducts(forceRefreshProducts = false).toList()
Expand Down Expand Up @@ -317,7 +323,7 @@ class WooPosProductsDataSourceTest {
)
)
whenever(handler.loadFromCacheAndFetch(any(), any(), any())).thenReturn(Result.success(Unit))
val sut = WooPosProductsDataSource(handler)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

// WHEN
val flow = sut.loadSimpleProducts(forceRefreshProducts = true).toList()
Expand Down Expand Up @@ -355,7 +361,7 @@ class WooPosProductsDataSourceTest {
)
)
whenever(handler.loadFromCacheAndFetch(any(), any(), any())).thenReturn(Result.success(Unit))
val sut = WooPosProductsDataSource(handler)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

// WHEN
val flow = sut.loadSimpleProducts(forceRefreshProducts = false).toList()
Expand Down Expand Up @@ -394,7 +400,7 @@ class WooPosProductsDataSourceTest {
)
)
whenever(handler.loadFromCacheAndFetch(any(), any(), any())).thenReturn(Result.success(Unit))
val sut = WooPosProductsDataSource(handler)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

// WHEN
val flow = sut.loadSimpleProducts(forceRefreshProducts = true).toList()
Expand Down Expand Up @@ -431,7 +437,7 @@ class WooPosProductsDataSourceTest {
)
)
whenever(handler.loadFromCacheAndFetch(any(), any(), any())).thenReturn(Result.success(Unit))
val sut = WooPosProductsDataSource(handler)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

// WHEN
val flow = sut.loadSimpleProducts(forceRefreshProducts = false).toList()
Expand Down Expand Up @@ -469,7 +475,7 @@ class WooPosProductsDataSourceTest {
)
)
whenever(handler.loadFromCacheAndFetch(any(), any(), any())).thenReturn(Result.success(Unit))
val sut = WooPosProductsDataSource(handler)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

// WHEN
val flow = sut.loadSimpleProducts(forceRefreshProducts = true).toList()
Expand All @@ -478,4 +484,45 @@ class WooPosProductsDataSourceTest {
val remoteResult = flow[1] as WooPosProductsDataSource.ProductsResult.Remote
assertThat(remoteResult.productsResult.getOrNull()?.any { it.remoteId == 1L }).isFalse()
}

@Test
fun `given non-simple product types feature disabled, when loadSimpleProducts called, then add filter to display only simple products`() = runTest {
// GIVEN
whenever(handler.canLoadMore).thenReturn(AtomicBoolean(true))
whenever(handler.productsFlow).thenReturn(flowOf(sampleProducts))
whenever(isNonSimpleProductTypesEnabled.invoke()).thenReturn(false)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

// WHEN
sut.loadSimpleProducts(forceRefreshProducts = true).first()

// THEN
verify(handler).loadFromCacheAndFetch(
searchType = ProductListHandler.SearchType.DEFAULT,
filters = mapOf(
WCProductStore.ProductFilterOption.TYPE to ProductType.SIMPLE.value,
WCProductStore.ProductFilterOption.STATUS to ProductStatus.PUBLISH.value
)
)
}

@Test
fun `given non-simple product types feature enabled, when loadSimpleProducts called, then do not add filter to display only simple products`() = runTest {
// GIVEN
whenever(handler.canLoadMore).thenReturn(AtomicBoolean(true))
whenever(handler.productsFlow).thenReturn(flowOf(sampleProducts))
whenever(isNonSimpleProductTypesEnabled.invoke()).thenReturn(true)
val sut = WooPosProductsDataSource(handler, isNonSimpleProductTypesEnabled)

// WHEN
sut.loadSimpleProducts(forceRefreshProducts = true).first()

// THEN
verify(handler).loadFromCacheAndFetch(
searchType = ProductListHandler.SearchType.DEFAULT,
filters = mapOf(
WCProductStore.ProductFilterOption.STATUS to ProductStatus.PUBLISH.value
)
)
}
}

0 comments on commit 9c96e74

Please sign in to comment.