Updated on 2026-08-14
This commit is contained in:
parent
e72c2c87bc
commit
6dbd7bd861
58 changed files with 207 additions and 206 deletions
|
|
@ -1,15 +0,0 @@
|
|||
package com.tangem.core.featuretoggle.storage
|
||||
|
||||
/**
|
||||
* Component that initializes and stores a list of feature toggles
|
||||
*
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
internal interface FeatureTogglesStorage {
|
||||
|
||||
/** List of feature toggles */
|
||||
val featureToggles: List<FeatureToggle>
|
||||
|
||||
/** Initialize storage */
|
||||
suspend fun init()
|
||||
}
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
package com.tangem.core.featuretoggle.storage
|
||||
|
||||
import com.tangem.core.featuretoggle.storage.LocalFeatureTogglesStorage.Companion.LOCAL_CONFIG_PATH
|
||||
import com.tangem.datasource.asset.loader.AssetLoader
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
/**
|
||||
* Storage implementation for storing local feature toggles.
|
||||
* Feature toggles are declared in file [LOCAL_CONFIG_PATH].
|
||||
*
|
||||
* @property assetLoader asset loader
|
||||
*
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
internal class LocalFeatureTogglesStorage(
|
||||
private val assetLoader: AssetLoader,
|
||||
) : FeatureTogglesStorage {
|
||||
|
||||
override var featureToggles: List<FeatureToggle> by Delegates.notNull()
|
||||
private set
|
||||
|
||||
override suspend fun init() {
|
||||
featureToggles = assetLoader.loadList<FeatureToggle>(LOCAL_CONFIG_PATH)
|
||||
}
|
||||
|
||||
private companion object {
|
||||
const val LOCAL_CONFIG_PATH: String = "configs/feature_toggles_config"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
package com.tangem.core.featuretoggle.utils
|
||||
|
||||
import com.tangem.core.featuretoggle.contract.VersionAvailabilityContract
|
||||
import com.tangem.core.featuretoggle.storage.FeatureToggle
|
||||
|
||||
internal fun List<FeatureToggle>.associateToggles(currentVersion: String): Map<String, Boolean> {
|
||||
return associate { localToggle ->
|
||||
Pair(
|
||||
first = localToggle.name,
|
||||
second = VersionAvailabilityContract(currentVersion, localToggle.version),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -7,7 +7,7 @@ plugins {
|
|||
}
|
||||
|
||||
android {
|
||||
namespace = "com.tangem.core.featuretoggles"
|
||||
namespace = "com.tangem.core.toggles"
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
[
|
||||
{
|
||||
"mainnet_id": "",
|
||||
"excluded_till": "undefined"
|
||||
},
|
||||
{
|
||||
"mainnet_id": "NEXA",
|
||||
"excluded_till": "undefined"
|
||||
}
|
||||
]
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
package com.tangem.core.featuretoggle.di
|
||||
package com.tangem.core.toggle.di
|
||||
|
||||
import android.content.Context
|
||||
import com.tangem.core.featuretoggle.manager.DevFeatureTogglesManager
|
||||
import com.tangem.core.featuretoggle.manager.FeatureTogglesManager
|
||||
import com.tangem.core.featuretoggle.manager.ProdFeatureTogglesManager
|
||||
import com.tangem.core.featuretoggle.storage.LocalFeatureTogglesStorage
|
||||
import com.tangem.core.featuretoggle.version.DefaultVersionProvider
|
||||
import com.tangem.core.featuretoggles.BuildConfig
|
||||
import com.tangem.core.toggle.feature.FeatureTogglesManager
|
||||
import com.tangem.core.toggle.feature.impl.DevFeatureTogglesManager
|
||||
import com.tangem.core.toggle.feature.impl.ProdFeatureTogglesManager
|
||||
import com.tangem.core.toggle.storage.LocalTogglesStorage
|
||||
import com.tangem.core.toggle.version.DefaultVersionProvider
|
||||
import com.tangem.core.toggles.BuildConfig
|
||||
import com.tangem.datasource.asset.loader.AssetLoader
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import dagger.Module
|
||||
|
|
@ -27,18 +27,18 @@ internal object FeatureTogglesManagerModule {
|
|||
assetLoader: AssetLoader,
|
||||
appPreferencesStore: AppPreferencesStore,
|
||||
): FeatureTogglesManager {
|
||||
val localFeatureTogglesStorage = LocalFeatureTogglesStorage(assetLoader)
|
||||
val localTogglesStorage = LocalTogglesStorage(assetLoader)
|
||||
val versionProvider = DefaultVersionProvider(context)
|
||||
|
||||
return if (BuildConfig.TESTER_MENU_ENABLED) {
|
||||
DevFeatureTogglesManager(
|
||||
localFeatureTogglesStorage = localFeatureTogglesStorage,
|
||||
localTogglesStorage = localTogglesStorage,
|
||||
appPreferencesStore = appPreferencesStore,
|
||||
versionProvider = versionProvider,
|
||||
)
|
||||
} else {
|
||||
ProdFeatureTogglesManager(
|
||||
localFeatureTogglesStorage = localFeatureTogglesStorage,
|
||||
localTogglesStorage = localTogglesStorage,
|
||||
versionProvider = versionProvider,
|
||||
)
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package com.tangem.core.featuretoggle.manager
|
||||
package com.tangem.core.toggle.feature
|
||||
|
||||
/**
|
||||
* Component for getting information about the availability of feature toggles
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package com.tangem.core.featuretoggle.manager
|
||||
package com.tangem.core.toggle.feature
|
||||
|
||||
/**
|
||||
* Component for change information about the availability of feature toggles
|
||||
|
|
@ -1,9 +1,10 @@
|
|||
package com.tangem.core.featuretoggle.manager
|
||||
package com.tangem.core.toggle.feature.impl
|
||||
|
||||
import androidx.annotation.VisibleForTesting
|
||||
import com.tangem.core.featuretoggle.storage.FeatureTogglesStorage
|
||||
import com.tangem.core.featuretoggle.utils.associateToggles
|
||||
import com.tangem.core.featuretoggle.version.VersionProvider
|
||||
import com.tangem.core.toggle.feature.MutableFeatureTogglesManager
|
||||
import com.tangem.core.toggle.storage.TogglesStorage
|
||||
import com.tangem.core.toggle.utils.associateToggles
|
||||
import com.tangem.core.toggle.version.VersionProvider
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.preferences.PreferencesKeys
|
||||
import com.tangem.datasource.local.preferences.utils.getObjectSyncOrNull
|
||||
|
|
@ -13,12 +14,12 @@ import kotlin.properties.Delegates
|
|||
/**
|
||||
* Feature toggles manager implementation in DEV build
|
||||
*
|
||||
* @property localFeatureTogglesStorage local feature toggles storage
|
||||
* @property localTogglesStorage local feature toggles storage
|
||||
* @property appPreferencesStore application local store
|
||||
* @property versionProvider application version provider
|
||||
*/
|
||||
internal class DevFeatureTogglesManager(
|
||||
private val localFeatureTogglesStorage: FeatureTogglesStorage,
|
||||
private val localTogglesStorage: TogglesStorage,
|
||||
private val appPreferencesStore: AppPreferencesStore,
|
||||
private val versionProvider: VersionProvider,
|
||||
) : MutableFeatureTogglesManager {
|
||||
|
|
@ -27,13 +28,13 @@ internal class DevFeatureTogglesManager(
|
|||
private var localFeatureTogglesMap: Map<String, Boolean> by Delegates.notNull()
|
||||
|
||||
override suspend fun init() {
|
||||
localFeatureTogglesStorage.init()
|
||||
localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH)
|
||||
|
||||
val savedFeatureToggles = appPreferencesStore.getObjectSyncOrNull<Map<String, Boolean>>(
|
||||
key = PreferencesKeys.FEATURE_TOGGLES_KEY,
|
||||
) ?: emptyMap()
|
||||
|
||||
val localFeatureToggles = localFeatureTogglesStorage.featureToggles
|
||||
val localFeatureToggles = localTogglesStorage.toggles
|
||||
.associateToggles(currentVersion = versionProvider.get().orEmpty())
|
||||
|
||||
localFeatureTogglesMap = localFeatureToggles
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
package com.tangem.core.toggle.feature.impl
|
||||
|
||||
internal object FeatureTogglesConstants {
|
||||
|
||||
const val LOCAL_CONFIG_PATH: String = "configs/feature_toggles_config"
|
||||
}
|
||||
|
|
@ -1,27 +1,28 @@
|
|||
package com.tangem.core.featuretoggle.manager
|
||||
package com.tangem.core.toggle.feature.impl
|
||||
|
||||
import androidx.annotation.VisibleForTesting
|
||||
import com.tangem.core.featuretoggle.storage.FeatureTogglesStorage
|
||||
import com.tangem.core.featuretoggle.utils.associateToggles
|
||||
import com.tangem.core.featuretoggle.version.VersionProvider
|
||||
import com.tangem.core.toggle.feature.FeatureTogglesManager
|
||||
import com.tangem.core.toggle.storage.TogglesStorage
|
||||
import com.tangem.core.toggle.utils.associateToggles
|
||||
import com.tangem.core.toggle.version.VersionProvider
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
/**
|
||||
* Feature toggles manager implementation in PROD build
|
||||
*
|
||||
* @property localFeatureTogglesStorage local feature toggles storage
|
||||
* @property localTogglesStorage local feature toggles storage
|
||||
* @property versionProvider application version provider
|
||||
*/
|
||||
internal class ProdFeatureTogglesManager(
|
||||
private val localFeatureTogglesStorage: FeatureTogglesStorage,
|
||||
private val localTogglesStorage: TogglesStorage,
|
||||
private val versionProvider: VersionProvider,
|
||||
) : FeatureTogglesManager {
|
||||
|
||||
private var featureToggles: Map<String, Boolean> by Delegates.notNull()
|
||||
|
||||
override suspend fun init() {
|
||||
localFeatureTogglesStorage.init()
|
||||
featureToggles = localFeatureTogglesStorage.featureToggles
|
||||
localTogglesStorage.populate(FeatureTogglesConstants.LOCAL_CONFIG_PATH)
|
||||
featureToggles = localTogglesStorage.toggles
|
||||
.associateToggles(currentVersion = versionProvider.get() ?: "")
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
package com.tangem.core.toggle.storage
|
||||
|
||||
import com.tangem.datasource.asset.loader.AssetLoader
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
/**
|
||||
* Storage implementation for storing local feature toggles.
|
||||
* Feature toggles are declared in file [LOCAL_CONFIG_PATH].
|
||||
*
|
||||
* @property assetLoader asset loader
|
||||
*
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
internal class LocalTogglesStorage(
|
||||
private val assetLoader: AssetLoader,
|
||||
) : TogglesStorage {
|
||||
|
||||
override var toggles: List<Toggle> by Delegates.notNull()
|
||||
private set
|
||||
|
||||
override suspend fun populate(path: String) {
|
||||
toggles = assetLoader.loadList<Toggle>(path)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,20 +1,20 @@
|
|||
package com.tangem.core.featuretoggle.storage
|
||||
package com.tangem.core.toggle.storage
|
||||
|
||||
import com.squareup.moshi.Json
|
||||
import com.squareup.moshi.JsonClass
|
||||
|
||||
/**
|
||||
* Data model with information about feature toggle
|
||||
* Data model with information about config toggle
|
||||
*
|
||||
* @property name feature toggle name
|
||||
* @property name toggle name
|
||||
* @property version version number in which the feature will be included
|
||||
*
|
||||
* IMPORTANT: if the version is "undefined", it means that feature toggle is disabled!
|
||||
* IMPORTANT: if the version is "undefined", it means that toggle is disabled!
|
||||
*
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
@JsonClass(generateAdapter = true)
|
||||
internal data class FeatureToggle(
|
||||
internal data class Toggle(
|
||||
@Json(name = "name") val name: String,
|
||||
@Json(name = "version") val version: String,
|
||||
)
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
package com.tangem.core.toggle.storage
|
||||
|
||||
/**
|
||||
* Component that initializes and stores a list of feature toggles
|
||||
*
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
internal interface TogglesStorage {
|
||||
|
||||
/** List of feature toggles */
|
||||
val toggles: List<Toggle>
|
||||
|
||||
/** Populate the storage with toggles */
|
||||
suspend fun populate(path: String)
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
package com.tangem.core.toggle.utils
|
||||
|
||||
import com.tangem.core.toggle.storage.Toggle
|
||||
import com.tangem.core.toggle.version.VersionAvailabilityContract
|
||||
|
||||
internal fun List<Toggle>.associateToggles(currentVersion: String): Map<String, Boolean> {
|
||||
return associate { localToggle ->
|
||||
Pair(
|
||||
first = localToggle.name,
|
||||
second = VersionAvailabilityContract(currentVersion, localToggle.version),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package com.tangem.core.featuretoggle.version
|
||||
package com.tangem.core.toggle.version
|
||||
|
||||
import android.content.Context
|
||||
import android.content.pm.PackageManager
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package com.tangem.core.featuretoggle.contract
|
||||
package com.tangem.core.toggle.version
|
||||
|
||||
import androidx.annotation.VisibleForTesting
|
||||
import timber.log.Timber
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package com.tangem.core.featuretoggle.contract
|
||||
package com.tangem.core.toggle.version
|
||||
|
||||
/**
|
||||
* Version contract to evaluate availability of feature toggle
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package com.tangem.core.featuretoggle.version
|
||||
package com.tangem.core.toggle.version
|
||||
|
||||
/** Application version provider */
|
||||
internal interface VersionProvider {
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
package com.tangem.core.featuretoggle.contract
|
||||
package com.tangem.core.toggle.contract
|
||||
|
||||
import com.google.common.truth.Truth
|
||||
import com.tangem.core.toggle.version.VersionAvailabilityContract
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
package com.tangem.core.featuretoggle.contract
|
||||
package com.tangem.core.toggle.contract
|
||||
|
||||
import com.google.common.truth.Truth
|
||||
import com.tangem.core.toggle.version.Version
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
package com.tangem.core.featuretoggle.manager
|
||||
package com.tangem.core.toggle.manager
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import com.google.common.truth.Truth
|
||||
import com.tangem.core.featuretoggle.storage.FeatureToggle
|
||||
import com.tangem.core.featuretoggle.storage.FeatureTogglesStorage
|
||||
import com.tangem.core.featuretoggle.utils.associateToggles
|
||||
import com.tangem.core.featuretoggle.version.VersionProvider
|
||||
import com.tangem.core.toggle.feature.impl.DevFeatureTogglesManager
|
||||
import com.tangem.core.toggle.storage.Toggle
|
||||
import com.tangem.core.toggle.storage.TogglesStorage
|
||||
import com.tangem.core.toggle.utils.associateToggles
|
||||
import com.tangem.core.toggle.version.VersionProvider
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.preferences.PreferencesKeys
|
||||
import com.tangem.datasource.local.preferences.utils.getObjectSyncOrNull
|
||||
|
|
@ -19,13 +20,13 @@ import kotlin.collections.set
|
|||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
@SuppressLint("CheckResult")
|
||||
internal class DevFeatureTogglesManagerTest {
|
||||
internal class DevTogglesManagerTest {
|
||||
|
||||
private val localFeatureTogglesStorage = mockk<FeatureTogglesStorage>()
|
||||
private val localTogglesStorage = mockk<TogglesStorage>()
|
||||
private val appPreferenceStore = mockk<AppPreferencesStore>(relaxed = true)
|
||||
private val versionProvider = mockk<VersionProvider>()
|
||||
private val manager = DevFeatureTogglesManager(
|
||||
localFeatureTogglesStorage = localFeatureTogglesStorage,
|
||||
localTogglesStorage = localTogglesStorage,
|
||||
appPreferencesStore = appPreferenceStore,
|
||||
versionProvider = versionProvider,
|
||||
)
|
||||
|
|
@ -34,17 +35,17 @@ internal class DevFeatureTogglesManagerTest {
|
|||
fun `successfully initialize storage if shared prefs kept feature toggles`() = runTest {
|
||||
val currentVersion = "0.1.0"
|
||||
|
||||
coEvery { localFeatureTogglesStorage.init() } just Runs
|
||||
coEvery { localTogglesStorage.populate() } just Runs
|
||||
coEvery {
|
||||
appPreferenceStore.getObjectSyncOrNull<Map<String, Boolean>>(PreferencesKeys.FEATURE_TOGGLES_KEY)
|
||||
} returns savedFeatureTogglesMap
|
||||
coEvery { localFeatureTogglesStorage.featureToggles } returns localFeatureToggles
|
||||
coEvery { localTogglesStorage.toggles } returns localFeatureToggles
|
||||
coEvery { versionProvider.get() } returns currentVersion
|
||||
|
||||
manager.init()
|
||||
|
||||
coVerifyOrder {
|
||||
localFeatureTogglesStorage.init()
|
||||
localTogglesStorage.populate()
|
||||
versionProvider.get()
|
||||
}
|
||||
|
||||
|
|
@ -61,17 +62,17 @@ internal class DevFeatureTogglesManagerTest {
|
|||
fun `successfully initialize storage if shared prefs kept empty list`() = runTest {
|
||||
val currentVersion = "0.1.0"
|
||||
|
||||
coEvery { localFeatureTogglesStorage.init() } just Runs
|
||||
coEvery { localTogglesStorage.populate() } just Runs
|
||||
coEvery {
|
||||
appPreferenceStore.getObjectSyncOrNull<Map<String, Boolean>>(PreferencesKeys.FEATURE_TOGGLES_KEY)
|
||||
} returns emptyMap()
|
||||
coEvery { localFeatureTogglesStorage.featureToggles } returns localFeatureToggles
|
||||
coEvery { localTogglesStorage.toggles } returns localFeatureToggles
|
||||
coEvery { versionProvider.get() } returns currentVersion
|
||||
|
||||
manager.init()
|
||||
|
||||
coVerifyOrder {
|
||||
localFeatureTogglesStorage.init()
|
||||
localTogglesStorage.populate()
|
||||
versionProvider.get()
|
||||
}
|
||||
|
||||
|
|
@ -88,17 +89,17 @@ internal class DevFeatureTogglesManagerTest {
|
|||
fun `successfully initialize storage if shared prefs didn't keep feature toggles`() = runTest {
|
||||
val currentVersion = "0.1.0"
|
||||
|
||||
coEvery { localFeatureTogglesStorage.init() } just Runs
|
||||
coEvery { localTogglesStorage.populate() } just Runs
|
||||
coEvery {
|
||||
appPreferenceStore.getObjectSyncOrNull<Map<String, Boolean>>(PreferencesKeys.FEATURE_TOGGLES_KEY)
|
||||
} returns null
|
||||
coEvery { localFeatureTogglesStorage.featureToggles } returns localFeatureToggles
|
||||
coEvery { localTogglesStorage.toggles } returns localFeatureToggles
|
||||
coEvery { versionProvider.get() } returns currentVersion
|
||||
|
||||
manager.init()
|
||||
|
||||
coVerifyOrder {
|
||||
localFeatureTogglesStorage.init()
|
||||
localTogglesStorage.populate()
|
||||
versionProvider.get()
|
||||
}
|
||||
|
||||
|
|
@ -111,15 +112,15 @@ internal class DevFeatureTogglesManagerTest {
|
|||
|
||||
@Test
|
||||
fun `successfully initialize storage if versionProvider returns null`() = runTest {
|
||||
coEvery { localFeatureTogglesStorage.init() } just Runs
|
||||
coEvery { localTogglesStorage.populate() } just Runs
|
||||
coEvery { appPreferenceStore.getSyncOrNull(PreferencesKeys.FEATURE_TOGGLES_KEY) } returns savedFeatureToggles
|
||||
coEvery { localFeatureTogglesStorage.featureToggles } returns localFeatureToggles
|
||||
coEvery { localTogglesStorage.toggles } returns localFeatureToggles
|
||||
coEvery { versionProvider.get() } returns null
|
||||
|
||||
manager.init()
|
||||
|
||||
coVerifyOrder {
|
||||
localFeatureTogglesStorage.init()
|
||||
localTogglesStorage.populate()
|
||||
versionProvider.get()
|
||||
}
|
||||
|
||||
|
|
@ -222,8 +223,8 @@ internal class DevFeatureTogglesManagerTest {
|
|||
)
|
||||
|
||||
val localFeatureToggles = listOf(
|
||||
FeatureToggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"),
|
||||
FeatureToggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"),
|
||||
Toggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"),
|
||||
Toggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
package com.tangem.core.featuretoggle.manager
|
||||
package com.tangem.core.toggle.manager
|
||||
|
||||
import android.content.pm.PackageManager
|
||||
import com.google.common.truth.Truth
|
||||
import com.tangem.core.featuretoggle.storage.FeatureToggle
|
||||
import com.tangem.core.featuretoggle.storage.FeatureTogglesStorage
|
||||
import com.tangem.core.featuretoggle.utils.associateToggles
|
||||
import com.tangem.core.featuretoggle.version.VersionProvider
|
||||
import com.tangem.core.toggle.feature.impl.ProdFeatureTogglesManager
|
||||
import com.tangem.core.toggle.storage.Toggle
|
||||
import com.tangem.core.toggle.storage.TogglesStorage
|
||||
import com.tangem.core.toggle.utils.associateToggles
|
||||
import com.tangem.core.toggle.version.VersionProvider
|
||||
import io.mockk.*
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.junit.Test
|
||||
|
|
@ -13,24 +14,24 @@ import org.junit.Test
|
|||
/**
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
internal class ProdFeatureTogglesManagerTest {
|
||||
internal class ProdTogglesManagerTest {
|
||||
|
||||
private val localFeatureTogglesStorage = mockk<FeatureTogglesStorage>()
|
||||
private val localTogglesStorage = mockk<TogglesStorage>()
|
||||
private val versionProvider = mockk<VersionProvider>()
|
||||
private val manager = ProdFeatureTogglesManager(localFeatureTogglesStorage, versionProvider)
|
||||
private val manager = ProdFeatureTogglesManager(localTogglesStorage, versionProvider)
|
||||
|
||||
@Test
|
||||
fun `successfully initialize storage`() = runTest {
|
||||
val currentVersion = "1.0.0"
|
||||
|
||||
coEvery { localFeatureTogglesStorage.init() } just Runs
|
||||
every { localFeatureTogglesStorage.featureToggles } returns localFeatureToggles
|
||||
coEvery { localTogglesStorage.populate() } just Runs
|
||||
every { localTogglesStorage.toggles } returns localFeatureToggles
|
||||
every { versionProvider.get() } returns currentVersion
|
||||
|
||||
manager.init()
|
||||
|
||||
coVerifyOrder {
|
||||
localFeatureTogglesStorage.init()
|
||||
localTogglesStorage.populate()
|
||||
versionProvider.get()
|
||||
}
|
||||
|
||||
|
|
@ -40,14 +41,14 @@ internal class ProdFeatureTogglesManagerTest {
|
|||
|
||||
@Test
|
||||
fun `successfully initialize storage if versionProvider returns null`() = runTest {
|
||||
coEvery { localFeatureTogglesStorage.init() } just Runs
|
||||
every { localFeatureTogglesStorage.featureToggles } returns localFeatureToggles
|
||||
coEvery { localTogglesStorage.populate() } just Runs
|
||||
every { localTogglesStorage.toggles } returns localFeatureToggles
|
||||
every { versionProvider.get() } returns null
|
||||
|
||||
manager.init()
|
||||
|
||||
coVerifyOrder {
|
||||
localFeatureTogglesStorage.init()
|
||||
localTogglesStorage.populate()
|
||||
versionProvider.get()
|
||||
}
|
||||
|
||||
|
|
@ -56,8 +57,8 @@ internal class ProdFeatureTogglesManagerTest {
|
|||
|
||||
@Test
|
||||
fun `failure initialize storage if localFeatureTogglesStorage throws exception`() = runTest {
|
||||
coEvery { localFeatureTogglesStorage.init() } just Runs
|
||||
every { localFeatureTogglesStorage.featureToggles } throws IllegalStateException(
|
||||
coEvery { localTogglesStorage.populate() } just Runs
|
||||
every { localTogglesStorage.toggles } throws IllegalStateException(
|
||||
"Property featureToggles should be initialized before get.",
|
||||
)
|
||||
|
||||
|
|
@ -72,14 +73,14 @@ internal class ProdFeatureTogglesManagerTest {
|
|||
Truth.assertThat(it).isInstanceOf(IllegalStateException::class.java)
|
||||
}
|
||||
|
||||
coVerifyOrder { localFeatureTogglesStorage.init() }
|
||||
coVerifyOrder { localTogglesStorage.populate() }
|
||||
verifyAll(inverse = true) { versionProvider.get() }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `failure initialize storage if versionProvider throws exception`() = runTest {
|
||||
coEvery { localFeatureTogglesStorage.init() } just Runs
|
||||
every { localFeatureTogglesStorage.featureToggles } returns localFeatureToggles
|
||||
coEvery { localTogglesStorage.populate() } just Runs
|
||||
every { localTogglesStorage.toggles } returns localFeatureToggles
|
||||
every { versionProvider.get() } throws PackageManager.NameNotFoundException()
|
||||
|
||||
runCatching { manager.init() }
|
||||
|
|
@ -89,7 +90,7 @@ internal class ProdFeatureTogglesManagerTest {
|
|||
}
|
||||
|
||||
coVerifyOrder {
|
||||
localFeatureTogglesStorage.init()
|
||||
localTogglesStorage.populate()
|
||||
versionProvider.get()
|
||||
}
|
||||
}
|
||||
|
|
@ -122,8 +123,8 @@ internal class ProdFeatureTogglesManagerTest {
|
|||
|
||||
private companion object {
|
||||
val localFeatureToggles = listOf(
|
||||
FeatureToggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"),
|
||||
FeatureToggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"),
|
||||
Toggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"),
|
||||
Toggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"),
|
||||
)
|
||||
|
||||
val disabledFeatureToggles = mapOf(
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package com.tangem.core.featuretoggle.storage
|
||||
package com.tangem.core.toggle.storage
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import com.google.common.truth.Truth
|
||||
|
|
@ -16,16 +16,16 @@ import java.io.IOException
|
|||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
@SuppressLint("CheckResult")
|
||||
internal class LocalFeatureTogglesStorageTest {
|
||||
internal class LocalTogglesStorageTest {
|
||||
|
||||
private val assetReader = mockk<AssetReader>()
|
||||
private val moshi = mockk<Moshi>()
|
||||
private val jsonAdapter = mockk<JsonAdapter<List<FeatureToggle>>>()
|
||||
private val jsonAdapter = mockk<JsonAdapter<List<Toggle>>>()
|
||||
|
||||
// Impossible to mockk AssetLoader because it implement inline functions
|
||||
private val assetLoader = AssetLoader(assetReader = assetReader, moshi = moshi)
|
||||
|
||||
private val storage = LocalFeatureTogglesStorage(assetLoader)
|
||||
private val storage = LocalTogglesStorage(assetLoader)
|
||||
|
||||
@Test
|
||||
fun `successfully initialize storage`() = runTest {
|
||||
|
|
@ -33,14 +33,14 @@ internal class LocalFeatureTogglesStorageTest {
|
|||
everyCreatingMoshiAdapter() returns jsonAdapter
|
||||
everyMappingJson() returns featureToggles
|
||||
|
||||
storage.init()
|
||||
storage.populate()
|
||||
|
||||
coVerifyOrder {
|
||||
assetReader.read(CONFIG_FILE_NAME)
|
||||
jsonAdapter.fromJson(json)
|
||||
}
|
||||
|
||||
Truth.assertThat(storage.featureToggles).containsExactlyElementsIn(featureToggles)
|
||||
Truth.assertThat(storage.toggles).containsExactlyElementsIn(featureToggles)
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -49,33 +49,33 @@ internal class LocalFeatureTogglesStorageTest {
|
|||
everyCreatingMoshiAdapter() returns jsonAdapter
|
||||
everyMappingJson() throws IOException()
|
||||
|
||||
storage.init()
|
||||
storage.populate()
|
||||
|
||||
coVerifyOrder {
|
||||
assetReader.read(CONFIG_FILE_NAME)
|
||||
jsonAdapter.fromJson(json)
|
||||
}
|
||||
|
||||
Truth.assertThat(storage.featureToggles).containsExactlyElementsIn(emptyList<FeatureToggle>())
|
||||
Truth.assertThat(storage.toggles).containsExactlyElementsIn(emptyList<Toggle>())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `failure initialize storage if jsonAdapter throws exception`() = runTest {
|
||||
everyReadingJson() throws IOException()
|
||||
|
||||
storage.init()
|
||||
storage.populate()
|
||||
|
||||
coVerifyOrder { assetReader.read(CONFIG_FILE_NAME) }
|
||||
verifyAll(inverse = true) { jsonAdapter.fromJson(any<String>()) }
|
||||
|
||||
Truth.assertThat(storage.featureToggles).containsExactlyElementsIn(emptyList<FeatureToggle>())
|
||||
Truth.assertThat(storage.toggles).containsExactlyElementsIn(emptyList<Toggle>())
|
||||
}
|
||||
|
||||
private fun everyReadingJson() = coEvery { assetReader.read(CONFIG_FILE_NAME) }
|
||||
|
||||
private fun everyCreatingMoshiAdapter() = every {
|
||||
val types = Types.newParameterizedType(List::class.java, FeatureToggle::class.java)
|
||||
moshi.adapter<List<FeatureToggle>>(types)
|
||||
val types = Types.newParameterizedType(List::class.java, Toggle::class.java)
|
||||
moshi.adapter<List<Toggle>>(types)
|
||||
}
|
||||
|
||||
private fun everyMappingJson() = every { jsonAdapter.fromJson(json) }
|
||||
|
|
@ -97,8 +97,8 @@ internal class LocalFeatureTogglesStorageTest {
|
|||
""".trimIndent()
|
||||
|
||||
val featureToggles = listOf(
|
||||
FeatureToggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"),
|
||||
FeatureToggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"),
|
||||
Toggle(name = "INACTIVE_TEST_FEATURE_ENABLED", version = "undefined"),
|
||||
Toggle(name = "ACTIVE2_TEST_FEATURE_ENABLED", version = "1.0.0"),
|
||||
)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue