Updated on 2026-08-14

This commit is contained in:
Tangem 2025-07-15 21:08:36 +03:00
parent 96a3074bdb
commit d616571df4
29 changed files with 421 additions and 19 deletions

View file

@ -16,6 +16,7 @@ import androidx.compose.runtime.Immutable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
@ -29,6 +30,7 @@ import com.tangem.core.ui.components.fields.SimpleDialogTextField
import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.core.ui.test.DialogTestTags
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
@ -216,7 +218,8 @@ private fun TangemDialog(
shape = TangemTheme.shapes.roundedCornersLarge,
color = TangemTheme.colors.background.primary,
)
.padding(vertical = TangemTheme.dimens.spacing24),
.padding(vertical = TangemTheme.dimens.spacing24)
.testTag(DialogTestTags.DIALOG_CONTAINER),
) {
if (title != null) {
Text(

View file

@ -15,6 +15,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.style.TextAlign
@ -24,6 +25,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.tangem.core.ui.components.ResizableText
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.test.DialogTestTags
import com.tangem.core.ui.utils.MultipleClickPreventer
@Suppress("LongParameterList")
@ -47,7 +49,9 @@ fun TangemButton(
val multipleClickPreventer = remember { MultipleClickPreventer.get() }
Button(
modifier = modifier.heightIn(min = size.toHeightDp()),
modifier = modifier
.heightIn(min = size.toHeightDp())
.testTag(DialogTestTags.BUTTON),
onClick = {
multipleClickPreventer.processEvent { if (!showProgress) onClick() }
},

View file

@ -7,12 +7,14 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.tooling.preview.Preview
import com.tangem.core.ui.R
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.core.ui.test.PopUpMenuTestTags
@Suppress("ComposableEventParameterNaming")
@Composable
@ -23,7 +25,8 @@ fun TangemDropdownItem(item: TangemDropdownMenuItem, dismissParent: () -> Unit,
dismissParent()
item.onClick()
}
.padding(vertical = TangemTheme.dimens.spacing8, horizontal = TangemTheme.dimens.spacing16),
.padding(vertical = TangemTheme.dimens.spacing8, horizontal = TangemTheme.dimens.spacing16)
.testTag(PopUpMenuTestTags.BUTTON),
text = item.title.resolveReference(),
style = TangemTheme.typography.button.copy(color = item.textColorProvider()),
)

View file

@ -17,11 +17,13 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.TransformOrigin
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.unit.*
import androidx.compose.ui.window.Popup
import androidx.compose.ui.window.PopupPositionProvider
import androidx.compose.ui.window.PopupProperties
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.test.PopUpMenuTestTags
import kotlin.math.max
import kotlin.math.min
@ -138,7 +140,8 @@ private fun DropdownMenuContent(
Column(
modifier = modifier
.width(IntrinsicSize.Max)
.verticalScroll(rememberScrollState()),
.verticalScroll(rememberScrollState())
.testTag(PopUpMenuTestTags.CONTAINER),
content = content,
)
}

View file

@ -12,6 +12,7 @@ import androidx.compose.ui.layout.Measurable
import androidx.compose.ui.layout.Placeable
import androidx.compose.ui.layout.layoutId
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider
@ -30,6 +31,7 @@ import com.tangem.core.ui.extensions.stringReference
import com.tangem.core.ui.res.TangemColorPalette
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.core.ui.test.MainScreenTestTags
import kotlinx.collections.immutable.persistentListOf
import org.burnoutcrew.reorderable.ReorderableLazyListState
import java.util.UUID
@ -100,7 +102,8 @@ fun TokenItem(
state = state.iconState,
modifier = Modifier
.layoutId(layoutId = LayoutId.ICON)
.padding(end = TangemTheme.dimens.spacing8),
.padding(end = TangemTheme.dimens.spacing8)
.testTag(MainScreenTestTags.TOKEN_ICON),
)
TokenTitle(
@ -108,7 +111,8 @@ fun TokenItem(
modifier = Modifier
.layoutId(layoutId = LayoutId.TITLE)
.padding(end = TangemTheme.dimens.spacing8)
.padding(bottom = betweenRowsMargin),
.padding(bottom = betweenRowsMargin)
.testTag(MainScreenTestTags.TOKEN_TITLE),
)
TokenFiatAmount(
@ -116,26 +120,32 @@ fun TokenItem(
isBalanceHidden = isBalanceHidden,
modifier = Modifier
.layoutId(layoutId = LayoutId.FIAT_AMOUNT)
.padding(bottom = betweenRowsMargin),
.padding(bottom = betweenRowsMargin)
.testTag(MainScreenTestTags.TOKEN_FIAT_AMOUNT),
)
TokenPrice(
state = state.subtitleState,
modifier = Modifier
.layoutId(layoutId = LayoutId.CRYPTO_PRICE)
.padding(end = TangemTheme.dimens.spacing8),
.padding(end = TangemTheme.dimens.spacing8)
.testTag(MainScreenTestTags.TOKEN_PRICE),
)
TokenCryptoAmount(
state = state.subtitle2State,
isBalanceHidden = isBalanceHidden,
modifier = Modifier.layoutId(layoutId = LayoutId.CRYPTO_AMOUNT),
modifier = Modifier
.layoutId(layoutId = LayoutId.CRYPTO_AMOUNT)
.testTag(MainScreenTestTags.TOKEN_CRYPTO_AMOUNT),
)
NonFiatContentBlock(
state = state,
reorderableTokenListState = reorderableTokenListState,
modifier = Modifier.layoutId(layoutId = LayoutId.NON_FIAT_CONTENT),
modifier = Modifier
.layoutId(layoutId = LayoutId.NON_FIAT_CONTENT)
.testTag(MainScreenTestTags.TOKEN_NO_ADDRESS),
)
}
}

View file

@ -0,0 +1,6 @@
package com.tangem.core.ui.test
object DialogTestTags {
const val DIALOG_CONTAINER = "DIALOG_CONTAINER"
const val BUTTON = "DIALOG_BUTTON"
}

View file

@ -4,4 +4,13 @@ object MainScreenTestTags {
const val SCREEN_CONTAINER = "MAIN_SCREEN_CONTAINER"
const val MORE_BUTTON = "MAIN_SCREEN_MORE_BUTTON"
const val TOP_BAR = "MAIN_SCREEN_TOP_BAR"
const val TOKEN_LIST_ITEM = "MAIN_SCREEN_TOKEN_LIST_ITEM"
const val TOKEN_TITLE = "MAIN_SCREEN_TOKEN_TITLE"
const val TOKEN_ICON = "MAIN_SCREEN_TOKEN_ICON"
const val TOKEN_PRICE = "MAIN_SCREEN_TOKEN_PRICE"
const val TOKEN_FIAT_AMOUNT = "MAIN_SCREEN_TOKEN_FIAT_AMOUNT"
const val TOKEN_CRYPTO_AMOUNT = "MAIN_SCREEN_TOKEN_CRYPTO_AMOUNT"
const val TOKEN_NO_ADDRESS = "MAIN_SCREEN_TOKEN_NO_ADDRESS"
const val WALLET_BALANCE = "MAIN_SCREEN_WALLET_BALANCE"
const val WALLET_LIST_ITEM = "MAIN_SCREEN_WALLET_LIST_ITEM"
}

View file

@ -0,0 +1,5 @@
package com.tangem.core.ui.test
object MarketTooltipTestTags {
const val CONTAINER = "MARKETS_TOOLTIP_CONTAINER"
}

View file

@ -0,0 +1,6 @@
package com.tangem.core.ui.test
object PopUpMenuTestTags {
const val CONTAINER = "POP_UP_MENU_CONTAINER"
const val BUTTON = "POP_UP_MENU_BUTTON"
}

View file

@ -0,0 +1,5 @@
package com.tangem.core.ui.test
object TokenDetailsScreenTestTags {
const val SCREEN_CONTAINER = "TOKEN_DETAILS_SCREEN_CONTAINER"
}

View file

@ -0,0 +1,6 @@
package com.tangem.core.ui.test
object TokenDetailsTopBarTestTags {
const val MORE_BUTTON = "TOKEN_DETAILS_TOP_BAR_MORE_BUTTON"
const val BACK_BUTTON = "TOKEN_DETAILS_TOP_BAR_BACK_BUTTON"
}

View file

@ -0,0 +1,29 @@
package com.tangem.core.ui.utils
import androidx.compose.ui.semantics.SemanticsPropertyKey
import androidx.compose.ui.semantics.SemanticsPropertyReceiver
/**
* Semantics key for storing and retrieving the visual position
* of an item within a LazyList. Used to verify item ordering
* and visibility in UI tests.
*/
val LazyListItemPositionSemantics = SemanticsPropertyKey<Int>("LazyListItemPosition")
/**
* Provides access to the item position semantics property
* through semantics property receiver DSL.
*/
var SemanticsPropertyReceiver.lazyListItemPosition by LazyListItemPositionSemantics
/**
* Semantics key for storing the total length/count of items
* in a LazyList. Enables validation of list completeness in tests.
*/
val LazyListLengthSemantics = SemanticsPropertyKey<Int>("LazyListLength")
/**
* Provides access to the list length semantics property
* through semantics property receiver DSL.
*/
var SemanticsPropertyReceiver.lazyListLength by LazyListLengthSemantics