Updated on 2026-08-14
This commit is contained in:
parent
49cf3b9cef
commit
e17029ce9b
27 changed files with 184 additions and 207 deletions
|
|
@ -6,9 +6,9 @@ import com.tangem.blockchainsdk.utils.toNetworkId
|
||||||
import com.tangem.data.common.account.WalletAccountsFetcher
|
import com.tangem.data.common.account.WalletAccountsFetcher
|
||||||
import com.tangem.data.common.tokens.getDefaultWalletBlockchains
|
import com.tangem.data.common.tokens.getDefaultWalletBlockchains
|
||||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
|
||||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||||
import com.tangem.domain.card.common.util.cardTypesResolver
|
import com.tangem.domain.card.common.util.cardTypesResolver
|
||||||
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.demo.models.DemoConfig
|
import com.tangem.domain.demo.models.DemoConfig
|
||||||
import com.tangem.domain.models.account.DerivationIndex
|
import com.tangem.domain.models.account.DerivationIndex
|
||||||
import com.tangem.domain.models.currency.CryptoCurrency
|
import com.tangem.domain.models.currency.CryptoCurrency
|
||||||
|
|
@ -29,7 +29,7 @@ import com.tangem.domain.models.wallet.isMultiCurrency
|
||||||
internal class DefaultCardCryptoCurrencyFactory(
|
internal class DefaultCardCryptoCurrencyFactory(
|
||||||
private val demoConfig: DemoConfig,
|
private val demoConfig: DemoConfig,
|
||||||
private val excludedBlockchains: ExcludedBlockchains,
|
private val excludedBlockchains: ExcludedBlockchains,
|
||||||
private val userWalletsStore: UserWalletsStore,
|
private val userWalletsListRepository: UserWalletsListRepository,
|
||||||
private val accountsFeatureToggles: AccountsFeatureToggles,
|
private val accountsFeatureToggles: AccountsFeatureToggles,
|
||||||
private val walletAccountsFetcher: WalletAccountsFetcher,
|
private val walletAccountsFetcher: WalletAccountsFetcher,
|
||||||
private val userTokensResponseStore: UserTokensResponseStore,
|
private val userTokensResponseStore: UserTokensResponseStore,
|
||||||
|
|
@ -42,7 +42,7 @@ internal class DefaultCardCryptoCurrencyFactory(
|
||||||
userWalletId: UserWalletId,
|
userWalletId: UserWalletId,
|
||||||
networks: Set<Network>,
|
networks: Set<Network>,
|
||||||
): Map<Network, List<CryptoCurrency>> {
|
): Map<Network, List<CryptoCurrency>> {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(key = userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(id = userWalletId)
|
||||||
|
|
||||||
// multi-currency wallet
|
// multi-currency wallet
|
||||||
if (userWallet !is UserWallet.Cold || userWallet.isMultiCurrency) {
|
if (userWallet !is UserWallet.Cold || userWallet.isMultiCurrency) {
|
||||||
|
|
@ -67,7 +67,7 @@ internal class DefaultCardCryptoCurrencyFactory(
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun createByRawId(userWalletId: UserWalletId, network: Network.RawID): List<CryptoCurrency> {
|
override suspend fun createByRawId(userWalletId: UserWalletId, network: Network.RawID): List<CryptoCurrency> {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(key = userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(id = userWalletId)
|
||||||
|
|
||||||
val blockchain = network.toBlockchain()
|
val blockchain = network.toBlockchain()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,8 @@ import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
||||||
import com.tangem.datasource.api.tangemTech.models.WalletType
|
import com.tangem.datasource.api.tangemTech.models.WalletType
|
||||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
|
||||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||||
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.models.wallet.UserWallet
|
import com.tangem.domain.models.wallet.UserWallet
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
|
|
@ -24,7 +24,7 @@ import timber.log.Timber
|
||||||
@Suppress("LongParameterList")
|
@Suppress("LongParameterList")
|
||||||
class UserTokensSaver(
|
class UserTokensSaver(
|
||||||
private val tangemTechApi: TangemTechApi,
|
private val tangemTechApi: TangemTechApi,
|
||||||
private val userWalletsStore: UserWalletsStore,
|
private val userWalletsListRepository: UserWalletsListRepository,
|
||||||
private val userTokensResponseStore: UserTokensResponseStore,
|
private val userTokensResponseStore: UserTokensResponseStore,
|
||||||
private val dispatchers: CoroutineDispatcherProvider,
|
private val dispatchers: CoroutineDispatcherProvider,
|
||||||
private val addressesEnricher: UserTokensResponseAddressesEnricher,
|
private val addressesEnricher: UserTokensResponseAddressesEnricher,
|
||||||
|
|
@ -59,7 +59,7 @@ class UserTokensSaver(
|
||||||
useEnricher: Boolean = true,
|
useEnricher: Boolean = true,
|
||||||
onFailSend: () -> Unit = {},
|
onFailSend: () -> Unit = {},
|
||||||
) = withContext(dispatchers.io) {
|
) = withContext(dispatchers.io) {
|
||||||
val userWallet = userWalletsStore.getSyncOrNull(key = userWalletId)
|
val userWallet = userWalletsListRepository.getSyncOrNull(id = userWalletId)
|
||||||
|
|
||||||
if (userWallet == null) {
|
if (userWallet == null) {
|
||||||
Timber.e("UserWallet with id $userWalletId not found. Cannot push tokens.")
|
Timber.e("UserWallet with id $userWalletId not found. Cannot push tokens.")
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,8 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
|
||||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||||
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.demo.models.DemoConfig
|
import com.tangem.domain.demo.models.DemoConfig
|
||||||
import com.tangem.domain.walletmanager.WalletManagersFacade
|
import com.tangem.domain.walletmanager.WalletManagersFacade
|
||||||
import com.tangem.domain.wallets.repository.WalletsRepository
|
import com.tangem.domain.wallets.repository.WalletsRepository
|
||||||
|
|
@ -36,7 +36,7 @@ internal object DataCommonModule {
|
||||||
@Singleton
|
@Singleton
|
||||||
fun provideCardCryptoCurrencyFactory(
|
fun provideCardCryptoCurrencyFactory(
|
||||||
excludedBlockchains: ExcludedBlockchains,
|
excludedBlockchains: ExcludedBlockchains,
|
||||||
userWalletsStore: UserWalletsStore,
|
userWalletsListRepository: UserWalletsListRepository,
|
||||||
accountsFeatureToggles: AccountsFeatureToggles,
|
accountsFeatureToggles: AccountsFeatureToggles,
|
||||||
walletAccountsFetcher: WalletAccountsFetcher,
|
walletAccountsFetcher: WalletAccountsFetcher,
|
||||||
userTokensResponseStore: UserTokensResponseStore,
|
userTokensResponseStore: UserTokensResponseStore,
|
||||||
|
|
@ -45,7 +45,7 @@ internal object DataCommonModule {
|
||||||
return DefaultCardCryptoCurrencyFactory(
|
return DefaultCardCryptoCurrencyFactory(
|
||||||
demoConfig = DemoConfig,
|
demoConfig = DemoConfig,
|
||||||
excludedBlockchains = excludedBlockchains,
|
excludedBlockchains = excludedBlockchains,
|
||||||
userWalletsStore = userWalletsStore,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
accountsFeatureToggles = accountsFeatureToggles,
|
accountsFeatureToggles = accountsFeatureToggles,
|
||||||
walletAccountsFetcher = walletAccountsFetcher,
|
walletAccountsFetcher = walletAccountsFetcher,
|
||||||
userTokensResponseStore = userTokensResponseStore,
|
userTokensResponseStore = userTokensResponseStore,
|
||||||
|
|
@ -71,7 +71,7 @@ internal object DataCommonModule {
|
||||||
@Singleton
|
@Singleton
|
||||||
fun provideUserTokensSaver(
|
fun provideUserTokensSaver(
|
||||||
tangemTechApi: TangemTechApi,
|
tangemTechApi: TangemTechApi,
|
||||||
userWalletsStore: UserWalletsStore,
|
userWalletsListRepository: UserWalletsListRepository,
|
||||||
userTokensResponseStore: UserTokensResponseStore,
|
userTokensResponseStore: UserTokensResponseStore,
|
||||||
dispatchers: CoroutineDispatcherProvider,
|
dispatchers: CoroutineDispatcherProvider,
|
||||||
addressesEnricher: UserTokensResponseAddressesEnricher,
|
addressesEnricher: UserTokensResponseAddressesEnricher,
|
||||||
|
|
@ -81,7 +81,7 @@ internal object DataCommonModule {
|
||||||
): UserTokensSaver {
|
): UserTokensSaver {
|
||||||
return UserTokensSaver(
|
return UserTokensSaver(
|
||||||
tangemTechApi = tangemTechApi,
|
tangemTechApi = tangemTechApi,
|
||||||
userWalletsStore = userWalletsStore,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
userTokensResponseStore = userTokensResponseStore,
|
userTokensResponseStore = userTokensResponseStore,
|
||||||
dispatchers = dispatchers,
|
dispatchers = dispatchers,
|
||||||
addressesEnricher = addressesEnricher,
|
addressesEnricher = addressesEnricher,
|
||||||
|
|
@ -109,13 +109,13 @@ internal object DataCommonModule {
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun provideWalletServerBinder(
|
fun provideWalletServerBinder(
|
||||||
userWalletsStore: UserWalletsStore,
|
userWalletsListRepository: UserWalletsListRepository,
|
||||||
appsFlyerStore: AppsFlyerStore,
|
appsFlyerStore: AppsFlyerStore,
|
||||||
tangemTechApi: TangemTechApi,
|
tangemTechApi: TangemTechApi,
|
||||||
dispatchers: CoroutineDispatcherProvider,
|
dispatchers: CoroutineDispatcherProvider,
|
||||||
): WalletServerBinder {
|
): WalletServerBinder {
|
||||||
return DefaultWalletServerBinder(
|
return DefaultWalletServerBinder(
|
||||||
userWalletsStore = userWalletsStore,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
appsFlyerStore = appsFlyerStore,
|
appsFlyerStore = appsFlyerStore,
|
||||||
tangemTechApi = tangemTechApi,
|
tangemTechApi = tangemTechApi,
|
||||||
dispatchers = dispatchers,
|
dispatchers = dispatchers,
|
||||||
|
|
|
||||||
|
|
@ -4,21 +4,21 @@ import com.tangem.datasource.api.common.response.ApiResponse
|
||||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||||
import com.tangem.datasource.api.tangemTech.converters.WalletIdBodyConverter
|
import com.tangem.datasource.api.tangemTech.converters.WalletIdBodyConverter
|
||||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.models.wallet.UserWallet
|
import com.tangem.domain.models.wallet.UserWallet
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
internal class DefaultWalletServerBinder(
|
internal class DefaultWalletServerBinder(
|
||||||
private val userWalletsStore: UserWalletsStore,
|
private val userWalletsListRepository: UserWalletsListRepository,
|
||||||
private val appsFlyerStore: AppsFlyerStore,
|
private val appsFlyerStore: AppsFlyerStore,
|
||||||
private val tangemTechApi: TangemTechApi,
|
private val tangemTechApi: TangemTechApi,
|
||||||
private val dispatchers: CoroutineDispatcherProvider,
|
private val dispatchers: CoroutineDispatcherProvider,
|
||||||
) : WalletServerBinder {
|
) : WalletServerBinder {
|
||||||
|
|
||||||
override suspend fun bind(userWalletId: UserWalletId): ApiResponse<Unit>? {
|
override suspend fun bind(userWalletId: UserWalletId): ApiResponse<Unit>? {
|
||||||
val userWallet = userWalletsStore.getSyncOrNull(key = userWalletId) ?: return null
|
val userWallet = userWalletsListRepository.getSyncOrNull(id = userWalletId) ?: return null
|
||||||
|
|
||||||
return bind(userWallet)
|
return bind(userWallet)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,10 @@ import com.tangem.data.common.account.WalletAccountsFetcher
|
||||||
import com.tangem.data.common.network.NetworkFactory
|
import com.tangem.data.common.network.NetworkFactory
|
||||||
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
||||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
|
||||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||||
import com.tangem.domain.card.common.util.cardTypesResolver
|
import com.tangem.domain.card.common.util.cardTypesResolver
|
||||||
import com.tangem.domain.card.configs.GenericCardConfig
|
import com.tangem.domain.card.configs.GenericCardConfig
|
||||||
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.demo.models.DemoConfig
|
import com.tangem.domain.demo.models.DemoConfig
|
||||||
import com.tangem.domain.models.currency.CryptoCurrency
|
import com.tangem.domain.models.currency.CryptoCurrency
|
||||||
import com.tangem.domain.models.network.Network
|
import com.tangem.domain.models.network.Network
|
||||||
|
|
@ -36,7 +36,7 @@ import org.junit.jupiter.params.ParameterizedTest
|
||||||
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
||||||
internal class DefaultCardCryptoCurrencyFactoryTest {
|
internal class DefaultCardCryptoCurrencyFactoryTest {
|
||||||
|
|
||||||
private val userWalletsStore: UserWalletsStore = mockk()
|
private val userWalletsListRepository: UserWalletsListRepository = mockk()
|
||||||
private val userTokensResponseStore: UserTokensResponseStore = mockk()
|
private val userTokensResponseStore: UserTokensResponseStore = mockk()
|
||||||
private val excludedBlockchains = ExcludedBlockchains()
|
private val excludedBlockchains = ExcludedBlockchains()
|
||||||
private val accountsFeatureToggles = mockk<AccountsFeatureToggles>()
|
private val accountsFeatureToggles = mockk<AccountsFeatureToggles>()
|
||||||
|
|
@ -45,7 +45,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
||||||
private val factory = DefaultCardCryptoCurrencyFactory(
|
private val factory = DefaultCardCryptoCurrencyFactory(
|
||||||
demoConfig = DemoConfig,
|
demoConfig = DemoConfig,
|
||||||
excludedBlockchains = excludedBlockchains,
|
excludedBlockchains = excludedBlockchains,
|
||||||
userWalletsStore = userWalletsStore,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
userTokensResponseStore = userTokensResponseStore,
|
userTokensResponseStore = userTokensResponseStore,
|
||||||
responseCryptoCurrenciesFactory = ResponseCryptoCurrenciesFactory(
|
responseCryptoCurrenciesFactory = ResponseCryptoCurrenciesFactory(
|
||||||
networkFactory = NetworkFactory(excludedBlockchains = excludedBlockchains),
|
networkFactory = NetworkFactory(excludedBlockchains = excludedBlockchains),
|
||||||
|
|
@ -63,7 +63,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
fun init() {
|
fun init() {
|
||||||
clearMocks(userWalletsStore, userTokensResponseStore, accountsFeatureToggles, walletAccountsFetcher, iconUri)
|
clearMocks(userWalletsListRepository, userTokensResponseStore, accountsFeatureToggles, walletAccountsFetcher, iconUri)
|
||||||
|
|
||||||
mockkStatic(Uri::class)
|
mockkStatic(Uri::class)
|
||||||
every { Uri.parse(any()) } returns iconUri
|
every { Uri.parse(any()) } returns iconUri
|
||||||
|
|
@ -82,7 +82,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
||||||
val network = ethereum.network
|
val network = ethereum.network
|
||||||
|
|
||||||
every { accountsFeatureToggles.isFeatureEnabled } returns false
|
every { accountsFeatureToggles.isFeatureEnabled } returns false
|
||||||
coEvery { userWalletsStore.getSyncStrict(key = userWallet.walletId) } returns userWallet
|
coEvery { userWalletsListRepository.getSyncStrict(id = userWallet.walletId) } returns userWallet
|
||||||
coEvery { userTokensResponseStore.getSyncOrNull(userWallet.walletId) } returns userTokensResponse
|
coEvery { userTokensResponseStore.getSyncOrNull(userWallet.walletId) } returns userTokensResponse
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -94,7 +94,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
||||||
Truth.assertThat(actual).isEqualTo(expected)
|
Truth.assertThat(actual).isEqualTo(expected)
|
||||||
|
|
||||||
coVerifyOrder {
|
coVerifyOrder {
|
||||||
userWalletsStore.getSyncStrict(key = userWallet.walletId)
|
userWalletsListRepository.getSyncStrict(id = userWallet.walletId)
|
||||||
userTokensResponseStore.getSyncOrNull(userWalletId = userWallet.walletId)
|
userTokensResponseStore.getSyncOrNull(userWalletId = userWallet.walletId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -131,7 +131,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
||||||
// Arrange
|
// Arrange
|
||||||
val userWallet = createSingleWallet()
|
val userWallet = createSingleWallet()
|
||||||
|
|
||||||
coEvery { userWalletsStore.getSyncStrict(key = userWallet.walletId) } returns userWallet
|
coEvery { userWalletsListRepository.getSyncStrict(id = userWallet.walletId) } returns userWallet
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
val actual = factory.create(userWalletId = userWallet.walletId, network = model.network)
|
val actual = factory.create(userWalletId = userWallet.walletId, network = model.network)
|
||||||
|
|
@ -142,7 +142,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
||||||
Truth.assertThat(actual).isEqualTo(expected)
|
Truth.assertThat(actual).isEqualTo(expected)
|
||||||
|
|
||||||
coVerifyOrder {
|
coVerifyOrder {
|
||||||
userWalletsStore.getSyncStrict(key = userWallet.walletId)
|
userWalletsListRepository.getSyncStrict(id = userWallet.walletId)
|
||||||
userWallet.scanResponse.cardTypesResolver.getBlockchain()
|
userWallet.scanResponse.cardTypesResolver.getBlockchain()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -169,7 +169,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
||||||
// Arrange
|
// Arrange
|
||||||
val userWallet = MockUserWalletFactory.createSingleWalletWithToken()
|
val userWallet = MockUserWalletFactory.createSingleWalletWithToken()
|
||||||
|
|
||||||
coEvery { userWalletsStore.getSyncStrict(key = userWallet.walletId) } returns userWallet
|
coEvery { userWalletsListRepository.getSyncStrict(id = userWallet.walletId) } returns userWallet
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
val actual = factory.create(userWalletId = userWallet.walletId, network = model.network)
|
val actual = factory.create(userWalletId = userWallet.walletId, network = model.network)
|
||||||
|
|
@ -186,7 +186,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
||||||
Truth.assertThat(actual).isEqualTo(expected)
|
Truth.assertThat(actual).isEqualTo(expected)
|
||||||
|
|
||||||
coVerifyOrder {
|
coVerifyOrder {
|
||||||
userWalletsStore.getSyncStrict(key = userWallet.walletId)
|
userWalletsListRepository.getSyncStrict(id = userWallet.walletId)
|
||||||
userWallet.scanResponse.cardTypesResolver.getBlockchain()
|
userWallet.scanResponse.cardTypesResolver.getBlockchain()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@ import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
||||||
import com.tangem.datasource.api.tangemTech.models.WalletType
|
import com.tangem.datasource.api.tangemTech.models.WalletType
|
||||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
|
||||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||||
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.models.wallet.UserWallet
|
import com.tangem.domain.models.wallet.UserWallet
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
|
||||||
|
|
@ -23,7 +23,7 @@ import org.junit.jupiter.api.TestInstance
|
||||||
class UserTokensSaverTest {
|
class UserTokensSaverTest {
|
||||||
|
|
||||||
private val tangemTechApi: TangemTechApi = mockk()
|
private val tangemTechApi: TangemTechApi = mockk()
|
||||||
private val userWalletsStore: UserWalletsStore = mockk(relaxUnitFun = true)
|
private val userWalletsListRepository: UserWalletsListRepository = mockk(relaxUnitFun = true)
|
||||||
private val userTokensResponseStore: UserTokensResponseStore = mockk(relaxed = true)
|
private val userTokensResponseStore: UserTokensResponseStore = mockk(relaxed = true)
|
||||||
private val enricher: UserTokensResponseAddressesEnricher = mockk()
|
private val enricher: UserTokensResponseAddressesEnricher = mockk()
|
||||||
private val accountsFeatureToggles = mockk<AccountsFeatureToggles> {
|
private val accountsFeatureToggles = mockk<AccountsFeatureToggles> {
|
||||||
|
|
@ -34,7 +34,7 @@ class UserTokensSaverTest {
|
||||||
|
|
||||||
private val userTokensSaver: UserTokensSaver = UserTokensSaver(
|
private val userTokensSaver: UserTokensSaver = UserTokensSaver(
|
||||||
tangemTechApi = tangemTechApi,
|
tangemTechApi = tangemTechApi,
|
||||||
userWalletsStore = userWalletsStore,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
userTokensResponseStore = userTokensResponseStore,
|
userTokensResponseStore = userTokensResponseStore,
|
||||||
dispatchers = TestingCoroutineDispatcherProvider(),
|
dispatchers = TestingCoroutineDispatcherProvider(),
|
||||||
addressesEnricher = enricher,
|
addressesEnricher = enricher,
|
||||||
|
|
@ -48,7 +48,7 @@ class UserTokensSaverTest {
|
||||||
fun resetMocks() {
|
fun resetMocks() {
|
||||||
clearMocks(
|
clearMocks(
|
||||||
tangemTechApi,
|
tangemTechApi,
|
||||||
userWalletsStore,
|
userWalletsListRepository,
|
||||||
userTokensResponseStore,
|
userTokensResponseStore,
|
||||||
enricher,
|
enricher,
|
||||||
walletServerBinder,
|
walletServerBinder,
|
||||||
|
|
@ -119,7 +119,7 @@ class UserTokensSaverTest {
|
||||||
var onFailSendCalled = false
|
var onFailSendCalled = false
|
||||||
|
|
||||||
every { accountsFeatureToggles.isFeatureEnabled } returns true
|
every { accountsFeatureToggles.isFeatureEnabled } returns true
|
||||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
|
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
|
||||||
coEvery { enricher(userWalletId, response) } returns enrichedResponse
|
coEvery { enricher(userWalletId, response) } returns enrichedResponse
|
||||||
coEvery { tangemTechApi.saveTokens(any(), any()) } returns ApiResponse.Error(error) as ApiResponse<Unit>
|
coEvery { tangemTechApi.saveTokens(any(), any()) } returns ApiResponse.Error(error) as ApiResponse<Unit>
|
||||||
|
|
||||||
|
|
@ -165,7 +165,7 @@ class UserTokensSaverTest {
|
||||||
walletType = WalletType.COLD,
|
walletType = WalletType.COLD,
|
||||||
)
|
)
|
||||||
|
|
||||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
|
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
|
||||||
coEvery { enricher(userWalletId, response) } returns enrichedResponse
|
coEvery { enricher(userWalletId, response) } returns enrichedResponse
|
||||||
coEvery {
|
coEvery {
|
||||||
tangemTechApi.saveTokens(userWalletId.stringValue, enrichedResponse)
|
tangemTechApi.saveTokens(userWalletId.stringValue, enrichedResponse)
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||||
import com.tangem.datasource.api.tangemTech.models.WalletIdBody
|
import com.tangem.datasource.api.tangemTech.models.WalletIdBody
|
||||||
import com.tangem.datasource.api.tangemTech.models.WalletType
|
import com.tangem.datasource.api.tangemTech.models.WalletType
|
||||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.models.wallet.UserWallet
|
import com.tangem.domain.models.wallet.UserWallet
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
import com.tangem.domain.wallets.models.AppsFlyerConversionData
|
import com.tangem.domain.wallets.models.AppsFlyerConversionData
|
||||||
|
|
@ -26,13 +26,13 @@ import org.junit.jupiter.api.TestInstance
|
||||||
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
||||||
internal class DefaultWalletServerBinderTest {
|
internal class DefaultWalletServerBinderTest {
|
||||||
|
|
||||||
private val userWalletsStore: UserWalletsStore = mockk()
|
private val userWalletsListRepository: UserWalletsListRepository = mockk()
|
||||||
private val appsFlyerStore: AppsFlyerStore = mockk()
|
private val appsFlyerStore: AppsFlyerStore = mockk()
|
||||||
private val tangemTechApi: TangemTechApi = mockk()
|
private val tangemTechApi: TangemTechApi = mockk()
|
||||||
private val dispatchers: CoroutineDispatcherProvider = TestingCoroutineDispatcherProvider()
|
private val dispatchers: CoroutineDispatcherProvider = TestingCoroutineDispatcherProvider()
|
||||||
|
|
||||||
private val binder = DefaultWalletServerBinder(
|
private val binder = DefaultWalletServerBinder(
|
||||||
userWalletsStore = userWalletsStore,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
appsFlyerStore = appsFlyerStore,
|
appsFlyerStore = appsFlyerStore,
|
||||||
tangemTechApi = tangemTechApi,
|
tangemTechApi = tangemTechApi,
|
||||||
dispatchers = dispatchers
|
dispatchers = dispatchers
|
||||||
|
|
@ -47,7 +47,7 @@ internal class DefaultWalletServerBinderTest {
|
||||||
|
|
||||||
@AfterEach
|
@AfterEach
|
||||||
fun tearDown() {
|
fun tearDown() {
|
||||||
clearMocks(userWalletsStore, appsFlyerStore, tangemTechApi)
|
clearMocks(userWalletsListRepository, appsFlyerStore, tangemTechApi)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nested
|
@Nested
|
||||||
|
|
@ -65,7 +65,7 @@ internal class DefaultWalletServerBinderTest {
|
||||||
)
|
)
|
||||||
val apiResponse = ApiResponse.Success(Unit)
|
val apiResponse = ApiResponse.Success(Unit)
|
||||||
|
|
||||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
|
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
|
||||||
coEvery { appsFlyerStore.get() } returns conversionData
|
coEvery { appsFlyerStore.get() } returns conversionData
|
||||||
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
||||||
|
|
||||||
|
|
@ -74,22 +74,22 @@ internal class DefaultWalletServerBinderTest {
|
||||||
Truth.assertThat(actual).isEqualTo(apiResponse)
|
Truth.assertThat(actual).isEqualTo(apiResponse)
|
||||||
|
|
||||||
coVerifyOrder {
|
coVerifyOrder {
|
||||||
userWalletsStore.getSyncOrNull(userWalletId)
|
userWalletsListRepository.getSyncOrNull(userWalletId)
|
||||||
appsFlyerStore.get()
|
appsFlyerStore.get()
|
||||||
tangemTechApi.createWallet(requestBody)
|
tangemTechApi.createWallet(requestBody)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `bind will skipped if userWalletsStore returns null`() = runTest {
|
fun `bind will skipped if userWalletsListRepository returns null`() = runTest {
|
||||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns null
|
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns null
|
||||||
|
|
||||||
val actual = binder.bind(userWalletId = userWalletId)
|
val actual = binder.bind(userWalletId = userWalletId)
|
||||||
|
|
||||||
Truth.assertThat(actual).isEqualTo(null)
|
Truth.assertThat(actual).isEqualTo(null)
|
||||||
|
|
||||||
coVerifyOrder {
|
coVerifyOrder {
|
||||||
userWalletsStore.getSyncOrNull(userWalletId)
|
userWalletsListRepository.getSyncOrNull(userWalletId)
|
||||||
}
|
}
|
||||||
|
|
||||||
coVerify(inverse = true) {
|
coVerify(inverse = true) {
|
||||||
|
|
@ -107,7 +107,7 @@ internal class DefaultWalletServerBinderTest {
|
||||||
)
|
)
|
||||||
val apiResponse = ApiResponse.Success(Unit)
|
val apiResponse = ApiResponse.Success(Unit)
|
||||||
|
|
||||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
|
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
|
||||||
coEvery { appsFlyerStore.get() } returns null
|
coEvery { appsFlyerStore.get() } returns null
|
||||||
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
||||||
|
|
||||||
|
|
@ -116,7 +116,7 @@ internal class DefaultWalletServerBinderTest {
|
||||||
Truth.assertThat(actual).isEqualTo(apiResponse)
|
Truth.assertThat(actual).isEqualTo(apiResponse)
|
||||||
|
|
||||||
coVerifyOrder {
|
coVerifyOrder {
|
||||||
userWalletsStore.getSyncOrNull(userWalletId)
|
userWalletsListRepository.getSyncOrNull(userWalletId)
|
||||||
appsFlyerStore.get()
|
appsFlyerStore.get()
|
||||||
tangemTechApi.createWallet(requestBody)
|
tangemTechApi.createWallet(requestBody)
|
||||||
}
|
}
|
||||||
|
|
@ -133,7 +133,7 @@ internal class DefaultWalletServerBinderTest {
|
||||||
)
|
)
|
||||||
val apiResponse = ApiResponse.Error(ApiResponseError.TimeoutException()) as ApiResponse<Unit>
|
val apiResponse = ApiResponse.Error(ApiResponseError.TimeoutException()) as ApiResponse<Unit>
|
||||||
|
|
||||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
|
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
|
||||||
coEvery { appsFlyerStore.get() } returns conversionData
|
coEvery { appsFlyerStore.get() } returns conversionData
|
||||||
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
||||||
|
|
||||||
|
|
@ -142,7 +142,7 @@ internal class DefaultWalletServerBinderTest {
|
||||||
Truth.assertThat(actual).isEqualTo(apiResponse)
|
Truth.assertThat(actual).isEqualTo(apiResponse)
|
||||||
|
|
||||||
coVerifyOrder {
|
coVerifyOrder {
|
||||||
userWalletsStore.getSyncOrNull(userWalletId)
|
userWalletsListRepository.getSyncOrNull(userWalletId)
|
||||||
appsFlyerStore.get()
|
appsFlyerStore.get()
|
||||||
tangemTechApi.createWallet(requestBody)
|
tangemTechApi.createWallet(requestBody)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ import com.tangem.datasource.api.common.response.getOrThrow
|
||||||
import com.tangem.datasource.api.markets.TangemTechMarketsApi
|
import com.tangem.datasource.api.markets.TangemTechMarketsApi
|
||||||
import com.tangem.datasource.api.markets.models.response.TokenMarketExchangesResponse
|
import com.tangem.datasource.api.markets.models.response.TokenMarketExchangesResponse
|
||||||
import com.tangem.datasource.local.datastore.RuntimeStateStore
|
import com.tangem.datasource.local.datastore.RuntimeStateStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
|
||||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
import com.tangem.domain.appcurrency.model.AppCurrency
|
||||||
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.markets.*
|
import com.tangem.domain.markets.*
|
||||||
import com.tangem.domain.markets.repositories.MarketsTokenRepository
|
import com.tangem.domain.markets.repositories.MarketsTokenRepository
|
||||||
import com.tangem.domain.models.account.DerivationIndex
|
import com.tangem.domain.models.account.DerivationIndex
|
||||||
|
|
@ -38,7 +38,7 @@ import java.util.concurrent.atomic.AtomicLong
|
||||||
internal class DefaultMarketsTokenRepository(
|
internal class DefaultMarketsTokenRepository(
|
||||||
private val marketsApi: TangemTechMarketsApi,
|
private val marketsApi: TangemTechMarketsApi,
|
||||||
private val quotesFetcher: QuotesFetcher,
|
private val quotesFetcher: QuotesFetcher,
|
||||||
private val userWalletsStore: UserWalletsStore,
|
private val userWalletsListRepository: UserWalletsListRepository,
|
||||||
private val dispatcherProvider: CoroutineDispatcherProvider,
|
private val dispatcherProvider: CoroutineDispatcherProvider,
|
||||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||||
private val cacheRegistry: CacheRegistry,
|
private val cacheRegistry: CacheRegistry,
|
||||||
|
|
@ -251,7 +251,7 @@ internal class DefaultMarketsTokenRepository(
|
||||||
network: TokenMarketInfo.Network,
|
network: TokenMarketInfo.Network,
|
||||||
accountIndex: DerivationIndex?,
|
accountIndex: DerivationIndex?,
|
||||||
): CryptoCurrency? {
|
): CryptoCurrency? {
|
||||||
val userWallet = userWalletsStore.getSyncOrNull(userWalletId) ?: error("UserWalletId [$userWalletId] not found")
|
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||||
val blockchain = Blockchain.fromNetworkId(network.networkId) ?: error("Unknown network [${network.networkId}]")
|
val blockchain = Blockchain.fromNetworkId(network.networkId) ?: error("Unknown network [${network.networkId}]")
|
||||||
|
|
||||||
return if (network.contractAddress == null) {
|
return if (network.contractAddress == null) {
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ import com.tangem.data.common.quote.QuotesFetcher
|
||||||
import com.tangem.data.markets.DefaultMarketsTokenRepository
|
import com.tangem.data.markets.DefaultMarketsTokenRepository
|
||||||
import com.tangem.datasource.api.markets.TangemTechMarketsApi
|
import com.tangem.datasource.api.markets.TangemTechMarketsApi
|
||||||
import com.tangem.datasource.local.datastore.RuntimeStateStore
|
import com.tangem.datasource.local.datastore.RuntimeStateStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.markets.repositories.MarketsTokenRepository
|
import com.tangem.domain.markets.repositories.MarketsTokenRepository
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
|
|
@ -26,7 +26,7 @@ internal object MarketsDataModule {
|
||||||
fun provideMarketsTokenRepository(
|
fun provideMarketsTokenRepository(
|
||||||
marketsApi: TangemTechMarketsApi,
|
marketsApi: TangemTechMarketsApi,
|
||||||
quotesFetcher: QuotesFetcher,
|
quotesFetcher: QuotesFetcher,
|
||||||
userWalletsStore: UserWalletsStore,
|
userWalletsListRepository: UserWalletsListRepository,
|
||||||
dispatchers: CoroutineDispatcherProvider,
|
dispatchers: CoroutineDispatcherProvider,
|
||||||
analyticsEventHandler: AnalyticsEventHandler,
|
analyticsEventHandler: AnalyticsEventHandler,
|
||||||
cacheRegistry: CacheRegistry,
|
cacheRegistry: CacheRegistry,
|
||||||
|
|
@ -37,7 +37,7 @@ internal object MarketsDataModule {
|
||||||
marketsApi = marketsApi,
|
marketsApi = marketsApi,
|
||||||
quotesFetcher = quotesFetcher,
|
quotesFetcher = quotesFetcher,
|
||||||
dispatcherProvider = dispatchers,
|
dispatcherProvider = dispatchers,
|
||||||
userWalletsStore = userWalletsStore,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
analyticsEventHandler = analyticsEventHandler,
|
||||||
cacheRegistry = cacheRegistry,
|
cacheRegistry = cacheRegistry,
|
||||||
tokenExchangesStore = RuntimeStateStore(defaultValue = emptyList()),
|
tokenExchangesStore = RuntimeStateStore(defaultValue = emptyList()),
|
||||||
|
|
|
||||||
|
|
@ -24,11 +24,12 @@ dependencies {
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
// region Project - Domain
|
// region Project - Domain
|
||||||
implementation(projects.domain.legacy)
|
|
||||||
implementation(projects.domain.walletManager)
|
|
||||||
implementation(projects.domain.card)
|
implementation(projects.domain.card)
|
||||||
api(projects.domain.models)
|
implementation(projects.domain.common)
|
||||||
|
implementation(projects.domain.legacy)
|
||||||
|
implementation(projects.domain.models)
|
||||||
implementation(projects.domain.networks)
|
implementation(projects.domain.networks)
|
||||||
|
implementation(projects.domain.walletManager)
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
// region Project - Libs
|
// region Project - Libs
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import arrow.core.Option
|
||||||
import arrow.core.some
|
import arrow.core.some
|
||||||
import com.tangem.data.common.network.NetworkFactory
|
import com.tangem.data.common.network.NetworkFactory
|
||||||
import com.tangem.data.networks.store.NetworksStatusesStore
|
import com.tangem.data.networks.store.NetworksStatusesStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.core.flow.FlowProducerTools
|
import com.tangem.domain.core.flow.FlowProducerTools
|
||||||
import com.tangem.domain.models.network.NetworkStatus
|
import com.tangem.domain.models.network.NetworkStatus
|
||||||
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
|
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
|
||||||
|
|
@ -28,7 +28,7 @@ internal class DefaultMultiNetworkStatusProducer @AssistedInject constructor(
|
||||||
@Assisted val params: MultiNetworkStatusProducer.Params,
|
@Assisted val params: MultiNetworkStatusProducer.Params,
|
||||||
override val flowProducerTools: FlowProducerTools,
|
override val flowProducerTools: FlowProducerTools,
|
||||||
private val networksStatusesStore: NetworksStatusesStore,
|
private val networksStatusesStore: NetworksStatusesStore,
|
||||||
private val userWalletsStore: UserWalletsStore,
|
private val userWalletsListRepository: UserWalletsListRepository,
|
||||||
private val networkFactory: NetworkFactory,
|
private val networkFactory: NetworkFactory,
|
||||||
private val dispatchers: CoroutineDispatcherProvider,
|
private val dispatchers: CoroutineDispatcherProvider,
|
||||||
) : MultiNetworkStatusProducer {
|
) : MultiNetworkStatusProducer {
|
||||||
|
|
@ -39,7 +39,7 @@ internal class DefaultMultiNetworkStatusProducer @AssistedInject constructor(
|
||||||
return networksStatusesStore.get(userWalletId = params.userWalletId)
|
return networksStatusesStore.get(userWalletId = params.userWalletId)
|
||||||
.distinctUntilChanged()
|
.distinctUntilChanged()
|
||||||
.mapNotNull { statuses ->
|
.mapNotNull { statuses ->
|
||||||
val userWallet = userWalletsStore.getSyncOrNull(params.userWalletId)
|
val userWallet = userWalletsListRepository.getSyncOrNull(params.userWalletId)
|
||||||
|
|
||||||
if (userWallet == null) {
|
if (userWallet == null) {
|
||||||
Timber.e("Unable to get UserWallet with provided ID: ${params.userWalletId}")
|
Timber.e("Unable to get UserWallet with provided ID: ${params.userWalletId}")
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ import com.tangem.data.common.network.NetworkFactory
|
||||||
import com.tangem.data.networks.models.SimpleNetworkStatus
|
import com.tangem.data.networks.models.SimpleNetworkStatus
|
||||||
import com.tangem.data.networks.store.NetworksStatusesStore
|
import com.tangem.data.networks.store.NetworksStatusesStore
|
||||||
import com.tangem.data.networks.toSimple
|
import com.tangem.data.networks.toSimple
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
|
||||||
import com.tangem.domain.card.configs.GenericCardConfig
|
import com.tangem.domain.card.configs.GenericCardConfig
|
||||||
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.core.flow.FlowProducerTools
|
import com.tangem.domain.core.flow.FlowProducerTools
|
||||||
import com.tangem.domain.models.network.NetworkStatus
|
import com.tangem.domain.models.network.NetworkStatus
|
||||||
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
|
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
|
||||||
|
|
@ -33,7 +33,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
private val params = MultiNetworkStatusProducer.Params(userWalletId = userWallet.walletId)
|
private val params = MultiNetworkStatusProducer.Params(userWalletId = userWallet.walletId)
|
||||||
|
|
||||||
private val networksStatusesStore = mockk<NetworksStatusesStore>()
|
private val networksStatusesStore = mockk<NetworksStatusesStore>()
|
||||||
private val userWalletsStore = mockk<UserWalletsStore>()
|
private val userWalletsListRepository = mockk<UserWalletsListRepository>()
|
||||||
private val networkFactory = mockk<NetworkFactory>()
|
private val networkFactory = mockk<NetworkFactory>()
|
||||||
private val dispatchers = TestingCoroutineDispatcherProvider()
|
private val dispatchers = TestingCoroutineDispatcherProvider()
|
||||||
private val flowProducerTools: FlowProducerTools = mockk()
|
private val flowProducerTools: FlowProducerTools = mockk()
|
||||||
|
|
@ -41,7 +41,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
private val producer = DefaultMultiNetworkStatusProducer(
|
private val producer = DefaultMultiNetworkStatusProducer(
|
||||||
params = params,
|
params = params,
|
||||||
networksStatusesStore = networksStatusesStore,
|
networksStatusesStore = networksStatusesStore,
|
||||||
userWalletsStore = userWalletsStore,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
networkFactory = networkFactory,
|
networkFactory = networkFactory,
|
||||||
dispatchers = dispatchers,
|
dispatchers = dispatchers,
|
||||||
flowProducerTools = flowProducerTools,
|
flowProducerTools = flowProducerTools,
|
||||||
|
|
@ -49,7 +49,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
fun resetMocks() {
|
fun resetMocks() {
|
||||||
clearMocks(networksStatusesStore, userWalletsStore, networkFactory)
|
clearMocks(networksStatusesStore, userWalletsListRepository, networkFactory)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -65,7 +65,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
val networksStatusesFlow = flowOf(simpleStatuses)
|
val networksStatusesFlow = flowOf(simpleStatuses)
|
||||||
|
|
||||||
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
||||||
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
|
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||||
|
|
||||||
every {
|
every {
|
||||||
networkFactory.create(
|
networkFactory.create(
|
||||||
|
|
@ -94,7 +94,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
|
|
||||||
verifyOrder {
|
verifyOrder {
|
||||||
networksStatusesStore.get(params.userWalletId)
|
networksStatusesStore.get(params.userWalletId)
|
||||||
userWalletsStore.getSyncOrNull(params.userWalletId)
|
userWalletsListRepository.getSyncOrNull(params.userWalletId)
|
||||||
networkFactory.create(
|
networkFactory.create(
|
||||||
networkId = simpleStatuses.first().id,
|
networkId = simpleStatuses.first().id,
|
||||||
derivationPath = simpleStatuses.first().id.derivationPath,
|
derivationPath = simpleStatuses.first().id.derivationPath,
|
||||||
|
|
@ -129,7 +129,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
|
|
||||||
// region every
|
// region every
|
||||||
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
||||||
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
|
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||||
every {
|
every {
|
||||||
networkFactory.create(
|
networkFactory.create(
|
||||||
networkId = simpleStatuses.first().id,
|
networkId = simpleStatuses.first().id,
|
||||||
|
|
@ -177,7 +177,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
Truth.assertThat(actual1.first()).isEqualTo(expected1)
|
Truth.assertThat(actual1.first()).isEqualTo(expected1)
|
||||||
|
|
||||||
verifyOrder {
|
verifyOrder {
|
||||||
userWalletsStore.getSyncOrNull(params.userWalletId)
|
userWalletsListRepository.getSyncOrNull(params.userWalletId)
|
||||||
networkFactory.create(
|
networkFactory.create(
|
||||||
networkId = simpleStatuses.first().id,
|
networkId = simpleStatuses.first().id,
|
||||||
derivationPath = simpleStatuses.first().id.derivationPath,
|
derivationPath = simpleStatuses.first().id.derivationPath,
|
||||||
|
|
@ -202,7 +202,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
Truth.assertThat(actual2).isEqualTo(expected2)
|
Truth.assertThat(actual2).isEqualTo(expected2)
|
||||||
|
|
||||||
verifyOrder {
|
verifyOrder {
|
||||||
userWalletsStore.getSyncOrNull(params.userWalletId)
|
userWalletsListRepository.getSyncOrNull(params.userWalletId)
|
||||||
networkFactory.create(
|
networkFactory.create(
|
||||||
networkId = updatedSimpleStatuses.first().id,
|
networkId = updatedSimpleStatuses.first().id,
|
||||||
derivationPath = updatedSimpleStatuses.first().id.derivationPath,
|
derivationPath = updatedSimpleStatuses.first().id.derivationPath,
|
||||||
|
|
@ -230,7 +230,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
|
|
||||||
// region every
|
// region every
|
||||||
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
||||||
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
|
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||||
|
|
||||||
every {
|
every {
|
||||||
networkFactory.create(
|
networkFactory.create(
|
||||||
|
|
@ -263,7 +263,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
Truth.assertThat(actual1.first()).isEqualTo(expected1)
|
Truth.assertThat(actual1.first()).isEqualTo(expected1)
|
||||||
|
|
||||||
verifyOrder {
|
verifyOrder {
|
||||||
userWalletsStore.getSyncOrNull(params.userWalletId)
|
userWalletsListRepository.getSyncOrNull(params.userWalletId)
|
||||||
networkFactory.create(
|
networkFactory.create(
|
||||||
networkId = simpleStatuses.first().id,
|
networkId = simpleStatuses.first().id,
|
||||||
derivationPath = simpleStatuses.first().id.derivationPath,
|
derivationPath = simpleStatuses.first().id.derivationPath,
|
||||||
|
|
@ -312,7 +312,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
|
|
||||||
// region every
|
// region every
|
||||||
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
||||||
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
|
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||||
every {
|
every {
|
||||||
networkFactory.create(
|
networkFactory.create(
|
||||||
networkId = simpleStatuses.first().id,
|
networkId = simpleStatuses.first().id,
|
||||||
|
|
@ -340,7 +340,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
Truth.assertThat(actual1.first()).isEqualTo(expected1)
|
Truth.assertThat(actual1.first()).isEqualTo(expected1)
|
||||||
|
|
||||||
verifyOrder(inverse = true) {
|
verifyOrder(inverse = true) {
|
||||||
userWalletsStore.getSyncOrNull(any())
|
userWalletsListRepository.getSyncOrNull(any())
|
||||||
networkFactory.create(networkId = any(), derivationPath = any(), userWallet = any())
|
networkFactory.create(networkId = any(), derivationPath = any(), userWallet = any())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -354,7 +354,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
Truth.assertThat(actual2.first()).isEqualTo(expected2)
|
Truth.assertThat(actual2.first()).isEqualTo(expected2)
|
||||||
|
|
||||||
verifyOrder {
|
verifyOrder {
|
||||||
userWalletsStore.getSyncOrNull(params.userWalletId)
|
userWalletsListRepository.getSyncOrNull(params.userWalletId)
|
||||||
networkFactory.create(
|
networkFactory.create(
|
||||||
networkId = simpleStatuses.first().id,
|
networkId = simpleStatuses.first().id,
|
||||||
derivationPath = simpleStatuses.first().id.derivationPath,
|
derivationPath = simpleStatuses.first().id.derivationPath,
|
||||||
|
|
@ -382,7 +382,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
Truth.assertThat(actual.first()).isEqualTo(expected)
|
Truth.assertThat(actual.first()).isEqualTo(expected)
|
||||||
|
|
||||||
verify { networksStatusesStore.get(params.userWalletId) }
|
verify { networksStatusesStore.get(params.userWalletId) }
|
||||||
verify(inverse = true) { userWalletsStore.getSyncOrNull(params.userWalletId) }
|
verify(inverse = true) { userWalletsListRepository.getSyncOrNull(params.userWalletId) }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -398,7 +398,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
val networksStatusesFlow = flowOf(simpleStatuses)
|
val networksStatusesFlow = flowOf(simpleStatuses)
|
||||||
|
|
||||||
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
||||||
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
|
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||||
coEvery { networkFactory.create(networkId = any(), any(), any()) } returns null
|
coEvery { networkFactory.create(networkId = any(), any(), any()) } returns null
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -411,7 +411,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
||||||
|
|
||||||
verifyOrder {
|
verifyOrder {
|
||||||
networksStatusesStore.get(params.userWalletId)
|
networksStatusesStore.get(params.userWalletId)
|
||||||
userWalletsStore.getSyncOrNull(params.userWalletId)
|
userWalletsListRepository.getSyncOrNull(params.userWalletId)
|
||||||
networkFactory.create(
|
networkFactory.create(
|
||||||
networkId = simpleStatuses.first().id,
|
networkId = simpleStatuses.first().id,
|
||||||
derivationPath = simpleStatuses.first().id.derivationPath,
|
derivationPath = simpleStatuses.first().id.derivationPath,
|
||||||
|
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
<?xml version="1.0" ?>
|
|
||||||
<SmellBaseline>
|
|
||||||
<ManuallySuppressedIssues/>
|
|
||||||
<CurrentIssues>
|
|
||||||
<ID>BooleanPropertyNaming:DefaultOnrampRepository.kt$DefaultOnrampRepository$val cachedValue = onrampSepaAvailabilityStore.getSyncOrNull(key)</ID>
|
|
||||||
<ID>MultilineLambdaItParameter:DefaultHotCryptoRepository.kt$DefaultHotCryptoRepository${ Timber.e(it, "Unable to fetch hot crypto") analyticsEventHandler.send( event = MainScreenAnalyticsEvent.HotTokenError( errorCode = (it as? ApiResponseError.HttpException)?.code?.numericCode?.toString().orEmpty(), ), ) }</ID>
|
|
||||||
<ID>MultilineLambdaItParameter:DefaultHotCryptoRepository.kt$DefaultHotCryptoRepository${ if (it.id == OLD_POLYGON_NAME) { it.copy(id = NEW_POLYGON_NAME) } else { it } }</ID>
|
|
||||||
<ID>MultilineLambdaItParameter:DefaultHotCryptoRepository.kt$DefaultHotCryptoRepository${ val userWallet = userWalletsStore.getSyncOrNull(userWalletId) ?: error("UserWalletId [$userWalletId] not found") HotCryptoCurrencyConverter( userWallet = userWallet, imageHost = it.imageHost, excludedBlockchains = excludedBlockchains, ) .convertList(input = it.tokens) .filterNotNull() }</ID>
|
|
||||||
<ID>MultilineLambdaItParameter:DefaultOnrampRepository.kt$DefaultOnrampRepository${ Timber.w(it, "Unable to fetch express providers") throw it }</ID>
|
|
||||||
<ID>MultilineLambdaItParameter:DefaultOnrampRepository.kt$DefaultOnrampRepository${ Timber.w(it, "Unable to fetch onramp pairs") throw it }</ID>
|
|
||||||
<ID>MultilineLambdaItParameter:DefaultOnrampRepository.kt$DefaultOnrampRepository${ Timber.w(it, "Unable to fetch onramp payment methods") throw it }</ID>
|
|
||||||
<ID>UnnecessaryLet:DefaultOnrampRepository.kt$DefaultOnrampRepository$let(countryConverter::convert)</ID>
|
|
||||||
<ID>UnnecessaryLet:DefaultOnrampRepository.kt$DefaultOnrampRepository$let(paymentMethodsConverter::convertList)</ID>
|
|
||||||
<ID>UnnecessaryLet:DefaultOnrampRepository.kt$DefaultOnrampRepository$let(statusConverter::convert)</ID>
|
|
||||||
<ID>UseOrEmpty:DefaultOnrampTransactionRepository.kt$DefaultOnrampTransactionRepository$stored ?: emptySet()</ID>
|
|
||||||
</CurrentIssues>
|
|
||||||
</SmellBaseline>
|
|
||||||
|
|
@ -18,10 +18,10 @@ import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse
|
||||||
import com.tangem.datasource.appcurrency.AppCurrencyResponseStore
|
import com.tangem.datasource.appcurrency.AppCurrencyResponseStore
|
||||||
import com.tangem.datasource.exchangeservice.hotcrypto.HotCryptoResponseStore
|
import com.tangem.datasource.exchangeservice.hotcrypto.HotCryptoResponseStore
|
||||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
|
||||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||||
import com.tangem.domain.card.common.extensions.canHandleBlockchain
|
import com.tangem.domain.card.common.extensions.canHandleBlockchain
|
||||||
import com.tangem.domain.card.common.extensions.canHandleToken
|
import com.tangem.domain.card.common.extensions.canHandleToken
|
||||||
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.models.wallet.UserWallet
|
import com.tangem.domain.models.wallet.UserWallet
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
import com.tangem.domain.onramp.model.HotCryptoCurrency
|
import com.tangem.domain.onramp.model.HotCryptoCurrency
|
||||||
|
|
@ -54,7 +54,7 @@ import timber.log.Timber
|
||||||
internal class DefaultHotCryptoRepository(
|
internal class DefaultHotCryptoRepository(
|
||||||
private val excludedBlockchains: ExcludedBlockchains,
|
private val excludedBlockchains: ExcludedBlockchains,
|
||||||
private val hotCryptoResponseStore: HotCryptoResponseStore,
|
private val hotCryptoResponseStore: HotCryptoResponseStore,
|
||||||
private val userWalletsStore: UserWalletsStore,
|
private val userWalletsListRepository: UserWalletsListRepository,
|
||||||
private val tangemTechApi: TangemTechApi,
|
private val tangemTechApi: TangemTechApi,
|
||||||
private val appCurrencyResponseStore: AppCurrencyResponseStore,
|
private val appCurrencyResponseStore: AppCurrencyResponseStore,
|
||||||
private val accountsFeatureToggles: AccountsFeatureToggles,
|
private val accountsFeatureToggles: AccountsFeatureToggles,
|
||||||
|
|
@ -88,22 +88,22 @@ internal class DefaultHotCryptoRepository(
|
||||||
return hotCryptoResponseStore.get()
|
return hotCryptoResponseStore.get()
|
||||||
.map { it[userWalletId] }
|
.map { it[userWalletId] }
|
||||||
.filterNotNull()
|
.filterNotNull()
|
||||||
.map {
|
.map { response ->
|
||||||
val userWallet = userWalletsStore.getSyncOrNull(userWalletId)
|
val userWallet = userWalletsListRepository.getSyncOrNull(userWalletId)
|
||||||
?: error("UserWalletId [$userWalletId] not found")
|
?: error("UserWalletId [$userWalletId] not found")
|
||||||
|
|
||||||
HotCryptoCurrencyConverter(
|
HotCryptoCurrencyConverter(
|
||||||
userWallet = userWallet,
|
userWallet = userWallet,
|
||||||
imageHost = it.imageHost,
|
imageHost = response.imageHost,
|
||||||
excludedBlockchains = excludedBlockchains,
|
excludedBlockchains = excludedBlockchains,
|
||||||
)
|
)
|
||||||
.convertList(input = it.tokens)
|
.convertList(input = response.tokens)
|
||||||
.filterNotNull()
|
.filterNotNull()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getWalletsWithTokensFlow(): Flow<Map<UserWallet, List<UserTokensResponse.Token>>> {
|
private fun getWalletsWithTokensFlow(): Flow<Map<UserWallet, List<UserTokensResponse.Token>>> {
|
||||||
return userWalletsStore.userWallets.flatMapLatest { userWallets ->
|
return userWalletsListRepository.loadAndGet().flatMapLatest { userWallets ->
|
||||||
val flows = userWallets.map { userWallet ->
|
val flows = userWallets.map { userWallet ->
|
||||||
if (accountsFeatureToggles.isFeatureEnabled) {
|
if (accountsFeatureToggles.isFeatureEnabled) {
|
||||||
walletAccountsFetcher.get(userWalletId = userWallet.walletId).map { it.toUserTokensResponse() }
|
walletAccountsFetcher.get(userWalletId = userWallet.walletId).map { it.toUserTokensResponse() }
|
||||||
|
|
@ -131,12 +131,13 @@ internal class DefaultHotCryptoRepository(
|
||||||
tangemTechApi.getHotCrypto(currencyId = appCurrencyId).getOrThrow()
|
tangemTechApi.getHotCrypto(currencyId = appCurrencyId).getOrThrow()
|
||||||
}
|
}
|
||||||
.onSuccess { Timber.d("HotCrypto is successfully updated") }
|
.onSuccess { Timber.d("HotCrypto is successfully updated") }
|
||||||
.onFailure {
|
.onFailure { throwable ->
|
||||||
Timber.e(it, "Unable to fetch hot crypto")
|
Timber.e(throwable, "Unable to fetch hot crypto")
|
||||||
|
|
||||||
|
val httpException = throwable as? ApiResponseError.HttpException
|
||||||
analyticsEventHandler.send(
|
analyticsEventHandler.send(
|
||||||
event = MainScreenAnalyticsEvent.HotTokenError(
|
event = MainScreenAnalyticsEvent.HotTokenError(
|
||||||
errorCode = (it as? ApiResponseError.HttpException)?.code?.numericCode?.toString().orEmpty(),
|
errorCode = httpException?.code?.numericCode?.toString().orEmpty(),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -164,11 +165,11 @@ internal class DefaultHotCryptoRepository(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun List<HotCryptoResponse.Token>.applyTokensIdMigrations(): List<HotCryptoResponse.Token> {
|
private fun List<HotCryptoResponse.Token>.applyTokensIdMigrations(): List<HotCryptoResponse.Token> {
|
||||||
return this.map {
|
return this.map { token ->
|
||||||
if (it.id == OLD_POLYGON_NAME) {
|
if (token.id == OLD_POLYGON_NAME) {
|
||||||
it.copy(id = NEW_POLYGON_NAME)
|
token.copy(id = NEW_POLYGON_NAME)
|
||||||
} else {
|
} else {
|
||||||
it
|
token
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,7 @@ internal class DefaultOnrampRepository(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val country = onrampApi.getCountryByIp(
|
val response = onrampApi.getCountryByIp(
|
||||||
userWalletId = userWallet.walletId.stringValue,
|
userWalletId = userWallet.walletId.stringValue,
|
||||||
refCode = ExpressUtils.getRefCode(
|
refCode = ExpressUtils.getRefCode(
|
||||||
userWallet = userWallet,
|
userWallet = userWallet,
|
||||||
|
|
@ -146,7 +146,8 @@ internal class DefaultOnrampRepository(
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.getOrThrow()
|
.getOrThrow()
|
||||||
.let(countryConverter::convert)
|
|
||||||
|
val country = countryConverter.convert(response)
|
||||||
|
|
||||||
onrampCurrentCountryByIPStore.store(country)
|
onrampCurrentCountryByIPStore.store(country)
|
||||||
|
|
||||||
|
|
@ -154,7 +155,7 @@ internal class DefaultOnrampRepository(
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun getStatus(userWallet: UserWallet, txId: String): OnrampStatus = withContext(dispatchers.io) {
|
override suspend fun getStatus(userWallet: UserWallet, txId: String): OnrampStatus = withContext(dispatchers.io) {
|
||||||
onrampApi.getStatus(
|
val response = onrampApi.getStatus(
|
||||||
userWalletId = userWallet.walletId.stringValue,
|
userWalletId = userWallet.walletId.stringValue,
|
||||||
refCode = ExpressUtils.getRefCode(
|
refCode = ExpressUtils.getRefCode(
|
||||||
userWallet = userWallet,
|
userWallet = userWallet,
|
||||||
|
|
@ -163,7 +164,8 @@ internal class DefaultOnrampRepository(
|
||||||
txId = txId,
|
txId = txId,
|
||||||
)
|
)
|
||||||
.getOrThrow()
|
.getOrThrow()
|
||||||
.let(statusConverter::convert)
|
|
||||||
|
statusConverter.convert(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun saveDefaultCurrency(currency: OnrampCurrency) = withContext(dispatchers.io) {
|
override suspend fun saveDefaultCurrency(currency: OnrampCurrency) = withContext(dispatchers.io) {
|
||||||
|
|
@ -218,9 +220,9 @@ internal class DefaultOnrampRepository(
|
||||||
),
|
),
|
||||||
).bind()
|
).bind()
|
||||||
},
|
},
|
||||||
onError = {
|
onError = { error ->
|
||||||
Timber.w(it, "Unable to fetch onramp payment methods")
|
Timber.w(error, "Unable to fetch onramp payment methods")
|
||||||
throw it
|
throw error
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
paymentMethodsStore.store(PAYMENT_METHODS_KEY, response.removeApplePay())
|
paymentMethodsStore.store(PAYMENT_METHODS_KEY, response.removeApplePay())
|
||||||
|
|
@ -253,9 +255,9 @@ internal class DefaultOnrampRepository(
|
||||||
),
|
),
|
||||||
).bind()
|
).bind()
|
||||||
},
|
},
|
||||||
onError = {
|
onError = { error ->
|
||||||
Timber.w(it, "Unable to fetch onramp pairs")
|
Timber.w(error, "Unable to fetch onramp pairs")
|
||||||
throw it
|
throw error
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -270,9 +272,9 @@ internal class DefaultOnrampRepository(
|
||||||
),
|
),
|
||||||
).bind()
|
).bind()
|
||||||
},
|
},
|
||||||
onError = {
|
onError = { error ->
|
||||||
Timber.w(it, "Unable to fetch express providers")
|
Timber.w(error, "Unable to fetch express providers")
|
||||||
throw it
|
throw error
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -291,10 +293,10 @@ internal class DefaultOnrampRepository(
|
||||||
cryptoCurrency = cryptoCurrency,
|
cryptoCurrency = cryptoCurrency,
|
||||||
)
|
)
|
||||||
|
|
||||||
val cachedValue = onrampSepaAvailabilityStore.getSyncOrNull(key)
|
val isCachedValue = onrampSepaAvailabilityStore.getSyncOrNull(key)
|
||||||
|
|
||||||
if (cachedValue != null) {
|
if (isCachedValue != null) {
|
||||||
return@withContext cachedValue
|
return@withContext isCachedValue
|
||||||
}
|
}
|
||||||
|
|
||||||
val onrampPairs =
|
val onrampPairs =
|
||||||
|
|
@ -318,9 +320,9 @@ internal class DefaultOnrampRepository(
|
||||||
),
|
),
|
||||||
).bind()
|
).bind()
|
||||||
},
|
},
|
||||||
onError = {
|
onError = { error ->
|
||||||
Timber.w(it, "Unable to fetch onramp pairs")
|
Timber.w(error, "Unable to fetch onramp pairs")
|
||||||
throw it
|
throw error
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -525,9 +527,11 @@ internal class DefaultOnrampRepository(
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun getPaymentMethods(): List<OnrampPaymentMethod> {
|
private suspend fun getPaymentMethods(): List<OnrampPaymentMethod> {
|
||||||
return requireNotNull(paymentMethodsStore.getSyncOrNull(PAYMENT_METHODS_KEY)) {
|
val methods = requireNotNull(paymentMethodsStore.getSyncOrNull(PAYMENT_METHODS_KEY)) {
|
||||||
"Onramp payment methods is absent in storage"
|
"Onramp payment methods is absent in storage"
|
||||||
}.let(paymentMethodsConverter::convertList)
|
}
|
||||||
|
|
||||||
|
return paymentMethodsConverter.convertList(methods)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createOnrampTransaction(
|
private fun createOnrampTransaction(
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,7 @@ internal class DefaultOnrampTransactionRepository(
|
||||||
|
|
||||||
mutablePreferences.setObjectSet<OnrampTransactionDTO>(
|
mutablePreferences.setObjectSet<OnrampTransactionDTO>(
|
||||||
key = PreferencesKeys.ONRAMP_TRANSACTIONS_STATUSES_KEY,
|
key = PreferencesKeys.ONRAMP_TRANSACTIONS_STATUSES_KEY,
|
||||||
value = stored ?: emptySet(),
|
value = stored.orEmpty(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,8 +28,8 @@ import com.tangem.datasource.local.onramp.sepa.OnrampCurrentCountryByIPStore
|
||||||
import com.tangem.datasource.local.onramp.sepa.OnrampSepaAvailabilityStore
|
import com.tangem.datasource.local.onramp.sepa.OnrampSepaAvailabilityStore
|
||||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
|
||||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||||
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.onramp.repositories.*
|
import com.tangem.domain.onramp.repositories.*
|
||||||
import com.tangem.domain.walletmanager.WalletManagersFacade
|
import com.tangem.domain.walletmanager.WalletManagersFacade
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
|
|
@ -105,7 +105,7 @@ internal object OnrampDataModule {
|
||||||
fun provideHotCryptoRepository(
|
fun provideHotCryptoRepository(
|
||||||
excludedBlockchains: ExcludedBlockchains,
|
excludedBlockchains: ExcludedBlockchains,
|
||||||
hotCryptoResponseStore: HotCryptoResponseStore,
|
hotCryptoResponseStore: HotCryptoResponseStore,
|
||||||
userWalletsStore: UserWalletsStore,
|
userWalletsListRepository: UserWalletsListRepository,
|
||||||
tangemTechApi: TangemTechApi,
|
tangemTechApi: TangemTechApi,
|
||||||
appCurrencyResponseStore: AppCurrencyResponseStore,
|
appCurrencyResponseStore: AppCurrencyResponseStore,
|
||||||
dispatchers: CoroutineDispatcherProvider,
|
dispatchers: CoroutineDispatcherProvider,
|
||||||
|
|
@ -117,7 +117,7 @@ internal object OnrampDataModule {
|
||||||
return DefaultHotCryptoRepository(
|
return DefaultHotCryptoRepository(
|
||||||
excludedBlockchains = excludedBlockchains,
|
excludedBlockchains = excludedBlockchains,
|
||||||
hotCryptoResponseStore = hotCryptoResponseStore,
|
hotCryptoResponseStore = hotCryptoResponseStore,
|
||||||
userWalletsStore = userWalletsStore,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
tangemTechApi = tangemTechApi,
|
tangemTechApi = tangemTechApi,
|
||||||
appCurrencyResponseStore = appCurrencyResponseStore,
|
appCurrencyResponseStore = appCurrencyResponseStore,
|
||||||
dispatchers = dispatchers,
|
dispatchers = dispatchers,
|
||||||
|
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
<?xml version="1.0" ?>
|
|
||||||
<SmellBaseline>
|
|
||||||
<ManuallySuppressedIssues/>
|
|
||||||
<CurrentIssues>
|
|
||||||
<ID>MultilineLambdaItParameter:CustomTokensMerger.kt$CustomTokensMerger${ Timber.e(it, "Unable to fetch token:\n$token") null }</ID>
|
|
||||||
<ID>NullableToStringCall:AccountListCryptoCurrenciesFetcher.kt$AccountListCryptoCurrenciesFetcher$${this::class.simpleName}</ID>
|
|
||||||
<ID>NullableToStringCall:DefaultMultiWalletCryptoCurrenciesFetcher.kt$DefaultMultiWalletCryptoCurrenciesFetcher$${this::class.simpleName}</ID>
|
|
||||||
<ID>UseOrEmpty:DefaultYieldSupplyWarningsViewedRepository.kt$DefaultYieldSupplyWarningsViewedRepository$appPreferencesStore.getObjectSet<String>(PreferencesKeys.YIELD_SUPPLY_WARNINGS_STATES_KEY).firstOrNull() ?: emptySet()</ID>
|
|
||||||
</CurrentIssues>
|
|
||||||
</SmellBaseline>
|
|
||||||
|
|
@ -4,11 +4,10 @@ import arrow.core.Either
|
||||||
import arrow.core.right
|
import arrow.core.right
|
||||||
import com.tangem.data.common.account.WalletAccountsFetcher
|
import com.tangem.data.common.account.WalletAccountsFetcher
|
||||||
import com.tangem.datasource.api.tangemTech.models.account.flattenTokens
|
import com.tangem.datasource.api.tangemTech.models.account.flattenTokens
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.core.utils.catchOn
|
import com.tangem.domain.core.utils.catchOn
|
||||||
import com.tangem.domain.express.ExpressServiceFetcher
|
import com.tangem.domain.express.ExpressServiceFetcher
|
||||||
import com.tangem.domain.express.models.ExpressAsset
|
import com.tangem.domain.express.models.ExpressAsset
|
||||||
import com.tangem.domain.models.wallet.UserWallet
|
|
||||||
import com.tangem.domain.models.wallet.isMultiCurrency
|
import com.tangem.domain.models.wallet.isMultiCurrency
|
||||||
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher
|
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher
|
||||||
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher.Params
|
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher.Params
|
||||||
|
|
@ -17,7 +16,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
/**
|
/**
|
||||||
* Implementation of [MultiWalletCryptoCurrenciesFetcher] that fetches crypto currencies of all accounts
|
* Implementation of [MultiWalletCryptoCurrenciesFetcher] that fetches crypto currencies of all accounts
|
||||||
*
|
*
|
||||||
* @property userWalletsStore [UserWallet]'s store
|
* @property userWalletsListRepository repository to get user wallets
|
||||||
* @property walletAccountsFetcher instance of [WalletAccountsFetcher] to fetch accounts for a multi wallet
|
* @property walletAccountsFetcher instance of [WalletAccountsFetcher] to fetch accounts for a multi wallet
|
||||||
* @property expressServiceFetcher fetcher of express service
|
* @property expressServiceFetcher fetcher of express service
|
||||||
* @property dispatchers dispatchers
|
* @property dispatchers dispatchers
|
||||||
|
|
@ -25,7 +24,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
[REDACTED_AUTHOR]
|
[REDACTED_AUTHOR]
|
||||||
*/
|
*/
|
||||||
internal class AccountListCryptoCurrenciesFetcher(
|
internal class AccountListCryptoCurrenciesFetcher(
|
||||||
private val userWalletsStore: UserWalletsStore,
|
private val userWalletsListRepository: UserWalletsListRepository,
|
||||||
private val walletAccountsFetcher: WalletAccountsFetcher,
|
private val walletAccountsFetcher: WalletAccountsFetcher,
|
||||||
private val expressServiceFetcher: ExpressServiceFetcher,
|
private val expressServiceFetcher: ExpressServiceFetcher,
|
||||||
private val dispatchers: CoroutineDispatcherProvider,
|
private val dispatchers: CoroutineDispatcherProvider,
|
||||||
|
|
@ -33,7 +32,7 @@ internal class AccountListCryptoCurrenciesFetcher(
|
||||||
|
|
||||||
override suspend fun invoke(params: Params): Either<Throwable, Unit> {
|
override suspend fun invoke(params: Params): Either<Throwable, Unit> {
|
||||||
return Either.catchOn(dispatchers.default) {
|
return Either.catchOn(dispatchers.default) {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(key = params.userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||||
|
|
||||||
if (!userWallet.isMultiCurrency) error("${this::class.simpleName} supports only multi-currency wallet")
|
if (!userWallet.isMultiCurrency) error("${this::class.simpleName} supports only multi-currency wallet")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import com.tangem.datasource.api.common.response.ApiResponseError
|
||||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||||
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
||||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.core.utils.catchOn
|
import com.tangem.domain.core.utils.catchOn
|
||||||
import com.tangem.domain.demo.models.DemoConfig
|
import com.tangem.domain.demo.models.DemoConfig
|
||||||
import com.tangem.domain.express.ExpressServiceFetcher
|
import com.tangem.domain.express.ExpressServiceFetcher
|
||||||
|
|
@ -26,7 +26,6 @@ import timber.log.Timber
|
||||||
/**
|
/**
|
||||||
* Default implementation of [MultiWalletCryptoCurrenciesFetcher]
|
* Default implementation of [MultiWalletCryptoCurrenciesFetcher]
|
||||||
*
|
*
|
||||||
* @property userWalletsStore [UserWallet]'s store
|
|
||||||
* @property tangemTechApi Tangem Tech API
|
* @property tangemTechApi Tangem Tech API
|
||||||
* @property userTokensResponseStore store of [UserTokensResponse]
|
* @property userTokensResponseStore store of [UserTokensResponse]
|
||||||
* @property userTokensSaver user tokens saver
|
* @property userTokensSaver user tokens saver
|
||||||
|
|
@ -39,7 +38,7 @@ import timber.log.Timber
|
||||||
@Suppress("LongParameterList")
|
@Suppress("LongParameterList")
|
||||||
internal class DefaultMultiWalletCryptoCurrenciesFetcher(
|
internal class DefaultMultiWalletCryptoCurrenciesFetcher(
|
||||||
private val demoConfig: DemoConfig,
|
private val demoConfig: DemoConfig,
|
||||||
private val userWalletsStore: UserWalletsStore,
|
private val userWalletsListRepository: UserWalletsListRepository,
|
||||||
private val tangemTechApi: TangemTechApi,
|
private val tangemTechApi: TangemTechApi,
|
||||||
private val customTokensMerger: CustomTokensMerger,
|
private val customTokensMerger: CustomTokensMerger,
|
||||||
private val userTokensResponseStore: UserTokensResponseStore,
|
private val userTokensResponseStore: UserTokensResponseStore,
|
||||||
|
|
@ -52,7 +51,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcher(
|
||||||
private val userTokensResponseFactory = UserTokensResponseFactory()
|
private val userTokensResponseFactory = UserTokensResponseFactory()
|
||||||
|
|
||||||
override suspend fun invoke(params: Params) = Either.catchOn(dispatchers.default) {
|
override suspend fun invoke(params: Params) = Either.catchOn(dispatchers.default) {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(key = params.userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||||
|
|
||||||
if (!userWallet.isMultiCurrency) error("${this::class.simpleName} supports only multi-currency wallet")
|
if (!userWallet.isMultiCurrency) error("${this::class.simpleName} supports only multi-currency wallet")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@ import com.tangem.data.tokens.DefaultMultiWalletCryptoCurrenciesFetcher
|
||||||
import com.tangem.data.tokens.utils.CustomTokensMerger
|
import com.tangem.data.tokens.utils.CustomTokensMerger
|
||||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
|
||||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||||
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.demo.models.DemoConfig
|
import com.tangem.domain.demo.models.DemoConfig
|
||||||
import com.tangem.domain.express.ExpressServiceFetcher
|
import com.tangem.domain.express.ExpressServiceFetcher
|
||||||
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher
|
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher
|
||||||
|
|
@ -29,7 +29,7 @@ internal class MultiWalletCryptoCurrenciesFetcherModule {
|
||||||
fun provideMultiWalletCryptoCurrenciesFetcher(
|
fun provideMultiWalletCryptoCurrenciesFetcher(
|
||||||
accountsFeatureToggles: AccountsFeatureToggles,
|
accountsFeatureToggles: AccountsFeatureToggles,
|
||||||
tangemTechApi: TangemTechApi,
|
tangemTechApi: TangemTechApi,
|
||||||
userWalletsStore: UserWalletsStore,
|
userWalletsListRepository: UserWalletsListRepository,
|
||||||
userTokensResponseStore: UserTokensResponseStore,
|
userTokensResponseStore: UserTokensResponseStore,
|
||||||
userTokensSaver: UserTokensSaver,
|
userTokensSaver: UserTokensSaver,
|
||||||
cardCryptoCurrencyFactory: CardCryptoCurrencyFactory,
|
cardCryptoCurrencyFactory: CardCryptoCurrencyFactory,
|
||||||
|
|
@ -39,7 +39,7 @@ internal class MultiWalletCryptoCurrenciesFetcherModule {
|
||||||
): MultiWalletCryptoCurrenciesFetcher {
|
): MultiWalletCryptoCurrenciesFetcher {
|
||||||
return if (accountsFeatureToggles.isFeatureEnabled) {
|
return if (accountsFeatureToggles.isFeatureEnabled) {
|
||||||
AccountListCryptoCurrenciesFetcher(
|
AccountListCryptoCurrenciesFetcher(
|
||||||
userWalletsStore = userWalletsStore,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
walletAccountsFetcher = walletAccountsFetcher,
|
walletAccountsFetcher = walletAccountsFetcher,
|
||||||
expressServiceFetcher = expressServiceFetcher,
|
expressServiceFetcher = expressServiceFetcher,
|
||||||
dispatchers = dispatchers,
|
dispatchers = dispatchers,
|
||||||
|
|
@ -47,7 +47,7 @@ internal class MultiWalletCryptoCurrenciesFetcherModule {
|
||||||
} else {
|
} else {
|
||||||
DefaultMultiWalletCryptoCurrenciesFetcher(
|
DefaultMultiWalletCryptoCurrenciesFetcher(
|
||||||
demoConfig = DemoConfig,
|
demoConfig = DemoConfig,
|
||||||
userWalletsStore = userWalletsStore,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
tangemTechApi = tangemTechApi,
|
tangemTechApi = tangemTechApi,
|
||||||
customTokensMerger = CustomTokensMerger(
|
customTokensMerger = CustomTokensMerger(
|
||||||
tangemTechApi = tangemTechApi,
|
tangemTechApi = tangemTechApi,
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,8 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||||
import com.tangem.datasource.local.token.TokenReceiveWarningActionStore
|
import com.tangem.datasource.local.token.TokenReceiveWarningActionStore
|
||||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
|
||||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||||
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.express.ExpressServiceFetcher
|
import com.tangem.domain.express.ExpressServiceFetcher
|
||||||
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesSupplier
|
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesSupplier
|
||||||
import com.tangem.domain.tokens.repository.CurrenciesRepository
|
import com.tangem.domain.tokens.repository.CurrenciesRepository
|
||||||
|
|
@ -39,7 +39,7 @@ internal object TokensDataModule {
|
||||||
fun provideCurrenciesRepository(
|
fun provideCurrenciesRepository(
|
||||||
tangemTechApi: TangemTechApi,
|
tangemTechApi: TangemTechApi,
|
||||||
userTokensResponseStore: UserTokensResponseStore,
|
userTokensResponseStore: UserTokensResponseStore,
|
||||||
userWalletsStore: UserWalletsStore,
|
userWalletsListRepository: UserWalletsListRepository,
|
||||||
walletManagersFacade: WalletManagersFacade,
|
walletManagersFacade: WalletManagersFacade,
|
||||||
cacheRegistry: CacheRegistry,
|
cacheRegistry: CacheRegistry,
|
||||||
dispatchers: CoroutineDispatcherProvider,
|
dispatchers: CoroutineDispatcherProvider,
|
||||||
|
|
@ -53,7 +53,7 @@ internal object TokensDataModule {
|
||||||
): CurrenciesRepository {
|
): CurrenciesRepository {
|
||||||
return DefaultCurrenciesRepository(
|
return DefaultCurrenciesRepository(
|
||||||
tangemTechApi = tangemTechApi,
|
tangemTechApi = tangemTechApi,
|
||||||
userWalletsStore = userWalletsStore,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
walletManagersFacade = walletManagersFacade,
|
walletManagersFacade = walletManagersFacade,
|
||||||
cacheRegistry = cacheRegistry,
|
cacheRegistry = cacheRegistry,
|
||||||
userTokensResponseStore = userTokensResponseStore,
|
userTokensResponseStore = userTokensResponseStore,
|
||||||
|
|
|
||||||
|
|
@ -13,10 +13,10 @@ import com.tangem.datasource.api.common.response.getOrThrow
|
||||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||||
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
||||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
|
||||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||||
import com.tangem.domain.card.CardTypesResolver
|
import com.tangem.domain.card.CardTypesResolver
|
||||||
import com.tangem.domain.card.common.util.cardTypesResolver
|
import com.tangem.domain.card.common.util.cardTypesResolver
|
||||||
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.core.error.DataError
|
import com.tangem.domain.core.error.DataError
|
||||||
import com.tangem.domain.demo.models.DemoConfig
|
import com.tangem.domain.demo.models.DemoConfig
|
||||||
import com.tangem.domain.express.ExpressServiceFetcher
|
import com.tangem.domain.express.ExpressServiceFetcher
|
||||||
|
|
@ -41,7 +41,7 @@ import com.tangem.blockchain.common.FeePaidCurrency as FeePaidSdkCurrency
|
||||||
@Suppress("LargeClass", "LongParameterList", "TooManyFunctions")
|
@Suppress("LargeClass", "LongParameterList", "TooManyFunctions")
|
||||||
internal class DefaultCurrenciesRepository(
|
internal class DefaultCurrenciesRepository(
|
||||||
private val tangemTechApi: TangemTechApi,
|
private val tangemTechApi: TangemTechApi,
|
||||||
private val userWalletsStore: UserWalletsStore,
|
private val userWalletsListRepository: UserWalletsListRepository,
|
||||||
private val walletManagersFacade: WalletManagersFacade,
|
private val walletManagersFacade: WalletManagersFacade,
|
||||||
private val cacheRegistry: CacheRegistry,
|
private val cacheRegistry: CacheRegistry,
|
||||||
private val expressServiceFetcher: ExpressServiceFetcher,
|
private val expressServiceFetcher: ExpressServiceFetcher,
|
||||||
|
|
@ -104,7 +104,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
)
|
)
|
||||||
|
|
||||||
fetchExpressAssetsByNetworkIds(
|
fetchExpressAssetsByNetworkIds(
|
||||||
userWallet = userWalletsStore.getSyncStrict(key = userWalletId),
|
userWallet = userWalletsListRepository.getSyncStrict(id = userWalletId),
|
||||||
userTokens = updatedResponse,
|
userTokens = updatedResponse,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -194,7 +194,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
|
|
||||||
override fun getWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>> {
|
override fun getWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>> {
|
||||||
return channelFlow {
|
return channelFlow {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||||
|
|
||||||
if (userWallet.isMultiCurrency) {
|
if (userWallet.isMultiCurrency) {
|
||||||
getMultiCurrencyWalletCurrenciesUpdates(userWalletId).collect(::send)
|
getMultiCurrencyWalletCurrenciesUpdates(userWalletId).collect(::send)
|
||||||
|
|
@ -211,7 +211,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
refresh: Boolean,
|
refresh: Boolean,
|
||||||
): CryptoCurrency {
|
): CryptoCurrency {
|
||||||
return withContext(dispatchers.io) {
|
return withContext(dispatchers.io) {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||||
userWallet.requireColdWallet()
|
userWallet.requireColdWallet()
|
||||||
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = false)
|
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = false)
|
||||||
|
|
||||||
|
|
@ -234,7 +234,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
refresh: Boolean,
|
refresh: Boolean,
|
||||||
): List<CryptoCurrency> {
|
): List<CryptoCurrency> {
|
||||||
return withContext(dispatchers.io) {
|
return withContext(dispatchers.io) {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||||
val scanResponse = userWallet.requireColdWallet().scanResponse
|
val scanResponse = userWallet.requireColdWallet().scanResponse
|
||||||
|
|
||||||
val currencies = if (scanResponse.cardTypesResolver.isSingleWalletWithToken()) {
|
val currencies = if (scanResponse.cardTypesResolver.isSingleWalletWithToken()) {
|
||||||
|
|
@ -261,7 +261,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
id: CryptoCurrency.ID,
|
id: CryptoCurrency.ID,
|
||||||
): CryptoCurrency {
|
): CryptoCurrency {
|
||||||
return withContext(dispatchers.io) {
|
return withContext(dispatchers.io) {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||||
userWallet.requireColdWallet()
|
userWallet.requireColdWallet()
|
||||||
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = false)
|
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = false)
|
||||||
|
|
||||||
|
|
@ -277,7 +277,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
|
|
||||||
private fun getMultiCurrencyWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>> {
|
private fun getMultiCurrencyWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>> {
|
||||||
return channelFlow {
|
return channelFlow {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||||
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true)
|
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true)
|
||||||
|
|
||||||
getMultiCurrencyWalletCurrencies(userWallet)
|
getMultiCurrencyWalletCurrencies(userWallet)
|
||||||
|
|
@ -290,7 +290,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
userWalletId: UserWalletId,
|
userWalletId: UserWalletId,
|
||||||
refresh: Boolean,
|
refresh: Boolean,
|
||||||
): List<CryptoCurrency> = withContext(dispatchers.io) {
|
): List<CryptoCurrency> = withContext(dispatchers.io) {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||||
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true)
|
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true)
|
||||||
|
|
||||||
fetchTokensIfCacheExpired(userWallet, refresh)
|
fetchTokensIfCacheExpired(userWallet, refresh)
|
||||||
|
|
@ -344,7 +344,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
derivationPath: Network.DerivationPath,
|
derivationPath: Network.DerivationPath,
|
||||||
): CryptoCurrency.Coin {
|
): CryptoCurrency.Coin {
|
||||||
return withContext(dispatchers.io) {
|
return withContext(dispatchers.io) {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||||
ensureIsCorrectUserWallet(userWallet = userWallet, isMultiCurrencyWalletExpected = true)
|
ensureIsCorrectUserWallet(userWallet = userWallet, isMultiCurrencyWalletExpected = true)
|
||||||
|
|
||||||
fetchTokensIfCacheExpired(userWallet = userWallet, refresh = false)
|
fetchTokensIfCacheExpired(userWallet = userWallet, refresh = false)
|
||||||
|
|
@ -378,7 +378,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
|
|
||||||
override fun isTokensGrouped(userWalletId: UserWalletId): Flow<Boolean> {
|
override fun isTokensGrouped(userWalletId: UserWalletId): Flow<Boolean> {
|
||||||
return channelFlow {
|
return channelFlow {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||||
|
|
||||||
if (userWallet.isMultiCurrency) {
|
if (userWallet.isMultiCurrency) {
|
||||||
getSavedUserTokensResponse(userWalletId)
|
getSavedUserTokensResponse(userWalletId)
|
||||||
|
|
@ -394,7 +394,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
|
|
||||||
override fun isTokensSortedByBalance(userWalletId: UserWalletId): Flow<Boolean> {
|
override fun isTokensSortedByBalance(userWalletId: UserWalletId): Flow<Boolean> {
|
||||||
return channelFlow {
|
return channelFlow {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||||
|
|
||||||
if (userWallet.isMultiCurrency) {
|
if (userWallet.isMultiCurrency) {
|
||||||
getSavedUserTokensResponse(userWalletId)
|
getSavedUserTokensResponse(userWalletId)
|
||||||
|
|
@ -481,7 +481,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
contractAddress: String,
|
contractAddress: String,
|
||||||
networkId: String,
|
networkId: String,
|
||||||
): CryptoCurrency.Token {
|
): CryptoCurrency.Token {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||||
val token = withContext(dispatchers.io) {
|
val token = withContext(dispatchers.io) {
|
||||||
val foundToken = tangemTechApi.getCoins(
|
val foundToken = tangemTechApi.getCoins(
|
||||||
contractAddress = contractAddress,
|
contractAddress = contractAddress,
|
||||||
|
|
@ -513,7 +513,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
override fun getAllWalletsCryptoCurrencies(
|
override fun getAllWalletsCryptoCurrencies(
|
||||||
currencyRawId: CryptoCurrency.RawID,
|
currencyRawId: CryptoCurrency.RawID,
|
||||||
): Flow<Map<UserWallet, List<CryptoCurrency>>> {
|
): Flow<Map<UserWallet, List<CryptoCurrency>>> {
|
||||||
return userWalletsStore.userWallets.flatMapLatest { userWallets ->
|
return userWalletsListRepository.loadAndGet().flatMapLatest { userWallets ->
|
||||||
|
|
||||||
userWallets.filter { it.isMultiCurrency }
|
userWallets.filter { it.isMultiCurrency }
|
||||||
.forEach { fetchTokensIfCacheExpired(userWallet = it, refresh = false) }
|
.forEach { fetchTokensIfCacheExpired(userWallet = it, refresh = false) }
|
||||||
|
|
@ -589,7 +589,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getCardTypesResolver(userWalletId: UserWalletId): CardTypesResolver? {
|
override fun getCardTypesResolver(userWalletId: UserWalletId): CardTypesResolver? {
|
||||||
return (userWalletsStore.getSyncStrict(userWalletId) as? UserWallet.Cold)?.cardTypesResolver
|
return (userWalletsListRepository.getSyncStrict(userWalletId) as? UserWallet.Cold)?.cardTypesResolver
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getMultiCurrencyWalletCurrencies(userWallet: UserWallet): Flow<List<CryptoCurrency>> {
|
private fun getMultiCurrencyWalletCurrencies(userWallet: UserWallet): Flow<List<CryptoCurrency>> {
|
||||||
|
|
@ -711,7 +711,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun ensureIsCorrectUserWallet(userWalletId: UserWalletId, isMultiCurrencyWalletExpected: Boolean) {
|
private fun ensureIsCorrectUserWallet(userWalletId: UserWalletId, isMultiCurrencyWalletExpected: Boolean) {
|
||||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||||
|
|
||||||
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected)
|
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,8 @@ internal class DefaultYieldSupplyWarningsViewedRepository(
|
||||||
) : YieldSupplyWarningsViewedRepository {
|
) : YieldSupplyWarningsViewedRepository {
|
||||||
|
|
||||||
override suspend fun getViewedWarnings(): Set<String> = withContext(dispatchers.io) {
|
override suspend fun getViewedWarnings(): Set<String> = withContext(dispatchers.io) {
|
||||||
appPreferencesStore.getObjectSet<String>(PreferencesKeys.YIELD_SUPPLY_WARNINGS_STATES_KEY).firstOrNull()
|
appPreferencesStore.getObjectSet<String>(PreferencesKeys.YIELD_SUPPLY_WARNINGS_STATES_KEY)
|
||||||
?: emptySet()
|
.firstOrNull().orEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun view(symbol: String) = withContext(dispatchers.io) {
|
override suspend fun view(symbol: String) = withContext(dispatchers.io) {
|
||||||
|
|
|
||||||
|
|
@ -104,8 +104,8 @@ internal class CustomTokensMerger(
|
||||||
networkIds = token.networkId,
|
networkIds = token.networkId,
|
||||||
).bind()
|
).bind()
|
||||||
},
|
},
|
||||||
onError = {
|
onError = { error ->
|
||||||
Timber.e(it, "Unable to fetch token:\n$token")
|
Timber.e(error, "Unable to fetch token:\n$token")
|
||||||
null
|
null
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import arrow.core.left
|
||||||
import arrow.core.right
|
import arrow.core.right
|
||||||
import com.tangem.data.common.account.WalletAccountsFetcher
|
import com.tangem.data.common.account.WalletAccountsFetcher
|
||||||
import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse
|
import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.express.ExpressServiceFetcher
|
import com.tangem.domain.express.ExpressServiceFetcher
|
||||||
import com.tangem.domain.models.wallet.UserWallet
|
import com.tangem.domain.models.wallet.UserWallet
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
|
|
@ -22,13 +22,13 @@ import org.junit.jupiter.api.TestInstance
|
||||||
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
||||||
internal class AccountListCryptoCurrenciesFetcherTest {
|
internal class AccountListCryptoCurrenciesFetcherTest {
|
||||||
|
|
||||||
private val userWalletsStore: UserWalletsStore = mockk(relaxUnitFun = true)
|
private val userWalletsListRepository: UserWalletsListRepository = mockk(relaxUnitFun = true)
|
||||||
private val walletAccountsFetcher: WalletAccountsFetcher = mockk(relaxUnitFun = true)
|
private val walletAccountsFetcher: WalletAccountsFetcher = mockk(relaxUnitFun = true)
|
||||||
private val expressServiceFetcher: ExpressServiceFetcher = mockk()
|
private val expressServiceFetcher: ExpressServiceFetcher = mockk()
|
||||||
private val dispatchers = TestingCoroutineDispatcherProvider()
|
private val dispatchers = TestingCoroutineDispatcherProvider()
|
||||||
|
|
||||||
private val fetcher = AccountListCryptoCurrenciesFetcher(
|
private val fetcher = AccountListCryptoCurrenciesFetcher(
|
||||||
userWalletsStore = userWalletsStore,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
walletAccountsFetcher = walletAccountsFetcher,
|
walletAccountsFetcher = walletAccountsFetcher,
|
||||||
expressServiceFetcher = expressServiceFetcher,
|
expressServiceFetcher = expressServiceFetcher,
|
||||||
dispatchers = dispatchers,
|
dispatchers = dispatchers,
|
||||||
|
|
@ -36,7 +36,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
fun resetMocks() {
|
fun resetMocks() {
|
||||||
clearMocks(userWalletsStore, walletAccountsFetcher)
|
clearMocks(userWalletsListRepository, walletAccountsFetcher)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -44,7 +44,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
|
||||||
// Arrange
|
// Arrange
|
||||||
val params = MultiWalletCryptoCurrenciesFetcher.Params(userWalletId = userWalletId)
|
val params = MultiWalletCryptoCurrenciesFetcher.Params(userWalletId = userWalletId)
|
||||||
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns false }
|
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns false }
|
||||||
every { userWalletsStore.getSyncStrict(key = params.userWalletId) } returns mockUserWallet
|
every { userWalletsListRepository.getSyncStrict(id = params.userWalletId) } returns mockUserWallet
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
val actual = fetcher(params)
|
val actual = fetcher(params)
|
||||||
|
|
@ -55,7 +55,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
|
||||||
).left()
|
).left()
|
||||||
assertEither(actual, expected)
|
assertEither(actual, expected)
|
||||||
|
|
||||||
verify { userWalletsStore.getSyncStrict(key = params.userWalletId) }
|
verify { userWalletsListRepository.getSyncStrict(id = params.userWalletId) }
|
||||||
coVerify(inverse = true) { walletAccountsFetcher.fetch(any()) }
|
coVerify(inverse = true) { walletAccountsFetcher.fetch(any()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -66,7 +66,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
|
||||||
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns true }
|
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns true }
|
||||||
val response = mockk<GetWalletAccountsResponse>(relaxed = true)
|
val response = mockk<GetWalletAccountsResponse>(relaxed = true)
|
||||||
|
|
||||||
every { userWalletsStore.getSyncStrict(key = params.userWalletId) } returns mockUserWallet
|
every { userWalletsListRepository.getSyncStrict(id = params.userWalletId) } returns mockUserWallet
|
||||||
coEvery { walletAccountsFetcher.fetch(userWalletId = params.userWalletId) } returns response
|
coEvery { walletAccountsFetcher.fetch(userWalletId = params.userWalletId) } returns response
|
||||||
coEvery { expressServiceFetcher.fetch(userWallet = mockUserWallet, assetIds = emptySet()) } returns Unit.right()
|
coEvery { expressServiceFetcher.fetch(userWallet = mockUserWallet, assetIds = emptySet()) } returns Unit.right()
|
||||||
|
|
||||||
|
|
@ -77,7 +77,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
|
||||||
assertEitherRight(actual)
|
assertEitherRight(actual)
|
||||||
|
|
||||||
coVerify(ordering = Ordering.SEQUENCE) {
|
coVerify(ordering = Ordering.SEQUENCE) {
|
||||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||||
walletAccountsFetcher.fetch(userWalletId = params.userWalletId)
|
walletAccountsFetcher.fetch(userWalletId = params.userWalletId)
|
||||||
expressServiceFetcher.fetch(userWallet = mockUserWallet, assetIds = emptySet())
|
expressServiceFetcher.fetch(userWallet = mockUserWallet, assetIds = emptySet())
|
||||||
}
|
}
|
||||||
|
|
@ -90,7 +90,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
|
||||||
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns true }
|
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns true }
|
||||||
val error = RuntimeException("fetch error")
|
val error = RuntimeException("fetch error")
|
||||||
|
|
||||||
every { userWalletsStore.getSyncStrict(key = params.userWalletId) } returns mockUserWallet
|
every { userWalletsListRepository.getSyncStrict(id = params.userWalletId) } returns mockUserWallet
|
||||||
coEvery { walletAccountsFetcher.fetch(userWalletId = params.userWalletId) } throws error
|
coEvery { walletAccountsFetcher.fetch(userWalletId = params.userWalletId) } throws error
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -101,7 +101,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
|
||||||
assertEither(actual, expected)
|
assertEither(actual, expected)
|
||||||
|
|
||||||
coVerify(ordering = Ordering.SEQUENCE) {
|
coVerify(ordering = Ordering.SEQUENCE) {
|
||||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||||
walletAccountsFetcher.fetch(userWalletId = params.userWalletId)
|
walletAccountsFetcher.fetch(userWalletId = params.userWalletId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ import com.tangem.datasource.api.common.response.ApiResponseError
|
||||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||||
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
||||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||||
import com.tangem.domain.demo.models.DemoConfig
|
import com.tangem.domain.demo.models.DemoConfig
|
||||||
import com.tangem.domain.express.ExpressServiceFetcher
|
import com.tangem.domain.express.ExpressServiceFetcher
|
||||||
import com.tangem.domain.express.models.ExpressAsset
|
import com.tangem.domain.express.models.ExpressAsset
|
||||||
|
|
@ -38,7 +38,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
private val cryptoCurrencyFactory = MockCryptoCurrencyFactory()
|
private val cryptoCurrencyFactory = MockCryptoCurrencyFactory()
|
||||||
private val userTokensResponseFactory = UserTokensResponseFactory()
|
private val userTokensResponseFactory = UserTokensResponseFactory()
|
||||||
|
|
||||||
private val userWalletsStore: UserWalletsStore = mockk(relaxUnitFun = true)
|
private val userWalletsListRepository: UserWalletsListRepository = mockk(relaxUnitFun = true)
|
||||||
private val tangemTechApi: TangemTechApi = mockk()
|
private val tangemTechApi: TangemTechApi = mockk()
|
||||||
private val customTokensMerger: CustomTokensMerger = mockk()
|
private val customTokensMerger: CustomTokensMerger = mockk()
|
||||||
private val userTokensResponseStore: UserTokensResponseStore = mockk(relaxUnitFun = true)
|
private val userTokensResponseStore: UserTokensResponseStore = mockk(relaxUnitFun = true)
|
||||||
|
|
@ -48,7 +48,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
|
|
||||||
private val fetcher = DefaultMultiWalletCryptoCurrenciesFetcher(
|
private val fetcher = DefaultMultiWalletCryptoCurrenciesFetcher(
|
||||||
demoConfig = DemoConfig,
|
demoConfig = DemoConfig,
|
||||||
userWalletsStore = userWalletsStore,
|
userWalletsListRepository = userWalletsListRepository,
|
||||||
tangemTechApi = tangemTechApi,
|
tangemTechApi = tangemTechApi,
|
||||||
customTokensMerger = customTokensMerger,
|
customTokensMerger = customTokensMerger,
|
||||||
userTokensResponseStore = userTokensResponseStore,
|
userTokensResponseStore = userTokensResponseStore,
|
||||||
|
|
@ -61,7 +61,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
fun resetMocks() {
|
fun resetMocks() {
|
||||||
clearMocks(
|
clearMocks(
|
||||||
userWalletsStore,
|
userWalletsListRepository,
|
||||||
tangemTechApi,
|
tangemTechApi,
|
||||||
userTokensResponseStore,
|
userTokensResponseStore,
|
||||||
userTokensSaver,
|
userTokensSaver,
|
||||||
|
|
@ -79,7 +79,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
every { isMultiCurrency } returns false
|
every { isMultiCurrency } returns false
|
||||||
}
|
}
|
||||||
|
|
||||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
val actual = fetcher(params)
|
val actual = fetcher(params)
|
||||||
|
|
@ -90,7 +90,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
).left()
|
).left()
|
||||||
assertEither(actual, expected)
|
assertEither(actual, expected)
|
||||||
|
|
||||||
verifyOrder { userWalletsStore.getSyncStrict(key = params.userWalletId) }
|
verifyOrder { userWalletsListRepository.getSyncStrict(id = params.userWalletId) }
|
||||||
coVerify(inverse = true) {
|
coVerify(inverse = true) {
|
||||||
userTokensResponseStore.getSyncOrNull(any())
|
userTokensResponseStore.getSyncOrNull(any())
|
||||||
}
|
}
|
||||||
|
|
@ -121,7 +121,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||||
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId) } returns null
|
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId) } returns null
|
||||||
every {
|
every {
|
||||||
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
|
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
|
||||||
|
|
@ -145,7 +145,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
assertEither(actual, expected)
|
assertEither(actual, expected)
|
||||||
|
|
||||||
coVerifyOrder {
|
coVerifyOrder {
|
||||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||||
userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId)
|
userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId)
|
||||||
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
|
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
|
||||||
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = userTokensResponse)
|
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = userTokensResponse)
|
||||||
|
|
@ -169,7 +169,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
data = defaultResponse.copy(group = UserTokensResponse.GroupType.TOKEN),
|
data = defaultResponse.copy(group = UserTokensResponse.GroupType.TOKEN),
|
||||||
)
|
)
|
||||||
|
|
||||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||||
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId) } returns defaultResponse
|
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId) } returns defaultResponse
|
||||||
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
||||||
coEvery {
|
coEvery {
|
||||||
|
|
@ -191,7 +191,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
assertEither(actual, expected)
|
assertEither(actual, expected)
|
||||||
|
|
||||||
coVerifyOrder {
|
coVerifyOrder {
|
||||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||||
userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId)
|
userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId)
|
||||||
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
||||||
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
|
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
|
||||||
|
|
@ -219,7 +219,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
data = defaultResponse.copy(group = UserTokensResponse.GroupType.TOKEN),
|
data = defaultResponse.copy(group = UserTokensResponse.GroupType.TOKEN),
|
||||||
)
|
)
|
||||||
|
|
||||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||||
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
||||||
coEvery {
|
coEvery {
|
||||||
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
|
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
|
||||||
|
|
@ -240,7 +240,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
assertEither(actual, expected)
|
assertEither(actual, expected)
|
||||||
|
|
||||||
coVerifyOrder {
|
coVerifyOrder {
|
||||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||||
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
||||||
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
|
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
|
||||||
userTokensSaver.store(userWalletId = params.userWalletId, response = apiResponse.data)
|
userTokensSaver.store(userWalletId = params.userWalletId, response = apiResponse.data)
|
||||||
|
|
@ -283,7 +283,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||||
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
||||||
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns null
|
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns null
|
||||||
coEvery {
|
coEvery {
|
||||||
|
|
@ -308,7 +308,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
assertEither(actual, expected)
|
assertEither(actual, expected)
|
||||||
|
|
||||||
coVerifyOrder {
|
coVerifyOrder {
|
||||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||||
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
||||||
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
|
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
|
||||||
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = userTokensResponse)
|
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = userTokensResponse)
|
||||||
|
|
@ -337,7 +337,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
cause = ApiResponseError.TimeoutException(),
|
cause = ApiResponseError.TimeoutException(),
|
||||||
) as ApiResponse<UserTokensResponse>
|
) as ApiResponse<UserTokensResponse>
|
||||||
|
|
||||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||||
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
||||||
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns defaultResponse
|
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns defaultResponse
|
||||||
coEvery {
|
coEvery {
|
||||||
|
|
@ -359,7 +359,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
assertEither(actual, expected)
|
assertEither(actual, expected)
|
||||||
|
|
||||||
coVerifyOrder {
|
coVerifyOrder {
|
||||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||||
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
||||||
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
|
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
|
||||||
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = defaultResponse)
|
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = defaultResponse)
|
||||||
|
|
@ -407,7 +407,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||||
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
||||||
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns null
|
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns null
|
||||||
coEvery {
|
coEvery {
|
||||||
|
|
@ -432,7 +432,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
assertEither(actual, expected)
|
assertEither(actual, expected)
|
||||||
|
|
||||||
coVerifyOrder {
|
coVerifyOrder {
|
||||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||||
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
||||||
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
|
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
|
||||||
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
|
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
|
||||||
|
|
@ -463,7 +463,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
),
|
),
|
||||||
) as ApiResponse<UserTokensResponse>
|
) as ApiResponse<UserTokensResponse>
|
||||||
|
|
||||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||||
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
||||||
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns defaultResponse
|
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns defaultResponse
|
||||||
coEvery {
|
coEvery {
|
||||||
|
|
@ -485,7 +485,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
assertEither(actual, expected)
|
assertEither(actual, expected)
|
||||||
|
|
||||||
coVerifyOrder {
|
coVerifyOrder {
|
||||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||||
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
||||||
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
|
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
|
||||||
userTokensSaver.push(userWalletId = params.userWalletId, response = defaultResponse)
|
userTokensSaver.push(userWalletId = params.userWalletId, response = defaultResponse)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue