From 1f6ead31a253ff32eb12b878a5e1b1fd14491087 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 17 Nov 2025 10:41:08 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/scenarios/SendScenarios.kt | 25 ++++ .../tangem/scenarios/SendWarningScenarios.kt | 28 ---- .../tangem/screens/SendAddressPageObject.kt | 16 +- .../send/addressScreen/MyWalletsBlockTest.kt | 137 ++++++++++++++++++ 4 files changed, 175 insertions(+), 31 deletions(-) create mode 100644 app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/MyWalletsBlockTest.kt diff --git a/app/src/androidTest/kotlin/com/tangem/scenarios/SendScenarios.kt b/app/src/androidTest/kotlin/com/tangem/scenarios/SendScenarios.kt index e09a95e61d..f1d548fd8e 100644 --- a/app/src/androidTest/kotlin/com/tangem/scenarios/SendScenarios.kt +++ b/app/src/androidTest/kotlin/com/tangem/scenarios/SendScenarios.kt @@ -1,7 +1,10 @@ package com.tangem.scenarios import com.tangem.common.BaseTestCase +import com.tangem.common.constants.TestConstants.QUOTES_API_SCENARIO +import com.tangem.common.constants.TestConstants.USER_TOKENS_API_SCENARIO import com.tangem.common.extensions.clickWithAssertion +import com.tangem.common.utils.setWireMockScenarioState import com.tangem.screens.* import com.tangem.screens.onMainScreen import com.tangem.screens.onSendConfirmScreen @@ -9,6 +12,28 @@ import com.tangem.screens.onSendScreen import com.tangem.screens.onTokenDetailsScreen import io.qameta.allure.kotlin.Allure.step +fun BaseTestCase.openSendScreen(tokenName: String, mockState: String = "") { + val scenarioState = mockState.ifEmpty { tokenName } + step("Set WireMock scenario: '$USER_TOKENS_API_SCENARIO' to state: '$scenarioState'") { + setWireMockScenarioState(scenarioName = USER_TOKENS_API_SCENARIO, state = scenarioState) + } + step("Set WireMock scenario: '$QUOTES_API_SCENARIO' to state: '$scenarioState'") { + setWireMockScenarioState(scenarioName = QUOTES_API_SCENARIO, state = scenarioState) + } + step("Open 'Main Screen'") { + openMainScreen() + } + step("Synchronize addresses") { + synchronizeAddresses() + } + step("Click on token with name: '$tokenName'") { + onMainScreen { tokenWithTitleAndAddress(tokenName).clickWithAssertion() } + } + step("Click on 'Send' button") { + onTokenDetailsScreen { sendButton().performClick() } + } +} + fun BaseTestCase.checkNetworkFeeBlock(currentFeeAmount: String, withFeeSelector: Boolean) { step("Assert fee selector block is displayed") { onSendConfirmScreen { feeSelectorBlock.assertIsDisplayed() } diff --git a/app/src/androidTest/kotlin/com/tangem/scenarios/SendWarningScenarios.kt b/app/src/androidTest/kotlin/com/tangem/scenarios/SendWarningScenarios.kt index 526f7a316b..f90275a934 100644 --- a/app/src/androidTest/kotlin/com/tangem/scenarios/SendWarningScenarios.kt +++ b/app/src/androidTest/kotlin/com/tangem/scenarios/SendWarningScenarios.kt @@ -1,38 +1,10 @@ package com.tangem.scenarios import com.tangem.common.BaseTestCase -import com.tangem.common.constants.TestConstants.QUOTES_API_SCENARIO -import com.tangem.common.constants.TestConstants.USER_TOKENS_API_SCENARIO -import com.tangem.common.extensions.clickWithAssertion -import com.tangem.common.utils.setWireMockScenarioState -import com.tangem.screens.onMainScreen import com.tangem.screens.onSendConfirmScreen -import com.tangem.screens.onTokenDetailsScreen import io.github.kakaocup.compose.node.element.KNode import io.qameta.allure.kotlin.Allure.step -fun BaseTestCase.openSendScreen(tokenName: String, mockState: String = "") { - val scenarioState = mockState.ifEmpty { tokenName } - step("Set WireMock scenario: '$USER_TOKENS_API_SCENARIO' to state: '$scenarioState'") { - setWireMockScenarioState(scenarioName = USER_TOKENS_API_SCENARIO, state = scenarioState) - } - step("Set WireMock scenario: '$QUOTES_API_SCENARIO' to state: '$scenarioState'") { - setWireMockScenarioState(scenarioName = QUOTES_API_SCENARIO, state = scenarioState) - } - step("Open 'Main Screen'") { - openMainScreen() - } - step("Synchronize addresses") { - synchronizeAddresses() - } - step("Click on token with name: '$tokenName'") { - onMainScreen { tokenWithTitleAndAddress(tokenName).clickWithAssertion() } - } - step("Click on 'Send' button") { - onTokenDetailsScreen { sendButton().performClick() } - } -} - fun BaseTestCase.checkSendWarning( title: String, message: String, diff --git a/app/src/androidTest/kotlin/com/tangem/screens/SendAddressPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/SendAddressPageObject.kt index 91f8d64b12..ec4330c3fd 100644 --- a/app/src/androidTest/kotlin/com/tangem/screens/SendAddressPageObject.kt +++ b/app/src/androidTest/kotlin/com/tangem/screens/SendAddressPageObject.kt @@ -55,14 +55,24 @@ class SendAddressPageObject(semanticsProvider: SemanticsNodeInteractionsProvider useUnmergedTree = true } - fun recentAddressItem(recipientAddress: String): KNode = child { + val myWalletsTitle: KNode = child { + hasText(getResourceString(CoreUiR.string.send_recipient_wallets_title)) + useUnmergedTree = true + } + + fun recentAddressItem(recipientAddress: String, isMyWallet: Boolean = false): KNode = child { hasTestTag(SendAddressScreenTestTags.RECENT_ADDRESS_ITEM) - hasAnySibling(withText(getResourceString(CoreUiR.string.send_recent_transactions))) hasAnyChild(withTestTag(SendAddressScreenTestTags.RECENT_ADDRESS_ICON)) hasAnyDescendant(withText(recipientAddress)) hasAnyDescendant(withTestTag(SendAddressScreenTestTags.RECENT_ADDRESS_TEXT)) - hasAnyDescendant(withTestTag(SendAddressScreenTestTags.RECENT_ADDRESS_TRANSACTION_ICON)) useUnmergedTree = true + if (isMyWallet) { + hasAnySibling(withText(getResourceString(CoreUiR.string.send_recipient_wallets_title))) + hasAnyDescendant(withText(getResourceString(CoreUiR.string.manage_tokens_network_selector_wallet))) + } else { + hasAnySibling(withText(getResourceString(CoreUiR.string.send_recent_transactions))) + hasAnyDescendant(withTestTag(SendAddressScreenTestTags.RECENT_ADDRESS_TRANSACTION_ICON)) + } } fun recentAddressItemDescription(recipientAddress: String): KNode = recentAddressItem(recipientAddress).child { diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/MyWalletsBlockTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/MyWalletsBlockTest.kt new file mode 100644 index 0000000000..13d2d3d727 --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/MyWalletsBlockTest.kt @@ -0,0 +1,137 @@ +package com.tangem.tests.send.addressScreen + +import com.tangem.common.BaseTestCase +import com.tangem.common.constants.TestConstants.DOGECOIN_ADDRESS +import com.tangem.common.constants.TestConstants.ETHEREUM_ADDRESS +import com.tangem.common.constants.TestConstants.QUOTES_API_SCENARIO +import com.tangem.common.constants.TestConstants.USER_TOKENS_API_SCENARIO +import com.tangem.common.utils.resetWireMockScenarioState +import com.tangem.common.utils.setWireMockScenarioState +import com.tangem.scenarios.openMainScreen +import com.tangem.scenarios.openSendAddressScreen +import com.tangem.scenarios.synchronizeAddresses +import com.tangem.screens.onSendAddressScreen +import com.tangem.screens.onSendConfirmScreen +import dagger.hilt.android.testing.HiltAndroidTest +import io.qameta.allure.kotlin.AllureId +import io.qameta.allure.kotlin.junit4.DisplayName +import org.junit.Test + +@HiltAndroidTest +class MyWalletsBlockTest : BaseTestCase() { + private val txHistoryScenarioName = "dogecoin_tx_history" + + @AllureId("4579") + @DisplayName("Send (address screen): click on 'My wallet address'") + @Test + fun clickOnMyWalletAddressTest() { + val tokenName = "Dogecoin" + val sendAmount = "1" + val txHistoryScenarioState = "OutgoingTransaction" + + setupHooks( + additionalAfterSection = { + resetWireMockScenarioState(USER_TOKENS_API_SCENARIO) + resetWireMockScenarioState(QUOTES_API_SCENARIO) + resetWireMockScenarioState(txHistoryScenarioName) + } + ).run { + step("Set WireMock scenario: '$USER_TOKENS_API_SCENARIO' to state: '$tokenName'") { + setWireMockScenarioState(scenarioName = USER_TOKENS_API_SCENARIO, state = tokenName) + } + step("Set WireMock scenario: '$QUOTES_API_SCENARIO' to state: '$tokenName'") { + setWireMockScenarioState(scenarioName = QUOTES_API_SCENARIO, state = tokenName) + } + step("Set WireMock scenario: '$txHistoryScenarioName' to state: '$txHistoryScenarioState'") { + setWireMockScenarioState(scenarioName = txHistoryScenarioName, state = txHistoryScenarioState) + } + step("Open 'Main Screen'") { + openMainScreen() + } + step("Synchronize addresses") { + synchronizeAddresses() + } + step("Open 'Send Address' screen") { + openSendAddressScreen(tokenName, sendAmount) + } + step("Click on 'My wallet' address") { + onSendAddressScreen { + recentAddressItem(recipientAddress = DOGECOIN_ADDRESS, isMyWallet = true).performClick() + } + } + step("Assert recipient address is displayed on confirm screen") { + onSendConfirmScreen { recipientAddress(DOGECOIN_ADDRESS).assertIsDisplayed() } + } + } + } + + @AllureId("4599") + @DisplayName("Send (address screen): 'My wallets' block is not displayed for account networks") + @Test + fun myWalletsBlockForAccountNetworksNotDisplayedTest() { + val tokenName = "Ethereum" + val sendAmount = "1" + + setupHooks().run { + step("Open 'Main Screen'") { + openMainScreen() + } + step("Synchronize addresses") { + synchronizeAddresses() + } + step("Open 'Send Address' screen") { + openSendAddressScreen(tokenName, sendAmount) + } + step("Assert 'My wallets' title is not displayed") { + onSendAddressScreen { myWalletsTitle.assertIsNotDisplayed() } + } + step("Assert recent address item is not displayed") { + onSendAddressScreen { recentAddressItem(ETHEREUM_ADDRESS).assertIsNotDisplayed() } + } + } + } + + @AllureId("4737") + @DisplayName("Send (address screen): assert 'My wallet address is correct'") + @Test + fun checkMyWalletsBlockTest() { + val tokenName = "Dogecoin" + val sendAmount = "1" + val txHistoryScenarioState = "OutgoingTransaction" + + setupHooks( + additionalAfterSection = { + resetWireMockScenarioState(USER_TOKENS_API_SCENARIO) + resetWireMockScenarioState(QUOTES_API_SCENARIO) + resetWireMockScenarioState(txHistoryScenarioName) + } + ).run { + step("Set WireMock scenario: '$USER_TOKENS_API_SCENARIO' to state: '$tokenName'") { + setWireMockScenarioState(scenarioName = USER_TOKENS_API_SCENARIO, state = tokenName) + } + step("Set WireMock scenario: '$QUOTES_API_SCENARIO' to state: '$tokenName'") { + setWireMockScenarioState(scenarioName = QUOTES_API_SCENARIO, state = tokenName) + } + step("Set WireMock scenario: '$txHistoryScenarioName' to state: '$txHistoryScenarioState'") { + setWireMockScenarioState(scenarioName = txHistoryScenarioName, state = txHistoryScenarioState) + } + step("Open 'Main Screen'") { + openMainScreen() + } + step("Synchronize addresses") { + synchronizeAddresses() + } + step("Open 'Send Address' screen") { + openSendAddressScreen(tokenName, sendAmount) + } + step("Assert 'My wallets' title is displayed") { + onSendAddressScreen { myWalletsTitle.assertIsDisplayed() } + } + step("Assert 'My wallet' address is displayed") { + onSendAddressScreen { + recentAddressItem(recipientAddress = DOGECOIN_ADDRESS, isMyWallet = true).performClick() + } + } + } + } +} \ No newline at end of file