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

View file

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

View file

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

View file

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

View file

@ -143,7 +143,7 @@ class SwapTokenPageObject(semanticsProvider: SemanticsNodeInteractionsProvider)
val youSwapBlock: KNode = child { val youSwapBlock: KNode = child {
hasTestTag(SwapTokenScreenTestTags.SWAP_BLOCK_HEADER) 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)) hasAnyDescendant(withTestTag(SwapTokenScreenTestTags.BALANCE))
useUnmergedTree = true useUnmergedTree = true
} }

View file

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

View file

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

View file

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

View file

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

View file

@ -84,10 +84,8 @@ internal class MockAwareTangemPayStorage @Inject constructor(
override suspend fun storeCheckCustomerWalletResult(userWalletId: UserWalletId, isPaeraCustomer: Boolean) = override suspend fun storeCheckCustomerWalletResult(userWalletId: UserWalletId, isPaeraCustomer: Boolean) =
real.storeCheckCustomerWalletResult(userWalletId, isPaeraCustomer) real.storeCheckCustomerWalletResult(userWalletId, isPaeraCustomer)
override suspend fun checkCustomerWalletResult(userWalletId: UserWalletId): Boolean? { override suspend fun checkCustomerWalletResult(userWalletId: UserWalletId): Boolean? =
if (isMockMode) return true real.checkCustomerWalletResult(userWalletId)
return real.checkCustomerWalletResult(userWalletId)
}
override suspend fun storeActiveWithdrawOrderId(userWalletId: UserWalletId, orderId: String) = override suspend fun storeActiveWithdrawOrderId(userWalletId: UserWalletId, orderId: String) =
real.storeActiveWithdrawOrderId(userWalletId, orderId) real.storeActiveWithdrawOrderId(userWalletId, orderId)

View file

@ -96,14 +96,14 @@ fun StoriesProgressBar(
.height(2.dp) .height(2.dp)
.weight(1f) .weight(1f)
.clip(RoundedCornerShape(2.dp)) .clip(RoundedCornerShape(2.dp))
.background(TangemColorPalette.White.copy(alpha = .2f)), .background(TangemColorPalette.White.copy(alpha = .2f))
.testTag(SwapStoriesScreenTestTags.PROGRESS_BAR_ITEM),
) { ) {
Box( Box(
modifier = Modifier modifier = Modifier
.clip(RoundedCornerShape(2.dp)) .clip(RoundedCornerShape(2.dp))
.background(TangemColorPalette.White) .background(TangemColorPalette.White)
.fillMaxHeight() .fillMaxHeight()
.testTag(SwapStoriesScreenTestTags.PROGRESS_BAR_ITEM)
.let { modifier -> .let { modifier ->
when (index) { when (index) {
currentStep -> modifier.fillMaxWidth(progress.value) currentStep -> modifier.fillMaxWidth(progress.value)

View file

@ -71,15 +71,11 @@ internal class MockAwareOnboardingRepository @Inject constructor(
override suspend fun hasTangemPayInWallet(userWalletId: UserWalletId): Either<VisaApiError, Boolean> = override suspend fun hasTangemPayInWallet(userWalletId: UserWalletId): Either<VisaApiError, Boolean> =
real.hasTangemPayInWallet(userWalletId) real.hasTangemPayInWallet(userWalletId)
override suspend fun checkCustomerEligibility(): List<TangemPayEligibilityType> { override suspend fun checkCustomerEligibility(): List<TangemPayEligibilityType> =
if (isMockMode) return listOf(TangemPayEligibilityType.DETAILS) real.checkCustomerEligibility()
return real.checkCustomerEligibility()
}
override suspend fun getCustomerEligibility(): List<TangemPayEligibilityType> { override suspend fun getCustomerEligibility(): List<TangemPayEligibilityType> =
if (isMockMode) return listOf(TangemPayEligibilityType.DETAILS) real.getCustomerEligibility()
return real.getCustomerEligibility()
}
override fun getSavedCustomerInfo(userWalletId: UserWalletId): CustomerInfo? = override fun getSavedCustomerInfo(userWalletId: UserWalletId): CustomerInfo? =
real.getSavedCustomerInfo(userWalletId) real.getSavedCustomerInfo(userWalletId)