Updated on 2026-08-14

This commit is contained in:
Tangem 2026-01-27 16:33:35 +03:00
parent 24d163b5e7
commit f21da4c520
13 changed files with 86 additions and 107 deletions

View file

@ -4,7 +4,7 @@ import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
import com.tangem.common.BaseTestCase import com.tangem.common.BaseTestCase
import com.tangem.core.ui.test.BaseBottomSheetTestTags import com.tangem.core.ui.test.BaseBottomSheetTestTags
import com.tangem.core.ui.test.BaseButtonTestTags import com.tangem.core.ui.test.BaseButtonTestTags
import com.tangem.core.ui.test.SendSelectNetworkFeeBottomSheetTestTags import com.tangem.core.ui.test.SelectNetworkFeeBottomSheetTestTags
import com.tangem.wallet.R import com.tangem.wallet.R
import io.github.kakaocup.compose.node.element.ComposeScreen 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.ComposeScreen.Companion.onComposeScreen
@ -16,12 +16,6 @@ import androidx.compose.ui.test.hasText as withText
class SendSelectNetworkFeeBottomSheetPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) : class SendSelectNetworkFeeBottomSheetPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) :
ComposeScreen<SendSelectNetworkFeeBottomSheetPageObject>(semanticsProvider = semanticsProvider) { ComposeScreen<SendSelectNetworkFeeBottomSheetPageObject>(semanticsProvider = semanticsProvider) {
val title: KNode = child {
hasTestTag(BaseBottomSheetTestTags.TITLE)
hasText(getResourceString(R.string.common_network_fee_title))
useUnmergedTree = true
}
val chooseSpeedTitle: KNode = child { val chooseSpeedTitle: KNode = child {
hasTestTag(BaseBottomSheetTestTags.TITLE) hasTestTag(BaseBottomSheetTestTags.TITLE)
hasText(getResourceString(R.string.fee_selector_choose_speed_title)) hasText(getResourceString(R.string.fee_selector_choose_speed_title))
@ -29,38 +23,38 @@ class SendSelectNetworkFeeBottomSheetPageObject(semanticsProvider: SemanticsNode
} }
fun regularFeeSelectorItem(title: String): KNode = child { fun regularFeeSelectorItem(title: String): KNode = child {
hasTestTag(SendSelectNetworkFeeBottomSheetTestTags.REGULAR_FEE_ITEM) hasTestTag(SelectNetworkFeeBottomSheetTestTags.REGULAR_FEE_ITEM)
hasAnyDescendant(withText(title)) hasAnyDescendant(withText(title))
hasAnyDescendant(withTestTag(SendSelectNetworkFeeBottomSheetTestTags.REGULAR_ITEM_ICON)) hasAnyDescendant(withTestTag(SelectNetworkFeeBottomSheetTestTags.REGULAR_ITEM_ICON))
hasAnyDescendant(withTestTag(SendSelectNetworkFeeBottomSheetTestTags.REGULAR_ITEM_TITLE)) hasAnyDescendant(withTestTag(SelectNetworkFeeBottomSheetTestTags.REGULAR_ITEM_TITLE))
hasAnyDescendant(withTestTag(SendSelectNetworkFeeBottomSheetTestTags.TOKEN_AMOUNT)) hasAnyDescendant(withTestTag(SelectNetworkFeeBottomSheetTestTags.TOKEN_AMOUNT))
hasAnyDescendant(withTestTag(SendSelectNetworkFeeBottomSheetTestTags.FIAT_AMOUNT)) hasAnyDescendant(withTestTag(SelectNetworkFeeBottomSheetTestTags.FIAT_AMOUNT))
hasAnyDescendant(withTestTag(SendSelectNetworkFeeBottomSheetTestTags.DOT_SIGN)) hasAnyDescendant(withTestTag(SelectNetworkFeeBottomSheetTestTags.DOT_SIGN))
useUnmergedTree = true useUnmergedTree = true
} }
val customSelectorItem: KNode = child { val customSelectorItem: KNode = child {
hasTestTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_FEE_ITEM) hasTestTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_FEE_ITEM)
hasAnyDescendant(withText(getResourceString(R.string.common_custom))) hasAnyDescendant(withText(getResourceString(R.string.common_custom)))
hasAnyDescendant(withTestTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_ITEM_ICON)) hasAnyDescendant(withTestTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_ITEM_ICON))
hasAnyDescendant(withTestTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_ITEM_TITLE)) hasAnyDescendant(withTestTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_ITEM_TITLE))
useUnmergedTree = true useUnmergedTree = true
} }
fun customInputItem(title: String, hasFiatAmount: Boolean = false): KNode = child { fun customInputItem(title: String, hasFiatAmount: Boolean = false): KNode = child {
hasTestTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM) hasTestTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM)
hasAnyDescendant(withText(title)) hasAnyDescendant(withText(title))
hasAnyDescendant(withTestTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_TITLE)) hasAnyDescendant(withTestTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_TITLE))
hasAnyDescendant(withTestTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_TOOLTIP_ICON)) hasAnyDescendant(withTestTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_TOOLTIP_ICON))
hasAnyDescendant(withTestTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_INPUT_TEXT_FIELD)) hasAnyDescendant(withTestTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_INPUT_TEXT_FIELD))
useUnmergedTree = true useUnmergedTree = true
if (hasFiatAmount) { if (hasFiatAmount) {
hasAnyDescendant(withTestTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_FIAT_AMOUNT)) hasAnyDescendant(withTestTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_FIAT_AMOUNT))
} }
} }
val nonceInputItem: KNode = child { val nonceInputItem: KNode = child {
hasTestTag(SendSelectNetworkFeeBottomSheetTestTags.NONCE_INPUT_ITEM) hasTestTag(SelectNetworkFeeBottomSheetTestTags.NONCE_INPUT_ITEM)
hasAnyDescendant(withText(getResourceString(R.string.send_nonce))) hasAnyDescendant(withText(getResourceString(R.string.send_nonce)))
hasAnyDescendant(withText(getResourceString(R.string.send_nonce_hint))) hasAnyDescendant(withText(getResourceString(R.string.send_nonce_hint)))
useUnmergedTree = true useUnmergedTree = true
@ -77,23 +71,23 @@ class SendSelectNetworkFeeBottomSheetPageObject(semanticsProvider: SemanticsNode
} }
private fun inputTextField(title: String): KNode = child { private fun inputTextField(title: String): KNode = child {
hasTestTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_INPUT_TEXT_FIELD) hasTestTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_INPUT_TEXT_FIELD)
hasAnySibling(withText(title)) hasAnySibling(withText(title))
useUnmergedTree = true useUnmergedTree = true
} }
fun inputTextFieldValue(title: String): KNode = inputTextField(title).child { fun inputTextFieldValue(title: String): KNode = inputTextField(title).child {
hasParent(withTestTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_INPUT_TEXT_FIELD)) hasParent(withTestTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_INPUT_TEXT_FIELD))
useUnmergedTree = true useUnmergedTree = true
} }
val nonceInputTextField: KNode = child { val nonceInputTextField: KNode = child {
hasTestTag(SendSelectNetworkFeeBottomSheetTestTags.NONCE_INPUT_TEXT_FIELD) hasTestTag(SelectNetworkFeeBottomSheetTestTags.NONCE_INPUT_TEXT_FIELD)
useUnmergedTree = true useUnmergedTree = true
} }
val customInputItemFiatAmount: KNode = child { val customInputItemFiatAmount: KNode = child {
hasTestTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_FIAT_AMOUNT) hasTestTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_FIAT_AMOUNT)
useUnmergedTree = true useUnmergedTree = true
} }
@ -102,12 +96,6 @@ class SendSelectNetworkFeeBottomSheetPageObject(semanticsProvider: SemanticsNode
hasText(getResourceString(R.string.common_done)) hasText(getResourceString(R.string.common_done))
useUnmergedTree = true useUnmergedTree = true
} }
val confirmButton: KNode = child {
hasTestTag(BaseButtonTestTags.TEXT)
hasText(getResourceString(R.string.common_confirm))
useUnmergedTree = true
}
} }
internal fun BaseTestCase.onSendSelectNetworkFeeBottomSheet(function: SendSelectNetworkFeeBottomSheetPageObject.() -> Unit) = internal fun BaseTestCase.onSendSelectNetworkFeeBottomSheet(function: SendSelectNetworkFeeBottomSheetPageObject.() -> Unit) =

