From 5855b3012f449864c426232eb428b64026fcb416 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 20 Mar 2026 16:29:44 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/common/extensions/KNode.kt | 10 ++++++-- .../MainScreenActionButtonsTest.kt | 25 ++++++++++--------- .../send/addressScreen/RecentBlockTest.kt | 3 ++- .../addressScreen/SendAddressScreenTest.kt | 2 ++ .../confirmScreen/SendConfirmScreenTest.kt | 13 +++++++++- .../tests/send/feeScreen/SendFeeScreenTest.kt | 13 +++++++--- .../send/warnings/PolkadotWarningsTest.kt | 3 ++- .../tangem/tests/swap/SearchAndSwapTest.kt | 6 +++++ 8 files changed, 54 insertions(+), 21 deletions(-) diff --git a/app/src/androidTest/kotlin/com/tangem/common/extensions/KNode.kt b/app/src/androidTest/kotlin/com/tangem/common/extensions/KNode.kt index f57b43288a..3e5c61cf6b 100644 --- a/app/src/androidTest/kotlin/com/tangem/common/extensions/KNode.kt +++ b/app/src/androidTest/kotlin/com/tangem/common/extensions/KNode.kt @@ -1,5 +1,6 @@ package com.tangem.common.extensions +import android.os.SystemClock import androidx.compose.ui.test.ComposeTimeoutException import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule @@ -61,9 +62,14 @@ fun KNode.clickAndWaitFor( fun KNode.performTextInputInChunks( text: String, - chunkSize: Int = 2 + chunkSize: Int = 2, + delayBetweenChunksMs: Long = 100 ) { - text.chunked(chunkSize).forEach { chunk -> + val chunks = text.chunked(chunkSize) + chunks.forEachIndexed { index, chunk -> performTextInput(chunk) + if (index < chunks.lastIndex) { + SystemClock.sleep(delayBetweenChunksMs) + } } } diff --git a/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/MainScreenActionButtonsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/MainScreenActionButtonsTest.kt index 8069b5d735..2cb635f684 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/MainScreenActionButtonsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/MainScreenActionButtonsTest.kt @@ -6,6 +6,7 @@ import com.tangem.common.annotations.ApiEnv import com.tangem.common.annotations.ApiEnvConfig import com.tangem.common.constants.TestConstants.BITCOIN_ADDRESS import com.tangem.common.constants.TestConstants.WAIT_UNTIL_TIMEOUT +import com.tangem.common.constants.TestConstants.WAIT_UNTIL_TIMEOUT_LONG import com.tangem.common.extensions.* import com.tangem.common.utils.assertClipboardTextEquals import com.tangem.common.utils.clearClipboard @@ -599,22 +600,22 @@ class MainScreenActionButtonsTest : BaseTestCase() { step("Reset Wiremock scenario: '$scenarioName'") { resetWireMockScenarioState(scenarioName) } - step("Perform pull to refresh") { - pullToRefresh(steps = 10) - waitForIdle() - } - step("Assert action buttons is enabled") { - assertActionButtonsForMultiCurrencyWallet(isEnabled = true) + step("Pull to refresh and wait for buttons to become enabled") { + flakySafely(WAIT_UNTIL_TIMEOUT_LONG, intervalMs = 2_000) { + pullToRefresh(10) + waitForIdle() + assertActionButtonsForMultiCurrencyWallet(isEnabled = true) + } } step("Set WireMock scenario: '$scenarioName' to state: '$scenarioState'") { setWireMockScenarioState(scenarioName = scenarioName, state = scenarioState) } - step("Perform pull to refresh") { - pullToRefresh(steps = 10) - waitForIdle() - } - step("Assert action buttons is not enabled") { - assertActionButtonsForMultiCurrencyWallet(isEnabled = false) + step("Pull to refresh and wait for buttons to become disabled") { + flakySafely(WAIT_UNTIL_TIMEOUT_LONG, intervalMs = 2_000) { + pullToRefresh(10) + waitForIdle() + assertActionButtonsForMultiCurrencyWallet(isEnabled = false) + } } } } diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/RecentBlockTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/RecentBlockTest.kt index d7f75da532..37950eb1a3 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/RecentBlockTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/RecentBlockTest.kt @@ -104,6 +104,7 @@ class RecentBlockTest : BaseTestCase() { @Test fun recentBlockTransactionHistoryDoesNotSupportedTest() { val tokenName = "Polkadot" + val fullTokenName = "Polkadot Asset Hub" val sendAmount = "1" setupHooks( @@ -113,7 +114,7 @@ class RecentBlockTest : BaseTestCase() { } ).run { step("Open 'Send Screen' with token: $tokenName") { - openSendScreen(tokenName) + openSendScreen(tokenName = fullTokenName, mockState = tokenName) } step("Type '$sendAmount' in input text field") { onSendScreen { diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/SendAddressScreenTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/SendAddressScreenTest.kt index 32177f7b76..6f0000086b 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/SendAddressScreenTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/SendAddressScreenTest.kt @@ -27,6 +27,7 @@ import dagger.hilt.android.testing.HiltAndroidTest import io.github.kakaocup.kakao.common.utilities.getResourceString import io.qameta.allure.kotlin.AllureId import io.qameta.allure.kotlin.junit4.DisplayName +import org.junit.Ignore import org.junit.Test @HiltAndroidTest @@ -98,6 +99,7 @@ class SendAddressScreenTest : BaseTestCase() { } } + @Ignore("TODO: [REDACTED_JIRA]") @AllureId("4543") @DisplayName("Send (address screen): check address field") @Test diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/confirmScreen/SendConfirmScreenTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/confirmScreen/SendConfirmScreenTest.kt index 69307ea8b4..a9746ca3c1 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/send/confirmScreen/SendConfirmScreenTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/confirmScreen/SendConfirmScreenTest.kt @@ -17,6 +17,7 @@ import dagger.hilt.android.testing.HiltAndroidTest import io.github.kakaocup.kakao.common.utilities.getResourceString import io.qameta.allure.kotlin.AllureId import io.qameta.allure.kotlin.junit4.DisplayName +import org.junit.Ignore import org.junit.Test @HiltAndroidTest @@ -152,7 +153,11 @@ class SendConfirmScreenTest : BaseTestCase() { step("Type recipient address") { onSendAddressScreen { addressTextField.performTextReplacement(recipientAddress) } } + step("Assert 'Addresses shimmer' is not displayed") { + onSendAddressScreen { addressesShimmer.assertIsNotDisplayed() } + } step("Click on 'Next' button") { + waitForIdle() onSendAddressScreen { nextButton.clickWithAssertion() } } step("Assert primary amount = '$tokenAmount'") { @@ -237,11 +242,13 @@ class SendConfirmScreenTest : BaseTestCase() { } } + @Ignore("TODO: [REDACTED_JIRA]") @AllureId("554") @DisplayName("Send (Confirm screen): check fee warning") @Test fun checkFeeWarningTest() { val tokenName = "Polkadot" + val fullTokenName = "Polkadot Asset Hub" val tokenAmount = "0.1" val warningTitle = getResourceString(R.string.send_fee_unreachable_error_title) val warningMessageResId = R.string.send_fee_unreachable_error_text @@ -256,7 +263,7 @@ class SendConfirmScreenTest : BaseTestCase() { } ).run { step("Open 'Send Screen' with token: $tokenName") { - openSendScreen(tokenName) + openSendScreen(tokenName = fullTokenName, mockState = tokenName) } step("Type '$tokenAmount' in input text field") { onSendScreen { @@ -274,7 +281,11 @@ class SendConfirmScreenTest : BaseTestCase() { step("Type address in input text field") { onSendAddressScreen { addressTextField.performTextReplacement(POLKADOT_RECIPIENT_ADDRESS) } } + step("Assert 'Addresses shimmer' is not displayed") { + onSendAddressScreen { addressesShimmer.assertIsNotDisplayed() } + } step("Click on 'Next' button") { + waitForIdle() onSendAddressScreen { nextButton.clickWithAssertion() } } step("Assert 'Network fee info unreachable' warning title is displayed") { diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/feeScreen/SendFeeScreenTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/feeScreen/SendFeeScreenTest.kt index 31b9035761..b9f6635d09 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/send/feeScreen/SendFeeScreenTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/feeScreen/SendFeeScreenTest.kt @@ -7,6 +7,7 @@ import com.tangem.common.constants.TestConstants.POLKADOT_RECIPIENT_ADDRESS import com.tangem.common.constants.TestConstants.QUOTES_API_SCENARIO import com.tangem.common.constants.TestConstants.TERRA_RECIPIENT_ADDRESS import com.tangem.common.constants.TestConstants.USER_TOKENS_API_SCENARIO +import com.tangem.common.constants.TestConstants.WAIT_UNTIL_TIMEOUT_LONG import com.tangem.common.extensions.SwipeDirection import com.tangem.common.extensions.clickWithAssertion import com.tangem.common.extensions.swipeVertical @@ -68,6 +69,7 @@ class SendFeeScreenTest : BaseTestCase() { @Test fun checkFeeBlockForFixedFeeTest() { val tokenName = "Polkadot" + val fullTokenName = "Polkadot Asset Hub" val tokenAmount = "1" val feeAmount = "$0.05" @@ -78,7 +80,7 @@ class SendFeeScreenTest : BaseTestCase() { } ).run { step("Open 'Send' screen") { - openSendScreen(tokenName) + openSendScreen(tokenName = fullTokenName, mockState = tokenName) } step("Type '$tokenAmount' in input text field") { onSendScreen { @@ -93,10 +95,13 @@ class SendFeeScreenTest : BaseTestCase() { onSendAddressScreen { addressTextField.performTextReplacement(POLKADOT_RECIPIENT_ADDRESS) } } step("Click on 'Next' button") { - onSendScreen { nextButton.clickWithAssertion() } + waitForIdle() + onSendAddressScreen { nextButton.clickWithAssertion() } } step("Assert fee block is displayed without fee selector") { - checkNetworkFeeBlock(currentFeeAmount = feeAmount, withFeeSelector = false) + flakySafely(WAIT_UNTIL_TIMEOUT_LONG) { + checkNetworkFeeBlock(currentFeeAmount = feeAmount, withFeeSelector = false) + } } step("Click on 'Fee selector' block") { onSendConfirmScreen { feeSelectorBlock.performClick() } @@ -161,7 +166,7 @@ class SendFeeScreenTest : BaseTestCase() { onSendAddressScreen { addressTextField.performTextReplacement(ETHEREUM_RECIPIENT_ADDRESS) } } step("Click on 'Next' button") { - onSendScreen { nextButton.clickWithAssertion() } + onSendAddressScreen { nextButton.clickWithAssertion() } } step("Assert fee block is displayed with fee selector") { checkNetworkFeeBlock(currentFeeAmount = feeAmount, withFeeSelector = true) diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/PolkadotWarningsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/PolkadotWarningsTest.kt index 31cf64adce..1c481a80fb 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/PolkadotWarningsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/PolkadotWarningsTest.kt @@ -21,6 +21,7 @@ import org.junit.Test @HiltAndroidTest class PolkadotWarningsTest : BaseTestCase() { private val tokenName = "Polkadot" + private val fullTokenName = "Polkadot Asset Hub" private val amountToLeaveLessThanDeposit = "1.299" private val amountToLeaveGreaterThanDeposit = "0.2" private val depositAmount = "DOT 0.01" @@ -41,7 +42,7 @@ class PolkadotWarningsTest : BaseTestCase() { } ).run { step("Open 'Send Screen' with token: $tokenName") { - openSendScreen(tokenName) + openSendScreen(tokenName = fullTokenName, mockState = tokenName) } step("Type '$amountToLeaveLessThanDeposit' in input text field") { onSendScreen { diff --git a/app/src/androidTest/kotlin/com/tangem/tests/swap/SearchAndSwapTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/swap/SearchAndSwapTest.kt index ce2450ee04..e1e79b96ad 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/swap/SearchAndSwapTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/swap/SearchAndSwapTest.kt @@ -16,11 +16,13 @@ import dagger.hilt.android.testing.HiltAndroidTest import io.github.kakaocup.kakao.common.utilities.getResourceString import io.qameta.allure.kotlin.AllureId import io.qameta.allure.kotlin.junit4.DisplayName +import org.junit.Ignore import org.junit.Test @HiltAndroidTest class SearchAndSwapTest : BaseTestCase() { + @Ignore("ToDo: [REDACTED_JIRA]") @AllureId("8520") @DisplayName("Search and Swap: add token without derivation") @Test @@ -68,6 +70,7 @@ class SearchAndSwapTest : BaseTestCase() { } } + @Ignore("ToDo: [REDACTED_JIRA]") @AllureId("8519") @DisplayName("Search and Swap: add token with derivation") @Test @@ -115,6 +118,7 @@ class SearchAndSwapTest : BaseTestCase() { } } + @Ignore("ToDo: [REDACTED_JIRA]") @AllureId("8523") @DisplayName("Search and Swap: Markets error") @Test @@ -155,6 +159,7 @@ class SearchAndSwapTest : BaseTestCase() { } } + @Ignore("ToDo: [REDACTED_JIRA]") @AllureId("8522") @DisplayName("Search and Swap: check 'Unsupported token pair' warning") @Test @@ -205,6 +210,7 @@ class SearchAndSwapTest : BaseTestCase() { } } + @Ignore("ToDo: [REDACTED_JIRA]") @AllureId("8521") @DisplayName("Swap: search token on Swap token screen") @Test