tangem-app-android-audited/app/src/androidTest/kotlin/com/tangem/tests/swap/SearchAndSwapTest.kt
2026-04-29 17:05:01 +03:00

265 lines
No EOL
10 KiB
Kotlin

package com.tangem.tests.swap
import com.tangem.common.BaseTestCase
import com.tangem.common.R
import com.tangem.common.constants.TestConstants.WAIT_UNTIL_TIMEOUT
import com.tangem.common.extensions.clickWithAssertion
import com.tangem.common.extensions.performTextInputInChunks
import com.tangem.common.utils.resetWireMockScenarioState
import com.tangem.common.utils.setWireMockScenarioState
import com.tangem.scenarios.SwapEntryPoint
import com.tangem.scenarios.openMainScreen
import com.tangem.scenarios.openSwapScreen
import com.tangem.scenarios.synchronizeAddresses
import com.tangem.screens.*
import dagger.hilt.android.testing.HiltAndroidTest
import io.github.kakaocup.kakao.common.utilities.getResourceString
import io.qameta.allure.kotlin.AllureId
import io.qameta.allure.kotlin.junit4.DisplayName
import org.junit.Ignore
import org.junit.Test
@HiltAndroidTest
class SearchAndSwapTest : BaseTestCase() {
@Ignore("ToDo: [REDACTED_JIRA]")
@AllureId("8520")
@DisplayName("Search and Swap: add token without derivation")
@Test
fun addTokenWithoutDerivationTest() {
val swapTokenName = "Ethereum"
val receiveTokenName = "Tether"
val swapTokenSymbol = "ETH"
val receiveTokenSymbol = "USDT"
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses()
}
step("Open 'Swap' screen") {
openSwapScreen(from = SwapEntryPoint.MainScreen)
}
step("Click on token with name '$swapTokenName'") {
onSwapSelectTokenScreen { tokenWithName(swapTokenName).performClick() }
waitForIdle()
}
step("Click on 'Search' text field") {
onSwapSelectTokenScreen { searchBarPlaceholderText.performClick() }
}
step("Type '$receiveTokenName' in input text field") {
onSwapSelectTokenScreen { searchBarBlock.performTextInputInChunks(receiveTokenName) }
}
step("Click on token with name '$receiveTokenName'") {
flakySafely(WAIT_UNTIL_TIMEOUT) {
onSwapSelectTokenScreen { marketsTokenWithName(receiveTokenName).clickWithAssertion() }
}
}
step("Click on 'Add' button") {
onAddTokenBottomSheet { addButton.performClick() }
}
step("Assert swap token symbol: '$swapTokenSymbol' is displayed") {
onSwapTokenScreen { swapTokenSymbol(swapTokenSymbol).assertIsDisplayed() }
}
step("Assert receive token symbol: '$receiveTokenSymbol' is displayed") {
onSwapTokenScreen { receiveTokenSymbol(receiveTokenSymbol).assertIsDisplayed() }
}
}
}
@Ignore("ToDo: [REDACTED_JIRA]")
@AllureId("8519")
@DisplayName("Search and Swap: add token with derivation")
@Test
fun addTokenWithDerivationTest() {
val swapTokenName = "Ethereum"
val receiveTokenName = "TRON"
val swapTokenSymbol = "ETH"
val receiveTokenSymbol = "TRX"
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses()
}
step("Open 'Swap' screen") {
openSwapScreen(from = SwapEntryPoint.MainScreen)
}
step("Click on token with name '$swapTokenName'") {
onSwapSelectTokenScreen { tokenWithName(swapTokenName).performClick() }
waitForIdle()
}
step("Click on 'Search' text field") {
onSwapSelectTokenScreen { searchBarPlaceholderText.performClick() }
}
step("Type '$receiveTokenSymbol' in input text field") {
onSwapSelectTokenScreen { searchBarBlock.performTextInputInChunks(receiveTokenSymbol) }
}
step("Click on token with name '$receiveTokenName'") {
flakySafely(WAIT_UNTIL_TIMEOUT) {
onSwapSelectTokenScreen { marketsTokenWithName(receiveTokenName).clickWithAssertion() }
}
}
step("Click on 'Add' button") {
onAddTokenBottomSheet { addButton.performClick() }
}
step("Assert swap token symbol: '$swapTokenSymbol' is displayed") {
onSwapTokenScreen { swapTokenSymbol(swapTokenSymbol).assertIsDisplayed() }
}
step("Assert receive token symbol: '$receiveTokenSymbol' is displayed") {
onSwapTokenScreen { receiveTokenSymbol(receiveTokenSymbol).assertIsDisplayed() }
}
}
}
@Ignore("ToDo: [REDACTED_JIRA]")
@AllureId("8523")
@DisplayName("Search and Swap: Markets error")
@Test
fun marketsErrorTest() {
val swapTokenName = "Ethereum"
val scenarioName = "coins_list_api"
val scenarioState = "Error"
setupHooks(
additionalAfterSection = {
resetWireMockScenarioState(scenarioName)
}
).run {
step("Set WireMock scenario: '$scenarioName' to state: '$scenarioState'") {
setWireMockScenarioState(scenarioName, scenarioState)
}
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses()
}
step("Open 'Swap' screen") {
openSwapScreen(from = SwapEntryPoint.MainScreen)
}
step("Click on token with name '$swapTokenName'") {
onSwapSelectTokenScreen { tokenWithName(swapTokenName).performClick() }
waitForIdle()
}
step("Assert 'Unable to load data...' error is displayed") {
onSwapSelectTokenScreen { unableToLoadData.assertIsDisplayed() }
}
step("Assert 'Try again' button is displayed") {
onSwapSelectTokenScreen { tryAgainButton.assertIsDisplayed() }
}
}
}
@Ignore("ToDo: [REDACTED_JIRA]")
@AllureId("8522")
@DisplayName("Search and Swap: check 'Unsupported token pair' warning")
@Test
fun unsupportedTokenPairTest() {
val swapTokenName = "Ethereum"
val receiveTokenName = "Pepe"
val warningTitle = getResourceString(R.string.warning_express_unsupported_pair_title)
val warningMessage = getResourceString(R.string.warning_express_unsupported_pair_description)
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses()
}
step("Open 'Swap' screen") {
openSwapScreen(from = SwapEntryPoint.MainScreen)
}
step("Click on token with name '$swapTokenName'") {
onSwapSelectTokenScreen { tokenWithName(swapTokenName).performClick() }
waitForIdle()
}
step("Click on 'Search' text field") {
onSwapSelectTokenScreen { searchBarPlaceholderText.performClick() }
}
step("Type '$receiveTokenName' in input text field") {
onSwapSelectTokenScreen { searchBarBlock.performTextInputInChunks(receiveTokenName) }
}
step("Click on token with name '$receiveTokenName'") {
flakySafely(WAIT_UNTIL_TIMEOUT) {
onSwapSelectTokenScreen { marketsTokenWithName(receiveTokenName).clickWithAssertion() }
}
}
step("Click on 'Add' button") {
onAddTokenBottomSheet { addButton.performClick() }
}
step("Assert warning title '$warningTitle' is displayed") {
onSwapTokenScreen { warningTitle(warningTitle).assertIsDisplayed() }
}
step("Assert warning message '$warningMessage' is displayed") {
onSwapTokenScreen { warningMessage(warningMessage).assertIsDisplayed() }
}
step("Assert warning icon is displayed'") {
onSwapTokenScreen { warningIcon(warningMessage).assertIsDisplayed() }
}
}
}
@Ignore("ToDo: [REDACTED_JIRA]")
@AllureId("8521")
@DisplayName("Swap: search token on Swap token screen")
@Test
fun networkFeeTest() {
val tokenTitle = "Ethereum"
val swapTokenSymbol = "TRX"
val receiveTokenSymbol = "ETH"
val swapTokenName = "TRON"
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen()
}
step("Synchronize addresses") {
synchronizeAddresses()
}
step("Click on token with name: '$tokenTitle'") {
onMainScreen { tokenWithTitleAndAddress(tokenTitle).clickWithAssertion() }
}
step("Open 'Swap' screen") {
openSwapScreen(from = SwapEntryPoint.TokenDetails)
}
step("Click on 'Replace tokens' button") {
onSwapTokenScreen { replaceTokensButton.performClick() }
}
step("Click on 'Select token' icon") {
onSwapTokenScreen { swapSelectTokenIcon.performClick() }
}
step("Click on 'Search' icon") {
onSwapSelectTokenScreen { searchBarIcon.performClick() }
}
step("Type '$swapTokenSymbol' in 'Search' text field") {
onSwapSelectTokenScreen { searchBarBlock.performTextInputInChunks(swapTokenSymbol) }
}
step("Click on token with name: '$swapTokenName'") {
flakySafely(WAIT_UNTIL_TIMEOUT) {
onSwapSelectTokenScreen { marketsTokenWithName(swapTokenName).performClick() }
}
}
step("Click on 'Add' button") {
onAddTokenBottomSheet { addButton.performClick() }
}
step("Assert swap token symbol: '$swapTokenSymbol' is displayed") {
onSwapTokenScreen { swapTokenSymbol(swapTokenSymbol).assertIsDisplayed() }
}
step("Assert receive token symbol: '$receiveTokenSymbol' is displayed") {
onSwapTokenScreen { receiveTokenSymbol(receiveTokenSymbol).assertIsDisplayed() }
}
}
}
}