From 62c5b2a5578c457fa9b93341edda582b866b203d Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 16 Jul 2026 14:05:08 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../tangem/scenarios/SendWarningScenarios.kt | 31 ++++++++++++++----- .../com/tangem/scenarios/SwapScenarios.kt | 10 ++++++ .../screens/AddFundsBottomSheetPageObject.kt | 5 +++ .../MainScreenActionButtonsTest.kt | 3 ++ .../TokenDetailsScreenActionButtonsTest.kt | 7 +++-- .../tests/send/warnings/SolanaWarningsTest.kt | 2 +- .../tests/swap/SwapTokenScreenWarningsTest.kt | 2 +- 7 files changed, 48 insertions(+), 12 deletions(-) diff --git a/app/src/androidTest/kotlin/com/tangem/scenarios/SendWarningScenarios.kt b/app/src/androidTest/kotlin/com/tangem/scenarios/SendWarningScenarios.kt index 7abb486367..2b8f9bce6a 100644 --- a/app/src/androidTest/kotlin/com/tangem/scenarios/SendWarningScenarios.kt +++ b/app/src/androidTest/kotlin/com/tangem/scenarios/SendWarningScenarios.kt @@ -13,24 +13,37 @@ fun BaseTestCase.checkSendWarning( ) { val assertDisplay = if (isDisplayed) "displayed" else "not displayed" + // When we expect the warning to be absent, it may still be finishing its disappear animation right after the + // Confirm screen opens (e.g. after re-entering a valid address), so poll the Compose tree until it is actually + // gone instead of asserting once. When we expect it to be present, assert straight away. + fun assertWarning(block: () -> Unit) { + if (isDisplayed) block() else awaitSuccess(block = block) + } + step("Assert 'Send confirm screen' is displayed") { onSendConfirmScreen { appBarTitle.assertIsDisplayed() } } step("Assert warning title is $assertDisplay") { - onSendConfirmScreen { - warningTitle(title).assertVisibility(isDisplayed) + assertWarning { + onSendConfirmScreen { + warningTitle(title).assertVisibility(isDisplayed) + } } } step("Assert warning icon is $assertDisplay") { - onSendConfirmScreen { - sendWarningIcon(message).assertVisibility(isDisplayed) + assertWarning { + onSendConfirmScreen { + sendWarningIcon(message).assertVisibility(isDisplayed) + } } } step("Assert warning message is $assertDisplay") { - onSendConfirmScreen { - sendWarningMessage(message).assertVisibility(isDisplayed) + assertWarning { + onSendConfirmScreen { + sendWarningMessage(message).assertVisibility(isDisplayed) + } } } if (sendButtonIsDisabled) @@ -41,8 +54,10 @@ fun BaseTestCase.checkSendWarning( } else step("Assert 'Send' button is enabled") { - onSendConfirmScreen { - sendButton.assertIsEnabled() + awaitSuccess { + onSendConfirmScreen { + sendButton.assertIsEnabled() + } } } } \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/scenarios/SwapScenarios.kt b/app/src/androidTest/kotlin/com/tangem/scenarios/SwapScenarios.kt index e49491ffff..bfbf8ae88f 100644 --- a/app/src/androidTest/kotlin/com/tangem/scenarios/SwapScenarios.kt +++ b/app/src/androidTest/kotlin/com/tangem/scenarios/SwapScenarios.kt @@ -164,6 +164,16 @@ fun BaseTestCase.checkStoriesChanges() { } } +fun BaseTestCase.skipSwapStories() { + step("Skip 'Swap stories' screen if displayed") { + onSwapStoriesScreen { + if (closeButton.isDisplayedSafely()) { + closeButton.performClick() + } + } + } +} + fun BaseTestCase.selectFeeType(feeType: FeeType, selectedFeeAmount: String) { step("Click on 'Select fee' icon") { onSwapTokenScreen { selectFeeIcon.performClick() } diff --git a/app/src/androidTest/kotlin/com/tangem/screens/AddFundsBottomSheetPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/AddFundsBottomSheetPageObject.kt index abb099d1a1..81b70b3e20 100644 --- a/app/src/androidTest/kotlin/com/tangem/screens/AddFundsBottomSheetPageObject.kt +++ b/app/src/androidTest/kotlin/com/tangem/screens/AddFundsBottomSheetPageObject.kt @@ -51,6 +51,11 @@ class AddFundsBottomSheetPageObject(semanticsProvider: SemanticsNodeInteractions useUnmergedTree = true } + fun titleWithTokenName(tokenTitle: String): KNode = child { + hasText(getResourceString(R.string.get_token_title, tokenTitle)) + useUnmergedTree = true + } + fun userTokenWithTitle(tokenTitle: String): KNode = child { hasTestTag(BuyTokenScreenTestTags.LAZY_LIST_ITEM) hasAnyDescendant(withTestTag(TokenElementsTestTags.TOKEN_TITLE)) 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 96a6fb73dc..c1e687dbc6 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/MainScreenActionButtonsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/MainScreenActionButtonsTest.kt @@ -503,6 +503,9 @@ class MainScreenActionButtonsTest : BaseTestCase() { step("Click on 'Swap' button") { onMainScreen { swapButton.performClick() } } + step("Skip stories if displayed") { + skipSwapStories() + } step("Check 'Action is unavailable' dialog") { flakySafely(WAIT_UNTIL_TIMEOUT) { checkActionIsUnavailableDialog() diff --git a/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/TokenDetailsScreenActionButtonsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/TokenDetailsScreenActionButtonsTest.kt index 218cf73ce3..74e7e024b6 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/TokenDetailsScreenActionButtonsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/TokenDetailsScreenActionButtonsTest.kt @@ -128,11 +128,14 @@ class TokenDetailsScreenActionButtonsTest : BaseTestCase() { step("Click on 'Add funds' button") { onTokenDetailsScreen { addFundsButton.clickWithAssertion() } } + step("Assert 'Get $tokenTitle' bottom-sheet is displayed") { + onAddFundsBottomSheet { titleWithTokenName(tokenTitle).assertIsDisplayed() } + } step("Assert 'Buy' button in bottom sheet is enabled") { onAddFundsBottomSheet { buyButton.assertIsEnabled() } } - step("Assert 'Swap' button in bottom sheet is not displayed") { - onAddFundsBottomSheet { swapButton.assertIsNotDisplayed() } + step("Assert 'Swap' button in bottom sheet is not enabled") { + onAddFundsBottomSheet { swapButton.assertIsNotEnabled() } } step("Assert 'Receive' button in bottom sheet is enabled") { onAddFundsBottomSheet { receiveButton.assertIsEnabled() } diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/SolanaWarningsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/SolanaWarningsTest.kt index 9ed4a7569f..5b47911276 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/SolanaWarningsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/SolanaWarningsTest.kt @@ -22,7 +22,7 @@ import org.junit.Test @HiltAndroidTest class SolanaWarningsTest : BaseTestCase() { private val tokenName = "Solana" - private val amountToLeaveLessThanRent = "0.0016941" + private val amountToLeaveLessThanRent = "0.0372" private val amountToLeaveGreaterThanRent = "0.0000941" private val amountToLeaveRentOnly = "0.001689338" private val rentAmount = "SOLĀ 0.00089088" diff --git a/app/src/androidTest/kotlin/com/tangem/tests/swap/SwapTokenScreenWarningsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/swap/SwapTokenScreenWarningsTest.kt index bc6b9e498b..a05a74f07f 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/swap/SwapTokenScreenWarningsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/swap/SwapTokenScreenWarningsTest.kt @@ -554,7 +554,7 @@ class SwapTokenScreenWarningsTest : BaseTestCase() { fun solanaRemainingBalanceLessThanRentAmountTest() { val tokenTitle = "Solana" val receiveTokenName = "USDC" - val inputAmount = "0.0016941" + val inputAmount = "0.0372" val tokensScenarioState = "SolanaUSDC" val rentAmount = "SOLĀ 0.00089088" val notificationTitle = getResourceString(R.string.send_notification_invalid_amount_title)