Updated on 2026-08-14

This commit is contained in:
Tangem 2026-05-05 18:32:39 +03:00
parent 67ca192c16
commit 7b6fc18a8f
12 changed files with 79 additions and 113 deletions

View file

@ -27,6 +27,7 @@ import com.tangem.datasource.utils.WireMockRedirectInterceptor
import com.tangem.domain.promo.PromoRepository
import com.tangem.domain.promo.models.PromoId
import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase
import com.tangem.features.pushnotifications.api.utils.PUSH_PERMISSION
import com.tangem.tap.MainActivity
import dagger.hilt.android.testing.HiltAndroidRule
import io.qameta.allure.kotlin.Allure
@ -129,6 +130,12 @@ abstract class BaseTestCase : TestCase(
value = false
)
}
appPreferencesStore.editData { mutablePreferences ->
mutablePreferences.set(
key = PreferencesKeys.getShouldShowInitialPermissionScreen(PUSH_PERMISSION),
value = false
)
}
promoRepository.setNeverToShowWalletPromo(PromoId.Sepa)
}
apiEnvironmentRule.setup(apiConfigsManager)

View file

@ -128,10 +128,6 @@ fun BaseTestCase.synchronizeAddresses(
onMainScreen { totalBalanceText.assert(!hasText(DASH_SIGN)) }
}
}
step("Expand 'Main account' to reveal tokens") {
onMainScreen { mainAccount().performClick() }
}
}
fun BaseTestCase.openDeviceSettingsScreen() {

View file

@ -11,20 +11,17 @@ import io.qameta.allure.kotlin.Allure.step
import com.tangem.common.ui.R as CommonUiR
private val firstStoryIndex = 0
private val firstStoryTitle = getResourceString(CommonUiR.string.swap_story_first_title)
private val firstStorySubtitle = getResourceString(CommonUiR.string.swap_story_first_subtitle)
private val firstStoryTitle = getResourceString(CommonUiR.string.swap_story_first_title_v2)
private val firstStorySubtitle = getResourceString(CommonUiR.string.swap_story_first_subtitle_v2)
private val secondStoryIndex = 1
private val secondStoryTitle = getResourceString(CommonUiR.string.swap_story_second_title)
private val secondStorySubtitle = getResourceString(CommonUiR.string.swap_story_second_subtitle)
private val secondStoryTitle = getResourceString(CommonUiR.string.swap_story_second_title_v2)
private val secondStorySubtitle = getResourceString(CommonUiR.string.swap_story_second_subtitle_v2)
private val thirdStoryIndex = 2
private val thirdStoryTitle = getResourceString(CommonUiR.string.swap_story_third_title)
private val thirdStorySubtitle = getResourceString(CommonUiR.string.swap_story_third_subtitle)
private val thirdStoryTitle = getResourceString(CommonUiR.string.swap_story_third_title_v2)
private val thirdStorySubtitle = getResourceString(CommonUiR.string.swap_story_third_subtitle_v2)
private val forthStoryIndex = 3
private val forthStoryTitle = getResourceString(CommonUiR.string.swap_story_forth_title)
private val forthStorySubtitle = getResourceString(CommonUiR.string.swap_story_forth_subtitle)
private val fifthStoryIndex = 4
private val fifthStoryTitle = getResourceString(CommonUiR.string.swap_story_fifth_title)
private val fifthStorySubtitle = getResourceString(CommonUiR.string.swap_story_fifth_subtitle)
private val forthStoryTitle = getResourceString(CommonUiR.string.swap_story_forth_title_v2)
private val forthStorySubtitle = getResourceString(CommonUiR.string.swap_story_forth_subtitle_v2)
fun BaseTestCase.openSwapScreen(
from: SwapEntryPoint,
@ -120,26 +117,6 @@ fun BaseTestCase.checkStoriesChanges() {
storySubtitle = forthStorySubtitle
)
}
step("Click on right side") {
onSwapStoriesScreen { container.performTouchInput { click(centerRight) } }
}
step("Check title and subtitle for story №${fifthStoryIndex + 1}") {
checkStoriesContent(
storyIndex = fifthStoryIndex,
storyTitle = fifthStoryTitle,
storySubtitle = fifthStorySubtitle
)
}
step("Click on left side") {
onSwapStoriesScreen { container.performTouchInput { click(centerLeft) } }
}
step("Check title and subtitle for story №${forthStoryIndex + 1}") {
checkStoriesContent(
storyIndex = forthStoryIndex,
storyTitle = forthStoryTitle,
storySubtitle = forthStorySubtitle
)
}
step("Click on left side") {
onSwapStoriesScreen { container.performTouchInput { click(centerLeft) } }
}

View file

@ -244,7 +244,7 @@ class MainScreenPageObject(semanticsProvider: SemanticsNodeInteractionsProvider)
fun tokenWithTitleAndAddress(tokenTitle: String): KNode {
return lazyList.childWith<LazyListItemNode> {
hasTestTag(MainScreenTestTags.TOKEN_LIST_ITEM)
hasAnyDescendant(withText(tokenTitle))
hasText(tokenTitle)
useUnmergedTree = true
}.child<KNode> {
hasTestTag(TokenElementsTestTags.TOKEN_FIAT_AMOUNT)
@ -256,7 +256,7 @@ class MainScreenPageObject(semanticsProvider: SemanticsNodeInteractionsProvider)
fun tokenWithCustomDerivationIcon(tokenTitle: String): KNode {
return lazyList.childWith<LazyListItemNode> {
hasTestTag(MainScreenTestTags.TOKEN_LIST_ITEM)
hasAnyDescendant(withText(tokenTitle))
hasText(tokenTitle)
useUnmergedTree = true
}.child<KNode> {
hasTestTag(TokenElementsTestTags.TOKEN_CUSTOM_DERIVATION_ICON)
@ -297,7 +297,7 @@ class MainScreenPageObject(semanticsProvider: SemanticsNodeInteractionsProvider)
fun tokenWithTitleAndPosition(tokenTitle: String, index: Int): KNode {
return lazyList.childWith<LazyListItemNode> {
hasTestTag(MainScreenTestTags.TOKEN_LIST_ITEM)
hasAnyDescendant(withText(tokenTitle))
hasText(tokenTitle)
hasLazyListItemPosition(index)
useUnmergedTree = true
}.child<KNode> {

View file

@ -143,7 +143,7 @@ class SwapTokenPageObject(semanticsProvider: SemanticsNodeInteractionsProvider)
val youSwapBlock: KNode = child {
hasTestTag(SwapTokenScreenTestTags.SWAP_BLOCK_HEADER)
hasAnyDescendant(withText(getResourceString(R.string.swapping_from_title)))
hasAnyDescendant(withText(getResourceString(R.string.swapping_from_title_v2)))
hasAnyDescendant(withTestTag(SwapTokenScreenTestTags.BALANCE))
useUnmergedTree = true
}

View file

@ -30,7 +30,6 @@ class SwapChooseTokenScreenTest : BaseTestCase() {
@Test
fun checkAvailableToSwapTokensListTest() {
val tokenTitle = "Polygon"
val inputAmount = "100"
val ethereum = "Ethereum"
val polExMatic = "POL (ex-MATIC)"
val bitcoin = "Bitcoin"
@ -66,13 +65,6 @@ class SwapChooseTokenScreenTest : BaseTestCase() {
step("Assert 'You swap' block is displayed") {
onSwapTokenScreen { youSwapBlock.assertIsDisplayed() }
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
textInput.clickWithAssertion()
textInput.performTextReplacement(inputAmount)
}
}
step("Click on 'Select token' icon") {
onSwapTokenScreen { swapSelectTokenIcon.performClick() }
}
@ -102,7 +94,6 @@ class SwapChooseTokenScreenTest : BaseTestCase() {
@Test
fun checkSearchOnSwapChooseTokenScreenTest() {
val tokenTitle = "Polygon"
val inputAmount = "100"
val ethereum = "Ethereum"
val polExMatic = "POL (ex-MATIC)"
val polExMaticSymbol = "POL"
@ -129,13 +120,6 @@ class SwapChooseTokenScreenTest : BaseTestCase() {
step("Assert 'You swap' block is displayed") {
onSwapTokenScreen { youSwapBlock.assertIsDisplayed() }
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
textInput.clickWithAssertion()
textInput.performTextReplacement(inputAmount)
}
}
step("Click on 'Choose token' button") {
onSwapTokenScreen { chooseTokenButton.performClick() }
}

View file

@ -117,7 +117,7 @@ class SwapStoriesTest : BaseTestCase() {
@DisplayName("Check unavailable swap stories on 'Main' screen")
@Test
fun checkUnavailableSwapStoriesOnMainScreen() {
val scenarioName = "stories_first_time_swap"
val scenarioName = "stories_first_time_swap_v2"
val scenarioErrorState = "Error"
val packageName = getTargetContext().packageName
@ -168,7 +168,7 @@ class SwapStoriesTest : BaseTestCase() {
@DisplayName("Check unavailable swap stories on 'Token details' screen")
@Test
fun checkUnavailableSwapStoriesOnTokenDetailsScreen() {
val scenarioName = "stories_first_time_swap"
val scenarioName = "stories_first_time_swap_v2"
val scenarioErrorState = "Error"
val packageName = getTargetContext().packageName
val tokenName = "Ethereum"
@ -224,7 +224,7 @@ class SwapStoriesTest : BaseTestCase() {
@DisplayName("Check unavailable swap stories on 'Markets' token details screen")
@Test
fun checkUnavailableSwapStoriesOnMarketsTokenDetailsScreen() {
val scenarioName = "stories_first_time_swap"
val scenarioName = "stories_first_time_swap_v2"
val scenarioErrorState = "Error"
val packageName = getTargetContext().packageName
val tokenName = "Ethereum"

View file

@ -68,6 +68,9 @@ class SwapTokenScreenTest : BaseTestCase() {
}
}
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
@ -75,9 +78,6 @@ class SwapTokenScreenTest : BaseTestCase() {
textInput.performTextReplacement(inputAmount)
}
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Assert input amount = '$inputAmount'") {
onSwapTokenScreen { textInput.assertTextEquals(inputAmount) }
}
@ -121,6 +121,7 @@ class SwapTokenScreenTest : BaseTestCase() {
@Test
fun networkErrorSwapTest() {
val tokenTitle = "Polygon"
val receiveTokenName = "Ethereum"
setupHooks(
additionalAfterSection = {
@ -154,6 +155,9 @@ class SwapTokenScreenTest : BaseTestCase() {
step("Assert 'Swap' screen title is displayed") {
onSwapTokenScreen { title.assertIsDisplayed() }
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Assert error notification title is displayed") {
onSwapTokenScreen {
waitForIdle()
@ -212,6 +216,9 @@ class SwapTokenScreenTest : BaseTestCase() {
}
}
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
@ -222,9 +229,6 @@ class SwapTokenScreenTest : BaseTestCase() {
step("Assert input amount = '$inputAmount'") {
onSwapTokenScreen { textInput.assertTextEquals(inputAmount) }
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Assert receive amount is displayed") {
onSwapTokenScreen {
flakySafely(WAIT_UNTIL_TIMEOUT) {
@ -461,8 +465,12 @@ class SwapTokenScreenTest : BaseTestCase() {
onSwapTokenScreen { receiveTokenSymbol(receiveTokenSymbol).assertIsDisplayed() }
}
step("Click on 'Swap tokens on screen' button") {
onSwapTokenScreen { replaceTokensButton.performClick() }
waitForIdle()
flakySafely(WAIT_UNTIL_TIMEOUT_LONG) {
onSwapTokenScreen {
replaceTokensButton.assertIsEnabled()
replaceTokensButton.performClick()
}
}
}
step("Assert new swap token symbol: '$receiveTokenSymbol' is displayed") {
onSwapTokenScreen { swapTokenSymbol(receiveTokenSymbol).assertIsDisplayed() }
@ -557,6 +565,9 @@ class SwapTokenScreenTest : BaseTestCase() {
step("Assert 'You swap' block is displayed") {
onSwapTokenScreen { youSwapBlock.assertIsDisplayed() }
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
@ -564,9 +575,6 @@ class SwapTokenScreenTest : BaseTestCase() {
textInput.performTextReplacement(inputAmount)
}
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Select '$market' fee type") {
flakySafely(WAIT_UNTIL_TIMEOUT_LONG) {
selectFeeType(FeeType.Market, selectedFeeAmount = marketFeeAmount)
@ -623,6 +631,9 @@ class SwapTokenScreenTest : BaseTestCase() {
step("Assert 'You swap' block is displayed") {
onSwapTokenScreen { youSwapBlock.assertIsDisplayed() }
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
@ -630,9 +641,6 @@ class SwapTokenScreenTest : BaseTestCase() {
textInput.performTextReplacement(inputAmount)
}
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Select '$marketFeeType' fee type") {
flakySafely(WAIT_UNTIL_TIMEOUT_LONG) {
selectFeeType(feeType = FeeType.Market, feeAmount)
@ -703,6 +711,9 @@ class SwapTokenScreenTest : BaseTestCase() {
step("Assert 'You swap' block is displayed") {
onSwapTokenScreen { youSwapBlock.assertIsDisplayed() }
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
@ -710,9 +721,6 @@ class SwapTokenScreenTest : BaseTestCase() {
textInput.performTextReplacement(inputAmount)
}
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Assert 'Swap' button is enabled") {
flakySafely(WAIT_UNTIL_TIMEOUT_LONG) {
onSwapTokenScreen { swapButton.assertIsEnabled() }

View file

@ -60,6 +60,9 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
step("Assert 'You swap' block is displayed") {
onSwapTokenScreen { youSwapBlock.assertIsDisplayed() }
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenTitle)
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
@ -67,9 +70,6 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
textInput.performTextReplacement(inputAmount)
}
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenTitle)
}
step("Assert 'Insufficient funds' error is displayed") {
waitForIdle()
onSwapTokenScreen { insufficientFundsErrorTitle.assertIsDisplayed() }
@ -125,6 +125,9 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
step("Assert 'You swap' block is displayed") {
onSwapTokenScreen { youSwapBlock.assertIsDisplayed() }
}
step("Choose receive token") {
chooseReceiveToken(networkName)
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
@ -132,9 +135,6 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
textInput.performTextReplacement(inputAmount)
}
}
step("Choose receive token") {
chooseReceiveToken(networkName)
}
step("Check 'Unable to cover '$networkName' fee notification") {
flakySafely(WAIT_UNTIL_TIMEOUT_LONG) {
chackUnableToCoverFeeNotification(networkName = networkName, currencySymbol = currencySymbol)
@ -204,6 +204,9 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
step("Assert 'You swap' block is displayed") {
onSwapTokenScreen { youSwapBlock.assertIsDisplayed() }
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
@ -211,9 +214,6 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
textInput.performTextReplacement(inputAmount)
}
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Assert fiat amount with warning is displayed") {
flakySafely(WAIT_UNTIL_TIMEOUT_LONG) {
onSwapTokenScreen {
@ -293,6 +293,9 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
step("Assert 'You swap' block is displayed") {
onSwapTokenScreen { youSwapBlock.assertIsDisplayed() }
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
@ -300,9 +303,6 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
textInput.performTextReplacement(inputAmount)
}
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Assert fiat amount with warning is displayed") {
onSwapTokenScreen { receiveFiatAmount.assertTextContains("%", substring = true) }
}
@ -381,6 +381,9 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
step("Assert 'You swap' block is displayed") {
onSwapTokenScreen { youSwapBlock.assertIsDisplayed() }
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
@ -388,9 +391,6 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
textInput.performTextReplacement(inputAmount)
}
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Assert 'Invalid amount' warning is not displayed") {
flakySafely(WAIT_UNTIL_TIMEOUT_LONG) {
checkSwapWarning(
@ -450,6 +450,9 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
step("Assert 'You swap' block is displayed") {
onSwapTokenScreen { youSwapBlock.assertIsDisplayed() }
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
@ -457,9 +460,6 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
textInput.performTextReplacement(inputAmount)
}
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Assert 'Invalid amount' warning is not displayed") {
flakySafely(WAIT_UNTIL_TIMEOUT_LONG) {
checkSwapWarning(
@ -520,6 +520,9 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
step("Assert 'You swap' block is displayed") {
onSwapTokenScreen { youSwapBlock.assertIsDisplayed() }
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
@ -527,9 +530,6 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
textInput.performTextReplacement(inputAmount)
}
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Assert 'Invalid amount' warning is not displayed") {
flakySafely(WAIT_UNTIL_TIMEOUT_LONG) {
checkSwapWarning(
@ -589,6 +589,9 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
step("Assert 'You swap' block is displayed") {
onSwapTokenScreen { youSwapBlock.assertIsDisplayed() }
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Input swap amount = '$inputAmount'") {
waitForIdle()
onSwapTokenScreen {
@ -596,9 +599,6 @@ class SwapTokenScreenWarningsTest : BaseTestCase() {
textInput.performTextReplacement(inputAmount)
}
}
step("Choose receive token") {
chooseReceiveToken(receiveTokenName)
}
step("Assert 'Invalid amount' warning is displayed") {
flakySafely(WAIT_UNTIL_TIMEOUT_LONG) {
checkSwapWarning(