From c10183d06a883c8ea67e86e0c6b7535284360f34 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 21 Jan 2026 15:45:43 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../kotlin/com/tangem/common/BaseTestCase.kt | 3 +- .../com/tangem/scenarios/DialogScenarios.kt | 13 +++++++ .../screens/DataNotLoadedDialogPageObject.kt | 36 +++++++++++++++++++ .../com/tangem/tests/OrganizeTokensTest.kt | 20 +++++------ .../MainScreenActionButtonsTest.kt | 6 ++-- .../TokenDetailsScreenActionButtonsTest.kt | 6 +--- .../tests/send/feeScreen/SendFeeScreenTest.kt | 2 +- 7 files changed, 67 insertions(+), 19 deletions(-) create mode 100644 app/src/androidTest/kotlin/com/tangem/screens/DataNotLoadedDialogPageObject.kt diff --git a/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt b/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt index ea5a538da3..96c353f84c 100644 --- a/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt +++ b/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt @@ -142,7 +142,8 @@ abstract class BaseTestCase : TestCase( "SWAP_REDESIGN_ENABLED" to false, "NEW_ONRAMP_MAIN_ENABLED" to true, "HOT_WALLET_ENABLED" to true, - "YIELD_SUPPLY_FEATURE_ENABLED" to true + "YIELD_SUPPLY_FEATURE_ENABLED" to true, + "ACCOUNTS_FEATURE_ENABLED" to true ) ) } diff --git a/app/src/androidTest/kotlin/com/tangem/scenarios/DialogScenarios.kt b/app/src/androidTest/kotlin/com/tangem/scenarios/DialogScenarios.kt index bca0130819..57d70b597e 100644 --- a/app/src/androidTest/kotlin/com/tangem/scenarios/DialogScenarios.kt +++ b/app/src/androidTest/kotlin/com/tangem/scenarios/DialogScenarios.kt @@ -9,6 +9,7 @@ import com.tangem.screens.AlreadyUsedWalletDialogPageObject.thisIsMyWalletButton import com.tangem.screens.AlreadyUsedWalletDialogPageObject.title import com.tangem.screens.ScanWarningDialogPageObject import com.tangem.screens.onActionIsUnavailableDialog +import com.tangem.screens.onDataNotLoadedDialog import com.tangem.screens.onFailedTransactionDialog import io.qameta.allure.kotlin.Allure.step @@ -76,4 +77,16 @@ fun BaseTestCase.checkActionIsUnavailableDialog() { step("Assert 'Action is unavailable' dialog 'Ok' button is displayed") { onActionIsUnavailableDialog { okButton.assertIsDisplayed() } } +} + +fun BaseTestCase.checkDataNotLoadedDialog() { + step("Assert 'The data has not loaded yet' dialog title is displayed") { + onDataNotLoadedDialog { title.assertIsDisplayed() } + } + step("Assert 'The data has not loaded yet' dialog text is displayed") { + onDataNotLoadedDialog { text.assertIsDisplayed() } + } + step("Assert 'The data has not loaded yet' dialog 'Ok' button is displayed") { + onDataNotLoadedDialog { okButton.assertIsDisplayed() } + } } \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/DataNotLoadedDialogPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/DataNotLoadedDialogPageObject.kt new file mode 100644 index 0000000000..e7efab995c --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/screens/DataNotLoadedDialogPageObject.kt @@ -0,0 +1,36 @@ +package com.tangem.screens + +import androidx.compose.ui.test.SemanticsNodeInteractionsProvider +import com.tangem.common.BaseTestCase +import com.tangem.core.ui.R +import com.tangem.core.ui.test.BaseButtonTestTags +import com.tangem.core.ui.test.BaseDialogTestTags +import io.github.kakaocup.compose.node.element.ComposeScreen +import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen +import io.github.kakaocup.compose.node.element.KNode +import io.github.kakaocup.kakao.common.utilities.getResourceString +import com.tangem.common.ui.R as CommonUIR + +class DataNotLoadedDialogPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) : + ComposeScreen(semanticsProvider = semanticsProvider) { + + val title: KNode = child { + hasTestTag(BaseDialogTestTags.TITLE) + hasText(getResourceString(CommonUIR.string.action_buttons_service_loading_alert_title)) + useUnmergedTree = true + } + + val text: KNode = child { + hasTestTag(BaseDialogTestTags.TEXT) + hasText(getResourceString(CommonUIR.string.action_buttons_service_loading_alert_message)) + useUnmergedTree = true + } + + val okButton: KNode = child { + hasTestTag(BaseButtonTestTags.BUTTON) + hasText(getResourceString(R.string.common_ok)) + } +} + +internal fun BaseTestCase.onDataNotLoadedDialog(function: DataNotLoadedDialogPageObject.() -> Unit) = + onComposeScreen(composeTestRule, function) \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/tests/OrganizeTokensTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/OrganizeTokensTest.kt index e4ac654ef2..fb132f5e1d 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/OrganizeTokensTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/OrganizeTokensTest.kt @@ -113,8 +113,8 @@ class OrganizeTokensTest : BaseTestCase() { } step("Check positions of tokens on 'Organize tokens' screen") { onOrganizeTokensScreen { - tokenWithTitleAndPosition(bitcoinTitle, 1).assertIsDisplayed() - tokenWithTitleAndPosition(ethereumTitle, 2).assertIsDisplayed() + tokenWithTitleAndPosition(bitcoinTitle, 0).assertIsDisplayed() + tokenWithTitleAndPosition(ethereumTitle, 1).assertIsDisplayed() } } } @@ -200,10 +200,10 @@ class OrganizeTokensTest : BaseTestCase() { } step("Check positions of tokens on 'Organize tokens' screen") { onOrganizeTokensScreen { - tokenWithTitleAndPosition(bitcoinTitle, 1).assertIsDisplayed() - tokenWithTitleAndPosition(ethereumTitle, 2).assertIsDisplayed() - tokenWithTitleAndPosition(polygonTitle, 3).assertIsDisplayed() - tokenWithTitleAndPosition(polExMaticTitle, 4).assertIsDisplayed() + tokenWithTitleAndPosition(bitcoinTitle, 0).assertIsDisplayed() + tokenWithTitleAndPosition(ethereumTitle, 1).assertIsDisplayed() + tokenWithTitleAndPosition(polygonTitle, 2).assertIsDisplayed() + tokenWithTitleAndPosition(polExMaticTitle, 3).assertIsDisplayed() } } step("Click 'By Balance' button") { @@ -213,10 +213,10 @@ class OrganizeTokensTest : BaseTestCase() { } step("Check positions of tokens by balance on 'Organize tokens' screen") { onOrganizeTokensScreen { - tokenWithTitleAndPosition(ethereumTitle, 1).assertIsDisplayed() - tokenWithTitleAndPosition(polExMaticTitle, 2).assertIsDisplayed() - tokenWithTitleAndPosition(polygonTitle, 3).assertIsDisplayed() - tokenWithTitleAndPosition(bitcoinTitle, 4).assertIsDisplayed() + tokenWithTitleAndPosition(ethereumTitle, 0).assertIsDisplayed() + tokenWithTitleAndPosition(polExMaticTitle, 1).assertIsDisplayed() + tokenWithTitleAndPosition(polygonTitle, 2).assertIsDisplayed() + tokenWithTitleAndPosition(bitcoinTitle, 3).assertIsDisplayed() } } step("Click 'Apply' button") { 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 fd03d3bd1e..e807c84361 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/MainScreenActionButtonsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/MainScreenActionButtonsTest.kt @@ -6,9 +6,11 @@ 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.extensions.clickWithAssertion import com.tangem.common.extensions.* -import com.tangem.common.utils.* +import com.tangem.common.utils.assertClipboardTextEquals +import com.tangem.common.utils.clearClipboard +import com.tangem.common.utils.resetWireMockScenarioState +import com.tangem.common.utils.setWireMockScenarioState import com.tangem.datasource.api.common.config.ApiConfig import com.tangem.datasource.api.common.config.ApiEnvironment import com.tangem.scenarios.* 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 13a36c3299..d14e14e295 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/TokenDetailsScreenActionButtonsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/TokenDetailsScreenActionButtonsTest.kt @@ -12,10 +12,6 @@ import com.tangem.scenarios.goToQrCodeBottomSheet import com.tangem.scenarios.openMainScreen import com.tangem.scenarios.synchronizeAddresses import com.tangem.screens.* -import com.tangem.screens.onMainScreen -import com.tangem.screens.onSwapStoriesScreen -import com.tangem.screens.onSwapTokenScreen -import com.tangem.screens.onTokenDetailsScreen import dagger.hilt.android.testing.HiltAndroidTest import io.qameta.allure.kotlin.AllureId import io.qameta.allure.kotlin.junit4.DisplayName @@ -239,7 +235,7 @@ class TokenDetailsScreenActionButtonsTest : BaseTestCase() { waitForIdle() onMainScreen { tokenWithTitleAndAddress(tokenTitle).performClick() } } - step("Assert 'Receive' button is displayed") { + step("Click on 'Receive' button") { onTokenDetailsScreen { receiveButton().performClick() } } step("Go to QR code bottom sheet") { 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 3f6c0ea10f..d5049ab273 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 @@ -392,7 +392,7 @@ class SendFeeScreenTest : BaseTestCase() { val tokenName = "VeThor" val mockState = "Vechain" val tokenAmount = "0.1" - val feeAmount = "~$0.01" + val feeAmount = "<$0.01" val marketSelectorItem = getResourceString(R.string.common_fee_selector_option_market) val fastSelectorItem = getResourceString(R.string.common_fee_selector_option_fast) val slowSelectorItem = getResourceString(R.string.common_fee_selector_option_slow)