Updated on 2026-08-14

This commit is contained in:
Tangem 2024-06-18 19:38:52 +08:00
parent d2b02493a8
commit 63da6a3729
4 changed files with 88 additions and 131 deletions

View file

@ -7,7 +7,6 @@ import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.Moshi
import com.squareup.moshi.adapter
import com.tangem.blockchainsdk.BlockchainProvidersResponse
import com.tangem.datasource.api.common.AuthProvider
import com.tangem.datasource.api.tangemTech.TangemTechServiceApi
import com.tangem.datasource.asset.loader.AssetLoader
import com.tangem.datasource.asset.reader.AssetReader
@ -26,7 +25,6 @@ import org.junit.Test
internal class BlockchainProvidersResponseLoaderTest {
private val tangemTechServiceApi = mockk<TangemTechServiceApi>()
private val authProvider = mockk<AuthProvider>()
private val assetReader = mockk<AssetReader>()
private val moshi = mockk<Moshi>()
private val jsonAdapter = mockk<JsonAdapter<BlockchainProvidersResponse>>()
@ -36,7 +34,6 @@ internal class BlockchainProvidersResponseLoaderTest {
private val loader = BlockchainProvidersResponseLoader(
tangemTechServiceApi = tangemTechServiceApi,
authProvider = authProvider,
assetLoader = assetLoader,
dispatchers = TestingCoroutineDispatcherProvider(),
)
@ -62,32 +59,23 @@ internal class BlockchainProvidersResponseLoaderTest {
jsonAdapter.fromJson(emptyJson)
}
coVerify(inverse = true) {
authProvider.getCardPublicKey()
authProvider.getCardId()
tangemTechServiceApi.getBlockchainProviders(any(), any())
}
coVerify(inverse = true) { tangemTechServiceApi.getBlockchainProviders() }
Truth.assertThat(actual).isEqualTo(null)
}
@Test
fun test_load_if_remote_config_loading_is_loaded_failure() = runTest {
everyGettingLocalConfig(json = localProvidersJson) returns localProviders
everyGettingRemoteConfig() throws IllegalStateException("Test exception")
everyGettingLocalConfig(json = LOCAL_PROVIDERS_JSON) returns localProviders
coEvery { tangemTechServiceApi.getBlockchainProviders() } throws IllegalStateException("Test exception")
val actual = loader.load()
coVerifyOrder {
assetReader.read(LOCAL_CONFIG_FILE_NAME)
moshi.adapter<BlockchainProvidersResponse>()
jsonAdapter.fromJson(localProvidersJson)
authProvider.getCardPublicKey()
authProvider.getCardId()
tangemTechServiceApi.getBlockchainProviders(
cardPublicKey = DEFAULT_CARD_PUBLIC_KEY,
cardId = DEFAULT_CARD_ID,
)
jsonAdapter.fromJson(LOCAL_PROVIDERS_JSON)
tangemTechServiceApi.getBlockchainProviders()
}
Truth.assertThat(actual).isEqualTo(localProviders)
@ -95,21 +83,16 @@ internal class BlockchainProvidersResponseLoaderTest {
@Test
fun test_load_if_remote_config_loading_is_loaded_successful() = runTest {
everyGettingLocalConfig(json = localProvidersJson) returns localProviders
everyGettingRemoteConfig() returns remoteProviders
everyGettingLocalConfig(json = LOCAL_PROVIDERS_JSON) returns localProviders
coEvery { tangemTechServiceApi.getBlockchainProviders() } returns remoteProviders
val actual = loader.load()
coVerifyOrder {
assetReader.read(LOCAL_CONFIG_FILE_NAME)
moshi.adapter<BlockchainProvidersResponse>()
jsonAdapter.fromJson(localProvidersJson)
authProvider.getCardPublicKey()
authProvider.getCardId()
tangemTechServiceApi.getBlockchainProviders(
cardPublicKey = DEFAULT_CARD_PUBLIC_KEY,
cardId = DEFAULT_CARD_ID,
)
jsonAdapter.fromJson(LOCAL_PROVIDERS_JSON)
tangemTechServiceApi.getBlockchainProviders()
}
Truth.assertThat(actual).isEqualTo(remoteProviders)
@ -119,21 +102,16 @@ internal class BlockchainProvidersResponseLoaderTest {
fun test_load_if_remote_config_is_the_same_as_local() = runTest {
val remoteProviders = localProviders
everyGettingLocalConfig(json = localProvidersJson) returns localProviders
everyGettingRemoteConfig() returns remoteProviders
everyGettingLocalConfig(json = LOCAL_PROVIDERS_JSON) returns localProviders
coEvery { tangemTechServiceApi.getBlockchainProviders() } returns remoteProviders
val actual = loader.load()
coVerifyOrder {
assetReader.read(LOCAL_CONFIG_FILE_NAME)
moshi.adapter<BlockchainProvidersResponse>()
jsonAdapter.fromJson(localProvidersJson)
authProvider.getCardPublicKey()
authProvider.getCardId()
tangemTechServiceApi.getBlockchainProviders(
cardPublicKey = DEFAULT_CARD_PUBLIC_KEY,
cardId = DEFAULT_CARD_ID,
)
jsonAdapter.fromJson(LOCAL_PROVIDERS_JSON)
tangemTechServiceApi.getBlockchainProviders()
}
Truth.assertThat(actual).isEqualTo(remoteProviders)
@ -144,8 +122,8 @@ internal class BlockchainProvidersResponseLoaderTest {
val ethProvider = "ethereum" to emptyList<ProviderModel>()
val remoteProvidersWithEth = remoteProviders + ethProvider
everyGettingLocalConfig(json = localProvidersJson) returns localProviders
everyGettingRemoteConfig() returns remoteProvidersWithEth
everyGettingLocalConfig(json = LOCAL_PROVIDERS_JSON) returns localProviders
coEvery { tangemTechServiceApi.getBlockchainProviders() } returns remoteProvidersWithEth
everyCrashlyticsRecording() just Runs
val actual = loader.load()
@ -153,13 +131,8 @@ internal class BlockchainProvidersResponseLoaderTest {
coVerifyOrder {
assetReader.read(LOCAL_CONFIG_FILE_NAME)
moshi.adapter<BlockchainProvidersResponse>()
jsonAdapter.fromJson(localProvidersJson)
authProvider.getCardPublicKey()
authProvider.getCardId()
tangemTechServiceApi.getBlockchainProviders(
cardPublicKey = DEFAULT_CARD_PUBLIC_KEY,
cardId = DEFAULT_CARD_ID,
)
jsonAdapter.fromJson(LOCAL_PROVIDERS_JSON)
tangemTechServiceApi.getBlockchainProviders()
firebaseCrashlytics.recordException(any())
}
@ -170,21 +143,16 @@ internal class BlockchainProvidersResponseLoaderTest {
fun test_load_if_local_config_has_empty_providers() = runTest {
val localProvidersWithEmptyApt = localProviders.mapValues { if (it.key == "aptos") emptyList() else it.value }
everyGettingLocalConfig(json = localProvidersJson) returns localProvidersWithEmptyApt
everyGettingRemoteConfig() returns remoteProviders
everyGettingLocalConfig(json = LOCAL_PROVIDERS_JSON) returns localProvidersWithEmptyApt
coEvery { tangemTechServiceApi.getBlockchainProviders() } returns remoteProviders
val actual = loader.load()
coVerifyOrder {
assetReader.read(LOCAL_CONFIG_FILE_NAME)
moshi.adapter<BlockchainProvidersResponse>()
jsonAdapter.fromJson(localProvidersJson)
authProvider.getCardPublicKey()
authProvider.getCardId()
tangemTechServiceApi.getBlockchainProviders(
cardPublicKey = DEFAULT_CARD_PUBLIC_KEY,
cardId = DEFAULT_CARD_ID,
)
jsonAdapter.fromJson(LOCAL_PROVIDERS_JSON)
tangemTechServiceApi.getBlockchainProviders()
}
val expected = localProvidersWithEmptyApt + remoteProviders
@ -196,8 +164,8 @@ internal class BlockchainProvidersResponseLoaderTest {
fun test_load_if_remote_config_doesnt_contain_local_providers() = runTest {
val remoteProvidersWithoutLocal: BlockchainProvidersResponse = remoteProviders - localProviders.keys
everyGettingLocalConfig(json = localProvidersJson) returns localProviders
everyGettingRemoteConfig() returns remoteProvidersWithoutLocal
everyGettingLocalConfig(json = LOCAL_PROVIDERS_JSON) returns localProviders
coEvery { tangemTechServiceApi.getBlockchainProviders() } returns remoteProvidersWithoutLocal
everyCrashlyticsRecording() just Runs
val actual = loader.load()
@ -205,13 +173,8 @@ internal class BlockchainProvidersResponseLoaderTest {
coVerifyOrder {
assetReader.read(LOCAL_CONFIG_FILE_NAME)
moshi.adapter<BlockchainProvidersResponse>()
jsonAdapter.fromJson(localProvidersJson)
authProvider.getCardPublicKey()
authProvider.getCardId()
tangemTechServiceApi.getBlockchainProviders(
cardPublicKey = DEFAULT_CARD_PUBLIC_KEY,
cardId = DEFAULT_CARD_ID,
)
jsonAdapter.fromJson(LOCAL_PROVIDERS_JSON)
tangemTechServiceApi.getBlockchainProviders()
firebaseCrashlytics.recordException(any())
}
@ -223,8 +186,8 @@ internal class BlockchainProvidersResponseLoaderTest {
val ethProvider = "ethereum" to listOf(ProviderModel.UnsupportedType, ProviderModel.Private(name = "nownodes"))
val remoteProvidersWithEth = remoteProviders + ethProvider
everyGettingLocalConfig(json = localProvidersJson) returns localProviders
everyGettingRemoteConfig() returns remoteProvidersWithEth
everyGettingLocalConfig(json = LOCAL_PROVIDERS_JSON) returns localProviders
coEvery { tangemTechServiceApi.getBlockchainProviders() } returns remoteProvidersWithEth
everyCrashlyticsRecording() just Runs
val actual = loader.load()
@ -232,13 +195,8 @@ internal class BlockchainProvidersResponseLoaderTest {
coVerifyOrder {
assetReader.read(LOCAL_CONFIG_FILE_NAME)
moshi.adapter<BlockchainProvidersResponse>()
jsonAdapter.fromJson(localProvidersJson)
authProvider.getCardPublicKey()
authProvider.getCardId()
tangemTechServiceApi.getBlockchainProviders(
cardPublicKey = DEFAULT_CARD_PUBLIC_KEY,
cardId = DEFAULT_CARD_ID,
)
jsonAdapter.fromJson(LOCAL_PROVIDERS_JSON)
tangemTechServiceApi.getBlockchainProviders()
firebaseCrashlytics.recordException(any())
}
@ -255,8 +213,8 @@ internal class BlockchainProvidersResponseLoaderTest {
val remoteEthProvider = "ethereum" to listOf(ProviderModel.UnsupportedType, ProviderModel.Public("adbw2138"))
val remoteProvidersWithEth = remoteProviders + remoteEthProvider
everyGettingLocalConfig(json = localProvidersJson) returns localProvidersWithEth
everyGettingRemoteConfig() returns remoteProvidersWithEth
everyGettingLocalConfig(json = LOCAL_PROVIDERS_JSON) returns localProvidersWithEth
coEvery { tangemTechServiceApi.getBlockchainProviders() } returns remoteProvidersWithEth
everyCrashlyticsRecording() just Runs
val actual = loader.load()
@ -264,13 +222,8 @@ internal class BlockchainProvidersResponseLoaderTest {
coVerifyOrder {
assetReader.read(LOCAL_CONFIG_FILE_NAME)
moshi.adapter<BlockchainProvidersResponse>()
jsonAdapter.fromJson(localProvidersJson)
authProvider.getCardPublicKey()
authProvider.getCardId()
tangemTechServiceApi.getBlockchainProviders(
cardPublicKey = DEFAULT_CARD_PUBLIC_KEY,
cardId = DEFAULT_CARD_ID,
)
jsonAdapter.fromJson(LOCAL_PROVIDERS_JSON)
tangemTechServiceApi.getBlockchainProviders()
firebaseCrashlytics.recordException(any())
}
@ -279,6 +232,37 @@ internal class BlockchainProvidersResponseLoaderTest {
Truth.assertThat(actual).isEqualTo(expected)
}
@Test
fun test_load_if_configs_contain_public_providers_without_slash_in_the_end() = runTest {
val localPublicProviderUrl = "https://qwe.com"
val localEthProvider = "ethereum" to listOf(ProviderModel.Public(url = localPublicProviderUrl))
val localProvidersWithEth = localProviders + localEthProvider
val remotePublicProviderUrl = "https://rty.com"
val remoteDogeProvider = "dogecoin" to listOf(ProviderModel.Public(url = remotePublicProviderUrl))
val remoteProvidersWithDoge = remoteProviders + remoteDogeProvider
everyGettingLocalConfig(json = LOCAL_PROVIDERS_JSON) returns localProvidersWithEth
coEvery { tangemTechServiceApi.getBlockchainProviders() } returns remoteProvidersWithDoge
everyCrashlyticsRecording() just Runs
val actual = loader.load()
coVerifyOrder {
assetReader.read(LOCAL_CONFIG_FILE_NAME)
moshi.adapter<BlockchainProvidersResponse>()
jsonAdapter.fromJson(LOCAL_PROVIDERS_JSON)
tangemTechServiceApi.getBlockchainProviders()
firebaseCrashlytics.recordException(any())
}
val expected = remoteProviders +
localEthProvider.copy(second = listOf(ProviderModel.Public(url = "$localPublicProviderUrl/"))) +
remoteDogeProvider.copy(second = listOf(ProviderModel.Public(url = "$remotePublicProviderUrl/")))
Truth.assertThat(actual).isEqualTo(expected)
}
private fun everyGettingLocalConfig(
json: String,
): MockKStubScope<BlockchainProvidersResponse?, BlockchainProvidersResponse?> {
@ -287,51 +271,18 @@ internal class BlockchainProvidersResponseLoaderTest {
return coEvery { jsonAdapter.fromJson(json) }
}
private fun everyGettingRemoteConfig(): MockKStubScope<BlockchainProvidersResponse, BlockchainProvidersResponse> {
every { authProvider.getCardPublicKey() } returns DEFAULT_CARD_PUBLIC_KEY
every { authProvider.getCardId() } returns DEFAULT_CARD_ID
return coEvery {
tangemTechServiceApi.getBlockchainProviders(
cardPublicKey = DEFAULT_CARD_PUBLIC_KEY,
cardId = DEFAULT_CARD_ID,
)
}
}
private fun everyCrashlyticsRecording() = every { firebaseCrashlytics.recordException(any()) }
private companion object {
const val LOCAL_CONFIG_FILE_NAME = "tangem-app-config/providers_order.json"
const val DEFAULT_CARD_PUBLIC_KEY = "card_public_key"
const val DEFAULT_CARD_ID = "card_id"
val localProvidersJson = """
{
"aptos": [
{
"type": "private",
"name": "private_apt"
}
],
"algorand": [
{
"type": "private",
"name": "private_alg"
},
{
"type": "public",
"name": "https://public_alg.com"
}
]
}
""".trimIndent()
const val LOCAL_PROVIDERS_JSON = "doesn't matter"
val localProviders: BlockchainProvidersResponse = mapOf(
"aptos" to listOf(ProviderModel.Private(name = "private_apt")),
"algorand" to listOf(
ProviderModel.Private(name = "private_alg"),
ProviderModel.Public(url = "https://public_alg.com"),
ProviderModel.Public(url = "https://public_alg.com/"),
),
)