View file

@ -2,38 +2,35 @@ package com.tangem.screens
import androidx.compose.ui.test.SemanticsNodeInteractionsProvider import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
import com.tangem.common.BaseTestCase import com.tangem.common.BaseTestCase
import com.tangem.core.ui.test.SwapSelectNetworkFeeBottomSheetTestTags import com.tangem.core.ui.test.SelectNetworkFeeBottomSheetTestTags
import com.tangem.core.ui.test.TopAppBarTestTags
import com.tangem.wallet.R import com.tangem.wallet.R
import io.github.kakaocup.compose.node.element.ComposeScreen 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.ComposeScreen.Companion.onComposeScreen
import io.github.kakaocup.compose.node.element.KNode import io.github.kakaocup.compose.node.element.KNode
import io.github.kakaocup.kakao.common.utilities.getResourceString import io.github.kakaocup.kakao.common.utilities.getResourceString
import androidx.compose.ui.test.hasText as withText
class SwapSelectNetworkFeeBottomSheetPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) : class SwapSelectNetworkFeeBottomSheetPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) :
ComposeScreen<SwapSelectNetworkFeeBottomSheetPageObject>(semanticsProvider = semanticsProvider) { ComposeScreen<SwapSelectNetworkFeeBottomSheetPageObject>(semanticsProvider = semanticsProvider) {
val title: KNode = child { val title: KNode = child {
hasTestTag(TopAppBarTestTags.TITLE) hasText(getResourceString(R.string.fee_selector_choose_speed_title))
hasText(getResourceString(R.string.common_fee_selector_title))
useUnmergedTree = true useUnmergedTree = true
} }
val marketSelectorItem: KNode = child { val marketSelectorItem: KNode = child {
hasTestTag(SwapSelectNetworkFeeBottomSheetTestTags.SELECTOR_ITEM) hasTestTag(SelectNetworkFeeBottomSheetTestTags.REGULAR_ITEM_TITLE)
hasAnyChild(withText(getResourceString(R.string.common_fee_selector_option_market))) hasText(getResourceString(R.string.common_fee_selector_option_market))
useUnmergedTree = true useUnmergedTree = true
} }
val fastSelectorItem: KNode = child { val fastSelectorItem: KNode = child {
hasTestTag(SwapSelectNetworkFeeBottomSheetTestTags.SELECTOR_ITEM) hasTestTag(SelectNetworkFeeBottomSheetTestTags.REGULAR_ITEM_TITLE)
hasAnyChild(withText(getResourceString(R.string.common_fee_selector_option_fast))) hasText(getResourceString(R.string.common_fee_selector_option_fast))
useUnmergedTree = true useUnmergedTree = true
} }
val readMoreTextBlock: KNode = child { val readMoreTextBlock: KNode = child {
hasTestTag(SwapSelectNetworkFeeBottomSheetTestTags.READ_MORE_TEXT) hasTestTag(SelectNetworkFeeBottomSheetTestTags.LEARN_MORE_TEXT)
useUnmergedTree = true useUnmergedTree = true
} }
} }

