diff --git a/build.gradle.kts b/build.gradle.kts index 5d73b767fa..3648de0c58 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -38,6 +38,16 @@ subprojects { testLogging { exceptionFormat = TestExceptionFormat.FULL showStandardStreams = true + + afterSuite(KotlinClosure2({ 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)) + } + })) } } } diff --git a/data/account/src/test/java/com/tangem/data/account/fetcher/DefaultWalletAccountsFetcherTest.kt b/data/account/src/test/java/com/tangem/data/account/fetcher/DefaultWalletAccountsFetcherTest.kt index d79de32016..ac012e76fb 100644 --- a/data/account/src/test/java/com/tangem/data/account/fetcher/DefaultWalletAccountsFetcherTest.kt +++ b/data/account/src/test/java/com/tangem/data/account/fetcher/DefaultWalletAccountsFetcherTest.kt @@ -2,6 +2,7 @@ package com.tangem.data.account.fetcher import com.google.common.truth.Truth 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.AccountsResponseStoreFactory 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.account.GetWalletAccountsResponse 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.utils.coroutines.TestingCoroutineDispatcherProvider import io.mockk.* @@ -24,6 +24,7 @@ import org.junit.jupiter.api.* /** [REDACTED_AUTHOR] */ +@Suppress("Unchecked_Cast", "UnusedFlow") @TestInstance(TestInstance.Lifecycle.PER_CLASS) class DefaultWalletAccountsFetcherTest { @@ -78,10 +79,13 @@ class DefaultWalletAccountsFetcherTest { val savedAccountsResponse = null val unassignedToken = createToken(accountId = null) + val accounts = listOf(createWalletAccountDTO(userWalletId = userWalletId, tokens = null)) val accountsResponse = createGetWalletAccountsResponse( userWalletId = userWalletId, unassignedTokens = listOf(unassignedToken), ) + .copy(accounts = accounts) + val newETag = "newEtag" val apiResponse = ApiResponse.Success( data = accountsResponse, @@ -124,12 +128,6 @@ class DefaultWalletAccountsFetcherTest { 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), - ) accountsResponseStoreFactory.create(userWalletId = userWalletId) accountsResponseStore.updateData(any()) } @@ -199,7 +197,7 @@ class DefaultWalletAccountsFetcherTest { fun `fetch should call error handler when getWalletAccounts returns error`() = runTest { // Arrange val savedAccountsResponse = null - val apiError = ApiResponse.Error(ApiResponseError.NetworkException) + val apiError = ApiResponse.Error(ApiResponseError.NetworkException()) accountsResponseStoreFlow.value = savedAccountsResponse @@ -232,87 +230,6 @@ class DefaultWalletAccountsFetcherTest { 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 - - // 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 @@ -343,9 +260,7 @@ class DefaultWalletAccountsFetcherTest { @Test fun `push should call saveWalletAccounts with correct params`() = runTest { // Arrange - val accounts = listOf( - mockk(), - ) + val accounts = listOf(createWalletAccountDTO(userWalletId = userWalletId, tokens = null)) val response = SaveWalletAccountsResponse(accounts) coEvery { @@ -373,7 +288,7 @@ class DefaultWalletAccountsFetcherTest { fun `push should throw error when saveWalletAccounts returns PRECONDITION_FAILED`() = runTest { // Arrange val accounts = listOf( - mockk(), + createWalletAccountDTO(userWalletId = userWalletId, tokens = null), ) val response = SaveWalletAccountsResponse(accounts) val apiError = ApiResponseError.HttpException( @@ -405,10 +320,8 @@ class DefaultWalletAccountsFetcherTest { @Test fun `pushAndStore should call push and store with correct params`() = runTest { // Arrange - listOf( - mockk(), - ) - val response = createGetWalletAccountsResponse(userWalletId) + val accounts = listOf(createWalletAccountDTO(userWalletId = userWalletId, tokens = null)) + val response = createGetWalletAccountsResponse(userWalletId).copy(accounts = accounts) coEvery { tangemTechApi.saveWalletAccounts( diff --git a/data/account/src/test/java/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandlerTest.kt b/data/account/src/test/java/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandlerTest.kt index 532b33975b..422c9a7b8a 100644 --- a/data/account/src/test/java/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandlerTest.kt +++ b/data/account/src/test/java/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandlerTest.kt @@ -158,7 +158,7 @@ class FetchWalletAccountsErrorHandlerTest { @Test fun `uses default accounts when savedAccountsResponse is null`() = runTest { // Arrange - val error = ApiResponseError.TimeoutException + val error = ApiResponseError.TimeoutException() val accounts = AccountList.empty(userWallet).accounts .filterIsInstance() diff --git a/data/staking/src/test/kotlin/com/tangem/data/staking/multi/DefaultMultiYieldBalanceFetcherTest.kt b/data/staking/src/test/kotlin/com/tangem/data/staking/multi/DefaultMultiYieldBalanceFetcherTest.kt index 7203f1fc73..1ae2b3fccd 100644 --- a/data/staking/src/test/kotlin/com/tangem/data/staking/multi/DefaultMultiYieldBalanceFetcherTest.kt +++ b/data/staking/src/test/kotlin/com/tangem/data/staking/multi/DefaultMultiYieldBalanceFetcherTest.kt @@ -309,7 +309,7 @@ internal class DefaultMultiYieldBalanceFetcherTest { val requests = setOf(tonId, solanaId).map(YieldBalanceRequestBodyFactory::create) @Suppress("UNCHECKED_CAST") - val errorResponse = ApiResponse.Error(ApiResponseError.NetworkException) + val errorResponse = ApiResponse.Error(ApiResponseError.NetworkException()) as ApiResponse> coEvery { stakeKitApi.getMultipleYieldBalances(requests) } returns errorResponse @@ -328,7 +328,7 @@ internal class DefaultMultiYieldBalanceFetcherTest { coVerify(inverse = true) { yieldsBalancesStore.storeActual(userWalletId = any(), values = any()) } - val expected = ApiResponseError.NetworkException + val expected = ApiResponseError.NetworkException() assertEitherLeft(actual, expected) } diff --git a/data/tokens/src/test/kotlin/com/tangem/data/tokens/DefaultMultiWalletCryptoCurrenciesFetcherTest.kt b/data/tokens/src/test/kotlin/com/tangem/data/tokens/DefaultMultiWalletCryptoCurrenciesFetcherTest.kt index f335e3d006..9b685b565c 100644 --- a/data/tokens/src/test/kotlin/com/tangem/data/tokens/DefaultMultiWalletCryptoCurrenciesFetcherTest.kt +++ b/data/tokens/src/test/kotlin/com/tangem/data/tokens/DefaultMultiWalletCryptoCurrenciesFetcherTest.kt @@ -246,7 +246,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest { @Suppress("UNCHECKED_CAST") val apiResponse = ApiResponse.Error( - cause = ApiResponseError.TimeoutException, + cause = ApiResponseError.TimeoutException(), ) as ApiResponse val defaultCoins = listOf( @@ -307,7 +307,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest { @Suppress("UNCHECKED_CAST") val apiResponse = ApiResponse.Error( - cause = ApiResponseError.TimeoutException, + cause = ApiResponseError.TimeoutException(), ) as ApiResponse every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet diff --git a/data/tokens/src/test/kotlin/com/tangem/data/tokens/utils/CustomTokensMergerTest.kt b/data/tokens/src/test/kotlin/com/tangem/data/tokens/utils/CustomTokensMergerTest.kt index 06d0021071..78f011687b 100644 --- a/data/tokens/src/test/kotlin/com/tangem/data/tokens/utils/CustomTokensMergerTest.kt +++ b/data/tokens/src/test/kotlin/com/tangem/data/tokens/utils/CustomTokensMergerTest.kt @@ -114,7 +114,7 @@ internal class CustomTokensMergerTest { ) @Suppress("UNCHECKED_CAST") - val apiResponse = ApiResponse.Error(ApiResponseError.TimeoutException) as ApiResponse + val apiResponse = ApiResponse.Error(ApiResponseError.TimeoutException()) as ApiResponse coEvery { tangemTechApi.getCoins(contractAddress = customToken.contractAddress, networkIds = customToken.networkId) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 209f923828..17e942ca63 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -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("../tangem-android-tools/CI/gradle_properties/tests_ci_gradle.properties", "../gradle.properties") puts File.read("../gradle.properties") - gradle(task: "detekt") - gradle(task: "detektGoogleDebug") + gradle(task: "detekt detektGoogleDebug --continue") end 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("../tangem-android-tools/CI/gradle_properties/tests_ci_gradle.properties", "../gradle.properties") puts File.read("../gradle.properties") - gradle(task: "testGoogleDebugUnitTest") + gradle(task: "testGoogleDebugUnitTest testDebugUnitTest --continue") end desc "Build internal APK Firebase App Distribution" diff --git a/features/send-v2/impl/src/test/java/com/tangem/features/send/v2/send/confirm/model/transformers/NFTSendConfirmNotificationsTransformersComparisonTest.kt b/features/send-v2/impl/src/test/java/com/tangem/features/send/v2/send/confirm/model/transformers/NFTSendConfirmNotificationsTransformersComparisonTest.kt deleted file mode 100644 index aa4f53b280..0000000000 --- a/features/send-v2/impl/src/test/java/com/tangem/features/send/v2/send/confirm/model/transformers/NFTSendConfirmNotificationsTransformersComparisonTest.kt +++ /dev/null @@ -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) - } - } -} \ No newline at end of file diff --git a/features/send-v2/impl/src/test/java/com/tangem/features/send/v2/send/confirm/model/transformers/NFTSendConfirmationNotificationsTransformerTest.kt b/features/send-v2/impl/src/test/java/com/tangem/features/send/v2/send/confirm/model/transformers/NFTSendConfirmationNotificationsTransformerTest.kt deleted file mode 100644 index e0519b34fb..0000000000 --- a/features/send-v2/impl/src/test/java/com/tangem/features/send/v2/send/confirm/model/transformers/NFTSendConfirmationNotificationsTransformerTest.kt +++ /dev/null @@ -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) - } - } -} \ No newline at end of file diff --git a/features/send-v2/impl/src/test/java/com/tangem/features/send/v2/send/confirm/model/transformers/SendConfirmNotificationsTransformersComparisonTest.kt b/features/send-v2/impl/src/test/java/com/tangem/features/send/v2/send/confirm/model/transformers/SendConfirmNotificationsTransformersComparisonTest.kt deleted file mode 100644 index ec301a0a0a..0000000000 --- a/features/send-v2/impl/src/test/java/com/tangem/features/send/v2/send/confirm/model/transformers/SendConfirmNotificationsTransformersComparisonTest.kt +++ /dev/null @@ -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) - } - } -} \ No newline at end of file diff --git a/features/send-v2/impl/src/test/java/com/tangem/features/send/v2/send/confirm/model/transformers/SendConfirmationNotificationsTransformerTest.kt b/features/send-v2/impl/src/test/java/com/tangem/features/send/v2/send/confirm/model/transformers/SendConfirmationNotificationsTransformerTest.kt deleted file mode 100644 index a0c7096cb7..0000000000 --- a/features/send-v2/impl/src/test/java/com/tangem/features/send/v2/send/confirm/model/transformers/SendConfirmationNotificationsTransformerTest.kt +++ /dev/null @@ -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) - } - } -} \ No newline at end of file