From d197fae012808b355533c56e5689b277e90ad34d Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 30 Oct 2025 11:36:06 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/scenarios/SendScenarios.kt | 61 ++++ .../tangem/screens/SendConfirmPageObject.kt | 53 ++++ .../com/tangem/screens/SendPageObject.kt | 10 + .../addressScreen/SendAddressScreenTest.kt | 5 +- .../confirmScreen/SendConfirmScreenTest.kt | 299 ++++++++++++++++++ .../ui/amountScreen/ui/AmountFieldV2.kt | 6 +- .../core/ui/test/FeeSelectorBlockTestTags.kt | 10 + .../tangem/core/ui/test/SendScreenTestTags.kt | 2 + .../feeselector/ui/FeeSelectorBlockContent.kt | 24 +- 9 files changed, 459 insertions(+), 11 deletions(-) create mode 100644 app/src/androidTest/kotlin/com/tangem/scenarios/SendScenarios.kt create mode 100644 app/src/androidTest/kotlin/com/tangem/tests/send/confirmScreen/SendConfirmScreenTest.kt create mode 100644 core/ui/src/main/java/com/tangem/core/ui/test/FeeSelectorBlockTestTags.kt diff --git a/app/src/androidTest/kotlin/com/tangem/scenarios/SendScenarios.kt b/app/src/androidTest/kotlin/com/tangem/scenarios/SendScenarios.kt new file mode 100644 index 0000000000..cd9c06dd5c --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/scenarios/SendScenarios.kt @@ -0,0 +1,61 @@ +package com.tangem.scenarios + +import com.tangem.common.BaseTestCase +import com.tangem.common.extensions.clickWithAssertion +import com.tangem.screens.* +import com.tangem.screens.onMainScreen +import com.tangem.screens.onSendConfirmScreen +import com.tangem.screens.onSendScreen +import com.tangem.screens.onTokenDetailsScreen +import io.qameta.allure.kotlin.Allure.step + +fun BaseTestCase.checkNetworkFeeBlock(currentFeeAmount: String, withFeeSelector: Boolean) { + step("Assert fee selector block is displayed") { + onSendConfirmScreen { feeSelectorBlock.assertIsDisplayed() } + } + step("Assert fee selector icon is displayed") { + onSendConfirmScreen { feeSelectorIcon.assertIsDisplayed() } + } + step("Assert fee selector title is displayed") { + onSendConfirmScreen { feeSelectorTitle.assertIsDisplayed() } + } + step("Assert fee selector tooltip icon is displayed") { + onSendConfirmScreen { feeSelectorTooltipIcon.assertIsDisplayed() } + } + step("Assert fee amount = '$currentFeeAmount'") { + onSendConfirmScreen { feeAmount.assertTextContains(currentFeeAmount) } + } + if (withFeeSelector) { + step("Assert select fee icon is displayed") { + onSendConfirmScreen { selectFeeIcon.assertIsDisplayed() } + } + } +} + +fun BaseTestCase.openSendConfirmScreen( + tokenName: String, + inputAmount: String, + recipientAddress: String +) { + step("Click on token with name: '$tokenName'") { + onMainScreen { tokenWithTitleAndAddress(tokenName).clickWithAssertion() } + } + step("Click on 'Send' button") { + onTokenDetailsScreen { sendButton().performClick() } + } + step("Type '$inputAmount' in input text field") { + onSendScreen { + amountInputTextField.performClick() + amountInputTextField.performTextReplacement(inputAmount) + } + } + step("Click on 'Next' button") { + onSendScreen { nextButton.clickWithAssertion() } + } + step("Type recipient address") { + onSendAddressScreen { addressTextField.performTextReplacement(recipientAddress) } + } + step("Click on 'Next' button") { + onSendAddressScreen { nextButton.clickWithAssertion() } + } +} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/SendConfirmPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/SendConfirmPageObject.kt index 9e4af1bf39..a93356d82b 100644 --- a/app/src/androidTest/kotlin/com/tangem/screens/SendConfirmPageObject.kt +++ b/app/src/androidTest/kotlin/com/tangem/screens/SendConfirmPageObject.kt @@ -9,6 +9,8 @@ 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 androidx.compose.ui.test.hasText as withText +import androidx.compose.ui.test.hasTestTag as withTestTag +import com.tangem.core.ui.R as CoreUiR class SendConfirmPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) : ComposeScreen(semanticsProvider = semanticsProvider) { @@ -29,6 +31,11 @@ class SendConfirmPageObject(semanticsProvider: SemanticsNodeInteractionsProvider useUnmergedTree = true } + val secondaryAmount: KNode = child { + hasTestTag(BaseAmountBlockTestTags.SECONDARY_AMOUNT) + useUnmergedTree = true + } + fun leaveDepositButton(amount: String): KNode = child { hasTestTag(BaseButtonTestTags.BUTTON) hasAnyDescendant(withText(getResourceString(R.string.send_notification_leave_button, amount))) @@ -66,6 +73,18 @@ class SendConfirmPageObject(semanticsProvider: SemanticsNodeInteractionsProvider useUnmergedTree = true } + fun warningMessage(messageResId: Int): KNode = child { + hasTestTag(NotificationTestTags.MESSAGE) + hasText(getResourceString(messageResId)) + useUnmergedTree = true + } + + fun warningIcon(messageResId: Int): KNode = child { + hasTestTag(NotificationTestTags.ICON) + hasAnySibling(withText(getResourceString(messageResId))) + useUnmergedTree = true + } + fun recipientAddress(recipientAddress: String): KNode = child { hasTestTag(SendConfirmScreenTestTags.RECIPIENT_ADDRESS) hasText(recipientAddress) @@ -76,6 +95,40 @@ class SendConfirmPageObject(semanticsProvider: SemanticsNodeInteractionsProvider hasTestTag(SendConfirmScreenTestTags.BLOCKCHAIN_ADDRESS) useUnmergedTree = true } + + val feeSelectorBlock: KNode = child { + hasTestTag(FeeSelectorBlockTestTags.SELECTOR_BLOCK) + } + + val feeSelectorIcon: KNode = child { + hasTestTag(FeeSelectorBlockTestTags.ICON) + useUnmergedTree = true + } + + val feeSelectorTitle: KNode = child { + hasTestTag(FeeSelectorBlockTestTags.TITLE) + useUnmergedTree = true + } + + val feeSelectorTooltipIcon: KNode = child { + hasTestTag(FeeSelectorBlockTestTags.TOOLTIP_ICON) + useUnmergedTree = true + } + + val selectFeeIcon: KNode = child { + hasTestTag(FeeSelectorBlockTestTags.SELECT_FEE_ICON) + useUnmergedTree = true + } + + val feeAmount: KNode = child { + hasParent(withTestTag(FeeSelectorBlockTestTags.FEE_AMOUNT)) + useUnmergedTree = true + } + + val refreshButton: KNode = child { + hasTestTag(BaseButtonTestTags.BUTTON) + hasText(getResourceString(CoreUiR.string.warning_button_refresh)) + } } internal fun BaseTestCase.onSendConfirmScreen(function: SendConfirmPageObject.() -> Unit) = diff --git a/app/src/androidTest/kotlin/com/tangem/screens/SendPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/SendPageObject.kt index baffa23c16..1e1f1da9d2 100644 --- a/app/src/androidTest/kotlin/com/tangem/screens/SendPageObject.kt +++ b/app/src/androidTest/kotlin/com/tangem/screens/SendPageObject.kt @@ -38,6 +38,16 @@ class SendPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) : useUnmergedTree = true } + val equivalentInputAmount: KNode = child { + hasTestTag(SendScreenTestTags.EQUIVALENT_INPUT_AMOUNT) + useUnmergedTree = true + } + + val exchangeIcon: KNode = child { + hasTestTag(SendScreenTestTags.EXCHANGE_ICON) + useUnmergedTree = true + } + val tokenName: KNode = child { hasTestTag(SendScreenTestTags.TOKEN_NAME) useUnmergedTree = true diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/SendAddressScreenTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/SendAddressScreenTest.kt index 952c04312b..15a61d3cde 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/SendAddressScreenTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/addressScreen/SendAddressScreenTest.kt @@ -9,10 +9,7 @@ import com.tangem.common.constants.TestConstants.ETHEREUM_RECIPIENT_ADDRESS import com.tangem.common.constants.TestConstants.ETHEREUM_RECIPIENT_SHORTENED_ADDRESS import com.tangem.common.constants.TestConstants.XRP_RECIPIENT_ADDRESS import com.tangem.common.extensions.clickWithAssertion -import com.tangem.common.utils.clearClipboard -import com.tangem.common.utils.resetWireMockScenarioState -import com.tangem.common.utils.setClipboardText -import com.tangem.common.utils.setWireMockScenarioState +import com.tangem.common.utils.* import com.tangem.core.ui.R import com.tangem.scenarios.openMainScreen import com.tangem.scenarios.synchronizeAddresses diff --git a/app/src/androidTest/kotlin/com/tangem/tests/send/confirmScreen/SendConfirmScreenTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/send/confirmScreen/SendConfirmScreenTest.kt new file mode 100644 index 0000000000..37cc020834 --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/tests/send/confirmScreen/SendConfirmScreenTest.kt @@ -0,0 +1,299 @@ +package com.tangem.tests.send.confirmScreen + +import com.tangem.common.BaseTestCase +import com.tangem.common.constants.TestConstants.ETHEREUM_RECIPIENT_ADDRESS +import com.tangem.common.constants.TestConstants.POLKADOT_RECIPIENT_ADDRESS +import com.tangem.common.constants.TestConstants.QUOTES_API_SCENARIO +import com.tangem.common.constants.TestConstants.USER_TOKENS_API_SCENARIO +import com.tangem.common.extensions.* +import com.tangem.common.utils.resetWireMockScenarioState +import com.tangem.common.utils.setWireMockScenarioState +import com.tangem.core.ui.R +import com.tangem.scenarios.* +import com.tangem.screens.* +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 SendConfirmScreenTest : BaseTestCase() { + + @AllureId("4003") + @DisplayName("Send (Confirm screen): change sending amount") + @Test + fun changeSendingAmountTest() { + val tokenName = "Ethereum" + val inputAmount = "1" + val newInputAmount = "0.9" + val ethereumAmount = "1.00" + val fiatAmount = "$2,535.63" + val newFiatAmount = "$2,282.07" + val newEthereumAmount = "0.90" + val recipientAddress = ETHEREUM_RECIPIENT_ADDRESS + + setupHooks().run { + 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("Type '$inputAmount' in input text field") { + onSendScreen { + amountInputTextField.performClick() + amountInputTextField.performTextReplacement(inputAmount) + } + } + step("Assert fiat amount = '$fiatAmount'") { + onSendScreen { equivalentInputAmount.assertTextContains(fiatAmount) } + } + step("Click on 'Next' button") { + onSendScreen { nextButton.clickWithAssertion() } + } + step("Type recipient address") { + onSendAddressScreen { addressTextField.performTextReplacement(recipientAddress) } + } + step("Click on 'Next' button") { + onSendAddressScreen { nextButton.clickWithAssertion() } + } + step("Assert token amount = '$ethereumAmount'") { + onSendConfirmScreen { primaryAmount.assertTextContains(ethereumAmount) } + } + step("Assert fiat amount = '$fiatAmount'") { + onSendConfirmScreen { secondaryAmount.assertTextContains(fiatAmount) } + } + step("Click on token amount") { + onSendConfirmScreen { primaryAmount.performClick() } + } + step("Clear input text field") { + onSendScreen { + amountInputTextField.performClick() + amountInputTextField.performTextClearance() + } + } + step("Type '$newInputAmount' in input text field") { + onSendScreen { + amountInputTextField.performTextReplacement(newInputAmount) + } + } + step("Assert fiat amount = '$newFiatAmount'") { + onSendScreen { equivalentInputAmount.assertTextContains(newFiatAmount) } + } + step("Click on 'Continue' button") { + onSendScreen { continueButton.clickWithAssertion() } + } + step("Assert token amount = '$newEthereumAmount'") { + onSendConfirmScreen { primaryAmount.assertTextContains(newEthereumAmount) } + } + step("Assert fiat amount = '$newFiatAmount'") { + onSendConfirmScreen { secondaryAmount.assertTextContains(newFiatAmount) } + } + } + } + + @AllureId("552") + @DisplayName("Send (Confirm screen): switch to equivalent") + @Test + fun switchToEquivalentTest() { + val tokenName = "Ethereum" + val inputAmount = "1" + val tokenAmount = "1.00" + val ethereumAmount = "ETH 1.00" + val fiatAmount = "$2,535.63" + val recipientAddress = ETHEREUM_RECIPIENT_ADDRESS + + setupHooks().run { + 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("Type '$inputAmount' in input text field") { + onSendScreen { + amountInputTextField.performClick() + amountInputTextField.performTextReplacement(inputAmount) + } + } + step("Assert fiat amount = '$fiatAmount'") { + onSendScreen { equivalentInputAmount.assertTextContains(fiatAmount) } + } + step("Click on exchange icon") { + onSendScreen { exchangeIcon.performClick() } + } + step("Assert token amount = '$ethereumAmount'") { + onSendScreen { equivalentInputAmount.assertTextContains(ethereumAmount) } + } + step("Click on exchange icon") { + onSendScreen { exchangeIcon.performClick() } + } + step("Assert fiat amount = '$fiatAmount'") { + onSendScreen { equivalentInputAmount.assertTextContains(fiatAmount) } + } + step("Click on 'Next' button") { + onSendScreen { nextButton.clickWithAssertion() } + } + step("Type recipient address") { + onSendAddressScreen { addressTextField.performTextReplacement(recipientAddress) } + } + step("Click on 'Next' button") { + onSendAddressScreen { nextButton.clickWithAssertion() } + } + step("Assert primary amount = '$tokenAmount'") { + onSendConfirmScreen { primaryAmount.assertTextContains(tokenAmount) } + } + step("Assert secondary amount = '$fiatAmount'") { + onSendConfirmScreen { secondaryAmount.assertTextContains(fiatAmount) } + } + } + } + + @AllureId("553") + @DisplayName("Send (Confirm screen): check fee for blockchain with unknown fee") + @Test + fun checkFeeForBlockchainWithUnknownFeeTest() { + val tokenName = "Polygon" + val inputAmount = "1" + val recipientAddress = ETHEREUM_RECIPIENT_ADDRESS + val currentFeeAmount = "<$0.01" + + setupHooks().run { + step("Open 'Main Screen'") { + openMainScreen() + } + step("Synchronize addresses") { + synchronizeAddresses() + } + step("Swipe up to token") { + swipeVertical(SwipeDirection.UP) + } + step("Open 'Send Confirm' screen for token '$tokenName'") { + openSendConfirmScreen( + tokenName = tokenName, + inputAmount = inputAmount, + recipientAddress = recipientAddress + ) + } + step("Check network fee block") { + checkNetworkFeeBlock(currentFeeAmount = currentFeeAmount, withFeeSelector = true) + } + } + } + + @AllureId("4565") + @DisplayName("Send (Confirm screen): check fee for token with unknown fee") + @Test + fun checkFeeForTokenWithUnknownFeeTest() { + val tokenName = "POL (ex-MATIC)" + val inputAmount = "1" + val recipientAddress = ETHEREUM_RECIPIENT_ADDRESS + val currentFeeAmount = "<$0.01" + val scenarioName = "eth_estimate_gas" + val scenarioState = "UnknownFee" + + 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() + } + step("Swipe up to token") { + swipeVertical(SwipeDirection.UP) + } + step("Open 'Send Confirm' screen for token '$tokenName'") { + openSendConfirmScreen( + tokenName = tokenName, + inputAmount = inputAmount, + recipientAddress = recipientAddress + ) + } + step("Check network fee block") { + checkNetworkFeeBlock(currentFeeAmount = currentFeeAmount, withFeeSelector = true) + } + } + } + + @AllureId("554") + @DisplayName("Send (Confirm screen): check fee warning") + @Test + fun checkFeeWarningTest() { + val tokenName = "Polkadot" + val tokenAmount = "0.1" + val warningTitleResId = R.string.send_fee_unreachable_error_title + val warningMessageResId = R.string.send_fee_unreachable_error_text + val currentFeeAmount = "$0.05" + + setupHooks( + additionalAfterSection = { + enableWiFi() + enableMobileData() + resetWireMockScenarioState(USER_TOKENS_API_SCENARIO) + resetWireMockScenarioState(QUOTES_API_SCENARIO) + } + ).run { + step("Open 'Send Screen' with token: $tokenName") { + openSendScreen(tokenName) + } + step("Type '$tokenAmount' in input text field") { + onSendScreen { + amountInputTextField.performClick() + amountInputTextField.performTextReplacement(tokenAmount) + } + } + step("Click on 'Next' button") { + onSendScreen { nextButton.clickWithAssertion() } + } + step("Type address in input text field") { + onSendAddressScreen { addressTextField.performTextReplacement(POLKADOT_RECIPIENT_ADDRESS) } + } + step("Turn off internet") { + disableWiFi() + disableMobileData() + } + step("Click on 'Next' button") { + onSendAddressScreen { nextButton.clickWithAssertion() } + } + step("Turn on internet") { + enableWiFi() + enableMobileData() + } + step("Assert 'Network fee info unreachable' warning title is displayed") { + onSendConfirmScreen { warningTitle(warningTitleResId).assertIsDisplayed() } + } + step("Assert 'Check your internet connection' warning message is displayed") { + onSendConfirmScreen { warningMessage(warningMessageResId).assertIsDisplayed() } + } + step("Assert warning icon is displayed") { + onSendConfirmScreen { warningIcon(warningTitleResId).assertIsDisplayed() } + } + step("Click on 'Refresh' button") { + waitForIdle() + onSendConfirmScreen { refreshButton.clickWithAssertion() } + } + step("Check network fee block") { + checkNetworkFeeBlock(currentFeeAmount = currentFeeAmount, withFeeSelector = false) + } + } + } +} \ No newline at end of file diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldV2.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldV2.kt index 6360babb2d..0932e007ab 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldV2.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldV2.kt @@ -25,6 +25,7 @@ import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.rememberVectorPainter +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextDirection @@ -47,6 +48,7 @@ import com.tangem.core.ui.format.bigdecimal.fiat import com.tangem.core.ui.format.bigdecimal.format import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview +import com.tangem.core.ui.test.SendScreenTestTags import com.tangem.core.ui.utils.rememberDecimalFormat import kotlinx.coroutines.delay @@ -191,7 +193,8 @@ private fun BoxScope.AmountFieldCurrencyInfo(amountUM: AmountState.Data, onCurre .size(16.dp) .graphicsLayer { rotationY = iconRotateState - }, + } + .testTag(SendScreenTestTags.EXCHANGE_ICON), ) AmountFieldCurrencyIcon( amountUM = amountUM, @@ -227,6 +230,7 @@ private fun AmountFieldCurrencyIcon(amountUM: AmountState.Data) { style = TangemTheme.typography.caption2.copy(textDirection = TextDirection.ContentOrLtr), color = TangemTheme.colors.text.primary1, textAlign = TextAlign.Center, + modifier = Modifier.testTag(SendScreenTestTags.EQUIVALENT_INPUT_AMOUNT), ) if (isFiatValue) { CurrencyIcon( diff --git a/core/ui/src/main/java/com/tangem/core/ui/test/FeeSelectorBlockTestTags.kt b/core/ui/src/main/java/com/tangem/core/ui/test/FeeSelectorBlockTestTags.kt new file mode 100644 index 0000000000..1063a68aa8 --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/test/FeeSelectorBlockTestTags.kt @@ -0,0 +1,10 @@ +package com.tangem.core.ui.test + +object FeeSelectorBlockTestTags { + const val SELECTOR_BLOCK = "FEE_SELECTOR_BLOCK" + const val ICON = "FEE_SELECTOR_ICON" + const val TITLE = "FEE_SELECTOR_TITLE" + const val FEE_AMOUNT = "FEE_SELECTOR_FEE_AMOUNT" + const val TOOLTIP_ICON = "FEE_SELECTOR_TOOLTIP_ICON" + const val SELECT_FEE_ICON = "FEE_SELECTOR_SELECT_FEE_ICON" +} \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/test/SendScreenTestTags.kt b/core/ui/src/main/java/com/tangem/core/ui/test/SendScreenTestTags.kt index fe8785cc8c..49103a185d 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/test/SendScreenTestTags.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/test/SendScreenTestTags.kt @@ -5,6 +5,8 @@ object SendScreenTestTags { const val AMOUNT_CONTAINER_TITLE = "SEND_SCREEN_AMOUNT_CONTAINER_TITLE" const val INPUT_TEXT_FIELD = "SEND_SCREEN_INPUT_TEXT_FIELD" + const val EQUIVALENT_INPUT_AMOUNT = "SEND_SCREEN_EQUIVALENT_INPUT_AMOUNT" + const val EXCHANGE_ICON = "SEND_SCREEN_EXCHANGE_ICON" const val TOKEN_NAME = "SEND_SCREEN_TOKEN_NAME" const val PRIMARY_AMOUNT = "SEND_SCREEN_PRIMARY_AMOUNT" const val SECONDARY_AMOUNT = "SEND_SCREEN_SECONDARY_AMOUNT" diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/feeselector/ui/FeeSelectorBlockContent.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/feeselector/ui/FeeSelectorBlockContent.kt index 793262545b..30dcb3c687 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/feeselector/ui/FeeSelectorBlockContent.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/feeselector/ui/FeeSelectorBlockContent.kt @@ -11,6 +11,7 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.* import androidx.compose.ui.text.style.TextAlign @@ -35,6 +36,7 @@ import com.tangem.core.ui.format.bigdecimal.fee import com.tangem.core.ui.format.bigdecimal.format import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview +import com.tangem.core.ui.test.FeeSelectorBlockTestTags import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.transaction.error.GetFeeError import com.tangem.features.send.v2.api.entity.* @@ -54,11 +56,14 @@ internal fun FeeSelectorBlockContent( Row( modifier = modifier .background(TangemTheme.colors.background.action) - .padding(12.dp), + .padding(12.dp) + .testTag(FeeSelectorBlockTestTags.SELECTOR_BLOCK), verticalAlignment = Alignment.CenterVertically, ) { Icon( - modifier = Modifier.size(24.dp), + modifier = Modifier + .size(24.dp) + .testTag(FeeSelectorBlockTestTags.ICON), painter = painterResource(R.drawable.ic_fee_new_24), contentDescription = null, tint = TangemTheme.colors.icon.accent, @@ -85,7 +90,8 @@ private fun FeeSelectorStaticPart(onReadMoreClick: () -> Unit, modifier: Modifie Text( modifier = Modifier .padding(start = TangemTheme.dimens.spacing4) - .weight(1f, fill = false), + .weight(1f, fill = false) + .testTag(FeeSelectorBlockTestTags.TITLE), text = stringResourceSafe(R.string.common_network_fee_title), style = TangemTheme.typography.body1, color = TangemTheme.colors.text.primary1, @@ -123,7 +129,9 @@ private fun FeeSelectorStaticPart(onReadMoreClick: () -> Unit, modifier: Modifie .clip(CircleShape), content = { contentModifier -> Icon( - modifier = contentModifier.size(TangemTheme.dimens.size16), + modifier = contentModifier + .size(TangemTheme.dimens.size16) + .testTag(FeeSelectorBlockTestTags.TOOLTIP_ICON), painter = painterResource(id = R.drawable.ic_token_info_24), contentDescription = null, tint = TangemTheme.colors.icon.informative, @@ -174,11 +182,15 @@ private fun FeeContent(state: FeeSelectorUM.Content, modifier: Modifier = Modifi style = TangemTheme.typography.body1, color = TangemTheme.colors.text.tertiary, textAlign = TextAlign.End, - modifier = Modifier.padding(start = TangemTheme.dimens.spacing4), + modifier = Modifier + .padding(start = TangemTheme.dimens.spacing4) + .testTag(FeeSelectorBlockTestTags.FEE_AMOUNT), ) if (!state.feeItems.isSingleItem()) { Icon( - modifier = Modifier.size(width = 18.dp, height = 24.dp), + modifier = Modifier + .size(width = 18.dp, height = 24.dp) + .testTag(FeeSelectorBlockTestTags.SELECT_FEE_ICON), painter = painterResource(id = R.drawable.ic_select_18_24), contentDescription = null, tint = TangemTheme.colors.icon.informative,