View file

@ -29,7 +29,12 @@ class SwapTokenPageObject(semanticsProvider: SemanticsNodeInteractionsProvider)
} }
val networkFeeBlock: KNode = child { val networkFeeBlock: KNode = child {
hasTestTag(BaseBlockTestTags.BLOCK) hasTestTag(FeeSelectorBlockTestTags.SELECTOR_BLOCK)
useUnmergedTree = true
}
val selectFeeIcon: KNode = child {
hasTestTag(FeeSelectorBlockTestTags.SELECT_FEE_ICON)
useUnmergedTree = true useUnmergedTree = true
} }

View file

@ -84,7 +84,7 @@ class SwapTokenTest : BaseTestCase() {
} }
step("Assert 'Providers' block is displayed") { step("Assert 'Providers' block is displayed") {
onSwapTokenScreen { onSwapTokenScreen {
flakySafely(WAIT_UNTIL_TIMEOUT) { flakySafely(WAIT_UNTIL_TIMEOUT_LONG) {
providersBlock.assertIsDisplayed() providersBlock.assertIsDisplayed()
} }
} }
@ -210,7 +210,7 @@ class SwapTokenTest : BaseTestCase() {
step("Click on 'Network fee' block") { step("Click on 'Network fee' block") {
onSwapTokenScreen { onSwapTokenScreen {
flakySafely(WAIT_UNTIL_TIMEOUT_LONG) { flakySafely(WAIT_UNTIL_TIMEOUT_LONG) {
networkFeeBlock.clickWithAssertion() selectFeeIcon.clickWithAssertion()
} }
} }
} }
@ -218,6 +218,7 @@ class SwapTokenTest : BaseTestCase() {
onSwapSelectNetworkFeeBottomSheet { title.assertIsDisplayed() } onSwapSelectNetworkFeeBottomSheet { title.assertIsDisplayed() }
} }
step("Assert 'Market' item is displayed") { step("Assert 'Market' item is displayed") {
printSemanticTree(rootIndex = 1, useUnmergedTree = true)
onSwapSelectNetworkFeeBottomSheet { marketSelectorItem.assertIsDisplayed() } onSwapSelectNetworkFeeBottomSheet { marketSelectorItem.assertIsDisplayed() }
} }
step("Assert 'Fast' item is displayed") { step("Assert 'Fast' item is displayed") {

View file

@ -170,10 +170,10 @@ class SendFeeScreenTest : BaseTestCase() {
onSendConfirmScreen { feeSelectorIcon.performClick() } onSendConfirmScreen { feeSelectorIcon.performClick() }
} }
step("Assert 'Fee selector' bottom sheet title is displayed") { step("Assert 'Fee selector' bottom sheet title is displayed") {
onSendSelectNetworkFeeBottomSheet { title.assertIsDisplayed() } onSendSelectNetworkFeeBottomSheet { chooseSpeedTitle.assertIsDisplayed() }
} }
step("Click on '$marketSelectorItem' selector item") { step("Assert '$marketSelectorItem' selector item is displayed") {
onSendSelectNetworkFeeBottomSheet { regularFeeSelectorItem(marketSelectorItem).performClick() } onSendSelectNetworkFeeBottomSheet { regularFeeSelectorItem(marketSelectorItem).assertIsDisplayed() }
} }
step("Assert '$fastSelectorItem' selector item is displayed") { step("Assert '$fastSelectorItem' selector item is displayed") {
onSendSelectNetworkFeeBottomSheet { regularFeeSelectorItem(fastSelectorItem).assertIsDisplayed() } onSendSelectNetworkFeeBottomSheet { regularFeeSelectorItem(fastSelectorItem).assertIsDisplayed() }
@ -264,9 +264,6 @@ class SendFeeScreenTest : BaseTestCase() {
step("Click on 'Done' button") { step("Click on 'Done' button") {
onSendSelectNetworkFeeBottomSheet { doneButton.performClick() } onSendSelectNetworkFeeBottomSheet { doneButton.performClick() }
} }
step("Click on 'Confirm' button") {
onSendSelectNetworkFeeBottomSheet { confirmButton.performClick() }
}
step("Assert fee block is displayed with new fee amount: '$newFeeAmount'") { step("Assert fee block is displayed with new fee amount: '$newFeeAmount'") {
checkNetworkFeeBlock(currentFeeAmount = newFeeAmount, withFeeSelector = true) checkNetworkFeeBlock(currentFeeAmount = newFeeAmount, withFeeSelector = true)
} }

View file

@ -32,7 +32,7 @@ import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.extensions.stringReference
import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.core.ui.test.SendSelectNetworkFeeBottomSheetTestTags import com.tangem.core.ui.test.SelectNetworkFeeBottomSheetTestTags
/** /**
* [InputRowEnter](https://www.figma.com/file/14ISV23YB1yVW1uNVwqrKv/Android?type=design&node-id=2100-799&mode=design&t=IQ5lBJEkFGU4WSvi-4) * [InputRowEnter](https://www.figma.com/file/14ISV23YB1yVW1uNVwqrKv/Android?type=design&node-id=2100-799&mode=design&t=IQ5lBJEkFGU4WSvi-4)
@ -116,7 +116,7 @@ fun InputRowEnter(
keyboardOptions = keyboardOptions, keyboardOptions = keyboardOptions,
modifier = Modifier modifier = Modifier
.padding(top = TangemTheme.dimens.spacing8) .padding(top = TangemTheme.dimens.spacing8)
.testTag(SendSelectNetworkFeeBottomSheetTestTags.NONCE_INPUT_TEXT_FIELD), .testTag(SelectNetworkFeeBottomSheetTestTags.NONCE_INPUT_TEXT_FIELD),
) )
} }
iconRes?.let { iconRes -> iconRes?.let { iconRes ->

View file

@ -22,7 +22,7 @@ import com.tangem.core.ui.components.tooltip.TangemTooltip
import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.test.SendSelectNetworkFeeBottomSheetTestTags import com.tangem.core.ui.test.SelectNetworkFeeBottomSheetTestTags
import com.tangem.core.ui.utils.rememberDecimalFormat import com.tangem.core.ui.utils.rememberDecimalFormat
/** /**
@ -143,21 +143,21 @@ fun InputRowEnterInfoAmountV2(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(16.dp) .padding(16.dp)
.testTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM), .testTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM),
) { ) {
Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(2.dp)) { Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(2.dp)) {
Text( Text(
text = title.resolveReference(), text = title.resolveReference(),
style = TangemTheme.typography.subtitle2, style = TangemTheme.typography.subtitle2,
color = titleColor, color = titleColor,
modifier = Modifier.testTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_TITLE), modifier = Modifier.testTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_TITLE),
) )
if (description != null) { if (description != null) {
TangemTooltip( TangemTooltip(
modifier = Modifier modifier = Modifier
.size(16.dp) .size(16.dp)
.clip(CircleShape) .clip(CircleShape)
.testTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_TOOLTIP_ICON), .testTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_TOOLTIP_ICON),
text = description, text = description,
content = { contentModifier -> content = { contentModifier ->
Icon( Icon(
@ -190,7 +190,7 @@ fun InputRowEnterInfoAmountV2(
modifier = Modifier modifier = Modifier
.padding(top = TangemTheme.dimens.spacing8) .padding(top = TangemTheme.dimens.spacing8)
.weight(1f) .weight(1f)
.testTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_INPUT_TEXT_FIELD), .testTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_INPUT_TEXT_FIELD),
) )
info?.let { info -> info?.let { info ->
Text( Text(
@ -200,7 +200,7 @@ fun InputRowEnterInfoAmountV2(
modifier = Modifier modifier = Modifier
.padding(start = TangemTheme.dimens.spacing8) .padding(start = TangemTheme.dimens.spacing8)
.align(Alignment.Bottom) .align(Alignment.Bottom)
.testTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_FIAT_AMOUNT), .testTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_INPUT_ITEM_FIAT_AMOUNT),
) )
} }
} }

View file

@ -12,7 +12,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
@ -25,7 +24,6 @@ import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.core.ui.test.SwapSelectNetworkFeeBottomSheetTestTags
import com.tangem.utils.StringsSigns import com.tangem.utils.StringsSigns
@Composable @Composable
@ -69,8 +67,7 @@ fun SelectorRowItem(
Row( Row(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(paddingValues) .padding(paddingValues),
.testTag(SwapSelectNetworkFeeBottomSheetTestTags.SELECTOR_ITEM),
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
) { ) {
Icon( Icon(

View file

@ -0,0 +1,23 @@
package com.tangem.core.ui.test
object SelectNetworkFeeBottomSheetTestTags {
const val REGULAR_FEE_ITEM = "SELECT_NETWORK_FEE_REGULAR_FEE_ITEM"
const val REGULAR_ITEM_ICON = "SELECT_NETWORK_FEE_REGULAR_ITEM_ICON"
const val REGULAR_ITEM_TITLE = "SELECT_NETWORK_FEE_REGULAR_ITEM_TITLE"
const val DOT_SIGN = "SELECT_NETWORK_FEE_DOT_SIGN"
const val TOKEN_AMOUNT = "SELECT_NETWORK_FEE_TOKEN_AMOUNT"
const val FIAT_AMOUNT = "SELECT_NETWORK_FEE_FIAT_AMOUNT"
const val LEARN_MORE_TEXT = "SELECT_NETWORK_FEE_LEARN_MORE_TEXT"
const val CUSTOM_FEE_ITEM = "SELECT_NETWORK_FEE_CUSTOM_FEE_ITEM"
const val CUSTOM_ITEM_ICON = "SELECT_NETWORK_FEE_CUSTOM_ITEM_ICON"
const val CUSTOM_ITEM_TITLE = "SELECT_NETWORK_FEE_CUSTOM_ITEM_TITLE"
const val CUSTOM_INPUT_ITEM = "SELECT_NETWORK_FEE_CUSTOM_INPUT_ITEM"
const val NONCE_INPUT_ITEM = "SELECT_NETWORK_FEE_NONCE_INPUT_ITEM"
const val NONCE_INPUT_TEXT_FIELD = "SELECT_NETWORK_FEE_NONCE_INPUT_TEXT_FIELD"
const val CUSTOM_INPUT_ITEM_TITLE = "SELECT_NETWORK_FEE_CUSTOM_INPUT_ITEM_TITLE"
const val CUSTOM_INPUT_ITEM_TOOLTIP_ICON = "SELECT_NETWORK_FEE_CUSTOM_INPUT_ITEM_TOOLTIP_ICON"
const val CUSTOM_INPUT_ITEM_INPUT_TEXT_FIELD = "SELECT_NETWORK_FEE_CUSTOM_INPUT_ITEM_INPUT_TEXT_FIELD"
const val CUSTOM_INPUT_ITEM_FIAT_AMOUNT = "SELECT_NETWORK_FEE_CUSTOM_INPUT_ITEM_FIAT_AMOUNT"
}

View file

@ -1,22 +0,0 @@
package com.tangem.core.ui.test
object SendSelectNetworkFeeBottomSheetTestTags {
const val REGULAR_FEE_ITEM = "SEND_SELECT_NETWORK_FEE_REGULAR_FEE_ITEM"
const val REGULAR_ITEM_ICON = "SEND_SELECT_NETWORK_FEE_REGULAR_ITEM_ICON"
const val REGULAR_ITEM_TITLE = "SEND_SELECT_NETWORK_FEE_REGULAR_ITEM_TITLE"
const val DOT_SIGN = "SEND_SELECT_NETWORK_FEE_DOT_SIGN"
const val TOKEN_AMOUNT = "SEND_SELECT_NETWORK_FEE_TOKEN_AMOUNT"
const val FIAT_AMOUNT = "SEND_SELECT_NETWORK_FEE_FIAT_AMOUNT"
const val CUSTOM_FEE_ITEM = "SEND_SELECT_NETWORK_FEE_CUSTOM_FEE_ITEM"
const val CUSTOM_ITEM_ICON = "SEND_SELECT_NETWORK_FEE_CUSTOM_ITEM_ICON"
const val CUSTOM_ITEM_TITLE = "SEND_SELECT_NETWORK_FEE_CUSTOM_ITEM_TITLE"
const val CUSTOM_INPUT_ITEM = "SEND_SELECT_NETWORK_FEE_CUSTOM_INPUT_ITEM"
const val NONCE_INPUT_ITEM = "SEND_SELECT_NETWORK_FEE_NONCE_INPUT_ITEM"
const val NONCE_INPUT_TEXT_FIELD = "SEND_SELECT_NETWORK_FEE_NONCE_INPUT_TEXT_FIELD"
const val CUSTOM_INPUT_ITEM_TITLE = "SEND_SELECT_NETWORK_FEE_CUSTOM_INPUT_ITEM_TITLE"
const val CUSTOM_INPUT_ITEM_TOOLTIP_ICON = "SEND_SELECT_NETWORK_FEE_CUSTOM_INPUT_ITEM_TOOLTIP_ICON"
const val CUSTOM_INPUT_ITEM_INPUT_TEXT_FIELD = "SEND_SELECT_NETWORK_FEE_CUSTOM_INPUT_ITEM_INPUT_TEXT_FIELD"
const val CUSTOM_INPUT_ITEM_FIAT_AMOUNT = "SEND_SELECT_NETWORK_FEE_CUSTOM_INPUT_ITEM_FIAT_AMOUNT"
}

View file

@ -1,6 +0,0 @@
package com.tangem.core.ui.test
object SwapSelectNetworkFeeBottomSheetTestTags {
const val READ_MORE_TEXT = "SWAP_SELECT_NETWORK_FEE_READ_MORE_TEXT"
const val SELECTOR_ITEM = "SWAP_SELECT_NETWORK_FEE_SELECTOR_ITEM"
}

View file

@ -49,7 +49,7 @@ import com.tangem.core.ui.format.bigdecimal.fee
import com.tangem.core.ui.format.bigdecimal.format import com.tangem.core.ui.format.bigdecimal.format
import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.core.ui.test.SendSelectNetworkFeeBottomSheetTestTags import com.tangem.core.ui.test.SelectNetworkFeeBottomSheetTestTags
import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.domain.models.currency.CryptoCurrencyStatus
@ -118,7 +118,9 @@ private fun Title(modifier: Modifier = Modifier, onLearnMoreClick: () -> Unit) {
} }
Text( Text(
modifier = modifier.padding(horizontal = 32.dp), modifier = modifier
.padding(horizontal = 32.dp)
.testTag(SelectNetworkFeeBottomSheetTestTags.LEARN_MORE_TEXT),
text = annotatedString, text = annotatedString,
style = TangemTheme.typography.caption2, style = TangemTheme.typography.caption2,
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
@ -214,7 +216,7 @@ private fun CustomFeeBlock(
Row( Row(
modifier = Modifier modifier = Modifier
.padding(horizontal = 12.dp, vertical = 15.dp) .padding(horizontal = 12.dp, vertical = 15.dp)
.testTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_FEE_ITEM), .testTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_FEE_ITEM),
horizontalArrangement = Arrangement.spacedBy(12.dp), horizontalArrangement = Arrangement.spacedBy(12.dp),
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
) { ) {
@ -223,7 +225,7 @@ private fun CustomFeeBlock(
.size(36.dp) .size(36.dp)
.background(color = iconBackgroundColor, shape = CircleShape) .background(color = iconBackgroundColor, shape = CircleShape)
.padding(6.dp) .padding(6.dp)
.testTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_ITEM_ICON), .testTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_ITEM_ICON),
painter = painterResource(R.drawable.ic_edit_v2_24), painter = painterResource(R.drawable.ic_edit_v2_24),
tint = iconTint, tint = iconTint,
contentDescription = null, contentDescription = null,
@ -235,7 +237,7 @@ private fun CustomFeeBlock(
style = TangemTheme.typography.subtitle2, style = TangemTheme.typography.subtitle2,
modifier = Modifier modifier = Modifier
.align(Alignment.CenterStart) .align(Alignment.CenterStart)
.testTag(SendSelectNetworkFeeBottomSheetTestTags.CUSTOM_ITEM_TITLE), .testTag(SelectNetworkFeeBottomSheetTestTags.CUSTOM_ITEM_TITLE),
) )
} }
} }
@ -310,7 +312,7 @@ private fun ExpandedCustomFeeItems(
color = TangemTheme.colors.background.primary, color = TangemTheme.colors.background.primary,
shape = TangemTheme.shapes.roundedCornersXMedium, shape = TangemTheme.shapes.roundedCornersXMedium,
) )
.testTag(SendSelectNetworkFeeBottomSheetTestTags.NONCE_INPUT_ITEM), .testTag(SelectNetworkFeeBottomSheetTestTags.NONCE_INPUT_ITEM),
) )
} }
} }
@ -334,7 +336,7 @@ internal fun RegularFeeItemContent(
Row( Row(
modifier = Modifier modifier = Modifier
.padding(horizontal = 12.dp, vertical = 15.dp) .padding(horizontal = 12.dp, vertical = 15.dp)
.testTag(SendSelectNetworkFeeBottomSheetTestTags.REGULAR_FEE_ITEM), .testTag(SelectNetworkFeeBottomSheetTestTags.REGULAR_FEE_ITEM),
horizontalArrangement = Arrangement.spacedBy(12.dp), horizontalArrangement = Arrangement.spacedBy(12.dp),
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
) { ) {
@ -343,7 +345,7 @@ internal fun RegularFeeItemContent(
.size(36.dp) .size(36.dp)
.background(color = iconBackgroundColor, shape = CircleShape) .background(color = iconBackgroundColor, shape = CircleShape)
.padding(6.dp) .padding(6.dp)
.testTag(SendSelectNetworkFeeBottomSheetTestTags.REGULAR_ITEM_ICON), .testTag(SelectNetworkFeeBottomSheetTestTags.REGULAR_ITEM_ICON),
painter = painterResource(iconRes), painter = painterResource(iconRes),
tint = iconTint, tint = iconTint,
contentDescription = null, contentDescription = null,
@ -385,7 +387,7 @@ private fun FeeDescription(
text = title.resolveReference(), text = title.resolveReference(),
color = TangemTheme.colors.text.primary1, color = TangemTheme.colors.text.primary1,
style = TangemTheme.typography.subtitle2, style = TangemTheme.typography.subtitle2,
modifier = Modifier.testTag(SendSelectNetworkFeeBottomSheetTestTags.REGULAR_ITEM_TITLE), modifier = Modifier.testTag(SelectNetworkFeeBottomSheetTestTags.REGULAR_ITEM_TITLE),
) )
when { when {
isNotEnoughFunds -> Text( isNotEnoughFunds -> Text(
@ -418,7 +420,7 @@ private fun FeeValueContent(preDot: TextReference, postDot: TextReference?, elli
color = textColor, color = textColor,
textAlign = TextAlign.End, textAlign = TextAlign.End,
ellipsis = ellipsis, ellipsis = ellipsis,
modifier = Modifier.testTag(SendSelectNetworkFeeBottomSheetTestTags.TOKEN_AMOUNT), modifier = Modifier.testTag(SelectNetworkFeeBottomSheetTestTags.TOKEN_AMOUNT),
) )
if (postDot != null) { if (postDot != null) {
Text( Text(
@ -428,13 +430,13 @@ private fun FeeValueContent(preDot: TextReference, postDot: TextReference?, elli
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
modifier = Modifier modifier = Modifier
.padding(horizontal = TangemTheme.dimens.spacing4) .padding(horizontal = TangemTheme.dimens.spacing4)
.testTag(SendSelectNetworkFeeBottomSheetTestTags.DOT_SIGN), .testTag(SelectNetworkFeeBottomSheetTestTags.DOT_SIGN),
) )
Text( Text(
text = postDot.resolveReference(), text = postDot.resolveReference(),
style = textStyle, style = textStyle,
color = textColor, color = textColor,
modifier = Modifier.testTag(SendSelectNetworkFeeBottomSheetTestTags.FIAT_AMOUNT), modifier = Modifier.testTag(SelectNetworkFeeBottomSheetTestTags.FIAT_AMOUNT),
) )
} }
} }

View file

@ -8,7 +8,6 @@ import androidx.compose.foundation.text.ClickableText
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
@ -20,7 +19,6 @@ import com.tangem.core.ui.components.rows.SelectorRowItem
import com.tangem.core.ui.extensions.* import com.tangem.core.ui.extensions.*
import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.core.ui.test.SwapSelectNetworkFeeBottomSheetTestTags
import com.tangem.feature.swap.domain.models.ui.FeeType import com.tangem.feature.swap.domain.models.ui.FeeType
import com.tangem.feature.swap.models.states.ChooseFeeBottomSheetConfig import com.tangem.feature.swap.models.states.ChooseFeeBottomSheetConfig
import com.tangem.feature.swap.models.states.FeeItemState import com.tangem.feature.swap.models.states.FeeItemState
@ -90,8 +88,7 @@ private fun FooterBlock(readMore: TextReference, onReadMoreClick: () -> Unit) {
.padding( .padding(
vertical = TangemTheme.dimens.spacing8, vertical = TangemTheme.dimens.spacing8,
horizontal = TangemTheme.dimens.spacing16, horizontal = TangemTheme.dimens.spacing16,
) ),
.testTag(SwapSelectNetworkFeeBottomSheetTestTags.READ_MORE_TEXT),
style = TangemTheme.typography.caption2.copy(textAlign = TextAlign.Start), style = TangemTheme.typography.caption2.copy(textAlign = TextAlign.Start),
onClick = click, onClick = click,
) )