Updated on 2026-08-14

This commit is contained in:
Tangem 2026-06-03 17:04:46 +02:00
parent 9b0305efe9
commit 2453d63633
12 changed files with 702 additions and 5 deletions

View file

@ -5,6 +5,12 @@ import com.tangem.common.extensions.clickWithAssertion
import com.tangem.screens.onDeviceSettingsScreen
import io.qameta.allure.kotlin.Allure.step
fun BaseTestCase.scanCardInDeviceSettings() {
step("Click on 'Scan card or ring' button") {
onDeviceSettingsScreen { scanCardOrRingButton.clickWithAssertion() }
}
}
fun BaseTestCase.openResetCardScreen(withBackup: Boolean = false) {
step("Click on 'Scan card or ring' button") {
onDeviceSettingsScreen { scanCardOrRingButton.clickWithAssertion() }

View file

@ -13,6 +13,9 @@ import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onCompose
import io.github.kakaocup.compose.node.element.KNode
import io.github.kakaocup.compose.node.element.lazylist.KLazyListNode
import io.github.kakaocup.kakao.common.utilities.getResourceString
import androidx.compose.ui.test.hasClickAction as withClickAction
import androidx.compose.ui.test.hasText as withText
import androidx.compose.ui.test.isNotEnabled as withDisabled
class DeviceSettingsPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) :
ComposeScreen<DeviceSettingsPageObject>(semanticsProvider = semanticsProvider) {
@ -46,6 +49,19 @@ class DeviceSettingsPageObject(semanticsProvider: SemanticsNodeInteractionsProvi
useUnmergedTree = true
}
val securityModeRowTitle: KNode = child {
hasTestTag(DeviceSettingsScreenTestTags.ITEM_TITLE)
hasText(getResourceString(R.string.card_settings_security_mode))
useUnmergedTree = true
}
// Match the row container (not the title Text): enabled exposes a click action, disabled exposes disabled semantics.
val securityModeRow: KNode = child {
addSemanticsMatcher(withClickAction() or withDisabled())
hasAnyDescendant(withText(getResourceString(R.string.card_settings_security_mode)))
useUnmergedTree = true
}
fun resetToFactorySettingsButtonSubtitle(withBackup: Boolean = false): KNode = child {
hasTestTag(DeviceSettingsScreenTestTags.ITEM_SUBTITLE)
useUnmergedTree = true

View file

@ -0,0 +1,27 @@
package com.tangem.screens
import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
import com.tangem.common.BaseTestCase
import com.tangem.wallet.R
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
class SecurityModePageObject(semanticsProvider: SemanticsNodeInteractionsProvider) :
ComposeScreen<SecurityModePageObject>(semanticsProvider = semanticsProvider) {
// Description only appears on the Security Mode screen — unambiguous "screen opened" signal.
val longTapOptionDescription: KNode = child {
hasText(getResourceString(R.string.details_manage_security_long_tap_description))
useUnmergedTree = true
}
val saveChangesButton: KNode = child {
hasText(getResourceString(R.string.common_save_changes))
useUnmergedTree = true
}
}
internal fun BaseTestCase.onSecurityModeScreen(function: SecurityModePageObject.() -> Unit) =
onComposeScreen(composeTestRule, function)

View file

@ -6,9 +6,13 @@ import com.tangem.domain.models.scan.ProductType
import com.tangem.scenarios.openMainScreen
import com.tangem.screens.*
import com.tangem.tap.domain.sdk.mocks.content.Firmware412MockContent
import com.tangem.tap.domain.sdk.mocks.content.S2CMockContent
import com.tangem.tap.domain.sdk.mocks.content.SingleCurrencyMockContent
import com.tangem.tap.domain.sdk.mocks.content.V3MockContent
import dagger.hilt.android.testing.HiltAndroidTest
import io.qameta.allure.kotlin.AllureId
import io.qameta.allure.kotlin.junit4.DisplayName
import org.junit.Ignore
import org.junit.Test
@HiltAndroidTest
@ -183,6 +187,144 @@ class DetailsTest : BaseTestCase() {
}
}
@AllureId("838")
@DisplayName("Details: (v3 multicurrency) fields")
@Test
fun v3MultiCurrencyDetailsTest() =
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen(mockContent = V3MockContent)
}
onMainScreenTopBar {
step("Open wallet details") {
moreButton.clickWithAssertion()
}
}
onDetailsScreen {
step("Assert 'Wallet connect' button is displayed") {
walletConnectButton.assertIsDisplayed()
}
step("Assert 'Buy Tangem card' button is displayed") {
buyTangemButton.assertIsDisplayed()
}
step("Assert 'App settings' button is displayed") {
appSettingsButton.assertIsDisplayed()
}
step("Assert 'Contact support' button is displayed") {
contactSupportButton.assertIsDisplayed()
}
step("Assert 'Terms of service' button is displayed") {
toSButton.assertIsDisplayed()
}
step("Assert app version is displayed") {
versionName.assertIsDisplayed()
}
}
}
@AllureId("9832")
@DisplayName("Details: (single currency) fields")
@Test
fun singleCurrencyDetailsTest() =
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen(mockContent = SingleCurrencyMockContent)
}
onMainScreenTopBar {
step("Open wallet details") {
moreButton.clickWithAssertion()
}
}
onDetailsScreen {
step("Assert 'Wallet connect' button is not displayed") {
walletConnectButton.assertIsNotDisplayed()
}
step("Assert 'Buy Tangem card' button is displayed") {
buyTangemButton.assertIsDisplayed()
}
step("Assert 'App settings' button is displayed") {
appSettingsButton.assertIsDisplayed()
}
step("Assert 'Contact support' button is displayed") {
contactSupportButton.assertIsDisplayed()
}
step("Assert 'Terms of service' button is displayed") {
toSButton.assertIsDisplayed()
}
step("Assert app version is displayed") {
versionName.assertIsDisplayed()
}
}
}
@AllureId("841")
@DisplayName("Details: (S2C) fields")
@Test
fun s2cDetailsTest() =
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen(mockContent = S2CMockContent)
}
onMainScreenTopBar {
step("Open wallet details") {
moreButton.clickWithAssertion()
}
}
onDetailsScreen {
step("Assert 'Wallet connect' button is not displayed") {
walletConnectButton.assertIsNotDisplayed()
}
step("Assert 'Buy Tangem card' button is displayed") {
buyTangemButton.assertIsDisplayed()
}
step("Assert 'App settings' button is displayed") {
appSettingsButton.assertIsDisplayed()
}
step("Assert 'Contact support' button is displayed") {
contactSupportButton.assertIsDisplayed()
}
step("Assert 'Terms of service' button is displayed") {
toSButton.assertIsDisplayed()
}
step("Assert app version is displayed") {
versionName.assertIsDisplayed()
}
}
}
// Parked: createWalletActions adds Sell for single-wallet cards with no isStart2Coin() check.
@Ignore("[REDACTED_JIRA]")
@AllureId("2869")
@DisplayName("Details: (S2C) no trade buttons and standard details")
@Test
fun s2cNoTradeButtonsDetailsTest() =
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen(mockContent = S2CMockContent)
}
onMainScreen {
step("Assert 'Buy' button is not displayed") {
buyButton.assertIsNotDisplayed()
}
step("Assert 'Sell' button is not displayed") {
sellButton.assertIsNotDisplayed()
}
step("Assert 'Swap' button is not displayed") {
swapButton.assertIsNotDisplayed()
}
}
onMainScreenTopBar {
step("Open wallet details") {
moreButton.clickWithAssertion()
}
}
onDetailsScreen {
step("Assert 'Wallet connect' button is not displayed") {
walletConnectButton.assertIsNotDisplayed()
}
}
}
@AllureId("3647")
@DisplayName("Referral program: validate screen")
@Test

