Add option to retrieve feature flag synchronously (#3692)

This commit is contained in:
David Perez 2024-08-07 10:13:52 -05:00 committed by GitHub
parent 59ba585048
commit 23066769a1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 51 additions and 1 deletions

View file

@ -20,11 +20,19 @@ interface FeatureFlagManager {
/**
* Get value for feature flag with [key] and returns it as generic type [T].
* If no value is found the the given [key] its default value will be returned.
* If no value is found the given [key] its default value will be returned.
* Cached flags can be invalidated with [forceRefresh]
*/
suspend fun <T : Any> getFeatureFlag(
key: FlagKey<T>,
forceRefresh: Boolean,
): T
/**
* Gets the value for feature flag with [key] and returns it as generic type [T].
* If no value is found the given [key] its [FlagKey.defaultValue] will be returned.
*/
fun <T : Any> getFeatureFlag(
key: FlagKey<T>,
): T
}

View file

@ -32,6 +32,12 @@ class FeatureFlagManagerImpl(
serverConfigRepository
.getServerConfig(forceRefresh = forceRefresh)
.getFlagValueOrDefault(key = key)
override fun <T : Any> getFeatureFlag(key: FlagKey<T>): T =
serverConfigRepository
.serverConfigStateFlow
.value
.getFlagValueOrDefault(key = key)
}
private fun <T : Any> ServerConfig?.getFlagValueOrDefault(key: FlagKey<T>): T {

View file

@ -216,6 +216,42 @@ class FeatureFlagManagerTest {
flagValue,
)
}
@Test
fun `synchronous getFeatureFlag should return stored value when present`() {
fakeServerConfigRepository.serverConfigValue = SERVER_CONFIG.copy(
serverData = SERVER_CONFIG.serverData.copy(
featureStates = mapOf("dummy-int" to JsonPrimitive(true)),
),
)
val flagValue = manager.getFeatureFlag(key = FlagKey.DummyInt)
assertEquals(Int.MIN_VALUE, flagValue)
}
@Test
fun `synchronous getFeatureFlag should return default value if flag is incorrect type`() {
val value = "nonDefaultValue"
fakeServerConfigRepository.serverConfigValue = SERVER_CONFIG.copy(
serverData = SERVER_CONFIG.serverData.copy(
featureStates = mapOf("dummy-string" to JsonPrimitive(value)),
),
)
val flagValue = manager.getFeatureFlag(key = FlagKey.DummyString)
assertEquals(value, flagValue)
}
@Test
fun `synchronous getFeatureFlag should return default value if no flags available`() {
fakeServerConfigRepository.serverConfigValue = null
val flagValue = manager.getFeatureFlag(key = FlagKey.DummyString)
assertEquals("defaultValue", flagValue)
}
}
private val SERVER_CONFIG = ServerConfig(