Updated on 2026-08-14

This commit is contained in:
Tangem 2025-10-14 11:42:44 +03:00
parent 1010c03899
commit 65e9a1cb40
19 changed files with 115 additions and 114 deletions

View file

@ -145,7 +145,7 @@ abstract class BaseTestCase : TestCase(
private fun setFeatureToggles() {
runBlocking {
with(featureTogglesManager as MutableFeatureTogglesManager) {
changeToggle("WALLET_CONNECT_REDESIGN_ENABLED", true)
changeToggle("NEW_TOKEN_RECEIVE_ENABLED", true)
changeToggle("WALLET_BALANCE_FETCHER_ENABLED", true)
changeToggle("SWAP_REDESIGN_ENABLED", true)
changeToggle("NEW_ONRAMP_MAIN_ENABLED", true)

View file

@ -1,5 +1,6 @@
package com.tangem.scenarios
import androidx.compose.ui.test.hasText
import com.tangem.common.BaseTestCase
import com.tangem.common.extensions.clickWithAssertion
import com.tangem.domain.models.scan.ProductType
@ -7,6 +8,7 @@ import com.tangem.screens.*
import com.tangem.screens.AlreadyUsedWalletDialogPageObject.thisIsMyWalletButton
import com.tangem.tap.domain.sdk.mocks.MockContent
import com.tangem.tap.domain.sdk.mocks.MockProvider
import com.tangem.utils.StringsSigns.DASH_SIGN
import io.qameta.allure.kotlin.Allure.step
fun BaseTestCase.scanCard(
@ -65,12 +67,29 @@ fun BaseTestCase.openMainScreen(
}
}
fun BaseTestCase.synchronizeAddresses(balance: String) {
fun BaseTestCase.synchronizeAddresses(
balance: String? = null,
isBalanceAvailable: Boolean = true
) {
step("Click on 'Synchronize addresses' button") {
onMainScreen { synchronizeAddressesButton.clickWithAssertion() }
}
step("Assert wallet balance = '$balance'") {
onMainScreen { totalBalanceText.assertTextContains(balance) }
when {
!isBalanceAvailable -> step("Assert wallet balance = '$DASH_SIGN'") {
onMainScreen { totalBalanceText.assertTextContains(DASH_SIGN) }
}
balance != null -> {
step("Assert wallet balance != '$DASH_SIGN'") {
onMainScreen { totalBalanceText.assert(!hasText(DASH_SIGN)) }
}
step("Assert wallet balance = '$balance'") {
onMainScreen { totalBalanceText.assertTextContains(balance) }
}
}
else -> step("Assert wallet balance != '$DASH_SIGN'") {
onMainScreen { totalBalanceText.assert(!hasText(DASH_SIGN)) }
}
}
}

View file

@ -5,6 +5,7 @@ import com.tangem.common.BaseTestCase
import com.tangem.core.ui.R
import com.tangem.core.ui.test.BaseButtonTestTags
import com.tangem.core.ui.test.NotificationTestTags
import com.tangem.core.ui.test.SendConfirmScreenTestTags
import com.tangem.core.ui.test.TopAppBarTestTags
import io.github.kakaocup.compose.node.element.ComposeScreen
import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen
@ -34,6 +35,11 @@ class SendConfirmPageObject(semanticsProvider: SemanticsNodeInteractionsProvider
useUnmergedTree = true
}
val sendingText: KNode = child {
hasTestTag(SendConfirmScreenTestTags.SENDING_TEXT)
useUnmergedTree = true
}
fun minimumSendAmountErrorIcon(amount: String): KNode = child {
hasAnySibling(
withText(

View file

@ -7,7 +7,7 @@ import androidx.test.uiautomator.UiObject2
import androidx.test.uiautomator.Until
import com.kaspersky.kaspresso.screens.KScreen
object ChromeBrowserPageObject : KScreen<ChromeBrowserPageObject>() {
object ThirdPartyAppPageObject : KScreen<ThirdPartyAppPageObject>() {
override val layoutId: Int? = null
override val viewClass: Class<*>? = null

View file

@ -9,10 +9,6 @@ import com.tangem.common.utils.setWireMockScenarioState
import com.tangem.scenarios.openMainScreen
import com.tangem.scenarios.synchronizeAddresses
import com.tangem.screens.*
import com.tangem.screens.onMainScreen
import com.tangem.screens.onSendAddressScreen
import com.tangem.screens.onSendScreen
import com.tangem.screens.onTokenDetailsScreen
import dagger.hilt.android.testing.HiltAndroidTest
import io.qameta.allure.kotlin.AllureId
import io.qameta.allure.kotlin.junit4.DisplayName
@ -26,7 +22,6 @@ class BlockchainTest : BaseTestCase() {
@Test
fun adaCheckMinAmountTest() {
val tokenName = "Cardano"
val balance = "$0.00"
val errorSendAmount = "0.1"
val validSendAmount = "10"
val minAmount = "ADA 1.00"
@ -46,7 +41,7 @@ class BlockchainTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Click on token with name: '$tokenName'") {
onMainScreen { tokenWithTitleAndAddress(tokenName).clickWithAssertion() }
@ -121,7 +116,6 @@ class BlockchainTest : BaseTestCase() {
val tokenName = "XRP Ledger"
val amount = "1.00"
val currencySymbol = "XRP"
val balance = "$0.00"
val userTokensScenarioName = "user_tokens_api"
val userTokensScenarioState = "XRP"
val rippleAccountInfoScenarioName = "ripple_account_info"
@ -151,7 +145,7 @@ class BlockchainTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Click on token with name: '$tokenName'") {
onMainScreen { tokenWithTitleAndAddress(tokenName).performClick() }

View file

@ -1,7 +1,6 @@
package com.tangem.tests
import com.tangem.common.BaseTestCase
import com.tangem.common.constants.TestConstants.TOTAL_BALANCE
import com.tangem.common.extensions.clickWithAssertion
import com.tangem.common.utils.resetWireMockScenarioState
import com.tangem.common.utils.setWireMockScenarioState
@ -22,7 +21,6 @@ class BuyTokenTest : BaseTestCase() {
fun errorInProvidersLoadingTest() {
val scenarioName = "payment_methods"
val tokenTitle = "Bitcoin"
val balance = TOTAL_BALANCE
setupHooks(
additionalAfterSection = {
@ -39,7 +37,7 @@ class BuyTokenTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Click on 'Buy' button") {
onMainScreen { buyButton.clickWithAssertion() }
@ -68,7 +66,6 @@ class BuyTokenTest : BaseTestCase() {
fun validateCurrencySelectorTest() {
setupHooks().run {
val tokenTitle = "Polygon"
val balance = TOTAL_BALANCE
val popularFiatsTitle = "Popular Fiats"
val otherCurrenciesTitle = "Other currencies"
val australianDollar = "AUD"
@ -84,7 +81,7 @@ class BuyTokenTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Click on 'Buy' button") {
onMainScreen { buyButton.clickWithAssertion() }
@ -146,7 +143,6 @@ class BuyTokenTest : BaseTestCase() {
fun validateBuyTokenScreenTest() {
setupHooks().run {
val tokenTitle = "Polygon"
val balance = TOTAL_BALANCE
val euro = "EUR"
val fiatAmount = "1"
val tokenAmount = "~488.24938338 POL"
@ -160,7 +156,7 @@ class BuyTokenTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Click on 'Buy' button") {
onMainScreen { buyButton.clickWithAssertion() }
@ -237,7 +233,6 @@ class BuyTokenTest : BaseTestCase() {
fun validateResidenceSettingsScreenTest() {
setupHooks().run {
val tokenTitle = "Polygon"
val balance = TOTAL_BALANCE
val country = "Albania"
val unavailableCountry = "Lebanon"
val scenarioName = "payment_methods"
@ -250,7 +245,7 @@ class BuyTokenTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Click on 'Buy' button") {
onMainScreen { buyButton.clickWithAssertion() }
@ -318,7 +313,6 @@ class BuyTokenTest : BaseTestCase() {
fun validateProvidersScreenTest() {
setupHooks().run {
val tokenTitle = "Polygon"
val balance = TOTAL_BALANCE
val paymentMethod = "Invoice Revolut Pay"
val fiatAmount = "1"
val providerNameMercuryo = "Mercuryo"
@ -333,7 +327,7 @@ class BuyTokenTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Click on 'Buy' button") {
onMainScreen { buyButton.clickWithAssertion() }
@ -407,7 +401,6 @@ class BuyTokenTest : BaseTestCase() {
fun validatePaymentMethodScreenTest() {
setupHooks().run {
val tokenTitle = "Polygon"
val balance = TOTAL_BALANCE
val card = "Card"
val googlePay = "Google Pay"
val invoiceRevolutPay = "Invoice Revolut Pay"
@ -424,7 +417,7 @@ class BuyTokenTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Click on 'Buy' button") {
onMainScreen { buyButton.clickWithAssertion() }

View file

@ -3,7 +3,6 @@ package com.tangem.tests
import androidx.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread
import com.tangem.common.BaseTestCase
import com.tangem.common.constants.TestConstants.RECIPIENT_ADDRESS
import com.tangem.common.constants.TestConstants.TOTAL_BALANCE
import com.tangem.common.constants.TestConstants.WAIT_UNTIL_TIMEOUT
import com.tangem.common.core.TangemSdkError
import com.tangem.common.extensions.clickWithAssertion
@ -28,6 +27,8 @@ class FeedbackTest : BaseTestCase() {
@DisplayName("Send feedback: from details")
@Test
fun sendFeedbackFromDetailsTest() {
val gmailText = "Welcome to Gmail"
setupHooks(
additionalAfterSection = {
device.uiDevice.pressBack()
@ -42,8 +43,8 @@ class FeedbackTest : BaseTestCase() {
step("Click 'Contact support' button") {
onDetailsScreen { contactSupportButton.clickWithAssertion() }
}
step("Check 'Contact support' intent is called") {
checkSendEMailIntentCalled()
step("Assert 'Gmail' app is open") {
ThirdPartyAppPageObject { assertElementWithTextExists(gmailText) }
}
}
}
@ -52,10 +53,10 @@ class FeedbackTest : BaseTestCase() {
@DisplayName("Send feedback: failed transaction")
@Test
fun sendFeedbackFromFailedTransactionTest() {
val balance = TOTAL_BALANCE
val tokenName = "Polygon"
val recipientAddress = RECIPIENT_ADDRESS
val sendAmount = "1"
val gmailText = "Welcome to Gmail"
setupHooks(
additionalAfterSection = {
@ -66,7 +67,7 @@ class FeedbackTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Click on token with name: '$tokenName'") {
onMainScreen { tokenWithTitleAndAddress(tokenName).clickWithAssertion() }
@ -92,6 +93,9 @@ class FeedbackTest : BaseTestCase() {
step("Click 'Next' button") {
onSendAddressScreen { nextButton.clickWithAssertion() }
}
step("Assert sanding text is displayed") {
onSendConfirmScreen { sendingText.assertIsDisplayed() }
}
step("Click 'Send' button") {
waitForIdle()
onSendConfirmScreen {
@ -100,6 +104,7 @@ class FeedbackTest : BaseTestCase() {
}
}
step("Check 'Failed transaction' dialog") {
waitForIdle()
flakySafely(WAIT_UNTIL_TIMEOUT) {
checkFailedTransactionDialog()
}
@ -107,8 +112,8 @@ class FeedbackTest : BaseTestCase() {
step("Click on 'Support' button") {
onFailedTransactionDialog { supportButton.performClick() }
}
step("Check 'Contact support' intent is called") {
checkSendEMailIntentCalled()
step("Assert 'Gmail' app is open") {
ThirdPartyAppPageObject { assertElementWithTextExists(gmailText) }
}
}
}
@ -117,6 +122,8 @@ class FeedbackTest : BaseTestCase() {
@DisplayName("Send feedback: from 'Warning' dialog after card scan")
@Test
fun sendFeedbackFromScanScreenTest() {
val gmailText = "Welcome to Gmail"
setupHooks(
additionalAfterSection = {
device.uiDevice.pressBack()
@ -145,8 +152,8 @@ class FeedbackTest : BaseTestCase() {
step("Click on 'Request support' button") {
ScanWarningDialogPageObject { requestSupportButton.click() }
}
step("Check 'Contact support' intent is called") {
checkSendEMailIntentCalled()
step("Assert 'Gmail' app is open") {
ThirdPartyAppPageObject { assertElementWithTextExists(gmailText) }
}
}
}
@ -155,6 +162,8 @@ class FeedbackTest : BaseTestCase() {
@DisplayName("Send feedback: from scan already used wallet alert dialog")
@Test
fun sendFeedbackAfterScanAlreadyUsedWalletTest() {
val gmailText = "Welcome to Gmail"
setupHooks(
additionalAfterSection = {
device.uiDevice.pressBack()
@ -175,8 +184,8 @@ class FeedbackTest : BaseTestCase() {
step("Click on 'Request support' button") {
AlreadyUsedWalletDialogPageObject { requestSupportButton.click() }
}
step("Check 'Contact support' intent is called") {
checkSendEMailIntentCalled()
step("Assert 'Gmail' app is open") {
ThirdPartyAppPageObject { assertElementWithTextExists(gmailText) }
}
}
}

View file

@ -1,7 +1,6 @@
package com.tangem.tests
import com.tangem.common.BaseTestCase
import com.tangem.common.constants.TestConstants.TOTAL_BALANCE
import com.tangem.common.extensions.clickWithAssertion
import com.tangem.scenarios.openMainScreen
import com.tangem.scenarios.synchronizeAddresses
@ -19,13 +18,12 @@ class HideTokenTest : BaseTestCase() {
@Test
fun hideWalletTokenByHideButtonTest() {
val tokenTitle = "Polygon"
val balance = TOTAL_BALANCE
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Click on token with name: '$tokenTitle'") {
onMainScreen { tokenWithTitleAndAddress(tokenTitle).clickWithAssertion() }

View file

@ -2,7 +2,6 @@ package com.tangem.tests
import androidx.compose.ui.test.onAllNodesWithText
import com.tangem.common.BaseTestCase
import com.tangem.common.constants.TestConstants.TOTAL_BALANCE
import com.tangem.common.extensions.SwipeDirection
import com.tangem.common.extensions.clickWithAssertion
import com.tangem.common.extensions.swipeVertical
@ -92,13 +91,12 @@ class OrganizeTokensTest : BaseTestCase() {
setupHooks().run {
val ethereumTitle = "Ethereum"
val bitcoinTitle = "Bitcoin"
val balance = TOTAL_BALANCE
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Check positions of tokens on 'Main Screen'") {
onMainScreen {
@ -179,13 +177,12 @@ class OrganizeTokensTest : BaseTestCase() {
val bitcoinTitle = "Bitcoin"
val polygonTitle = "Polygon"
val polExMaticTitle = "POL (ex-MATIC)"
val balance = TOTAL_BALANCE
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Check positions of tokens on 'Main Screen'") {
onMainScreen {

View file

@ -25,7 +25,6 @@ class SendTest : BaseTestCase() {
val currencyName = "POL (ex-MATIC)"
val feeCurrencyName = "Ethereum"
val feeCurrencySymbol = "ETH"
val balance = "$763.55"
val scenarioName = "eth_network_balance"
val scenarioState = "Empty"
@ -42,7 +41,7 @@ class SendTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Swipe up") {
swipeVertical(SwipeDirection.UP)

View file

@ -1,7 +1,6 @@
package com.tangem.tests
import com.tangem.common.BaseTestCase
import com.tangem.common.constants.TestConstants.TOTAL_BALANCE
import com.tangem.common.extensions.SwipeDirection
import com.tangem.common.extensions.clickWithAssertion
import com.tangem.common.extensions.swipeVertical
@ -22,7 +21,6 @@ class StakingTest : BaseTestCase() {
@Test
fun validateStakingBlockTest() {
val tokenTitle = "POL (ex-MATIC)"
val balance = "$3,299.37"
val scenarioName = "staking_eth_pol_balances_android"
val scenarioState = "Staked"
@ -40,7 +38,7 @@ class StakingTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Assert 'Organize tokens' button is displayed") {
onMainScreen { organizeTokensButton().assertIsDisplayed() }
@ -80,7 +78,6 @@ class StakingTest : BaseTestCase() {
@Test
fun validateStakingMoreScreensTest() {
val tokenTitle = "POL (ex-MATIC)"
val balance = "$3,299.37"
val scenarioName = "staking_eth_pol_balances_android"
val scenarioState = "Staked"
val stakingAmount = "1"
@ -99,7 +96,7 @@ class StakingTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Assert 'Organize tokens' button is displayed") {
onMainScreen { organizeTokensButton().assertIsDisplayed() }
@ -139,7 +136,6 @@ class StakingTest : BaseTestCase() {
@Test
fun validateStakingScreensTest() {
val tokenTitle = "POL (ex-MATIC)"
val balance = TOTAL_BALANCE
val scenarioName = "staking_eth_pol_balances_android"
val scenarioState = "Started"
val stakingAmount = "1"
@ -158,7 +154,7 @@ class StakingTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Assert 'Organize tokens' button is displayed") {
onMainScreen { organizeTokensButton().assertIsDisplayed() }

View file

@ -4,16 +4,15 @@ import androidx.compose.ui.test.hasText
import com.tangem.common.BaseTestCase
import com.tangem.common.annotations.ApiEnv
import com.tangem.common.annotations.ApiEnvConfig
import com.tangem.common.constants.TestConstants.TOTAL_BALANCE
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.*
import com.tangem.common.utils.resetWireMockScenarios
import com.tangem.datasource.api.common.config.ApiConfig
import com.tangem.datasource.api.common.config.ApiEnvironment
import com.tangem.screens.*
import com.tangem.scenarios.openMainScreen
import com.tangem.scenarios.synchronizeAddresses
import com.tangem.screens.*
import dagger.hilt.android.testing.HiltAndroidTest
import io.qameta.allure.kotlin.AllureId
import io.qameta.allure.kotlin.junit4.DisplayName
@ -31,7 +30,6 @@ class SwapTokenTest : BaseTestCase() {
fun networkFeeTest() {
val inputAmount = "100"
val tokenTitle = "Polygon"
val balance = TOTAL_BALANCE
setupHooks().run {
@ -40,7 +38,7 @@ class SwapTokenTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Click on token with name: '$tokenTitle'") {
onMainScreen { tokenWithTitleAndAddress(tokenTitle).clickWithAssertion() }
@ -115,13 +113,12 @@ class SwapTokenTest : BaseTestCase() {
}
).run {
val tokenTitle = "Polygon"
val balance = TOTAL_BALANCE
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Click on token with name: '$tokenTitle'") {
onMainScreen { tokenWithTitleAndAddress(tokenTitle).clickWithAssertion() }
@ -164,13 +161,12 @@ class SwapTokenTest : BaseTestCase() {
val inputAmount = "100"
setupHooks().run {
val tokenTitle = "Polygon"
val balance = TOTAL_BALANCE
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Click on token with name: '$tokenTitle'") {
onMainScreen { tokenWithTitleAndAddress(tokenTitle).clickWithAssertion() }

View file

@ -1,13 +1,15 @@
package com.tangem.tests
import com.tangem.common.BaseTestCase
import com.tangem.common.constants.TestConstants.TOTAL_BALANCE
import com.tangem.common.constants.TestConstants.WAIT_UNTIL_TIMEOUT
import com.tangem.common.extensions.clickWithAssertion
import com.tangem.common.utils.getWcUri
import com.tangem.common.utils.setClipboardText
import com.tangem.scenarios.*
import com.tangem.screens.*
import com.tangem.screens.onWalletConnectBottomSheet
import com.tangem.screens.onWalletConnectDetailsBottomSheet
import com.tangem.screens.onWalletConnectScanQrScreen
import com.tangem.screens.onWalletConnectScreen
import com.tangem.wallet.BuildConfig
import dagger.hilt.android.testing.HiltAndroidTest
import io.qameta.allure.kotlin.AllureId
@ -23,7 +25,6 @@ class WalletConnectTest : BaseTestCase() {
@Ignore("TODO [REDACTED_JIRA] React app deeplink doesn't work")
@Test
fun openWalletConnectSessionOnMainScreenTest() {
val balance = TOTAL_BALANCE
val dAppName = "React App"
val deepLinkUri = getWcUri()
@ -32,7 +33,7 @@ class WalletConnectTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Create WC session buy deeplink") {
openAppByDeepLink(deepLinkUri)
@ -81,7 +82,6 @@ class WalletConnectTest : BaseTestCase() {
@Ignore("TODO [REDACTED_JIRA] React app deeplink doesn't work")
@Test
fun openWalletConnectSessionNotOnMainScreenTest() {
val balance = TOTAL_BALANCE
val dAppName = "React App"
val deepLinkUri = getWcUri()
@ -90,7 +90,7 @@ class WalletConnectTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Open 'Wallet Connect' screen") {
openWalletConnectScreen()
@ -139,7 +139,6 @@ class WalletConnectTest : BaseTestCase() {
@Ignore("TODO [REDACTED_JIRA] React app deeplink doesn't work")
@Test
fun openWalletConnectSessionTest() {
val balance = TOTAL_BALANCE
val dAppName = "React App"
val packageName = BuildConfig.APPLICATION_ID
val deepLinkUri = getWcUri()
@ -149,7 +148,7 @@ class WalletConnectTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Kill app") {
device.apps.kill(packageName)
@ -194,7 +193,6 @@ class WalletConnectTest : BaseTestCase() {
@Ignore("TODO [REDACTED_JIRA] React app deeplink doesn't work")
@Test
fun openWalletConnectSessionByClipboardLinkTest() {
val balance = TOTAL_BALANCE
val dAppName = "React App"
val context = device.context
val deepLinkUri = getWcUri()
@ -207,7 +205,7 @@ class WalletConnectTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Open 'Wallet Connect' screen") {
openWalletConnectScreen()

View file

@ -3,17 +3,13 @@ package com.tangem.tests.actionButtons
import androidx.compose.ui.test.longClick
import com.tangem.common.BaseTestCase
import com.tangem.common.constants.TestConstants.BITCOIN_ADDRESS
import com.tangem.common.constants.TestConstants.TOTAL_BALANCE
import com.tangem.common.constants.TestConstants.WAIT_UNTIL_TIMEOUT
import com.tangem.common.extensions.clickWithAssertion
import com.tangem.common.utils.assertClipboardTextEquals
import com.tangem.common.utils.clearClipboard
import com.tangem.scenarios.openMainScreen
import com.tangem.scenarios.synchronizeAddresses
import com.tangem.screens.*
import com.tangem.screens.onTokenActionsBottomSheet
import com.tangem.screens.onBuyTokenDetailsScreen
import com.tangem.screens.onDialog
import com.tangem.screens.onMainScreen
import dagger.hilt.android.testing.HiltAndroidTest
import io.qameta.allure.kotlin.AllureId
import io.qameta.allure.kotlin.junit4.DisplayName
@ -27,13 +23,12 @@ class MainScreenActionButtonsTest : BaseTestCase() {
@Test
fun actionButtonsValidateLongTapUiTest() {
val tokenTitle = "Ethereum"
val balance = TOTAL_BALANCE
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Long click on token with name: '$tokenTitle'") {
waitForIdle()
@ -78,7 +73,6 @@ class MainScreenActionButtonsTest : BaseTestCase() {
@Test
fun clickOnCopyAddressButtonTest() {
val tokenTitle = "Bitcoin"
val balance = TOTAL_BALANCE
val bitcoinAddress = BITCOIN_ADDRESS
setupHooks(
@ -93,7 +87,7 @@ class MainScreenActionButtonsTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Long click on token with name: '$tokenTitle'") {
waitForIdle()
@ -128,14 +122,13 @@ class MainScreenActionButtonsTest : BaseTestCase() {
fun clickOnBuyButtonTest() {
val tokenTitle = "Bitcoin"
val tokenSymbol = "BTC"
val balance = TOTAL_BALANCE
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Long click on token with name: '$tokenTitle'") {
waitForIdle()
@ -182,14 +175,13 @@ class MainScreenActionButtonsTest : BaseTestCase() {
fun clickOnSwapButtonTest() {
val tokenTitle = "Ethereum"
val tokenSymbol = "ETH"
val balance = TOTAL_BALANCE
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Long click on token with name: '$tokenTitle'") {
waitForIdle()
@ -226,14 +218,13 @@ class MainScreenActionButtonsTest : BaseTestCase() {
fun clickOnSendButtonTest() {
val tokenTitle = "Ethereum"
val tokenSymbol = "ETH"
val balance = TOTAL_BALANCE
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Long click on token with name: '$tokenTitle'") {
waitForIdle()
@ -265,14 +256,13 @@ class MainScreenActionButtonsTest : BaseTestCase() {
@Test
fun clickOnReceiveButtonTest() {
val tokenTitle = "Bitcoin"
val balance = TOTAL_BALANCE
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Long click on token with name: '$tokenTitle'") {
waitForIdle()
@ -292,7 +282,12 @@ class MainScreenActionButtonsTest : BaseTestCase() {
onTokenActionsBottomSheet { receiveButton.performClick() }
}
step("Assert 'Token receive warning' bottom sheet is displayed") {
onTokenReceiveWarningBottomSheet { bottomSheet.assertIsDisplayed() }
waitForIdle()
flakySafely(WAIT_UNTIL_TIMEOUT) {
onTokenReceiveWarningBottomSheet {
bottomSheet.assertIsDisplayed()
}
}
}
step("Click on 'Got it' button") {
onTokenReceiveWarningBottomSheet { gotItButton.performClick() }
@ -326,8 +321,6 @@ class MainScreenActionButtonsTest : BaseTestCase() {
@Test
fun clickOnSellButtonTest() {
val tokenTitle = "Ethereum"
val tokenSymbol = "ETH"
val balance = TOTAL_BALANCE
val url = "sell.moonpay.com"
val useWithoutAccount = "Use without an account"
@ -336,7 +329,7 @@ class MainScreenActionButtonsTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Long click on token with name: '$tokenTitle'") {
waitForIdle()
@ -356,18 +349,15 @@ class MainScreenActionButtonsTest : BaseTestCase() {
onTokenActionsBottomSheet { sellButton.performClick() }
}
step("Assert Chrome Browser is opened") {
ChromeBrowserPageObject { assertChromeIsOpened() }
ThirdPartyAppPageObject { assertChromeIsOpened() }
}
if (ChromeBrowserPageObject.isElementWithTextExists(useWithoutAccount)) {
if (ThirdPartyAppPageObject.isElementWithTextExists(useWithoutAccount)) {
step("Click on '$useWithoutAccount' button on Chrome browser") {
ChromeBrowserPageObject { clickOnElementWithText(useWithoutAccount) }
ThirdPartyAppPageObject { clickOnElementWithText(useWithoutAccount) }
}
}
step("Assert url contains: '$url'") {
ChromeBrowserPageObject { assertUrlContains(url) }
}
step("Assert token symbol '$tokenSymbol' is displayed") {
ChromeBrowserPageObject { assertElementWithTextExists(tokenSymbol) }
ThirdPartyAppPageObject { assertUrlContains(url) }
}
}
}
@ -377,14 +367,13 @@ class MainScreenActionButtonsTest : BaseTestCase() {
@Test
fun assertSellButtonIsNotDisplayedTest() {
val tokenTitle = "Bitcoin"
val balance = TOTAL_BALANCE
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(balance)
synchronizeAddresses()
}
step("Long click on token with name: '$tokenTitle'") {
waitForIdle()

View file

@ -2,7 +2,6 @@ package com.tangem.tests.balance
import androidx.compose.ui.test.longClick
import com.tangem.common.BaseTestCase
import com.tangem.common.constants.TestConstants.TOTAL_BALANCE
import com.tangem.scenarios.openMainScreen
import com.tangem.scenarios.synchronizeAddresses
import com.tangem.screens.onMainScreen
@ -23,7 +22,7 @@ class TotalBalanceLongTapTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(TOTAL_BALANCE)
synchronizeAddresses()
}
step("Long tap on total balance block") {
onMainScreen {

View file

@ -51,7 +51,7 @@ class TotalBalanceUnavailableTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(DASH_SIGN)
synchronizeAddresses(isBalanceAvailable = false)
}
step("Assert 'Synchronize addresses' button does not exist") {
onMainScreen {
@ -88,7 +88,7 @@ class TotalBalanceUnavailableTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(DASH_SIGN)
synchronizeAddresses(isBalanceAvailable = false)
}
step("Assert 'Synchronize addresses' button does not exist") {
onMainScreen {
@ -125,7 +125,7 @@ class TotalBalanceUnavailableTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(DASH_SIGN)
synchronizeAddresses(isBalanceAvailable = false)
}
step("Assert 'Synchronize addresses' button does not exist") {
onMainScreen {

View file

@ -33,7 +33,7 @@ class TotalBalanceUpdateTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(TOTAL_BALANCE)
synchronizeAddresses()
}
step("Assert $TOTAL_BALANCE is displayed in total balance") {
onMainScreen { totalBalanceText.assertTextContains(TOTAL_BALANCE) }
@ -67,7 +67,7 @@ class TotalBalanceUpdateTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(TOTAL_BALANCE)
synchronizeAddresses()
}
step("Assert $TOTAL_BALANCE is displayed in total balance") {
onMainScreen { totalBalanceText.assertTextContains(TOTAL_BALANCE) }
@ -117,7 +117,7 @@ class TotalBalanceUpdateTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(TOTAL_BALANCE)
synchronizeAddresses()
}
step("Assert $TOTAL_BALANCE is displayed in total balance") {
onMainScreen { totalBalanceText.assertTextContains(TOTAL_BALANCE) }
@ -145,7 +145,7 @@ class TotalBalanceUpdateTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(TOTAL_BALANCE)
synchronizeAddresses()
}
step("Assert $TOTAL_BALANCE is displayed in total balance") {
onMainScreen { totalBalanceText.assertTextContains(TOTAL_BALANCE) }
@ -187,7 +187,7 @@ class TotalBalanceUpdateTest : BaseTestCase() {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses(TOTAL_BALANCE)
synchronizeAddresses()
}
step("Assert $TOTAL_BALANCE is displayed in total balance") {
onMainScreen { totalBalanceText.assertTextContains(TOTAL_BALANCE) }

View file

@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.tangem.core.ui.components.Keyboard
@ -17,6 +18,7 @@ import com.tangem.core.ui.components.keyboardAsState
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resolveAnnotatedReference
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.test.SendConfirmScreenTestTags
/**
* Sending info text with display animation.
@ -52,7 +54,8 @@ fun SendingText(footerText: TextReference, modifier: Modifier = Modifier) {
color = TangemTheme.colors.text.tertiary,
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
.padding(16.dp)
.testTag(SendConfirmScreenTestTags.SENDING_TEXT),
)
}
}

View file

@ -0,0 +1,5 @@
package com.tangem.core.ui.test
object SendConfirmScreenTestTags {
const val SENDING_TEXT = "SEND_CONFIRM_SCREEN_SENDING_TEXT"
}