View file

@ -0,0 +1,68 @@
package com.tangem.tests
import com.tangem.common.BaseTestCase
import com.tangem.domain.models.scan.ProductType
import com.tangem.scenarios.openDeviceSettingsScreen
import com.tangem.scenarios.openMainScreen
import com.tangem.scenarios.scanCardInDeviceSettings
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 SecurityModeTest : BaseTestCase() {
@AllureId("2267")
@DisplayName("Security Mode: available for Twin cards")
@Test
fun securityModeOpensForTwinsTest() =
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen(productType = ProductType.Twins, isTwinsCard = true)
}
step("Open 'Device settings' screen") {
openDeviceSettingsScreen()
}
step("Scan card in 'Device settings'") {
scanCardInDeviceSettings()
}
step("Assert 'Security mode' row is enabled") {
onDeviceSettingsScreen { securityModeRow.assertIsEnabled() }
}
step("Click on 'Security mode' button") {
onDeviceSettingsScreen { securityModeRow.performClick() }
}
onSecurityModeScreen {
step("Assert 'Long tap' option is displayed") {
longTapOptionDescription.assertIsDisplayed()
}
step("Assert 'Save changes' button is displayed") {
saveChangesButton.assertIsDisplayed()
}
}
}
@AllureId("9831")
@DisplayName("Security Mode: unavailable for single-capability cards")
@Test
fun securityModeRowDisabledForOtherCardsTest() =
setupHooks().run {
step("Open 'Main Screen'") {
openMainScreen()
}
step("Open 'Device settings' screen") {
openDeviceSettingsScreen()
}
step("Scan card in 'Device settings'") {
scanCardInDeviceSettings()
}
step("Assert 'Security mode' row title is displayed") {
onDeviceSettingsScreen { securityModeRowTitle.assertIsDisplayed() }
}
step("Assert 'Security mode' row is disabled") {
onDeviceSettingsScreen { securityModeRow.assertIsNotEnabled() }
}
}
}