Updated on 2026-08-14
This commit is contained in:
parent
7e375ac36b
commit
1906481ac6
11 changed files with 28 additions and 2633 deletions
|
|
@ -38,6 +38,16 @@ subprojects {
|
||||||
testLogging {
|
testLogging {
|
||||||
exceptionFormat = TestExceptionFormat.FULL
|
exceptionFormat = TestExceptionFormat.FULL
|
||||||
showStandardStreams = true
|
showStandardStreams = true
|
||||||
|
|
||||||
|
afterSuite(KotlinClosure2<TestDescriptor, TestResult, Unit>({ desc, result ->
|
||||||
|
if (desc.parent == null) { // will match the outermost suite
|
||||||
|
val output = "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} passed, ${result.failedTestCount} failed, ${result.skippedTestCount} skipped)"
|
||||||
|
val startItem = "| "
|
||||||
|
val endItem = " |"
|
||||||
|
val repeatLength = startItem.length + output.length + endItem.length
|
||||||
|
println("\n" + "-".repeat(repeatLength) + "\n" + startItem + output + endItem + "\n" + "-".repeat(repeatLength))
|
||||||
|
}
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package com.tangem.data.account.fetcher
|
||||||
|
|
||||||
import com.google.common.truth.Truth
|
import com.google.common.truth.Truth
|
||||||
import com.tangem.data.account.converter.createGetWalletAccountsResponse
|
import com.tangem.data.account.converter.createGetWalletAccountsResponse
|
||||||
|
import com.tangem.data.account.converter.createWalletAccountDTO
|
||||||
import com.tangem.data.account.store.AccountsResponseStore
|
import com.tangem.data.account.store.AccountsResponseStore
|
||||||
import com.tangem.data.account.store.AccountsResponseStoreFactory
|
import com.tangem.data.account.store.AccountsResponseStoreFactory
|
||||||
import com.tangem.data.common.cache.etag.ETagsStore
|
import com.tangem.data.common.cache.etag.ETagsStore
|
||||||
|
|
@ -13,7 +14,6 @@ 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.api.tangemTech.models.account.GetWalletAccountsResponse
|
import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse
|
||||||
import com.tangem.datasource.api.tangemTech.models.account.SaveWalletAccountsResponse
|
import com.tangem.datasource.api.tangemTech.models.account.SaveWalletAccountsResponse
|
||||||
import com.tangem.datasource.api.tangemTech.models.account.WalletAccountDTO
|
|
||||||
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
|
||||||
import io.mockk.*
|
import io.mockk.*
|
||||||
|
|
@ -24,6 +24,7 @@ import org.junit.jupiter.api.*
|
||||||
/**
|
/**
|
||||||
[REDACTED_AUTHOR]
|
[REDACTED_AUTHOR]
|
||||||
*/
|
*/
|
||||||
|
@Suppress("Unchecked_Cast", "UnusedFlow")
|
||||||
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
||||||
class DefaultWalletAccountsFetcherTest {
|
class DefaultWalletAccountsFetcherTest {
|
||||||
|
|
||||||
|
|
@ -78,10 +79,13 @@ class DefaultWalletAccountsFetcherTest {
|
||||||
val savedAccountsResponse = null
|
val savedAccountsResponse = null
|
||||||
val unassignedToken = createToken(accountId = null)
|
val unassignedToken = createToken(accountId = null)
|
||||||
|
|
||||||
|
val accounts = listOf(createWalletAccountDTO(userWalletId = userWalletId, tokens = null))
|
||||||
val accountsResponse = createGetWalletAccountsResponse(
|
val accountsResponse = createGetWalletAccountsResponse(
|
||||||
userWalletId = userWalletId,
|
userWalletId = userWalletId,
|
||||||
unassignedTokens = listOf(unassignedToken),
|
unassignedTokens = listOf(unassignedToken),
|
||||||
)
|
)
|
||||||
|
.copy(accounts = accounts)
|
||||||
|
|
||||||
val newETag = "newEtag"
|
val newETag = "newEtag"
|
||||||
val apiResponse = ApiResponse.Success(
|
val apiResponse = ApiResponse.Success(
|
||||||
data = accountsResponse,
|
data = accountsResponse,
|
||||||
|
|
@ -124,12 +128,6 @@ class DefaultWalletAccountsFetcherTest {
|
||||||
eTagsStore.store(userWalletId = userWalletId, key = ETagsStore.Key.WalletAccounts, value = newETag)
|
eTagsStore.store(userWalletId = userWalletId, key = ETagsStore.Key.WalletAccounts, value = newETag)
|
||||||
accountsResponseStoreFactory.create(userWalletId = userWalletId)
|
accountsResponseStoreFactory.create(userWalletId = userWalletId)
|
||||||
accountsResponseStore.updateData(any())
|
accountsResponseStore.updateData(any())
|
||||||
eTagsStore.getSyncOrNull(userWalletId = userWalletId, key = ETagsStore.Key.WalletAccounts)
|
|
||||||
tangemTechApi.saveWalletAccounts(
|
|
||||||
walletId = userWalletId.stringValue,
|
|
||||||
eTag = eTag,
|
|
||||||
body = SaveWalletAccountsResponse(updatedAccountsResponse.accounts),
|
|
||||||
)
|
|
||||||
accountsResponseStoreFactory.create(userWalletId = userWalletId)
|
accountsResponseStoreFactory.create(userWalletId = userWalletId)
|
||||||
accountsResponseStore.updateData(any())
|
accountsResponseStore.updateData(any())
|
||||||
}
|
}
|
||||||
|
|
@ -199,7 +197,7 @@ class DefaultWalletAccountsFetcherTest {
|
||||||
fun `fetch should call error handler when getWalletAccounts returns error`() = runTest {
|
fun `fetch should call error handler when getWalletAccounts returns error`() = runTest {
|
||||||
// Arrange
|
// Arrange
|
||||||
val savedAccountsResponse = null
|
val savedAccountsResponse = null
|
||||||
val apiError = ApiResponse.Error(ApiResponseError.NetworkException)
|
val apiError = ApiResponse.Error(ApiResponseError.NetworkException())
|
||||||
|
|
||||||
accountsResponseStoreFlow.value = savedAccountsResponse
|
accountsResponseStoreFlow.value = savedAccountsResponse
|
||||||
|
|
||||||
|
|
@ -232,87 +230,6 @@ class DefaultWalletAccountsFetcherTest {
|
||||||
userTokensSaver.push(userWalletId = any(), response = any())
|
userTokensSaver.push(userWalletId = any(), response = any())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `push should throw error when saveWalletAccounts returns PRECONDITION_FAILED`() = runTest {
|
|
||||||
// Arrange
|
|
||||||
val savedAccountsResponse = null
|
|
||||||
val unassignedToken = createToken(accountId = null)
|
|
||||||
|
|
||||||
val accountsResponse = createGetWalletAccountsResponse(
|
|
||||||
userWalletId = userWalletId,
|
|
||||||
unassignedTokens = listOf(unassignedToken),
|
|
||||||
)
|
|
||||||
|
|
||||||
val newETag = "newEtag"
|
|
||||||
val apiResponse = ApiResponse.Success(
|
|
||||||
data = accountsResponse,
|
|
||||||
headers = mapOf(ETAG_HEADER to listOf(newETag)),
|
|
||||||
)
|
|
||||||
|
|
||||||
val apiError = ApiResponseError.HttpException(
|
|
||||||
code = ApiResponseError.HttpException.Code.PRECONDITION_FAILED,
|
|
||||||
message = null,
|
|
||||||
errorBody = null,
|
|
||||||
)
|
|
||||||
val saveApiResponse = ApiResponse.Error(apiError)
|
|
||||||
|
|
||||||
accountsResponseStoreFlow.value = savedAccountsResponse
|
|
||||||
|
|
||||||
val accountId = "957B88B12730E646E0F33D3618B77DFA579E8231E3C59C7104BE7165611C8027"
|
|
||||||
val updatedAccountsResponse = accountsResponse.copy(
|
|
||||||
accounts = accountsResponse.accounts.map {
|
|
||||||
it.copy(tokens = listOf(unassignedToken.copy(accountId = accountId)))
|
|
||||||
},
|
|
||||||
unassignedTokens = emptyList(),
|
|
||||||
)
|
|
||||||
|
|
||||||
coEvery {
|
|
||||||
tangemTechApi.getWalletAccounts(walletId = userWalletId.stringValue, eTag = eTag)
|
|
||||||
} returns apiResponse
|
|
||||||
|
|
||||||
coEvery { accountsResponseStore.updateData(any()) } returns accountsResponse
|
|
||||||
|
|
||||||
coEvery {
|
|
||||||
tangemTechApi.saveWalletAccounts(
|
|
||||||
walletId = userWalletId.stringValue,
|
|
||||||
eTag = eTag,
|
|
||||||
body = SaveWalletAccountsResponse(updatedAccountsResponse.accounts),
|
|
||||||
)
|
|
||||||
} returns saveApiResponse as ApiResponse<Unit>
|
|
||||||
|
|
||||||
// Act
|
|
||||||
val actual = runCatching { fetcher.fetch(userWalletId) }.exceptionOrNull()!!
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Truth.assertThat(actual).isEqualTo(apiError)
|
|
||||||
|
|
||||||
coVerifyOrder {
|
|
||||||
accountsResponseStoreFactory.create(userWalletId = userWalletId)
|
|
||||||
accountsResponseStore.data
|
|
||||||
eTagsStore.getSyncOrNull(userWalletId = userWalletId, key = ETagsStore.Key.WalletAccounts)
|
|
||||||
tangemTechApi.getWalletAccounts(walletId = userWalletId.stringValue, eTag = eTag)
|
|
||||||
eTagsStore.store(userWalletId = userWalletId, key = ETagsStore.Key.WalletAccounts, value = newETag)
|
|
||||||
accountsResponseStoreFactory.create(userWalletId = userWalletId)
|
|
||||||
accountsResponseStore.updateData(any())
|
|
||||||
eTagsStore.getSyncOrNull(userWalletId = userWalletId, key = ETagsStore.Key.WalletAccounts)
|
|
||||||
tangemTechApi.saveWalletAccounts(
|
|
||||||
walletId = userWalletId.stringValue,
|
|
||||||
eTag = eTag,
|
|
||||||
body = SaveWalletAccountsResponse(updatedAccountsResponse.accounts),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
coVerify(inverse = true) {
|
|
||||||
fetchWalletAccountsErrorHandler.handle(
|
|
||||||
error = any(),
|
|
||||||
userWalletId = any(),
|
|
||||||
savedAccountsResponse = any(),
|
|
||||||
pushWalletAccounts = any(),
|
|
||||||
storeWalletAccounts = any(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nested
|
@Nested
|
||||||
|
|
@ -343,9 +260,7 @@ class DefaultWalletAccountsFetcherTest {
|
||||||
@Test
|
@Test
|
||||||
fun `push should call saveWalletAccounts with correct params`() = runTest {
|
fun `push should call saveWalletAccounts with correct params`() = runTest {
|
||||||
// Arrange
|
// Arrange
|
||||||
val accounts = listOf(
|
val accounts = listOf(createWalletAccountDTO(userWalletId = userWalletId, tokens = null))
|
||||||
mockk<WalletAccountDTO>(),
|
|
||||||
)
|
|
||||||
val response = SaveWalletAccountsResponse(accounts)
|
val response = SaveWalletAccountsResponse(accounts)
|
||||||
|
|
||||||
coEvery {
|
coEvery {
|
||||||
|
|
@ -373,7 +288,7 @@ class DefaultWalletAccountsFetcherTest {
|
||||||
fun `push should throw error when saveWalletAccounts returns PRECONDITION_FAILED`() = runTest {
|
fun `push should throw error when saveWalletAccounts returns PRECONDITION_FAILED`() = runTest {
|
||||||
// Arrange
|
// Arrange
|
||||||
val accounts = listOf(
|
val accounts = listOf(
|
||||||
mockk<WalletAccountDTO>(),
|
createWalletAccountDTO(userWalletId = userWalletId, tokens = null),
|
||||||
)
|
)
|
||||||
val response = SaveWalletAccountsResponse(accounts)
|
val response = SaveWalletAccountsResponse(accounts)
|
||||||
val apiError = ApiResponseError.HttpException(
|
val apiError = ApiResponseError.HttpException(
|
||||||
|
|
@ -405,10 +320,8 @@ class DefaultWalletAccountsFetcherTest {
|
||||||
@Test
|
@Test
|
||||||
fun `pushAndStore should call push and store with correct params`() = runTest {
|
fun `pushAndStore should call push and store with correct params`() = runTest {
|
||||||
// Arrange
|
// Arrange
|
||||||
listOf(
|
val accounts = listOf(createWalletAccountDTO(userWalletId = userWalletId, tokens = null))
|
||||||
mockk<WalletAccountDTO>(),
|
val response = createGetWalletAccountsResponse(userWalletId).copy(accounts = accounts)
|
||||||
)
|
|
||||||
val response = createGetWalletAccountsResponse(userWalletId)
|
|
||||||
|
|
||||||
coEvery {
|
coEvery {
|
||||||
tangemTechApi.saveWalletAccounts(
|
tangemTechApi.saveWalletAccounts(
|
||||||
|
|
|
||||||
|
|
@ -158,7 +158,7 @@ class FetchWalletAccountsErrorHandlerTest {
|
||||||
@Test
|
@Test
|
||||||
fun `uses default accounts when savedAccountsResponse is null`() = runTest {
|
fun `uses default accounts when savedAccountsResponse is null`() = runTest {
|
||||||
// Arrange
|
// Arrange
|
||||||
val error = ApiResponseError.TimeoutException
|
val error = ApiResponseError.TimeoutException()
|
||||||
|
|
||||||
val accounts = AccountList.empty(userWallet).accounts
|
val accounts = AccountList.empty(userWallet).accounts
|
||||||
.filterIsInstance<Account.CryptoPortfolio>()
|
.filterIsInstance<Account.CryptoPortfolio>()
|
||||||
|
|
|
||||||
|
|
@ -309,7 +309,7 @@ internal class DefaultMultiYieldBalanceFetcherTest {
|
||||||
val requests = setOf(tonId, solanaId).map(YieldBalanceRequestBodyFactory::create)
|
val requests = setOf(tonId, solanaId).map(YieldBalanceRequestBodyFactory::create)
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
val errorResponse = ApiResponse.Error(ApiResponseError.NetworkException)
|
val errorResponse = ApiResponse.Error(ApiResponseError.NetworkException())
|
||||||
as ApiResponse<Set<YieldBalanceWrapperDTO>>
|
as ApiResponse<Set<YieldBalanceWrapperDTO>>
|
||||||
|
|
||||||
coEvery { stakeKitApi.getMultipleYieldBalances(requests) } returns errorResponse
|
coEvery { stakeKitApi.getMultipleYieldBalances(requests) } returns errorResponse
|
||||||
|
|
@ -328,7 +328,7 @@ internal class DefaultMultiYieldBalanceFetcherTest {
|
||||||
|
|
||||||
coVerify(inverse = true) { yieldsBalancesStore.storeActual(userWalletId = any(), values = any()) }
|
coVerify(inverse = true) { yieldsBalancesStore.storeActual(userWalletId = any(), values = any()) }
|
||||||
|
|
||||||
val expected = ApiResponseError.NetworkException
|
val expected = ApiResponseError.NetworkException()
|
||||||
|
|
||||||
assertEitherLeft(actual, expected)
|
assertEitherLeft(actual, expected)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -246,7 +246,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
val apiResponse = ApiResponse.Error(
|
val apiResponse = ApiResponse.Error(
|
||||||
cause = ApiResponseError.TimeoutException,
|
cause = ApiResponseError.TimeoutException(),
|
||||||
) as ApiResponse<UserTokensResponse>
|
) as ApiResponse<UserTokensResponse>
|
||||||
|
|
||||||
val defaultCoins = listOf(
|
val defaultCoins = listOf(
|
||||||
|
|
@ -307,7 +307,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
val apiResponse = ApiResponse.Error(
|
val apiResponse = ApiResponse.Error(
|
||||||
cause = ApiResponseError.TimeoutException,
|
cause = ApiResponseError.TimeoutException(),
|
||||||
) as ApiResponse<UserTokensResponse>
|
) as ApiResponse<UserTokensResponse>
|
||||||
|
|
||||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||||
|
|
|
||||||
|
|
@ -114,7 +114,7 @@ internal class CustomTokensMergerTest {
|
||||||
)
|
)
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
val apiResponse = ApiResponse.Error(ApiResponseError.TimeoutException) as ApiResponse<CoinsResponse>
|
val apiResponse = ApiResponse.Error(ApiResponseError.TimeoutException()) as ApiResponse<CoinsResponse>
|
||||||
|
|
||||||
coEvery {
|
coEvery {
|
||||||
tangemTechApi.getCoins(contractAddress = customToken.contractAddress, networkIds = customToken.networkId)
|
tangemTechApi.getCoins(contractAddress = customToken.contractAddress, networkIds = customToken.networkId)
|
||||||
|
|
|
||||||
|
|
@ -22,8 +22,7 @@ platform :android do
|
||||||
FileUtils.cp("../app/src/main/assets/tangem-app-config/android/google-services/dev/google-services.json", "../app")
|
FileUtils.cp("../app/src/main/assets/tangem-app-config/android/google-services/dev/google-services.json", "../app")
|
||||||
FileUtils.cp("../tangem-android-tools/CI/gradle_properties/tests_ci_gradle.properties", "../gradle.properties")
|
FileUtils.cp("../tangem-android-tools/CI/gradle_properties/tests_ci_gradle.properties", "../gradle.properties")
|
||||||
puts File.read("../gradle.properties")
|
puts File.read("../gradle.properties")
|
||||||
gradle(task: "detekt")
|
gradle(task: "detekt detektGoogleDebug --continue")
|
||||||
gradle(task: "detektGoogleDebug")
|
|
||||||
end
|
end
|
||||||
|
|
||||||
desc "Run tests"
|
desc "Run tests"
|
||||||
|
|
@ -31,7 +30,7 @@ platform :android do
|
||||||
FileUtils.cp("../app/src/main/assets/tangem-app-config/android/google-services/dev/google-services.json", "../app")
|
FileUtils.cp("../app/src/main/assets/tangem-app-config/android/google-services/dev/google-services.json", "../app")
|
||||||
FileUtils.cp("../tangem-android-tools/CI/gradle_properties/tests_ci_gradle.properties", "../gradle.properties")
|
FileUtils.cp("../tangem-android-tools/CI/gradle_properties/tests_ci_gradle.properties", "../gradle.properties")
|
||||||
puts File.read("../gradle.properties")
|
puts File.read("../gradle.properties")
|
||||||
gradle(task: "testGoogleDebugUnitTest")
|
gradle(task: "testGoogleDebugUnitTest testDebugUnitTest --continue")
|
||||||
end
|
end
|
||||||
|
|
||||||
desc "Build internal APK Firebase App Distribution"
|
desc "Build internal APK Firebase App Distribution"
|
||||||
|
|
|
||||||
|
|
@ -1,821 +0,0 @@
|
||||||
package com.tangem.features.send.v2.send.confirm.model.transformers
|
|
||||||
|
|
||||||
import com.google.common.truth.Truth.assertThat
|
|
||||||
import com.tangem.blockchain.common.Amount
|
|
||||||
import com.tangem.blockchain.common.transaction.Fee
|
|
||||||
import com.tangem.blockchain.common.transaction.TransactionFee
|
|
||||||
import com.tangem.common.ui.notifications.NotificationUM
|
|
||||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
|
||||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
|
||||||
import com.tangem.domain.models.currency.CryptoCurrency
|
|
||||||
import com.tangem.features.send.v2.api.entity.*
|
|
||||||
import com.tangem.features.send.v2.common.ui.state.ConfirmUM
|
|
||||||
import com.tangem.features.send.v2.sendnft.confirm.model.transformers.NFTSendConfirmationNotificationsTransformerV2
|
|
||||||
import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeSelectorUM
|
|
||||||
import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeType
|
|
||||||
import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeUM
|
|
||||||
import io.mockk.mockk
|
|
||||||
import io.mockk.verify
|
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
|
||||||
import kotlinx.coroutines.test.runTest
|
|
||||||
import org.junit.jupiter.api.BeforeAll
|
|
||||||
import org.junit.jupiter.api.Test
|
|
||||||
import java.math.BigDecimal
|
|
||||||
import java.math.BigInteger
|
|
||||||
import java.util.Locale
|
|
||||||
import com.tangem.features.send.v2.api.entity.FeeSelectorUM as FeeSelectorUMV2
|
|
||||||
|
|
||||||
class NFTSendConfirmNotificationsTransformersComparisonTest {
|
|
||||||
|
|
||||||
private val analyticsEventHandler: AnalyticsEventHandler = mockk(relaxed = true)
|
|
||||||
private val cryptoCurrency: CryptoCurrency = mockk(relaxed = true)
|
|
||||||
private val appCurrency = AppCurrency(name = "US Dollar", code = "USD", symbol = "$")
|
|
||||||
private val analyticsCategoryName = "test_category"
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN equivalent input data WHEN both transformers transform THEN they produce equal ConfirmUM`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val initialConfirmUM = createTestConfirmUM()
|
|
||||||
|
|
||||||
val feeUM = createTestFeeUM()
|
|
||||||
val feeSelectorUMV2 = createTestFeeSelectorUMV2()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val transformerV1 = NFTSendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val transformerV2 = NFTSendConfirmationNotificationsTransformerV2(
|
|
||||||
feeSelectorUM = feeSelectorUMV2,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val resultV1 = transformerV1.transform(initialConfirmUM)
|
|
||||||
val resultV2 = transformerV2.transform(initialConfirmUM)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(resultV1).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
assertThat(resultV2).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
|
|
||||||
val contentV1 = resultV1 as ConfirmUM.Content
|
|
||||||
val contentV2 = resultV2 as ConfirmUM.Content
|
|
||||||
|
|
||||||
assertThat(contentV1.isPrimaryButtonEnabled).isEqualTo(contentV2.isPrimaryButtonEnabled)
|
|
||||||
assertThat(contentV1.notifications.size).isEqualTo(contentV2.notifications.size)
|
|
||||||
assertThat(contentV1.sendingFooter).isEqualTo(contentV2.sendingFooter)
|
|
||||||
assertThat(contentV1.isPrimaryButtonEnabled).isEqualTo(contentV2.isPrimaryButtonEnabled)
|
|
||||||
assertThat(contentV1.isSending).isEqualTo(contentV2.isSending)
|
|
||||||
assertThat(contentV1.showTapHelp).isEqualTo(contentV2.showTapHelp)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN fee too low WHEN both transformers transform THEN they produce equal notifications`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val initialConfirmUM = createTestConfirmUM()
|
|
||||||
|
|
||||||
val feeUM = createFeeTooLowUM()
|
|
||||||
val feeSelectorUMV2 = createFeeTooLowUMV2()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val transformerV1 = NFTSendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val transformerV2 = NFTSendConfirmationNotificationsTransformerV2(
|
|
||||||
feeSelectorUM = feeSelectorUMV2,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val resultV1 = transformerV1.transform(initialConfirmUM)
|
|
||||||
val resultV2 = transformerV2.transform(initialConfirmUM)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(resultV1).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
assertThat(resultV2).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
|
|
||||||
val contentV1 = resultV1 as ConfirmUM.Content
|
|
||||||
val contentV2 = resultV2 as ConfirmUM.Content
|
|
||||||
|
|
||||||
assertThat(contentV1.isPrimaryButtonEnabled).isTrue()
|
|
||||||
assertThat(contentV2.isPrimaryButtonEnabled).isTrue()
|
|
||||||
assertThat(contentV1.notifications).hasSize(1)
|
|
||||||
assertThat(contentV2.notifications).hasSize(1)
|
|
||||||
assertThat(contentV1.notifications.first()).isInstanceOf(NotificationUM.Warning.FeeTooLow::class.java)
|
|
||||||
assertThat(contentV2.notifications.first()).isInstanceOf(NotificationUM.Warning.FeeTooLow::class.java)
|
|
||||||
assertThat(contentV1.sendingFooter).isEqualTo(contentV2.sendingFooter)
|
|
||||||
|
|
||||||
// Verify analytics event was sent for both transformers
|
|
||||||
verify(exactly = 2) { analyticsEventHandler.send(any()) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN fee too high WHEN both transformers transform THEN they produce equal notifications`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val initialConfirmUM = createTestConfirmUM()
|
|
||||||
|
|
||||||
val feeUM = createFeeTooHighUM()
|
|
||||||
val feeSelectorUMV2 = createFeeTooHighUMV2()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val transformerV1 = NFTSendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val transformerV2 = NFTSendConfirmationNotificationsTransformerV2(
|
|
||||||
feeSelectorUM = feeSelectorUMV2,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val resultV1 = transformerV1.transform(initialConfirmUM)
|
|
||||||
val resultV2 = transformerV2.transform(initialConfirmUM)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(resultV1).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
assertThat(resultV2).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
|
|
||||||
val contentV1 = resultV1 as ConfirmUM.Content
|
|
||||||
val contentV2 = resultV2 as ConfirmUM.Content
|
|
||||||
|
|
||||||
assertThat(contentV1.isPrimaryButtonEnabled).isTrue()
|
|
||||||
assertThat(contentV2.isPrimaryButtonEnabled).isTrue()
|
|
||||||
assertThat(contentV1.notifications).hasSize(1)
|
|
||||||
assertThat(contentV2.notifications).hasSize(1)
|
|
||||||
assertThat(contentV1.notifications.first()).isInstanceOf(NotificationUM.Warning.TooHigh::class.java)
|
|
||||||
assertThat(contentV2.notifications.first()).isInstanceOf(NotificationUM.Warning.TooHigh::class.java)
|
|
||||||
|
|
||||||
val tooHighV1 = contentV1.notifications.first() as NotificationUM.Warning.TooHigh
|
|
||||||
val tooHighV2 = contentV2.notifications.first() as NotificationUM.Warning.TooHigh
|
|
||||||
assertThat(tooHighV1.value).isEqualTo(tooHighV2.value)
|
|
||||||
assertThat(contentV1.sendingFooter).isEqualTo(contentV2.sendingFooter)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN fee both too high and too low WHEN both transformers transform THEN they produce equal notifications`() =
|
|
||||||
runTest {
|
|
||||||
// GIVEN
|
|
||||||
val initialConfirmUM = createTestConfirmUM()
|
|
||||||
|
|
||||||
val feeUM = createFeeTooHighAndTooLowUM()
|
|
||||||
val feeSelectorUMV2 = createFeeTooHighAndTooLowUMV2()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val transformerV1 = NFTSendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val transformerV2 = NFTSendConfirmationNotificationsTransformerV2(
|
|
||||||
feeSelectorUM = feeSelectorUMV2,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val resultV1 = transformerV1.transform(initialConfirmUM)
|
|
||||||
val resultV2 = transformerV2.transform(initialConfirmUM)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(resultV1).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
assertThat(resultV2).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
|
|
||||||
val contentV1 = resultV1 as ConfirmUM.Content
|
|
||||||
val contentV2 = resultV2 as ConfirmUM.Content
|
|
||||||
|
|
||||||
assertThat(contentV1.isPrimaryButtonEnabled).isTrue()
|
|
||||||
assertThat(contentV2.isPrimaryButtonEnabled).isTrue()
|
|
||||||
assertThat(contentV1.notifications).hasSize(2)
|
|
||||||
assertThat(contentV2.notifications).hasSize(2)
|
|
||||||
|
|
||||||
assertThat(contentV1.notifications.any { it is NotificationUM.Warning.FeeTooLow }).isTrue()
|
|
||||||
assertThat(contentV1.notifications.any { it is NotificationUM.Warning.TooHigh }).isTrue()
|
|
||||||
assertThat(contentV2.notifications.any { it is NotificationUM.Warning.FeeTooLow }).isTrue()
|
|
||||||
assertThat(contentV2.notifications.any { it is NotificationUM.Warning.TooHigh }).isTrue()
|
|
||||||
|
|
||||||
assertThat(contentV1.sendingFooter).isEqualTo(contentV2.sendingFooter)
|
|
||||||
|
|
||||||
verify(exactly = 2) { analyticsEventHandler.send(any()) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN normal fee WHEN both transformers transform THEN they produce equal notifications`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val initialConfirmUM = createTestConfirmUM()
|
|
||||||
|
|
||||||
val feeUM = createNormalFeeUM()
|
|
||||||
val feeSelectorUMV2 = createNormalFeeSelectorUMV2()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val transformerV1 = NFTSendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val transformerV2 = NFTSendConfirmationNotificationsTransformerV2(
|
|
||||||
feeSelectorUM = feeSelectorUMV2,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val resultV1 = transformerV1.transform(initialConfirmUM)
|
|
||||||
val resultV2 = transformerV2.transform(initialConfirmUM)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(resultV1).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
assertThat(resultV2).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
|
|
||||||
val contentV1 = resultV1 as ConfirmUM.Content
|
|
||||||
val contentV2 = resultV2 as ConfirmUM.Content
|
|
||||||
|
|
||||||
assertThat(contentV1.notifications).isEmpty()
|
|
||||||
assertThat(contentV2.notifications).isEmpty()
|
|
||||||
assertThat(contentV1.isPrimaryButtonEnabled).isEqualTo(contentV2.isPrimaryButtonEnabled)
|
|
||||||
assertThat(contentV1.sendingFooter).isEqualTo(contentV2.sendingFooter)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createTestConfirmUM(): ConfirmUM.Content {
|
|
||||||
return ConfirmUM.Content(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
walletName = mockk(relaxed = true),
|
|
||||||
isSending = false,
|
|
||||||
showTapHelp = false,
|
|
||||||
sendingFooter = mockk(relaxed = true),
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createTestFeeUM(): FeeUM.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Single(fee)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Market,
|
|
||||||
selectedFee = fee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.001",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = false,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createTestFeeSelectorUMV2(): FeeSelectorUMV2.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Single(fee)
|
|
||||||
return FeeSelectorUMV2.Content(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
fees = transactionFee,
|
|
||||||
feeItems = persistentListOf(
|
|
||||||
FeeItem.Market(fee),
|
|
||||||
),
|
|
||||||
selectedFeeItem = FeeItem.Market(fee),
|
|
||||||
feeExtraInfo = FeeExtraInfo(
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isTronToken = false,
|
|
||||||
),
|
|
||||||
feeFiatRateUM = FeeFiatRateUM(
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
),
|
|
||||||
feeNonce = FeeNonce.Nonce(
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
onNonceChange = {},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooLowUM(): FeeUM.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.0001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = fee,
|
|
||||||
priority = fee,
|
|
||||||
)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Custom,
|
|
||||||
selectedFee = fee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.0001",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = true,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooLowUMV2(): FeeSelectorUMV2.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.0001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = fee,
|
|
||||||
priority = fee,
|
|
||||||
)
|
|
||||||
return FeeSelectorUMV2.Content(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
fees = transactionFee,
|
|
||||||
feeItems = persistentListOf(
|
|
||||||
FeeItem.Custom(
|
|
||||||
fee = fee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.0001",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
selectedFeeItem = FeeItem.Custom(
|
|
||||||
fee = fee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.0001",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
feeExtraInfo = FeeExtraInfo(
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isTronToken = false,
|
|
||||||
),
|
|
||||||
feeFiatRateUM = FeeFiatRateUM(
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
),
|
|
||||||
feeNonce = FeeNonce.Nonce(
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
onNonceChange = {},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooHighUM(): FeeUM.Content {
|
|
||||||
val priorityFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val customFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.01"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = minimumFee,
|
|
||||||
priority = priorityFee,
|
|
||||||
)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Custom,
|
|
||||||
selectedFee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.01",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = true,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooHighUMV2(): FeeSelectorUMV2.Content {
|
|
||||||
val priorityFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val customFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.01"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = minimumFee,
|
|
||||||
priority = priorityFee,
|
|
||||||
)
|
|
||||||
return FeeSelectorUMV2.Content(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
fees = transactionFee,
|
|
||||||
feeItems = persistentListOf(
|
|
||||||
FeeItem.Custom(
|
|
||||||
fee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.01",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
selectedFeeItem = FeeItem.Custom(
|
|
||||||
fee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.01",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
feeExtraInfo = FeeExtraInfo(
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isTronToken = false,
|
|
||||||
),
|
|
||||||
feeFiatRateUM = FeeFiatRateUM(
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
),
|
|
||||||
feeNonce = FeeNonce.Nonce(
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
onNonceChange = {},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooHighAndTooLowUM(): FeeUM.Content {
|
|
||||||
val priorityFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.01"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val customFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.008"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = minimumFee,
|
|
||||||
priority = priorityFee,
|
|
||||||
)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Custom,
|
|
||||||
selectedFee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.008",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = true,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooHighAndTooLowUMV2(): FeeSelectorUMV2.Content {
|
|
||||||
val priorityFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.01"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val customFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.008"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = minimumFee,
|
|
||||||
priority = priorityFee,
|
|
||||||
)
|
|
||||||
return FeeSelectorUMV2.Content(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
fees = transactionFee,
|
|
||||||
feeItems = persistentListOf(
|
|
||||||
FeeItem.Custom(
|
|
||||||
fee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.008",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
selectedFeeItem = FeeItem.Custom(
|
|
||||||
fee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.008",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
feeExtraInfo = FeeExtraInfo(
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isTronToken = false,
|
|
||||||
),
|
|
||||||
feeFiatRateUM = FeeFiatRateUM(
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
),
|
|
||||||
feeNonce = FeeNonce.Nonce(
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
onNonceChange = {},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createNormalFeeUM(): FeeUM.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Single(fee)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Market,
|
|
||||||
selectedFee = fee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.001",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = false,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createNormalFeeSelectorUMV2(): FeeSelectorUMV2.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Single(fee)
|
|
||||||
return FeeSelectorUMV2.Content(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
fees = transactionFee,
|
|
||||||
feeItems = persistentListOf(
|
|
||||||
FeeItem.Market(fee),
|
|
||||||
),
|
|
||||||
selectedFeeItem = FeeItem.Market(fee),
|
|
||||||
feeExtraInfo = FeeExtraInfo(
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isTronToken = false,
|
|
||||||
),
|
|
||||||
feeFiatRateUM = FeeFiatRateUM(
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
),
|
|
||||||
feeNonce = FeeNonce.Nonce(
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
onNonceChange = {},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
@JvmStatic
|
|
||||||
@BeforeAll
|
|
||||||
fun setUpLocale() {
|
|
||||||
Locale.setDefault(Locale.US)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,380 +0,0 @@
|
||||||
package com.tangem.features.send.v2.send.confirm.model.transformers
|
|
||||||
|
|
||||||
import com.google.common.truth.Truth.assertThat
|
|
||||||
import com.tangem.blockchain.common.transaction.Fee
|
|
||||||
import com.tangem.blockchain.common.transaction.TransactionFee
|
|
||||||
import com.tangem.common.ui.notifications.NotificationUM
|
|
||||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
|
||||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
|
||||||
import com.tangem.domain.models.currency.CryptoCurrency
|
|
||||||
import com.tangem.features.send.v2.api.entity.CustomFeeFieldUM
|
|
||||||
import com.tangem.features.send.v2.common.ui.state.ConfirmUM
|
|
||||||
import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeSelectorUM
|
|
||||||
import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeType
|
|
||||||
import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeUM
|
|
||||||
import io.mockk.mockk
|
|
||||||
import io.mockk.verify
|
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
|
||||||
import kotlinx.coroutines.test.runTest
|
|
||||||
import org.junit.jupiter.api.BeforeAll
|
|
||||||
import org.junit.jupiter.api.Test
|
|
||||||
import java.math.BigDecimal
|
|
||||||
import java.math.BigInteger
|
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
class NFTSendConfirmationNotificationsTransformerTest {
|
|
||||||
|
|
||||||
private val analyticsEventHandler: AnalyticsEventHandler = mockk(relaxed = true)
|
|
||||||
private val cryptoCurrency: CryptoCurrency = mockk(relaxed = true)
|
|
||||||
private val appCurrency = AppCurrency(name = "US Dollar", code = "USD", symbol = "$")
|
|
||||||
private val analyticsCategoryName = "test_category"
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN non content state WHEN transform THEN returns original state`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val feeUM: FeeUM = mockk(relaxed = true)
|
|
||||||
val transformer = NFTSendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
val initialState: ConfirmUM = ConfirmUM.Empty
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val result = transformer.transform(initialState)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(result).isEqualTo(initialState)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN fee UM not content WHEN transform THEN returns original state`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val feeUM: FeeUM = FeeUM.Empty()
|
|
||||||
val transformer = NFTSendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
val initialState: ConfirmUM.Content = createTestConfirmUM()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val result = transformer.transform(initialState)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(result).isEqualTo(initialState)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN normal fee WHEN transform THEN returns state with footer and no notifications`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val feeUM = createNormalFeeUM()
|
|
||||||
val transformer = NFTSendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
val initialState = createTestConfirmUM()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val result = transformer.transform(initialState)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(result).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
val content = result as ConfirmUM.Content
|
|
||||||
assertThat(content.notifications).isEmpty()
|
|
||||||
assertThat(content.sendingFooter).isNotEqualTo(initialState.sendingFooter)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN fee too high WHEN transform THEN returns state with too high notification`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val feeUM = createFeeTooHighUM()
|
|
||||||
val transformer = NFTSendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
val initialState = createTestConfirmUM()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val result = transformer.transform(initialState)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(result).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
val content = result as ConfirmUM.Content
|
|
||||||
assertThat(content.notifications).hasSize(1)
|
|
||||||
assertThat(content.notifications.first()).isInstanceOf(NotificationUM.Warning.TooHigh::class.java)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN fee too low WHEN transform THEN returns state with too low notification`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val feeUM = createFeeTooLowUM()
|
|
||||||
val transformer = NFTSendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
val initialState = createTestConfirmUM()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val result = transformer.transform(initialState)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(result).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
val content = result as ConfirmUM.Content
|
|
||||||
assertThat(content.notifications).hasSize(1)
|
|
||||||
assertThat(content.notifications.first()).isInstanceOf(NotificationUM.Warning.FeeTooLow::class.java)
|
|
||||||
verify { analyticsEventHandler.send(any()) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN both fee too high and too low WHEN transform THEN returns state with both notifications`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val feeUM = createFeeTooHighAndTooLowUM()
|
|
||||||
val transformer = NFTSendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
val initialState = createTestConfirmUM()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val result = transformer.transform(initialState)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(result).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
val content = result as ConfirmUM.Content
|
|
||||||
assertThat(content.notifications).hasSize(2)
|
|
||||||
assertThat(content.notifications.any { it is NotificationUM.Warning.TooHigh }).isTrue()
|
|
||||||
assertThat(content.notifications.any { it is NotificationUM.Warning.FeeTooLow }).isTrue()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createTestConfirmUM(): ConfirmUM.Content {
|
|
||||||
return ConfirmUM.Content(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
walletName = mockk(relaxed = true),
|
|
||||||
isSending = false,
|
|
||||||
showTapHelp = false,
|
|
||||||
sendingFooter = mockk(relaxed = true),
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createNormalFeeUM(): FeeUM.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Single(fee)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Market,
|
|
||||||
selectedFee = fee,
|
|
||||||
customValues = persistentListOf(),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = true,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = false,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooHighUM(): FeeUM.Content {
|
|
||||||
val priorityFee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val customFee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.01"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = minimumFee,
|
|
||||||
priority = priorityFee,
|
|
||||||
)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Custom,
|
|
||||||
selectedFee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.01",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "SOL",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = true,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = false,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooLowUM(): FeeUM.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.0001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = fee,
|
|
||||||
priority = fee,
|
|
||||||
)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Custom,
|
|
||||||
selectedFee = fee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.0001",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "SOL",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = true,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = false,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooHighAndTooLowUM(): FeeUM.Content {
|
|
||||||
val priorityFee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.01"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val customFee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.008"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = minimumFee,
|
|
||||||
priority = priorityFee,
|
|
||||||
)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Custom,
|
|
||||||
selectedFee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.008",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "SOL",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = true,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = false,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
@JvmStatic
|
|
||||||
@BeforeAll
|
|
||||||
fun setUpLocale() {
|
|
||||||
Locale.setDefault(Locale.US)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,885 +0,0 @@
|
||||||
package com.tangem.features.send.v2.send.confirm.model.transformers
|
|
||||||
|
|
||||||
import com.google.common.truth.Truth.assertThat
|
|
||||||
import com.tangem.blockchain.common.Amount
|
|
||||||
import com.tangem.blockchain.common.transaction.Fee
|
|
||||||
import com.tangem.blockchain.common.transaction.TransactionFee
|
|
||||||
import com.tangem.common.ui.amountScreen.models.AmountFieldModel
|
|
||||||
import com.tangem.common.ui.amountScreen.models.AmountState
|
|
||||||
import com.tangem.common.ui.notifications.NotificationUM
|
|
||||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
|
||||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
|
||||||
import com.tangem.domain.models.currency.CryptoCurrency
|
|
||||||
import com.tangem.features.send.v2.api.entity.*
|
|
||||||
import com.tangem.features.send.v2.common.ui.state.ConfirmUM
|
|
||||||
import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeSelectorUM
|
|
||||||
import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeType
|
|
||||||
import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeUM
|
|
||||||
import io.mockk.mockk
|
|
||||||
import io.mockk.verify
|
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
|
||||||
import kotlinx.coroutines.test.runTest
|
|
||||||
import org.junit.jupiter.api.BeforeAll
|
|
||||||
import org.junit.jupiter.api.Test
|
|
||||||
import java.math.BigDecimal
|
|
||||||
import java.math.BigInteger
|
|
||||||
import java.util.Locale
|
|
||||||
import com.tangem.domain.tokens.model.Amount as DomainAmount
|
|
||||||
import com.tangem.features.send.v2.api.entity.FeeSelectorUM as FeeSelectorUMV2
|
|
||||||
|
|
||||||
class SendConfirmNotificationsTransformersComparisonTest {
|
|
||||||
|
|
||||||
private val analyticsEventHandler: AnalyticsEventHandler = mockk(relaxed = true)
|
|
||||||
private val cryptoCurrency: CryptoCurrency = mockk(relaxed = true)
|
|
||||||
private val appCurrency = AppCurrency(name = "US Dollar", code = "USD", symbol = "$")
|
|
||||||
private val analyticsCategoryName = "test_category"
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN equivalent input data WHEN both transformers transform THEN they produce equal ConfirmUM`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val initialConfirmUM = createTestConfirmUM()
|
|
||||||
val amountUM = createTestAmountUM()
|
|
||||||
|
|
||||||
val feeUM = createTestFeeUM()
|
|
||||||
val feeSelectorUMV2 = createTestFeeSelectorUMV2()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val transformerV1 = SendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val transformerV2 = SendConfirmationNotificationsTransformerV2(
|
|
||||||
feeSelectorUM = feeSelectorUMV2,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val resultV1 = transformerV1.transform(initialConfirmUM)
|
|
||||||
val resultV2 = transformerV2.transform(initialConfirmUM)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(resultV1).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
assertThat(resultV2).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
|
|
||||||
val contentV1 = resultV1 as ConfirmUM.Content
|
|
||||||
val contentV2 = resultV2 as ConfirmUM.Content
|
|
||||||
|
|
||||||
assertThat(contentV1.isPrimaryButtonEnabled).isEqualTo(contentV2.isPrimaryButtonEnabled)
|
|
||||||
assertThat(contentV1.notifications.size).isEqualTo(contentV2.notifications.size)
|
|
||||||
assertThat(contentV1.sendingFooter).isEqualTo(contentV2.sendingFooter)
|
|
||||||
assertThat(contentV1.isPrimaryButtonEnabled).isEqualTo(contentV2.isPrimaryButtonEnabled)
|
|
||||||
assertThat(contentV1.isSending).isEqualTo(contentV2.isSending)
|
|
||||||
assertThat(contentV1.showTapHelp).isEqualTo(contentV2.showTapHelp)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN fee too low WHEN both transformers transform THEN they produce equal notifications`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val initialConfirmUM = createTestConfirmUM()
|
|
||||||
val amountUM = createTestAmountUM()
|
|
||||||
|
|
||||||
val feeUM = createFeeTooLowUM()
|
|
||||||
val feeSelectorUMV2 = createFeeTooLowUMV2()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val transformerV1 = SendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val transformerV2 = SendConfirmationNotificationsTransformerV2(
|
|
||||||
feeSelectorUM = feeSelectorUMV2,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val resultV1 = transformerV1.transform(initialConfirmUM)
|
|
||||||
val resultV2 = transformerV2.transform(initialConfirmUM)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(resultV1).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
assertThat(resultV2).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
|
|
||||||
val contentV1 = resultV1 as ConfirmUM.Content
|
|
||||||
val contentV2 = resultV2 as ConfirmUM.Content
|
|
||||||
|
|
||||||
assertThat(contentV1.isPrimaryButtonEnabled).isTrue()
|
|
||||||
assertThat(contentV2.isPrimaryButtonEnabled).isTrue()
|
|
||||||
assertThat(contentV1.notifications).hasSize(1)
|
|
||||||
assertThat(contentV2.notifications).hasSize(1)
|
|
||||||
assertThat(contentV1.notifications.first()).isInstanceOf(NotificationUM.Warning.FeeTooLow::class.java)
|
|
||||||
assertThat(contentV2.notifications.first()).isInstanceOf(NotificationUM.Warning.FeeTooLow::class.java)
|
|
||||||
assertThat(contentV1.sendingFooter).isEqualTo(contentV2.sendingFooter)
|
|
||||||
|
|
||||||
// Verify analytics event was sent for both transformers
|
|
||||||
verify(exactly = 2) { analyticsEventHandler.send(any()) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN fee too high WHEN both transformers transform THEN they produce equal notifications`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val initialConfirmUM = createTestConfirmUM()
|
|
||||||
val amountUM = createTestAmountUM()
|
|
||||||
|
|
||||||
val feeUM = createFeeTooHighUM()
|
|
||||||
val feeSelectorUMV2 = createFeeTooHighUMV2()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val transformerV1 = SendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val transformerV2 = SendConfirmationNotificationsTransformerV2(
|
|
||||||
feeSelectorUM = feeSelectorUMV2,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val resultV1 = transformerV1.transform(initialConfirmUM)
|
|
||||||
val resultV2 = transformerV2.transform(initialConfirmUM)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(resultV1).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
assertThat(resultV2).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
|
|
||||||
val contentV1 = resultV1 as ConfirmUM.Content
|
|
||||||
val contentV2 = resultV2 as ConfirmUM.Content
|
|
||||||
|
|
||||||
assertThat(contentV1.isPrimaryButtonEnabled).isTrue()
|
|
||||||
assertThat(contentV2.isPrimaryButtonEnabled).isTrue()
|
|
||||||
assertThat(contentV1.notifications).hasSize(1)
|
|
||||||
assertThat(contentV2.notifications).hasSize(1)
|
|
||||||
assertThat(contentV1.notifications.first()).isInstanceOf(NotificationUM.Warning.TooHigh::class.java)
|
|
||||||
assertThat(contentV2.notifications.first()).isInstanceOf(NotificationUM.Warning.TooHigh::class.java)
|
|
||||||
|
|
||||||
val tooHighV1 = contentV1.notifications.first() as NotificationUM.Warning.TooHigh
|
|
||||||
val tooHighV2 = contentV2.notifications.first() as NotificationUM.Warning.TooHigh
|
|
||||||
assertThat(tooHighV1.value).isEqualTo(tooHighV2.value)
|
|
||||||
assertThat(contentV1.sendingFooter).isEqualTo(contentV2.sendingFooter)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN fee both too high and too low WHEN both transformers transform THEN they produce equal notifications`() =
|
|
||||||
runTest {
|
|
||||||
// GIVEN
|
|
||||||
val initialConfirmUM = createTestConfirmUM()
|
|
||||||
val amountUM = createTestAmountUM()
|
|
||||||
|
|
||||||
val feeUM = createFeeTooHighAndTooLowUM()
|
|
||||||
val feeSelectorUMV2 = createFeeTooHighAndTooLowUMV2()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val transformerV1 = SendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val transformerV2 = SendConfirmationNotificationsTransformerV2(
|
|
||||||
feeSelectorUM = feeSelectorUMV2,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val resultV1 = transformerV1.transform(initialConfirmUM)
|
|
||||||
val resultV2 = transformerV2.transform(initialConfirmUM)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(resultV1).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
assertThat(resultV2).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
|
|
||||||
val contentV1 = resultV1 as ConfirmUM.Content
|
|
||||||
val contentV2 = resultV2 as ConfirmUM.Content
|
|
||||||
|
|
||||||
assertThat(contentV1.isPrimaryButtonEnabled).isTrue()
|
|
||||||
assertThat(contentV2.isPrimaryButtonEnabled).isTrue()
|
|
||||||
assertThat(contentV1.notifications).hasSize(2)
|
|
||||||
assertThat(contentV2.notifications).hasSize(2)
|
|
||||||
|
|
||||||
assertThat(contentV1.notifications.any { it is NotificationUM.Warning.FeeTooLow }).isTrue()
|
|
||||||
assertThat(contentV1.notifications.any { it is NotificationUM.Warning.TooHigh }).isTrue()
|
|
||||||
assertThat(contentV2.notifications.any { it is NotificationUM.Warning.FeeTooLow }).isTrue()
|
|
||||||
assertThat(contentV2.notifications.any { it is NotificationUM.Warning.TooHigh }).isTrue()
|
|
||||||
|
|
||||||
assertThat(contentV1.sendingFooter).isEqualTo(contentV2.sendingFooter)
|
|
||||||
|
|
||||||
verify(exactly = 2) { analyticsEventHandler.send(any()) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN normal fee WHEN both transformers transform THEN they produce equal notifications`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val initialConfirmUM = createTestConfirmUM()
|
|
||||||
val amountUM = createTestAmountUM()
|
|
||||||
|
|
||||||
val feeUM = createNormalFeeUM()
|
|
||||||
val feeSelectorUMV2 = createNormalFeeSelectorUMV2()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val transformerV1 = SendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val transformerV2 = SendConfirmationNotificationsTransformerV2(
|
|
||||||
feeSelectorUM = feeSelectorUMV2,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
|
|
||||||
val resultV1 = transformerV1.transform(initialConfirmUM)
|
|
||||||
val resultV2 = transformerV2.transform(initialConfirmUM)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(resultV1).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
assertThat(resultV2).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
|
|
||||||
val contentV1 = resultV1 as ConfirmUM.Content
|
|
||||||
val contentV2 = resultV2 as ConfirmUM.Content
|
|
||||||
|
|
||||||
assertThat(contentV1.notifications).isEmpty()
|
|
||||||
assertThat(contentV2.notifications).isEmpty()
|
|
||||||
assertThat(contentV1.isPrimaryButtonEnabled).isEqualTo(contentV2.isPrimaryButtonEnabled)
|
|
||||||
assertThat(contentV1.sendingFooter).isEqualTo(contentV2.sendingFooter)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createTestConfirmUM(): ConfirmUM.Content {
|
|
||||||
return ConfirmUM.Content(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
walletName = mockk(relaxed = true),
|
|
||||||
isSending = false,
|
|
||||||
showTapHelp = false,
|
|
||||||
sendingFooter = mockk(relaxed = true),
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createTestAmountUM(): AmountState.Data {
|
|
||||||
val cryptoAmount = DomainAmount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("1.5"),
|
|
||||||
decimals = 8,
|
|
||||||
)
|
|
||||||
val fiatAmount = DomainAmount(
|
|
||||||
currencySymbol = "USD",
|
|
||||||
value = BigDecimal("50.00"),
|
|
||||||
decimals = 2,
|
|
||||||
)
|
|
||||||
|
|
||||||
return AmountState.Data(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
isRedesignEnabled = false,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
availableBalance = mockk(relaxed = true),
|
|
||||||
availableBalanceCrypto = mockk(relaxed = true),
|
|
||||||
availableBalanceFiat = mockk(relaxed = true),
|
|
||||||
tokenName = mockk(relaxed = true),
|
|
||||||
tokenIconState = mockk(relaxed = true),
|
|
||||||
segmentedButtonConfig = persistentListOf(),
|
|
||||||
selectedButton = 0,
|
|
||||||
isSegmentedButtonsEnabled = false,
|
|
||||||
amountTextField = AmountFieldModel(
|
|
||||||
value = "1.5",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
cryptoAmount = cryptoAmount,
|
|
||||||
fiatAmount = fiatAmount,
|
|
||||||
isFiatValue = false,
|
|
||||||
fiatValue = "50.00",
|
|
||||||
isFiatUnavailable = false,
|
|
||||||
isValuePasted = false,
|
|
||||||
onValuePastedTriggerDismiss = {},
|
|
||||||
isError = false,
|
|
||||||
isWarning = false,
|
|
||||||
error = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
reduceAmountBy = BigDecimal.ZERO,
|
|
||||||
isIgnoreReduce = false,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createTestFeeUM(): FeeUM.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Single(fee)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Market,
|
|
||||||
selectedFee = fee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.001",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = false,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createTestFeeSelectorUMV2(): FeeSelectorUMV2.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Single(fee)
|
|
||||||
return FeeSelectorUMV2.Content(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
fees = transactionFee,
|
|
||||||
feeItems = persistentListOf(
|
|
||||||
FeeItem.Market(fee),
|
|
||||||
),
|
|
||||||
selectedFeeItem = FeeItem.Market(fee),
|
|
||||||
feeExtraInfo = FeeExtraInfo(
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isTronToken = false,
|
|
||||||
),
|
|
||||||
feeFiatRateUM = FeeFiatRateUM(
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
),
|
|
||||||
feeNonce = FeeNonce.Nonce(
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
onNonceChange = {},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooLowUM(): FeeUM.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.0001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = fee,
|
|
||||||
priority = fee,
|
|
||||||
)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Custom,
|
|
||||||
selectedFee = fee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.0001",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = true,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooLowUMV2(): FeeSelectorUMV2.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.0001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = fee,
|
|
||||||
priority = fee,
|
|
||||||
)
|
|
||||||
return FeeSelectorUMV2.Content(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
fees = transactionFee,
|
|
||||||
feeItems = persistentListOf(
|
|
||||||
FeeItem.Custom(
|
|
||||||
fee = fee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.0001",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
selectedFeeItem = FeeItem.Custom(
|
|
||||||
fee = fee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.0001",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
feeExtraInfo = FeeExtraInfo(
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isTronToken = false,
|
|
||||||
),
|
|
||||||
feeFiatRateUM = FeeFiatRateUM(
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
),
|
|
||||||
feeNonce = FeeNonce.Nonce(
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
onNonceChange = {},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooHighUM(): FeeUM.Content {
|
|
||||||
val priorityFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val customFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.01"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = minimumFee,
|
|
||||||
priority = priorityFee,
|
|
||||||
)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Custom,
|
|
||||||
selectedFee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.01",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = true,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooHighUMV2(): FeeSelectorUMV2.Content {
|
|
||||||
val priorityFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val customFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.01"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = minimumFee,
|
|
||||||
priority = priorityFee,
|
|
||||||
)
|
|
||||||
return FeeSelectorUMV2.Content(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
fees = transactionFee,
|
|
||||||
feeItems = persistentListOf(
|
|
||||||
FeeItem.Custom(
|
|
||||||
fee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.01",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
selectedFeeItem = FeeItem.Custom(
|
|
||||||
fee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.01",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
feeExtraInfo = FeeExtraInfo(
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isTronToken = false,
|
|
||||||
),
|
|
||||||
feeFiatRateUM = FeeFiatRateUM(
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
),
|
|
||||||
feeNonce = FeeNonce.Nonce(
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
onNonceChange = {},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooHighAndTooLowUM(): FeeUM.Content {
|
|
||||||
val priorityFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.01"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val customFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.008"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = minimumFee,
|
|
||||||
priority = priorityFee,
|
|
||||||
)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Custom,
|
|
||||||
selectedFee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.008",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = true,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooHighAndTooLowUMV2(): FeeSelectorUMV2.Content {
|
|
||||||
val priorityFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.01"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val customFee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.008"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = minimumFee,
|
|
||||||
priority = priorityFee,
|
|
||||||
)
|
|
||||||
return FeeSelectorUMV2.Content(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
fees = transactionFee,
|
|
||||||
feeItems = persistentListOf(
|
|
||||||
FeeItem.Custom(
|
|
||||||
fee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.008",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
selectedFeeItem = FeeItem.Custom(
|
|
||||||
fee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.008",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
feeExtraInfo = FeeExtraInfo(
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isTronToken = false,
|
|
||||||
),
|
|
||||||
feeFiatRateUM = FeeFiatRateUM(
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
),
|
|
||||||
feeNonce = FeeNonce.Nonce(
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
onNonceChange = {},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createNormalFeeUM(): FeeUM.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Single(fee)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Market,
|
|
||||||
selectedFee = fee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.001",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "TST",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = false,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createNormalFeeSelectorUMV2(): FeeSelectorUMV2.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = Amount(
|
|
||||||
currencySymbol = "TST",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Single(fee)
|
|
||||||
return FeeSelectorUMV2.Content(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
fees = transactionFee,
|
|
||||||
feeItems = persistentListOf(
|
|
||||||
FeeItem.Market(fee),
|
|
||||||
),
|
|
||||||
selectedFeeItem = FeeItem.Market(fee),
|
|
||||||
feeExtraInfo = FeeExtraInfo(
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isFeeConvertibleToFiat = false,
|
|
||||||
isTronToken = false,
|
|
||||||
),
|
|
||||||
feeFiatRateUM = FeeFiatRateUM(
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
),
|
|
||||||
feeNonce = FeeNonce.Nonce(
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
onNonceChange = {},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
@JvmStatic
|
|
||||||
@BeforeAll
|
|
||||||
fun setUpLocale() {
|
|
||||||
Locale.setDefault(Locale.US)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,441 +0,0 @@
|
||||||
package com.tangem.features.send.v2.send.confirm.model.transformers
|
|
||||||
|
|
||||||
import com.google.common.truth.Truth.assertThat
|
|
||||||
import com.tangem.blockchain.common.transaction.Fee
|
|
||||||
import com.tangem.blockchain.common.transaction.TransactionFee
|
|
||||||
import com.tangem.common.ui.amountScreen.models.AmountFieldModel
|
|
||||||
import com.tangem.common.ui.amountScreen.models.AmountState
|
|
||||||
import com.tangem.common.ui.notifications.NotificationUM
|
|
||||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
|
||||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
|
||||||
import com.tangem.domain.models.currency.CryptoCurrency
|
|
||||||
import com.tangem.features.send.v2.api.entity.CustomFeeFieldUM
|
|
||||||
import com.tangem.features.send.v2.common.ui.state.ConfirmUM
|
|
||||||
import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeSelectorUM
|
|
||||||
import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeType
|
|
||||||
import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeUM
|
|
||||||
import io.mockk.mockk
|
|
||||||
import io.mockk.verify
|
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
|
||||||
import kotlinx.coroutines.test.runTest
|
|
||||||
import org.junit.jupiter.api.BeforeAll
|
|
||||||
import org.junit.jupiter.api.Test
|
|
||||||
import java.math.BigDecimal
|
|
||||||
import java.math.BigInteger
|
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
class SendConfirmationNotificationsTransformerTest {
|
|
||||||
|
|
||||||
private val analyticsEventHandler: AnalyticsEventHandler = mockk(relaxed = true)
|
|
||||||
private val cryptoCurrency: CryptoCurrency = mockk(relaxed = true)
|
|
||||||
private val appCurrency = AppCurrency(name = "US Dollar", code = "USD", symbol = "$")
|
|
||||||
private val analyticsCategoryName = "test_category"
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN non content state WHEN transform THEN returns original state`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val feeUM: FeeUM = mockk(relaxed = true)
|
|
||||||
val amountUM: AmountState = mockk(relaxed = true)
|
|
||||||
val transformer = SendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
val initialState: ConfirmUM = ConfirmUM.Empty
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val result = transformer.transform(initialState)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(result).isEqualTo(initialState)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN fee UM not content WHEN transform THEN returns original state`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val feeUM: FeeUM = FeeUM.Empty()
|
|
||||||
val amountUM: AmountState = mockk(relaxed = true)
|
|
||||||
val transformer = SendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
val initialState: ConfirmUM.Content = createTestConfirmUM()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val result = transformer.transform(initialState)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(result).isEqualTo(initialState)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN normal fee WHEN transform THEN returns state with footer and no notifications`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val feeUM = createNormalFeeUM()
|
|
||||||
val amountUM = createTestAmountUM()
|
|
||||||
val transformer = SendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
val initialState = createTestConfirmUM()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val result = transformer.transform(initialState)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(result).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
val content = result as ConfirmUM.Content
|
|
||||||
assertThat(content.notifications).isEmpty()
|
|
||||||
assertThat(content.sendingFooter).isNotEqualTo(initialState.sendingFooter)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN fee too high WHEN transform THEN returns state with too high notification`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val feeUM = createFeeTooHighUM()
|
|
||||||
val amountUM = createTestAmountUM()
|
|
||||||
val transformer = SendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
val initialState = createTestConfirmUM()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val result = transformer.transform(initialState)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(result).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
val content = result as ConfirmUM.Content
|
|
||||||
assertThat(content.notifications).hasSize(1)
|
|
||||||
assertThat(content.notifications.first()).isInstanceOf(NotificationUM.Warning.TooHigh::class.java)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN fee too low WHEN transform THEN returns state with too low notification`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val feeUM = createFeeTooLowUM()
|
|
||||||
val amountUM = createTestAmountUM()
|
|
||||||
val transformer = SendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
val initialState = createTestConfirmUM()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val result = transformer.transform(initialState)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(result).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
val content = result as ConfirmUM.Content
|
|
||||||
assertThat(content.notifications).hasSize(1)
|
|
||||||
assertThat(content.notifications.first()).isInstanceOf(NotificationUM.Warning.FeeTooLow::class.java)
|
|
||||||
verify { analyticsEventHandler.send(any()) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN both fee too high and too low WHEN transform THEN returns state with both notifications`() = runTest {
|
|
||||||
// GIVEN
|
|
||||||
val feeUM = createFeeTooHighAndTooLowUM()
|
|
||||||
val amountUM = createTestAmountUM()
|
|
||||||
val transformer = SendConfirmationNotificationsTransformer(
|
|
||||||
feeUM = feeUM,
|
|
||||||
amountUM = amountUM,
|
|
||||||
analyticsEventHandler = analyticsEventHandler,
|
|
||||||
cryptoCurrency = cryptoCurrency,
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
analyticsCategoryName = analyticsCategoryName,
|
|
||||||
)
|
|
||||||
val initialState = createTestConfirmUM()
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
val result = transformer.transform(initialState)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
assertThat(result).isInstanceOf(ConfirmUM.Content::class.java)
|
|
||||||
val content = result as ConfirmUM.Content
|
|
||||||
assertThat(content.notifications).hasSize(2)
|
|
||||||
assertThat(content.notifications.any { it is NotificationUM.Warning.TooHigh }).isTrue()
|
|
||||||
assertThat(content.notifications.any { it is NotificationUM.Warning.FeeTooLow }).isTrue()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createTestConfirmUM(): ConfirmUM.Content {
|
|
||||||
return ConfirmUM.Content(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
walletName = mockk(relaxed = true),
|
|
||||||
isSending = false,
|
|
||||||
showTapHelp = false,
|
|
||||||
sendingFooter = mockk(relaxed = true),
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createTestAmountUM(): AmountState.Data {
|
|
||||||
val cryptoAmount = com.tangem.domain.tokens.model.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("1.5"),
|
|
||||||
decimals = 8,
|
|
||||||
)
|
|
||||||
val fiatAmount = com.tangem.domain.tokens.model.Amount(
|
|
||||||
currencySymbol = "USD",
|
|
||||||
value = BigDecimal("50.00"),
|
|
||||||
decimals = 2,
|
|
||||||
)
|
|
||||||
|
|
||||||
return AmountState.Data(
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
isRedesignEnabled = false,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
availableBalance = mockk(relaxed = true),
|
|
||||||
availableBalanceCrypto = mockk(relaxed = true),
|
|
||||||
availableBalanceFiat = mockk(relaxed = true),
|
|
||||||
tokenName = mockk(relaxed = true),
|
|
||||||
tokenIconState = mockk(relaxed = true),
|
|
||||||
segmentedButtonConfig = persistentListOf(),
|
|
||||||
selectedButton = 0,
|
|
||||||
isSegmentedButtonsEnabled = false,
|
|
||||||
amountTextField = AmountFieldModel(
|
|
||||||
value = "1.5",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
cryptoAmount = cryptoAmount,
|
|
||||||
fiatAmount = fiatAmount,
|
|
||||||
isFiatValue = false,
|
|
||||||
fiatValue = "50.00",
|
|
||||||
isFiatUnavailable = false,
|
|
||||||
isValuePasted = false,
|
|
||||||
onValuePastedTriggerDismiss = {},
|
|
||||||
isError = false,
|
|
||||||
isWarning = false,
|
|
||||||
error = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
appCurrency = appCurrency,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
reduceAmountBy = BigDecimal.ZERO,
|
|
||||||
isIgnoreReduce = false,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createNormalFeeUM(): FeeUM.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Single(fee)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Market,
|
|
||||||
selectedFee = fee,
|
|
||||||
customValues = persistentListOf(),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = true,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = false,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooHighUM(): FeeUM.Content {
|
|
||||||
val priorityFee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val customFee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.01"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = minimumFee,
|
|
||||||
priority = priorityFee,
|
|
||||||
)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Custom,
|
|
||||||
selectedFee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.01",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "SOL",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = true,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = false,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooLowUM(): FeeUM.Content {
|
|
||||||
val fee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.0001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = fee,
|
|
||||||
priority = fee,
|
|
||||||
)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Custom,
|
|
||||||
selectedFee = fee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.0001",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "SOL",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = true,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = false,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createFeeTooHighAndTooLowUM(): FeeUM.Content {
|
|
||||||
val priorityFee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.001"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val minimumFee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.01"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val customFee = Fee.Common(
|
|
||||||
amount = com.tangem.blockchain.common.Amount(
|
|
||||||
currencySymbol = "SOL",
|
|
||||||
value = BigDecimal("0.008"),
|
|
||||||
decimals = 8,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
val transactionFee = TransactionFee.Choosable(
|
|
||||||
minimum = minimumFee,
|
|
||||||
normal = minimumFee,
|
|
||||||
priority = priorityFee,
|
|
||||||
)
|
|
||||||
return FeeUM.Content(
|
|
||||||
feeSelectorUM = FeeSelectorUM.Content(
|
|
||||||
fees = transactionFee,
|
|
||||||
selectedType = FeeType.Custom,
|
|
||||||
selectedFee = customFee,
|
|
||||||
customValues = persistentListOf(
|
|
||||||
CustomFeeFieldUM(
|
|
||||||
value = "0.008",
|
|
||||||
onValueChange = {},
|
|
||||||
keyboardOptions = mockk(relaxed = true),
|
|
||||||
keyboardActions = mockk(relaxed = true),
|
|
||||||
symbol = "SOL",
|
|
||||||
decimals = 8,
|
|
||||||
title = mockk(relaxed = true),
|
|
||||||
footer = mockk(relaxed = true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
nonce = BigInteger.ZERO,
|
|
||||||
),
|
|
||||||
rate = BigDecimal("50000"),
|
|
||||||
isFeeConvertibleToFiat = true,
|
|
||||||
isFeeApproximate = false,
|
|
||||||
isTronToken = false,
|
|
||||||
isEditingDisabled = false,
|
|
||||||
isPrimaryButtonEnabled = true,
|
|
||||||
appCurrency = AppCurrency.Default,
|
|
||||||
isCustomSelected = false,
|
|
||||||
notifications = persistentListOf(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
@JvmStatic
|
|
||||||
@BeforeAll
|
|
||||||
fun setUpLocale() {
|
|
||||||
Locale.setDefault(Locale.US)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue