diff --git a/app/src/androidTest/kotlin/com/tangem/common/constants/TestConstants.kt b/app/src/androidTest/kotlin/com/tangem/common/constants/TestConstants.kt index 68cf02b8ae..cfefe6cebc 100644 --- a/app/src/androidTest/kotlin/com/tangem/common/constants/TestConstants.kt +++ b/app/src/androidTest/kotlin/com/tangem/common/constants/TestConstants.kt @@ -19,6 +19,11 @@ object TestConstants { const val KUSAMA_RECIPIENT_ADDRESS = "CqNrR92Hh76vW69vDBL5iATrZoYkk9nj67iVSUbb2YHtktn" const val AZERO_RECIPIENT_ADDRESS = "5EA4p6DZdbt2vLZySML2dG3ZsnNrenEWZHnVCScQh4iq2KZo" const val TEZOS_RECIPIENT_ADDRESS = "tz1eBdC2JkU2bxgZssweLo6D3wCkWN12ioHW" + const val KASPA_RECIPIENT_ADDRESS = "kaspa:qypc4aywf95rken57kclwdjvycugnacstrh5uzmu0a7pjtxas366ktgj5jzu8t6" + const val XLM_NON_ACTIVATED_RECIPIENT_ADDRESS = "GAGMMENFDWASIHSVO4BPVIT3ZH3YNUIM4EJ6MUDJW46OVPNOJSQIJ22K" + const val XLM_ACTIVATED_RECIPIENT_ADDRESS = "GDKGS3UQFUNQY34P4SIAOKKGEA3NKHH6BSAXK4HIN3BZQQRBTITJLKL6" + const val XRP_NON_ACTIVATED_RECIPIENT_ADDRESS = "rvJfSnN6JzV3rhz1RRKDHnE6MYW28BaZG" + const val XRP_ACTIVATED_RECIPIENT_ADDRESS = "rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH" const val WAIT_UNTIL_TIMEOUT = 20_000L const val WAIT_UNTIL_TIMEOUT_LONG = 30_000L diff --git a/app/src/androidTest/kotlin/com/tangem/scenarios/SendWarningScenarios.kt b/app/src/androidTest/kotlin/com/tangem/scenarios/SendWarningScenarios.kt index 3f77840196..526f7a316b 100644 --- a/app/src/androidTest/kotlin/com/tangem/scenarios/SendWarningScenarios.kt +++ b/app/src/androidTest/kotlin/com/tangem/scenarios/SendWarningScenarios.kt @@ -11,12 +11,13 @@ 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) { - step("Set WireMock scenario: '$USER_TOKENS_API_SCENARIO' to state: '$tokenName'") { - setWireMockScenarioState(scenarioName = USER_TOKENS_API_SCENARIO, state = tokenName) +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: '$tokenName'") { - setWireMockScenarioState(scenarioName = QUOTES_API_SCENARIO, state = tokenName) + step("Set WireMock scenario: '$QUOTES_API_SCENARIO' to state: '$scenarioState'") { + setWireMockScenarioState(scenarioName = QUOTES_API_SCENARIO, state = scenarioState) } step("Open 'Main Screen'") { openMainScreen() @@ -33,9 +34,8 @@ fun BaseTestCase.openSendScreen(tokenName: String) { } fun BaseTestCase.checkSendWarning( - titleResId: Int, - messageResId: Int, - amount: String, + title: String, + message: String, isDisplayed: Boolean = true, sendButtonIsDisabled: Boolean = isDisplayed, ) { @@ -43,22 +43,22 @@ fun BaseTestCase.checkSendWarning( step("Assert 'Send confirm screen' is displayed") { onSendConfirmScreen { - title.assertIsDisplayed() + appBarTitle.assertIsDisplayed() } } step("Assert warning title is $assertDisplay") { onSendConfirmScreen { - warningTitle(titleResId).assertVisibility(isDisplayed) + warningTitle(title).assertVisibility(isDisplayed) } } step("Assert warning icon is $assertDisplay") { onSendConfirmScreen { - sendWarningIcon(messageResId, amount).assertVisibility(isDisplayed) + sendWarningIcon(message).assertVisibility(isDisplayed) } } step("Assert warning message is $assertDisplay") { onSendConfirmScreen { - sendWarningMessage(messageResId, amount).assertVisibility(isDisplayed) + sendWarningMessage(message).assertVisibility(isDisplayed) } } if (sendButtonIsDisabled) diff --git a/app/src/androidTest/kotlin/com/tangem/screens/SendAddressPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/SendAddressPageObject.kt index e684489ca3..2db67d9ee7 100644 --- a/app/src/androidTest/kotlin/com/tangem/screens/SendAddressPageObject.kt +++ b/app/src/androidTest/kotlin/com/tangem/screens/SendAddressPageObject.kt @@ -9,9 +9,9 @@ import io.github.kakaocup.compose.node.element.ComposeScreen import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen import io.github.kakaocup.compose.node.element.KNode import io.github.kakaocup.kakao.common.utilities.getResourceString -import com.tangem.core.ui.R as CoreUiR -import androidx.compose.ui.test.hasText as withText import androidx.compose.ui.test.hasTestTag as withTestTag +import androidx.compose.ui.test.hasText as withText +import com.tangem.core.ui.R as CoreUiR class SendAddressPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) : ComposeScreen(semanticsProvider = semanticsProvider) { @@ -88,6 +88,12 @@ class SendAddressPageObject(semanticsProvider: SemanticsNodeInteractionsProvider useUnmergedTree = true } + val continueButton: KNode = child { + hasTestTag(BaseButtonTestTags.TEXT) + hasText(getResourceString(R.string.common_continue)) + useUnmergedTree = true + } + fun recentAddressWithText(recipientAddress: String): KNode = child { hasParent(withTestTag(SendAddressScreenTestTags.RECENT_ADDRESS_TITLE)) hasText(recipientAddress) diff --git a/app/src/androidTest/kotlin/com/tangem/screens/SendConfirmPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/SendConfirmPageObject.kt index b1790b7e04..9e4af1bf39 100644 --- a/app/src/androidTest/kotlin/com/tangem/screens/SendConfirmPageObject.kt +++ b/app/src/androidTest/kotlin/com/tangem/screens/SendConfirmPageObject.kt @@ -13,7 +13,7 @@ import androidx.compose.ui.test.hasText as withText class SendConfirmPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) : ComposeScreen(semanticsProvider = semanticsProvider) { - val title: KNode = child { + val appBarTitle: KNode = child { hasTestTag(TopAppBarTestTags.TITLE) useUnmergedTree = true } @@ -41,9 +41,9 @@ class SendConfirmPageObject(semanticsProvider: SemanticsNodeInteractionsProvider useUnmergedTree = true } - fun warningTitle(titleResId: Int): KNode = child { + fun warningTitle(title: String): KNode = child { hasTestTag(NotificationTestTags.TITLE) - hasText(getResourceString(titleResId)) + hasText(title) useUnmergedTree = true } @@ -52,33 +52,17 @@ class SendConfirmPageObject(semanticsProvider: SemanticsNodeInteractionsProvider useUnmergedTree = true } - fun sendWarningIcon(messageResId: Int, amount: String): KNode = child { + fun sendWarningIcon(message: String): KNode = child { hasTestTag(NotificationTestTags.ICON) - hasAnySibling( - withText( - getResourceString( - messageResId, - amount, - amount, - ) - ) - - ) + hasAnySibling(withText(message)) useUnmergedTree = true } fun sendWarningMessage( - messageResId: Int, - amount: String, + message: String, ): KNode = child { hasTestTag(NotificationTestTags.MESSAGE) - hasText( - getResourceString( - messageResId, - amount, - amount, - ) - ) + hasText(message) useUnmergedTree = true } diff --git a/app/src/androidTest/kotlin/com/tangem/tests/BlockchainTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/BlockchainTest.kt index d705db7b8b..df177bb300 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/BlockchainTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/BlockchainTest.kt @@ -2,6 +2,7 @@ package com.tangem.tests import com.tangem.common.BaseTestCase import com.tangem.common.constants.TestConstants.CARDANO_ADDRESS +import com.tangem.common.constants.TestConstants.USER_TOKENS_API_SCENARIO import com.tangem.common.extensions.clickWithAssertion import com.tangem.common.extensions.pullToRefresh import com.tangem.common.ui.R @@ -9,12 +10,15 @@ import com.tangem.common.utils.resetWireMockScenarioState import com.tangem.common.utils.setWireMockScenarioState import com.tangem.scenarios.checkSendWarning import com.tangem.scenarios.openMainScreen +import com.tangem.scenarios.openSendScreen import com.tangem.scenarios.synchronizeAddresses import com.tangem.screens.onMainScreen import com.tangem.screens.onSendAddressScreen +import com.tangem.screens.onSendConfirmScreen import com.tangem.screens.onSendScreen import com.tangem.screens.onTokenDetailsScreen 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.Test @@ -31,31 +35,18 @@ class BlockchainTest : BaseTestCase() { val validSendAmount = "10" val minAmount = "ADA 1.00" val address = CARDANO_ADDRESS - val scenarioName = "user_tokens_api" - val scenarioState = "Cardano" - val invalidAmountTitleResId = R.string.send_notification_invalid_amount_title - val invalidAmountMessageResId = R.string.send_notification_invalid_minimum_amount_text + val invalidAmountTitle = getResourceString(R.string.send_notification_invalid_amount_title) + val invalidAmountMessage = + getResourceString(R.string.send_notification_invalid_minimum_amount_text, minAmount, minAmount) setupHooks( additionalAfterSection = { - resetWireMockScenarioState(scenarioName) + resetWireMockScenarioState(USER_TOKENS_API_SCENARIO) } ).run { - step("Set WireMock scenario: '$scenarioName' to state: '$scenarioState'") { - setWireMockScenarioState(scenarioName = scenarioName, 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() } + step("Open 'Send Screen' with token: $tokenName") { + openSendScreen(tokenName) } step("Type '$errorSendAmount' in input text field") { onSendScreen { @@ -74,40 +65,26 @@ class BlockchainTest : BaseTestCase() { } step("Assert 'Invalid amount warning' is displayed") { checkSendWarning( - titleResId = invalidAmountTitleResId, - messageResId = invalidAmountMessageResId, - amount = minAmount + title = invalidAmountTitle, + message = invalidAmountMessage, ) } - step("Press system 'Back' button") { - device.uiDevice.pressBack() - } - step("Assert address text field is displayed") { - onSendAddressScreen { addressTextField.assertIsDisplayed() } - } - step("Press system 'Back' button") { - device.uiDevice.pressBack() + step("Click on 'Amount' field") { + onSendConfirmScreen { primaryAmount.clickWithAssertion() } } step("Type '$validSendAmount' in input text field") { onSendScreen { amountInputTextField.performClick() - amountInputTextField.performTextReplacement(errorSendAmount) + amountInputTextField.performTextReplacement(validSendAmount) } } - step("Click on 'Next' button") { - onSendScreen { nextButton.clickWithAssertion() } - } - step("Assert address text field is displayed") { - onSendAddressScreen { addressTextField.assertIsDisplayed() } - } - step("Click on 'Next' button") { - onSendAddressScreen { nextButton.clickWithAssertion() } + step("Click on 'Continue' button") { + onSendScreen { continueButton.clickWithAssertion() } } step("Assert 'Invalid amount warning' is not displayed") { checkSendWarning( - titleResId = invalidAmountTitleResId, - messageResId = invalidAmountMessageResId, - amount = minAmount, + title = invalidAmountTitle, + message = invalidAmountMessage, isDisplayed = false ) } diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/AzeroWarningsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/AzeroWarningsTest.kt index 41c5453ee8..3e4c62024e 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/AzeroWarningsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/AzeroWarningsTest.kt @@ -13,7 +13,9 @@ import com.tangem.screens.onSendConfirmScreen import com.tangem.screens.onSendScreen import com.tangem.wallet.R 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.Test @HiltAndroidTest @@ -23,10 +25,13 @@ class AzeroWarningsTest : BaseTestCase() { private val amountToLeaveGreaterThanDeposit = "0.09" private val depositAmount = "AZERO 0.0000000005" - private val warningTitleResId = R.string.send_notification_existential_deposit_title - private val warningMessageResId = R.string.send_notification_existential_deposit_text + private val warningTitle = getResourceString(R.string.send_notification_existential_deposit_title) + private val warningMessage = getResourceString( + R.string.send_notification_existential_deposit_text, depositAmount + ) @AllureId("4290") + @DisplayName("Warnings: check deposit warnings in Azero") @Test fun checkWarning() { setupHooks( @@ -55,9 +60,8 @@ class AzeroWarningsTest : BaseTestCase() { } step("Assert 'Existential deposit warning' is displayed") { checkSendWarning( - titleResId = warningTitleResId, - messageResId = warningMessageResId, - amount = depositAmount + title = warningTitle, + message = warningMessage, ) } step("Click on 'Leave $depositAmount' button") { @@ -65,9 +69,8 @@ class AzeroWarningsTest : BaseTestCase() { } step("Assert 'Existential deposit warning' is not displayed") { checkSendWarning( - titleResId = warningTitleResId, - messageResId = warningMessageResId, - amount = depositAmount, + title = warningTitle, + message = warningMessage, isDisplayed = false ) } @@ -85,9 +88,8 @@ class AzeroWarningsTest : BaseTestCase() { } step("Assert 'Existential deposit warning' is not displayed") { checkSendWarning( - titleResId = warningTitleResId, - messageResId = warningMessageResId, - amount = depositAmount, + title = warningTitle, + message = warningMessage, isDisplayed = false ) } diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/KusamaWarningsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/KusamaWarningsTest.kt index a7fb621e34..c545a4100b 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/KusamaWarningsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/KusamaWarningsTest.kt @@ -13,7 +13,9 @@ import com.tangem.screens.onSendConfirmScreen import com.tangem.screens.onSendScreen import com.tangem.wallet.R 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.Test @HiltAndroidTest @@ -23,10 +25,13 @@ class KusamaWarningsTest : BaseTestCase() { private val amountToLeaveGreaterThanDeposit = "0.1" private val depositAmount = "KSM 0.000333333333" - private val warningTitleResId = R.string.send_notification_existential_deposit_title - private val warningMessageResId = R.string.send_notification_existential_deposit_text + private val warningTitle = getResourceString(R.string.send_notification_existential_deposit_title) + private val warningMessage = getResourceString( + R.string.send_notification_existential_deposit_text, depositAmount + ) @AllureId("4291") + @DisplayName("Warnings: check deposit warnings in Kusama") @Test fun checkWarning() { setupHooks( @@ -55,9 +60,8 @@ class KusamaWarningsTest : BaseTestCase() { } step("Assert 'Existential deposit warning' is displayed") { checkSendWarning( - titleResId = warningTitleResId, - messageResId = warningMessageResId, - amount = depositAmount + title = warningTitle, + message = warningMessage, ) } step("Click on 'Leave $depositAmount' button") { @@ -65,9 +69,8 @@ class KusamaWarningsTest : BaseTestCase() { } step("Assert 'Existential deposit warning' is not displayed") { checkSendWarning( - titleResId = warningTitleResId, - messageResId = warningMessageResId, - amount = depositAmount, + title = warningTitle, + message = warningMessage, isDisplayed = false ) } @@ -85,9 +88,8 @@ class KusamaWarningsTest : BaseTestCase() { } step("Assert 'Existential deposit warning' is not displayed") { checkSendWarning( - titleResId = warningTitleResId, - messageResId = warningMessageResId, - amount = depositAmount, + title = warningTitle, + message = warningMessage, isDisplayed = false ) } diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/PolkadotWarningsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/PolkadotWarningsTest.kt index e66b62620e..be40b64a78 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/PolkadotWarningsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/PolkadotWarningsTest.kt @@ -13,7 +13,9 @@ import com.tangem.screens.onSendConfirmScreen import com.tangem.screens.onSendScreen import com.tangem.wallet.R 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.Test @HiltAndroidTest @@ -23,10 +25,13 @@ class PolkadotWarningsTest : BaseTestCase() { private val amountToLeaveGreaterThanDeposit = "0.2" private val depositAmount = "DOT 1.00" - private val warningTitleResId = R.string.send_notification_existential_deposit_title - private val warningMessageResId = R.string.send_notification_existential_deposit_text + private val warningTitle = getResourceString(R.string.send_notification_existential_deposit_title) + private val warningMessage = getResourceString( + R.string.send_notification_existential_deposit_text, depositAmount + ) @AllureId("4289") + @DisplayName("Warnings: check deposit warnings in Polkadot") @Test fun checkWarning() { setupHooks( @@ -55,9 +60,8 @@ class PolkadotWarningsTest : BaseTestCase() { } step("Assert 'Existential deposit warning' is displayed") { checkSendWarning( - titleResId = warningTitleResId, - messageResId = warningMessageResId, - amount = depositAmount + title = warningTitle, + message = warningMessage ) } step("Click on 'Leave $depositAmount' button") { @@ -65,9 +69,8 @@ class PolkadotWarningsTest : BaseTestCase() { } step("Assert 'Existential deposit warning' is not displayed") { checkSendWarning( - titleResId = warningTitleResId, - messageResId = warningMessageResId, - amount = depositAmount, + title = warningTitle, + message = warningMessage, isDisplayed = false ) } @@ -85,9 +88,8 @@ class PolkadotWarningsTest : BaseTestCase() { } step("Assert 'Existential deposit warning' is not displayed") { checkSendWarning( - titleResId = warningTitleResId, - messageResId = warningMessageResId, - amount = depositAmount, + title = warningTitle, + message = warningMessage, isDisplayed = false ) } diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/SolanaWarningsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/SolanaWarningsTest.kt index 5753cebbc3..ec60a4de62 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/SolanaWarningsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/SolanaWarningsTest.kt @@ -12,6 +12,7 @@ import com.tangem.screens.onSendAddressScreen import com.tangem.screens.onSendScreen import com.tangem.wallet.R 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.Test @@ -22,10 +23,10 @@ class SolanaWarningsTest : BaseTestCase() { private val amountToLeaveLessThanRent = "0.0016941" private val amountToLeaveGreaterThanRent = "0.0000941" private val amountToLeaveRentOnly = "0.00168934" - private val rentAmount = "0.000890880" + private val rentAmount = "SOL 0.00089088" - private val invalidAmountTitleResId = R.string.send_notification_invalid_amount_title - private val invalidAmountMessageResId = R.string.send_notification_invalid_amount_rent_fee + private val invalidAmountTitle = getResourceString(R.string.send_notification_invalid_amount_title) + private val invalidAmountMessage = getResourceString(R.string.send_notification_invalid_amount_rent_fee, rentAmount) @AllureId("564") @DisplayName("Warnings: warning is displayed, if after send balance is less than rent amount (SOLANA)") @@ -57,9 +58,8 @@ class SolanaWarningsTest : BaseTestCase() { } step("Assert 'Invalid amount warning' is displayed") { checkSendWarning( - titleResId = invalidAmountTitleResId, - messageResId = invalidAmountMessageResId, - amount = rentAmount + title = invalidAmountTitle, + message = invalidAmountMessage ) } } @@ -95,9 +95,8 @@ class SolanaWarningsTest : BaseTestCase() { } step("Assert 'Invalid amount warning' is not displayed") { checkSendWarning( - titleResId = invalidAmountTitleResId, - messageResId = invalidAmountMessageResId, - amount = rentAmount, + title = invalidAmountTitle, + message = invalidAmountMessage, isDisplayed = false ) } @@ -134,9 +133,8 @@ class SolanaWarningsTest : BaseTestCase() { } step("Assert 'Invalid amount warning' is not displayed") { checkSendWarning( - titleResId = invalidAmountTitleResId, - messageResId = invalidAmountMessageResId, - amount = rentAmount, + title = invalidAmountTitle, + message = invalidAmountMessage, isDisplayed = false ) } @@ -172,9 +170,8 @@ class SolanaWarningsTest : BaseTestCase() { } step("Assert 'Invalid amount warning' is not displayed") { checkSendWarning( - titleResId = invalidAmountTitleResId, - messageResId = invalidAmountMessageResId, - amount = rentAmount, + title = invalidAmountTitle, + message = invalidAmountMessage, isDisplayed = false ) } diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/StellarWarningsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/StellarWarningsTest.kt new file mode 100644 index 0000000000..fb4483da57 --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/StellarWarningsTest.kt @@ -0,0 +1,195 @@ +package com.tangem.tests.send.warnings + +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.constants.TestConstants.XLM_ACTIVATED_RECIPIENT_ADDRESS +import com.tangem.common.constants.TestConstants.XLM_NON_ACTIVATED_RECIPIENT_ADDRESS +import com.tangem.common.extensions.clickWithAssertion +import com.tangem.common.utils.resetWireMockScenarioState +import com.tangem.scenarios.checkSendWarning +import com.tangem.scenarios.openSendScreen +import com.tangem.screens.onSendAddressScreen +import com.tangem.screens.onSendConfirmScreen +import com.tangem.screens.onSendScreen +import com.tangem.wallet.R +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.Test + +@HiltAndroidTest +class StellarWarningsTest : BaseTestCase() { + private val tokenName = "Stellar" + private val mockStateName = "XLM" + private val lessThanReserveAmount = "0.5" + private val equalToReserveAmount = "1" + private val reserveAmount = "XLM 1.00" + private val greaterThanReserveAmount = "2" + + private val warningTitle = + getResourceString(R.string.send_notification_invalid_reserve_amount_title, reserveAmount) + private val warningMessage = getResourceString(R.string.send_notification_invalid_reserve_amount_text) + + @AllureId("4287") + @DisplayName("Warnings: check warning, when sending less than reserve") + @Test + fun checkWarningWhenSendingLessThanReserve() { + setupHooks( + additionalAfterSection = { + resetWireMockScenarioState(USER_TOKENS_API_SCENARIO) + resetWireMockScenarioState(QUOTES_API_SCENARIO) + } + ).run { + step("Open 'Send Screen' with token: $tokenName") { + openSendScreen(tokenName, mockStateName) + } + step("Type '$lessThanReserveAmount' in input text field") { + onSendScreen { + amountInputTextField.performClick() + amountInputTextField.performTextReplacement(lessThanReserveAmount) + } + } + step("Click on 'Next' button") { + onSendScreen { nextButton.clickWithAssertion() } + } + step("Type non activated address in input text field") { + onSendAddressScreen { addressTextField.performTextReplacement(XLM_NON_ACTIVATED_RECIPIENT_ADDRESS) } + } + step("Click on 'Next' button") { + onSendAddressScreen { nextButton.clickWithAssertion() } + } + step("Assert 'Invalid reserve amount warning' is displayed") { + checkSendWarning( + title = warningTitle, + message = warningMessage + ) + } + step("Click on 'Address' field") { + onSendConfirmScreen { recipientAddress(XLM_NON_ACTIVATED_RECIPIENT_ADDRESS).clickWithAssertion() } + } + step("Type an activated address in input text field") { + onSendAddressScreen { addressTextField.performTextReplacement(XLM_ACTIVATED_RECIPIENT_ADDRESS) } + } + step("Click on 'Next' button") { + onSendScreen { continueButton.clickWithAssertion() } + } + step("Assert 'Invalid reserve amount warning' is not displayed") { + checkSendWarning( + title = warningTitle, + message = warningMessage, + isDisplayed = false + ) + } + } + } + + @AllureId("4286") + @DisplayName("Warnings: check warning when sending amount equal to reserve") + @Test + fun checkWarningWhenSendingAmountEqualToReserve() { + setupHooks( + additionalAfterSection = { + resetWireMockScenarioState(USER_TOKENS_API_SCENARIO) + resetWireMockScenarioState(QUOTES_API_SCENARIO) + } + ).run { + step("Open 'Send Screen' with token: $tokenName") { + openSendScreen(tokenName, mockStateName) + } + step("Type '$equalToReserveAmount' in input text field") { + onSendScreen { + amountInputTextField.performClick() + amountInputTextField.performTextReplacement(equalToReserveAmount) + } + } + step("Click on 'Next' button") { + onSendScreen { nextButton.clickWithAssertion() } + } + step("Type non activated address in input text field") { + onSendAddressScreen { addressTextField.performTextReplacement(XLM_NON_ACTIVATED_RECIPIENT_ADDRESS) } + } + step("Click on 'Next' button") { + onSendAddressScreen { nextButton.clickWithAssertion() } + } + step("Assert 'Invalid reserve amount warning' is not displayed") { + checkSendWarning( + title = warningTitle, + message = warningMessage, + isDisplayed = false + ) + } + step("Click on 'Address' field") { + onSendConfirmScreen { recipientAddress(XLM_NON_ACTIVATED_RECIPIENT_ADDRESS).clickWithAssertion() } + } + step("Type an activated address in input text field") { + onSendAddressScreen { addressTextField.performTextReplacement(XLM_ACTIVATED_RECIPIENT_ADDRESS) } + } + step("Click on 'Next' button") { + onSendScreen { continueButton.clickWithAssertion() } + } + step("Assert 'Invalid reserve amount warning' is not displayed") { + checkSendWarning( + title = warningTitle, + message = warningMessage, + isDisplayed = false + ) + } + } + } + + @AllureId("4288") + @DisplayName("Warnings: check warning when sending greater than reserve") + @Test + fun checkWarningWhenSendingGreaterThanReserve() { + setupHooks( + additionalAfterSection = { + resetWireMockScenarioState(USER_TOKENS_API_SCENARIO) + resetWireMockScenarioState(QUOTES_API_SCENARIO) + } + ).run { + step("Open 'Send Screen' with token: $tokenName") { + openSendScreen(tokenName, mockStateName) + } + step("Type '$greaterThanReserveAmount' in input text field") { + onSendScreen { + amountInputTextField.performClick() + amountInputTextField.performTextReplacement(greaterThanReserveAmount) + } + } + step("Click on 'Next' button") { + onSendScreen { nextButton.clickWithAssertion() } + } + step("Type non activated address in input text field") { + onSendAddressScreen { addressTextField.performTextReplacement(XLM_NON_ACTIVATED_RECIPIENT_ADDRESS) } + } + step("Click on 'Next' button") { + onSendAddressScreen { nextButton.clickWithAssertion() } + } + step("Assert 'Invalid reserve amount warning' is not displayed") { + checkSendWarning( + title = warningTitle, + message = warningMessage, + isDisplayed = false + ) + } + step("Click on 'Address' field") { + onSendConfirmScreen { recipientAddress(XLM_NON_ACTIVATED_RECIPIENT_ADDRESS).clickWithAssertion() } + } + step("Type an activated address in input text field") { + onSendAddressScreen { addressTextField.performTextReplacement(XLM_ACTIVATED_RECIPIENT_ADDRESS) } + } + step("Click on 'Next' button") { + onSendScreen { continueButton.clickWithAssertion() } + } + step("Assert 'Invalid reserve amount warning' is not displayed") { + checkSendWarning( + title = warningTitle, + message = warningMessage, + isDisplayed = false + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/TezosWarningsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/TezosWarningsTest.kt index 1d47b9d392..4b65dfa5e8 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/TezosWarningsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/TezosWarningsTest.kt @@ -15,6 +15,7 @@ import com.tangem.screens.onSendConfirmScreen import com.tangem.screens.onSendScreen import com.tangem.wallet.R 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.Test @@ -25,8 +26,9 @@ class TezosWarningsTest : BaseTestCase() { private val reduceAmount = "0.000001" private val sendAmount = "0.01" - private val feeIsHighTitleResId = R.string.send_notification_high_fee_title - private val feeIsHighMessageResId = R.string.send_notification_high_fee_text + private val feeIsHighTitle = getResourceString(R.string.send_notification_high_fee_title) + private val feeIsHighMessage = + getResourceString(R.string.send_notification_high_fee_text, tokenName, reduceAmount) @AllureId("4229") @DisplayName("Warnings: warning is displayed when sending max amount") @@ -55,14 +57,13 @@ class TezosWarningsTest : BaseTestCase() { step("Click on 'Next' button") { onSendAddressScreen { nextButton.clickWithAssertion() } } - step("Swipe up to see the warning"){ + step("Swipe up to see the warning") { swipeVertical(SwipeDirection.UP) } step("Assert 'Fee is high warning' is displayed") { checkSendWarning( - titleResId = feeIsHighTitleResId, - messageResId = feeIsHighMessageResId, - amount = reduceAmount, + title = feeIsHighTitle, + message = feeIsHighMessage, sendButtonIsDisabled = false ) } @@ -71,9 +72,8 @@ class TezosWarningsTest : BaseTestCase() { } step("Assert 'Fee is high warning' is not displayed") { checkSendWarning( - titleResId = feeIsHighTitleResId, - messageResId = feeIsHighMessageResId, - amount = reduceAmount, + title = feeIsHighTitle, + message = feeIsHighMessage, isDisplayed = false ) } @@ -110,9 +110,8 @@ class TezosWarningsTest : BaseTestCase() { } step("Assert 'Fee is high warning' is not displayed") { checkSendWarning( - titleResId = feeIsHighTitleResId, - messageResId = feeIsHighMessageResId, - amount = reduceAmount, + title = feeIsHighTitle, + message = feeIsHighMessage, isDisplayed = false ) } diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/XRPWarningsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/XRPWarningsTest.kt new file mode 100644 index 0000000000..bc665f8a2d --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/warnings/XRPWarningsTest.kt @@ -0,0 +1,195 @@ +package com.tangem.tests.send.warnings + +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.constants.TestConstants.XRP_ACTIVATED_RECIPIENT_ADDRESS +import com.tangem.common.constants.TestConstants.XRP_NON_ACTIVATED_RECIPIENT_ADDRESS +import com.tangem.common.extensions.clickWithAssertion +import com.tangem.common.utils.resetWireMockScenarioState +import com.tangem.scenarios.checkSendWarning +import com.tangem.scenarios.openSendScreen +import com.tangem.screens.onSendAddressScreen +import com.tangem.screens.onSendConfirmScreen +import com.tangem.screens.onSendScreen +import com.tangem.wallet.R +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.Test + +@HiltAndroidTest +class XRPWarningsTest : BaseTestCase() { + private val tokenName = "XRP Ledger" + private val mockStateName = "XRP" + private val lessThanReserveAmount = "0.5" + private val equalToReserveAmount = "1" + private val reserveAmount = "XRP 1.00" + private val greaterThanReserveAmount = "2" + + private val warningTitle = + getResourceString(R.string.send_notification_invalid_reserve_amount_title, reserveAmount) + private val warningMessage = getResourceString(R.string.send_notification_invalid_reserve_amount_text) + + @AllureId("4255") + @DisplayName("Warnings: check warning, when sending less than reserve") + @Test + fun checkWarningWhenSendingLessThanReserve() { + setupHooks( + additionalAfterSection = { + resetWireMockScenarioState(USER_TOKENS_API_SCENARIO) + resetWireMockScenarioState(QUOTES_API_SCENARIO) + } + ).run { + step("Open 'Send Screen' with token: $tokenName") { + openSendScreen(tokenName, mockStateName) + } + step("Type '$lessThanReserveAmount' in input text field") { + onSendScreen { + amountInputTextField.performClick() + amountInputTextField.performTextReplacement(lessThanReserveAmount) + } + } + step("Click on 'Next' button") { + onSendScreen { nextButton.clickWithAssertion() } + } + step("Type non activated address in input text field") { + onSendAddressScreen { addressTextField.performTextReplacement(XRP_NON_ACTIVATED_RECIPIENT_ADDRESS) } + } + step("Click on 'Next' button") { + onSendAddressScreen { nextButton.clickWithAssertion() } + } + step("Assert 'Invalid reserve amount warning' is displayed") { + checkSendWarning( + title = warningTitle, + message = warningMessage + ) + } + step("Click on 'Address' field") { + onSendConfirmScreen { recipientAddress(XRP_NON_ACTIVATED_RECIPIENT_ADDRESS).clickWithAssertion() } + } + step("Type an activated address in input text field") { + onSendAddressScreen { addressTextField.performTextReplacement(XRP_ACTIVATED_RECIPIENT_ADDRESS) } + } + step("Click on 'Next' button") { + onSendScreen { continueButton.clickWithAssertion() } + } + step("Assert 'Invalid reserve amount warning' is not displayed") { + checkSendWarning( + title = warningTitle, + message = warningMessage, + isDisplayed = false + ) + } + } + } + + @AllureId("4285") + @DisplayName("Warnings: check warning when sending amount equal to reserve") + @Test + fun checkWarningWhenSendingAmountEqualToReserve() { + setupHooks( + additionalAfterSection = { + resetWireMockScenarioState(USER_TOKENS_API_SCENARIO) + resetWireMockScenarioState(QUOTES_API_SCENARIO) + } + ).run { + step("Open 'Send Screen' with token: $tokenName") { + openSendScreen(tokenName, mockStateName) + } + step("Type '$equalToReserveAmount' in input text field") { + onSendScreen { + amountInputTextField.performClick() + amountInputTextField.performTextReplacement(equalToReserveAmount) + } + } + step("Click on 'Next' button") { + onSendScreen { nextButton.clickWithAssertion() } + } + step("Type non activated address in input text field") { + onSendAddressScreen { addressTextField.performTextReplacement(XRP_NON_ACTIVATED_RECIPIENT_ADDRESS) } + } + step("Click on 'Next' button") { + onSendAddressScreen { nextButton.clickWithAssertion() } + } + step("Assert 'Invalid reserve amount warning' is not displayed") { + checkSendWarning( + title = warningTitle, + message = warningMessage, + isDisplayed = false + ) + } + step("Click on 'Address' field") { + onSendConfirmScreen { recipientAddress(XRP_NON_ACTIVATED_RECIPIENT_ADDRESS).clickWithAssertion() } + } + step("Type an activated address in input text field") { + onSendAddressScreen { addressTextField.performTextReplacement(XRP_ACTIVATED_RECIPIENT_ADDRESS) } + } + step("Click on 'Next' button") { + onSendScreen { continueButton.clickWithAssertion() } + } + step("Assert 'Invalid reserve amount warning' is not displayed") { + checkSendWarning( + title = warningTitle, + message = warningMessage, + isDisplayed = false + ) + } + } + } + + @AllureId("4284") + @DisplayName("Warnings: check warning when sending greater than reserve") + @Test + fun checkWarningWhenSendingGreaterThanReserve() { + setupHooks( + additionalAfterSection = { + resetWireMockScenarioState(USER_TOKENS_API_SCENARIO) + resetWireMockScenarioState(QUOTES_API_SCENARIO) + } + ).run { + step("Open 'Send Screen' with token: $tokenName") { + openSendScreen(tokenName, mockStateName) + } + step("Type '$greaterThanReserveAmount' in input text field") { + onSendScreen { + amountInputTextField.performClick() + amountInputTextField.performTextReplacement(greaterThanReserveAmount) + } + } + step("Click on 'Next' button") { + onSendScreen { nextButton.clickWithAssertion() } + } + step("Type non activated address in input text field") { + onSendAddressScreen { addressTextField.performTextReplacement(XRP_NON_ACTIVATED_RECIPIENT_ADDRESS) } + } + step("Click on 'Next' button") { + onSendAddressScreen { nextButton.clickWithAssertion() } + } + step("Assert 'Invalid reserve amount warning' is not displayed") { + checkSendWarning( + title = warningTitle, + message = warningMessage, + isDisplayed = false + ) + } + step("Click on 'Address' field") { + onSendConfirmScreen { recipientAddress(XRP_NON_ACTIVATED_RECIPIENT_ADDRESS).clickWithAssertion() } + } + step("Type an activated address in input text field") { + onSendAddressScreen { addressTextField.performTextReplacement(XRP_ACTIVATED_RECIPIENT_ADDRESS) } + } + step("Click on 'Next' button") { + onSendScreen { continueButton.clickWithAssertion() } + } + step("Assert 'Invalid reserve amount warning' is not displayed") { + checkSendWarning( + title = warningTitle, + message = warningMessage, + isDisplayed = false + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/sdk/mocks/content/WalletMockContent.kt b/app/src/main/java/com/tangem/tap/domain/sdk/mocks/content/WalletMockContent.kt index e5d488ce02..3d66410898 100644 --- a/app/src/main/java/com/tangem/tap/domain/sdk/mocks/content/WalletMockContent.kt +++ b/app/src/main/java/com/tangem/tap/domain/sdk/mocks/content/WalletMockContent.kt @@ -1,7 +1,11 @@ package com.tangem.tap.domain.sdk.mocks.content import com.tangem.common.SuccessResponse -import com.tangem.common.card.* +import com.tangem.common.card.Card +import com.tangem.common.card.CardWallet +import com.tangem.common.card.EllipticCurve +import com.tangem.common.card.EncryptionMode +import com.tangem.common.card.FirmwareVersion import com.tangem.common.extensions.ByteArrayKey import com.tangem.crypto.hdWallet.DerivationPath import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey @@ -243,14 +247,14 @@ object WalletMockContent : MockContent { parentFingerprint = byteArrayOf(0, 0, 0, 0), childNumber = 0, ), - DerivationPath("m/44'/148'/0'") to ExtendedPublicKey( // XLM + DerivationPath("m/44'/1729'/0'/0'") to ExtendedPublicKey( // Tezos publicKey = byteArrayOf(2, -40, 115, -15, 80, 104, 100, -29, 80, 29, 112, -35, -54, 64, -98, 45, 115, 108, 93, 113, -71, 89, 17, 72, 98, 21, 126, 82, -50, 50, -12, -87, -62), chainCode = byteArrayOf(-27, 56, 57, 54, 27, -40, 65, 109, 119, -54, -94, 88, -29, -115, -45, -112, -31, 57, 53, 56, 118, 87, 34, -16, -64, -45, 105, 77, 91, -106, -92, 41), depth = 0, parentFingerprint = byteArrayOf(0, 0, 0, 0), childNumber = 0, ), - DerivationPath("m/44'/1729'/0'/0'") to ExtendedPublicKey( // Tezos + DerivationPath("m/44'/111111'/0'/0/0") to ExtendedPublicKey( // Kaspa publicKey = byteArrayOf(2, -40, 115, -15, 80, 104, 100, -29, 80, 29, 112, -35, -54, 64, -98, 45, 115, 108, 93, 113, -71, 89, 17, 72, 98, 21, 126, 82, -50, 50, -12, -87, -62), chainCode = byteArrayOf(-27, 56, 57, 54, 27, -40, 65, 109, 119, -54, -94, 88, -29, -115, -45, -112, -31, 57, 53, 56, 118, 87, 34, -16, -64, -45, 105, 77, 91, -106, -92, 41), depth = 0, @@ -307,6 +311,13 @@ object WalletMockContent : MockContent { parentFingerprint = byteArrayOf(0, 0, 0, 0), childNumber = 0, ), + DerivationPath("m/44'/148'/0'") to ExtendedPublicKey( // Stellar + publicKey = byteArrayOf(2, 34, 6, 119, -106, 5, -119, 111, -22, 8, 23, -108, -72, -56, 6, 77, -17, -61, -101, -85, 16, 28, 18, 3, -3, -89, -81, -108, 48, -7, -86, -82), + chainCode = byteArrayOf(-75, 55, 107, -106, -37, -81, -15, 72, -102, 94, 55, -39, 9, -112, 1, 90, -50, 103, 53, 120, -92, -36, -85, -39, -65, 1, 88, 46, 92, 104, -13, -109), + depth = 0, + parentFingerprint = byteArrayOf(0, 0, 0, 0), + childNumber = 0, + ), ), ), @@ -353,6 +364,13 @@ object WalletMockContent : MockContent { parentFingerprint = byteArrayOf(0, 0, 0, 0), childNumber = 0, ), + DerivationPath("m/44'/111111'/0'/0/0") to ExtendedPublicKey( // Kaspa + publicKey = byteArrayOf(2, -40, 115, -15, 80, 104, 100, -29, 80, 29, 112, -35, -54, 64, -98, 45, 115, 108, 93, 113, -71, 89, 17, 72, 98, 21, 126, 82, -50, 50, -12, -87, -62), + chainCode = byteArrayOf(-27, 56, 57, 54, 27, -40, 65, 109, 119, -54, -94, 88, -29, -115, -45, -112, -31, 57, 53, 56, 118, 87, 34, -16, -64, -45, 105, 77, 91, -106, -92, 41), + depth = 0, + parentFingerprint = byteArrayOf(0, 0, 0, 0), + childNumber = 0, + ), ), ), ByteArrayKey( @@ -403,6 +421,13 @@ object WalletMockContent : MockContent { parentFingerprint = byteArrayOf(0, 0, 0, 0), childNumber = 0, ), + DerivationPath("m/44'/148'/0'") to ExtendedPublicKey( // Stellar + publicKey = byteArrayOf(2, -40, 115, -15, 80, 104, 100, -29, 80, 29, 112, -35, -54, 64, -98, 45, 115, 108, 93, 113, -71, 89, 17, 72, 98, 21, 126, 82, -50, 50, -12, -87, -62), + chainCode = byteArrayOf(-27, 56, 57, 54, 27, -40, 65, 109, 119, -54, -94, 88, -29, -115, -45, -112, -31, 57, 53, 56, 118, 87, 34, -16, -64, -45, 105, 77, 91, -106, -92, 41), + depth = 0, + parentFingerprint = byteArrayOf(0, 0, 0, 0), + childNumber = 0, + ), ), ), ),