diff --git a/app/src/androidTest/kotlin/com/tangem/screens/TokenDetailsPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/TokenDetailsPageObject.kt index d17b8a09c2..3b9fb1b195 100644 --- a/app/src/androidTest/kotlin/com/tangem/screens/TokenDetailsPageObject.kt +++ b/app/src/androidTest/kotlin/com/tangem/screens/TokenDetailsPageObject.kt @@ -6,6 +6,7 @@ import androidx.compose.ui.test.SemanticsNodeInteractionsProvider import com.tangem.common.BaseTestCase import com.tangem.core.ui.test.BaseButtonTestTags import com.tangem.common.utils.LazyListItemNode +import com.tangem.core.ui.test.NotificationTestTags import com.tangem.core.ui.test.TokenDetailsScreenTestTags import com.tangem.features.tokendetails.impl.R import com.tangem.core.ui.utils.LazyListItemPositionSemantics @@ -14,6 +15,7 @@ import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onCompose import io.github.kakaocup.compose.node.element.KNode import io.github.kakaocup.kakao.common.utilities.getResourceString import io.github.kakaocup.compose.node.element.lazylist.KLazyListNode +import androidx.compose.ui.test.hasText as withText class TokenDetailsPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) : ComposeScreen(semanticsProvider = semanticsProvider) { @@ -117,6 +119,44 @@ class TokenDetailsPageObject(semanticsProvider: SemanticsNodeInteractionsProvide hasText(getResourceString(R.string.common_send)) } + fun networkFeeNotificationIcon(feeCurrencyName: String): KNode = child { + hasAnySibling(withText(getResourceString(R.string.warning_send_blocked_funds_for_fee_title, feeCurrencyName))) + hasTestTag(NotificationTestTags.ICON) + useUnmergedTree = true + } + + fun networkFeeNotificationTitle(feeCurrencyName: String): KNode = child { + hasTestTag(NotificationTestTags.TITLE) + hasText(getResourceString(R.string.warning_send_blocked_funds_for_fee_title, feeCurrencyName)) + useUnmergedTree = true + } + + fun networkFeeNotificationMessage( + currencyName: String, + networkName: String, + feeCurrencyName: String, + feeCurrencySymbol: String, + ): KNode = child { + hasTestTag(NotificationTestTags.MESSAGE) + hasText( + getResourceString( + R.string.warning_send_blocked_funds_for_fee_message, + currencyName, + networkName, + currencyName, + feeCurrencyName, + feeCurrencySymbol + ) + ) + useUnmergedTree = true + } + + fun goToBuyCurrencyButton(feeCurrencySymbol: String): KNode = child { + hasTestTag(BaseButtonTestTags.TEXT) + hasText(getResourceString(R.string.common_buy_currency, feeCurrencySymbol)) + useUnmergedTree = true + } + } internal fun BaseTestCase.onTokenDetailsScreen(function: TokenDetailsPageObject.() -> Unit) = diff --git a/app/src/androidTest/kotlin/com/tangem/tests/SendTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/SendTest.kt new file mode 100644 index 0000000000..7cf0a321e3 --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/tests/SendTest.kt @@ -0,0 +1,69 @@ +package com.tangem.tests + +import com.tangem.common.BaseTestCase +import com.tangem.common.extensions.clickWithAssertion +import com.tangem.common.utils.resetWireMockScenarioState +import com.tangem.common.utils.setWireMockScenarioState +import com.tangem.scenarios.openMainScreen +import com.tangem.scenarios.synchronizeAddresses +import com.tangem.screens.onMainScreen +import com.tangem.screens.onTokenDetailsScreen +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 SendTest : BaseTestCase() { + + @AllureId("3645") + @DisplayName("Send: check fee notification") + @Test + fun checkFeeNotificationTest() { + val currencyName = "POL (ex-MATIC)" + val feeCurrencyName = "Ethereum" + val feeCurrencySymbol = "ETH" + val balance = "$763.55" + val scenarioName = "eth_network_balance" + val scenarioState = "Empty" + + setupHooks( + additionalAfterSection = { + resetWireMockScenarioState(scenarioName) + } + ).run { + step("Set WireMock scenario: '$scenarioName' to state: '$scenarioState'") { + setWireMockScenarioState(scenarioName = scenarioName, state = scenarioState) + } + + step("Open 'Main Screen'") { + openMainScreen() + } + step("Synchronize addresses") { + synchronizeAddresses(balance) + } + step("Click on token with name: $currencyName") { + onMainScreen { tokenWithTitleAndAddress(currencyName).clickWithAssertion() } + } + step("Assert 'Insufficient $feeCurrencyName to cover network fee' notification icon is displayed") { + onTokenDetailsScreen { networkFeeNotificationIcon(feeCurrencyName).assertIsDisplayed() } + } + step("Assert 'Insufficient $feeCurrencyName to cover network fee' notification title is displayed") { + onTokenDetailsScreen { networkFeeNotificationTitle(feeCurrencyName).assertIsDisplayed() } + } + step("Assert 'Insufficient $feeCurrencyName to cover network fee' notification text is displayed") { + onTokenDetailsScreen { + networkFeeNotificationMessage( + currencyName, + feeCurrencyName, + feeCurrencyName, + feeCurrencySymbol + ).assertIsDisplayed() + } + } + step("Assert 'Go to $feeCurrencySymbol' button is displayed") { + onTokenDetailsScreen { goToBuyCurrencyButton(feeCurrencySymbol).assertIsDisplayed() } + } + } + } +} \ No newline at end of file