Updated on 2026-08-14

This commit is contained in:
Tangem 2025-11-07 11:32:19 +04:00
parent b3138bf560
commit 3088258c74
14 changed files with 339 additions and 97 deletions

View file

@ -3,6 +3,7 @@ package com.tangem.data.account.utils
import com.google.common.truth.Truth
import com.tangem.data.account.converter.CryptoPortfolioConverter
import com.tangem.data.account.converter.createWalletAccountDTO
import com.tangem.data.account.utils.GetWalletAccountsResponseExtTest.Companion.createUserToken
import com.tangem.data.common.currency.UserTokensResponseFactory
import com.tangem.data.common.network.NetworkFactory
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
@ -10,7 +11,6 @@ import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResp
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.account.models.AccountList
import com.tangem.domain.models.account.Account
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId
import io.mockk.*
@ -104,15 +104,16 @@ class DefaultWalletAccountsResponseFactoryTest {
every { walletId } returns userWalletId
}
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
val accounts = AccountList.empty(userWallet.walletId).accounts
.filterIsInstance<Account.CryptoPortfolio>()
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
val token = createUserToken(accountIndex = 0)
val defaultResponse = UserTokensResponse(
group = UserTokensResponse.GroupType.NETWORK,
sort = UserTokensResponse.SortType.BALANCE,
tokens = listOf(mockk(relaxed = true)),
tokens = listOf(token),
)
every {
userTokensResponseFactory.createDefaultResponse(
@ -135,7 +136,7 @@ class DefaultWalletAccountsResponseFactoryTest {
sort = defaultResponse.sort,
totalAccounts = 1,
),
accounts = listOf(accountsDTO),
accounts = listOf(accountsDTO.copy(tokens = listOf(token))),
unassignedTokens = emptyList(),
)
@ -202,24 +203,20 @@ class DefaultWalletAccountsResponseFactoryTest {
val userWallet = mockk<UserWallet>(relaxed = true) {
every { walletId } returns userWalletId
}
val assignedTokens = listOf(mockk<CryptoCurrency.Token>(), mockk<CryptoCurrency.Token>())
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
val userTokensResponse = UserTokensResponse(
group = UserTokensResponse.GroupType.NETWORK,
sort = UserTokensResponse.SortType.BALANCE,
tokens = listOf(mockk(relaxed = true)),
tokens = listOf(
createUserToken(accountIndex = 0),
createUserToken(accountIndex = 1),
),
)
every {
userTokensResponseFactory.createUserTokensResponse(
currencies = assignedTokens,
isGroupedByNetwork = false,
isSortedByBalance = false,
)
} returns userTokensResponse
val accounts = AccountList.empty(userWallet.walletId).accounts
.filterIsInstance<Account.CryptoPortfolio>()
val accountsDTO = createWalletAccountDTO(userWalletId)
val accountsDTO = createWalletAccountDTO(userWalletId = userWalletId)
every { cryptoPortfolioConverter.convertListBack(accounts) } returns listOf(accountsDTO)
// Act
@ -232,7 +229,7 @@ class DefaultWalletAccountsResponseFactoryTest {
sort = userTokensResponse.sort,
totalAccounts = 1,
),
accounts = listOf(accountsDTO),
accounts = listOf(accountsDTO.copy(tokens = userTokensResponse.tokens)),
unassignedTokens = emptyList(),
)
Truth.assertThat(actual).isEqualTo(expected)

View file

@ -70,9 +70,9 @@ class GetWalletAccountsResponseExtTest {
@Test
fun `flattenTokens returns all tokens from multiple accounts`() {
// Arrange
val token1 = createUserToken(id = "0")
val token2 = createUserToken(id = "1")
val token3 = createUserToken(id = "2")
val token1 = createUserToken(accountIndex = 0)
val token2 = createUserToken(accountIndex = 1)
val token3 = createUserToken(accountIndex = 2)
val account1 = createWalletAccountDTO(derivationIndex = 0, tokens = listOf(token1, token2))
val account2 = createWalletAccountDTO(derivationIndex = 1, tokens = listOf(token3))
@ -131,10 +131,9 @@ class GetWalletAccountsResponseExtTest {
@Test
fun `toUserTokensResponse includes tokens from accounts and unassignedTokens`() {
// Arrange
val token1 = createUserToken(id = "0")
val token2 = createUserToken(id = "1")
val token1 = createUserToken(accountIndex = 0)
val token2 = createUserToken(accountIndex = 1)
val account = createWalletAccountDTO(derivationIndex = 0, tokens = listOf(token1))
val unassignedToken = token2
val response = GetWalletAccountsResponse(
wallet = GetWalletAccountsResponse.Wallet(
@ -144,7 +143,7 @@ class GetWalletAccountsResponseExtTest {
totalAccounts = 1,
),
accounts = listOf(account),
unassignedTokens = listOf(unassignedToken),
unassignedTokens = listOf(token2),
)
// Act
@ -169,8 +168,8 @@ class GetWalletAccountsResponseExtTest {
fun `assignTokens correctly assigns tokens to accounts`() {
// Arrange
val accountId = "957B88B12730E646E0F33D3618B77DFA579E8231E3C59C7104BE7165611C8027"
val token1 = createUserToken(id = "0", accountId = null)
val token2 = createUserToken(id = "1", accountId = null)
val token1 = createUserToken(accountIndex = 0, accountId = null)
val token2 = createUserToken(accountIndex = 1, accountId = null)
val account1 = createWalletAccountDTO(derivationIndex = 0)
val account2 = createWalletAccountDTO(derivationIndex = 1)
val response = GetWalletAccountsResponse(
@ -194,10 +193,13 @@ class GetWalletAccountsResponseExtTest {
account1.copy(
tokens = listOf(
token1.copy(accountId = accountId),
),
),
account2.copy(
tokens = listOf(
token2.copy(accountId = accountId),
),
),
account2,
),
unassignedTokens = emptyList(),
)
@ -232,6 +234,44 @@ class GetWalletAccountsResponseExtTest {
Truth.assertThat(actual).isEqualTo(expected)
}
@Test
fun `unassignedTokens contain tokens for unexisting accounts`() {
// Arrange
val token1 = createUserToken(accountIndex = 0, accountId = null)
val token2 = createUserToken(accountIndex = 3, accountId = null)
val account = createWalletAccountDTO(derivationIndex = 0)
val response = GetWalletAccountsResponse(
wallet = GetWalletAccountsResponse.Wallet(
version = 1,
group = UserTokensResponse.GroupType.NONE,
sort = UserTokensResponse.SortType.MANUAL,
totalAccounts = 2,
),
accounts = listOf(account),
unassignedTokens = listOf(token1, token2),
)
// Act
val actual = response.assignTokens(userWalletId)
// Assert
val expected = GetWalletAccountsResponse(
wallet = response.wallet,
accounts = listOf(
account.copy(
tokens = listOf(
token1.copy(accountId = "957B88B12730E646E0F33D3618B77DFA579E8231E3C59C7104BE7165611C8027"),
token2.copy(accountId = "957B88B12730E646E0F33D3618B77DFA579E8231E3C59C7104BE7165611C8027"),
),
),
),
unassignedTokens = emptyList(),
)
Truth.assertThat(actual).isEqualTo(expected)
}
}
@Nested
@ -242,8 +282,8 @@ class GetWalletAccountsResponseExtTest {
fun `assignTokens correctly assigns tokens to accounts`() {
// Arrange
val accountId = "957B88B12730E646E0F33D3618B77DFA579E8231E3C59C7104BE7165611C8027"
val token1 = createUserToken(id = "0", accountId = null)
val token2 = createUserToken(id = "1", accountId = null)
val token1 = createUserToken(accountIndex = 0, accountId = null)
val token2 = createUserToken(accountIndex = 1, accountId = null)
val account1 = createWalletAccountDTO(derivationIndex = 0)
val account2 = createWalletAccountDTO(derivationIndex = 1)
@ -258,10 +298,13 @@ class GetWalletAccountsResponseExtTest {
account1.copy(
tokens = listOf(
token1.copy(accountId = accountId),
),
),
account2.copy(
tokens = listOf(
token2.copy(accountId = accountId),
),
),
account2,
)
Truth.assertThat(actual).isEqualTo(expected)
@ -271,7 +314,7 @@ class GetWalletAccountsResponseExtTest {
fun `assignTokens does not change accounts if there are no unassignedTokens`() {
// Arrange
val accountId = "957B88B12730E646E0F33D3618B77DFA579E8231E3C59C7104BE7165611C8027"
val token1 = createUserToken(id = "0", accountId = accountId)
val token1 = createUserToken(accountIndex = 0, accountId = accountId)
val account1 = createWalletAccountDTO(derivationIndex = 0)
// Act
@ -308,19 +351,19 @@ class GetWalletAccountsResponseExtTest {
totalNetworks = 1,
)
private fun createUserToken(id: String, accountId: String? = "account_id") = UserTokensResponse.Token(
id = id,
accountId = accountId,
networkId = "ethereum",
derivationPath = "m/44'/60'/0'/0/0",
name = "Token",
symbol = "T",
contractAddress = "0x$id",
decimals = 18,
)
companion object {
private companion object {
private val userWalletId = UserWalletId("011")
val userWalletId = UserWalletId("011")
fun createUserToken(accountIndex: Int, accountId: String? = "account_id") = UserTokensResponse.Token(
id = accountIndex.toString(),
accountId = accountId,
networkId = "ethereum",
derivationPath = "m/44'/60'/0'/0/$accountIndex",
name = "Token",
symbol = "T",
contractAddress = "0x$accountIndex",
decimals = 18,
)
}
}