Avoid using volatile FeatureFlags in DefaultFeatureFlagServiceTest

This commit is contained in:
Benoit Marty 2025-10-17 12:33:07 +02:00 committed by Benoit Marty
parent a76ab22ed5
commit ba49cfb07c

View file

@ -11,19 +11,37 @@ import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.featureflag.api.Feature import io.element.android.libraries.featureflag.api.Feature
import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.featureflag.test.FakeFeature import io.element.android.libraries.featureflag.test.FakeFeature
import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.libraries.matrix.test.core.aBuildMeta
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Test import org.junit.Test
class DefaultFeatureFlagServiceTest { class DefaultFeatureFlagServiceTest {
private val aFeature = FakeFeature(
key = "test_feature",
title = "Test Feature",
)
@Test @Test
fun `given service without provider when feature is checked then it returns the default value`() = runTest { fun `given service without provider when feature is checked then it returns the default value`() = runTest {
val featureWithDefaultToFalse = FakeFeature(
key = "test_feature",
title = "Test Feature",
defaultValue = { false }
)
val featureWithDefaultToTrue = FakeFeature(
key = "test_feature_2",
title = "Test Feature 2",
defaultValue = { true }
)
val buildMeta = aBuildMeta() val buildMeta = aBuildMeta()
val featureFlagService = createDefaultFeatureFlagService(buildMeta = buildMeta) val featureFlagService = createDefaultFeatureFlagService(buildMeta = buildMeta)
featureFlagService.isFeatureEnabledFlow(FeatureFlags.Space).test { featureFlagService.isFeatureEnabledFlow(featureWithDefaultToFalse).test {
assertThat(awaitItem()).isEqualTo(FeatureFlags.Space.defaultValue(buildMeta)) assertThat(awaitItem()).isFalse()
cancelAndIgnoreRemainingEvents()
}
featureFlagService.isFeatureEnabledFlow(featureWithDefaultToTrue).test {
assertThat(awaitItem()).isTrue()
cancelAndIgnoreRemainingEvents() cancelAndIgnoreRemainingEvents()
} }
} }
@ -31,7 +49,7 @@ class DefaultFeatureFlagServiceTest {
@Test @Test
fun `given service without provider when set enabled feature is called then it returns false`() = runTest { fun `given service without provider when set enabled feature is called then it returns false`() = runTest {
val featureFlagService = createDefaultFeatureFlagService() val featureFlagService = createDefaultFeatureFlagService()
val result = featureFlagService.setFeatureEnabled(FeatureFlags.Space, true) val result = featureFlagService.setFeatureEnabled(aFeature, true)
assertThat(result).isFalse() assertThat(result).isFalse()
} }
@ -43,7 +61,7 @@ class DefaultFeatureFlagServiceTest {
providers = setOf(featureFlagProvider), providers = setOf(featureFlagProvider),
buildMeta = buildMeta, buildMeta = buildMeta,
) )
val result = featureFlagService.setFeatureEnabled(FeatureFlags.Space, true) val result = featureFlagService.setFeatureEnabled(aFeature, true)
assertThat(result).isTrue() assertThat(result).isTrue()
} }
@ -55,10 +73,10 @@ class DefaultFeatureFlagServiceTest {
providers = setOf(featureFlagProvider), providers = setOf(featureFlagProvider),
buildMeta = buildMeta buildMeta = buildMeta
) )
featureFlagService.setFeatureEnabled(FeatureFlags.Space, true) featureFlagService.setFeatureEnabled(aFeature, true)
featureFlagService.isFeatureEnabledFlow(FeatureFlags.Space).test { featureFlagService.isFeatureEnabledFlow(aFeature).test {
assertThat(awaitItem()).isTrue() assertThat(awaitItem()).isTrue()
featureFlagService.setFeatureEnabled(FeatureFlags.Space, false) featureFlagService.setFeatureEnabled(aFeature, false)
assertThat(awaitItem()).isFalse() assertThat(awaitItem()).isFalse()
} }
} }
@ -72,9 +90,9 @@ class DefaultFeatureFlagServiceTest {
providers = setOf(lowPriorityFeatureFlagProvider, highPriorityFeatureFlagProvider), providers = setOf(lowPriorityFeatureFlagProvider, highPriorityFeatureFlagProvider),
buildMeta = buildMeta buildMeta = buildMeta
) )
lowPriorityFeatureFlagProvider.setFeatureEnabled(FeatureFlags.Space, false) lowPriorityFeatureFlagProvider.setFeatureEnabled(aFeature, false)
highPriorityFeatureFlagProvider.setFeatureEnabled(FeatureFlags.Space, true) highPriorityFeatureFlagProvider.setFeatureEnabled(aFeature, true)
featureFlagService.isFeatureEnabledFlow(FeatureFlags.Space).test { featureFlagService.isFeatureEnabledFlow(aFeature).test {
assertThat(awaitItem()).isTrue() assertThat(awaitItem()).isTrue()
} }
} }
@ -143,7 +161,7 @@ class DefaultFeatureFlagServiceTest {
private fun createDefaultFeatureFlagService( private fun createDefaultFeatureFlagService(
providers: Set<FeatureFlagProvider> = emptySet(), providers: Set<FeatureFlagProvider> = emptySet(),
buildMeta: BuildMeta = aBuildMeta(), buildMeta: BuildMeta = aBuildMeta(),
features: List<Feature> = FeatureFlags.entries, features: List<Feature> = emptyList(),
) = DefaultFeatureFlagService( ) = DefaultFeatureFlagService(
providers = providers, providers = providers,
buildMeta = buildMeta, buildMeta = buildMeta,