Updated on 2026-08-14
This commit is contained in:
parent
a163569c86
commit
a253674fe6
13 changed files with 639 additions and 8 deletions
|
|
@ -49,4 +49,16 @@ fun BaseTestCase.synchronizeAddresses(balance: String) {
|
|||
step("Assert wallet balance = '$balance'") {
|
||||
onMainScreen { walletBalance().assertTextContains(balance) }
|
||||
}
|
||||
}
|
||||
|
||||
fun BaseTestCase.openDeviceSettingsScreen() {
|
||||
step("Open wallet details") {
|
||||
onTopBar { moreButton.clickWithAssertion() }
|
||||
}
|
||||
step("Open 'Wallet settings' screen") {
|
||||
onDetailsScreen { walletNameButton.performClick() }
|
||||
}
|
||||
step("Click on 'Device settings' button") {
|
||||
onWalletSettingsScreen { deviceSettingsButton.clickWithAssertion() }
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
package com.tangem.scenarios
|
||||
|
||||
import com.tangem.common.BaseTestCase
|
||||
import com.tangem.common.extensions.clickWithAssertion
|
||||
import com.tangem.screens.onDeviceSettingsScreen
|
||||
import io.qameta.allure.kotlin.Allure.step
|
||||
|
||||
fun BaseTestCase.openResetCardScreen(withBackup: Boolean = false) {
|
||||
step("Click on 'Scan card or ring' button") {
|
||||
onDeviceSettingsScreen { scanCardOrRingButton.clickWithAssertion() }
|
||||
}
|
||||
step("Assert 'Reset to Factory Settings' button title is displayed") {
|
||||
onDeviceSettingsScreen { resetToFactorySettingsButtonTitle.assertIsDisplayed() }
|
||||
}
|
||||
step("Assert 'Reset to Factory Settings' button subtitle is displayed") {
|
||||
onDeviceSettingsScreen { resetToFactorySettingsButtonSubtitle(withBackup).assertIsDisplayed() }
|
||||
}
|
||||
step("Click on 'Reset to Factory Settings' button") {
|
||||
onDeviceSettingsScreen { resetToFactorySettingsButtonTitle.performClick() }
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
package com.tangem.scenarios
|
||||
|
||||
import com.tangem.common.BaseTestCase
|
||||
import com.tangem.screens.onResetCardScreen
|
||||
import io.qameta.allure.kotlin.Allure.step
|
||||
|
||||
fun BaseTestCase.checkResetCardScreen(withBackup: Boolean = false) {
|
||||
step("Assert title is displayed") {
|
||||
onResetCardScreen { title.assertIsDisplayed() }
|
||||
}
|
||||
step("Assert 'Attention' image is displayed") {
|
||||
onResetCardScreen { attentionImage.assertIsDisplayed() }
|
||||
}
|
||||
step("Assert 'Attention' subtitle is displayed") {
|
||||
onResetCardScreen { subtitle.assertIsDisplayed() }
|
||||
}
|
||||
step("Assert description is displayed") {
|
||||
onResetCardScreen { description.assertIsDisplayed() }
|
||||
}
|
||||
step("Assert 'Lost wallet' checkbox is displayed") {
|
||||
onResetCardScreen { lostWalletAccessCheckBox.assertIsDisplayed() }
|
||||
}
|
||||
if (withBackup) {
|
||||
step("Assert 'Lost password restore' checkbox is displayed") {
|
||||
onResetCardScreen { lostPasswordRestoreCheckBox.assertIsDisplayed() }
|
||||
}
|
||||
} else {
|
||||
step("Assert 'Lost password restore' checkbox doesn't exist") {
|
||||
onResetCardScreen { lostPasswordRestoreCheckBox.assertDoesNotExist() }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun BaseTestCase.checkCheckBoxLogic(withBackup: Boolean = false) {
|
||||
if (withBackup) {
|
||||
step("Click on 'Lost wallet' checkbox") {
|
||||
onResetCardScreen { lostWalletAccessCheckBox.performClick() }
|
||||
}
|
||||
step("Assert 'Lost wallet' checkbox is enabled") {
|
||||
onResetCardScreen { lostWalletAccessCheckBox.assertIsEnabled() }
|
||||
}
|
||||
step("Assert 'Reset the card' button is disabled") {
|
||||
onResetCardScreen { resetCardButton.assertIsNotEnabled() }
|
||||
}
|
||||
step("Click on 'Lost password restore' checkbox") {
|
||||
onResetCardScreen { lostPasswordRestoreCheckBox.performClick() }
|
||||
}
|
||||
step("Assert 'Lost password restore' checkbox is enabled") {
|
||||
onResetCardScreen { lostPasswordRestoreCheckBox.assertIsEnabled() }
|
||||
}
|
||||
step("Assert 'Reset the card' button is enabled") {
|
||||
onResetCardScreen { resetCardButton.assertIsEnabled() }
|
||||
}
|
||||
step("Click on 'Lost password restore' checkbox") {
|
||||
onResetCardScreen { lostPasswordRestoreCheckBox.performClick() }
|
||||
}
|
||||
step("Assert 'Reset the card' button is disabled") {
|
||||
onResetCardScreen { resetCardButton.assertIsNotEnabled() }
|
||||
}
|
||||
step("Click on 'Lost wallet' checkbox") {
|
||||
onResetCardScreen { lostWalletAccessCheckBox.performClick() }
|
||||
}
|
||||
step("Click on 'Lost password restore' checkbox") {
|
||||
onResetCardScreen { lostPasswordRestoreCheckBox.performClick() }
|
||||
}
|
||||
step("Assert 'Reset the card' button is disabled") {
|
||||
onResetCardScreen { resetCardButton.assertIsNotEnabled() }
|
||||
}
|
||||
} else {
|
||||
step("Click on 'Lost wallet' checkbox") {
|
||||
onResetCardScreen { lostWalletAccessCheckBox.performClick() }
|
||||
}
|
||||
step("Assert 'Lost wallet' checkbox is enabled") {
|
||||
onResetCardScreen { lostWalletAccessCheckBox.assertIsEnabled() }
|
||||
}
|
||||
step("Assert 'Reset the card' button is enabled") {
|
||||
onResetCardScreen { resetCardButton.assertIsEnabled() }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
package com.tangem.screens
|
||||
|
||||
import androidx.compose.ui.test.SemanticsMatcher
|
||||
import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
|
||||
import com.tangem.common.BaseTestCase
|
||||
import com.tangem.common.utils.LazyListItemNode
|
||||
import com.tangem.core.ui.test.BaseButtonTestTags
|
||||
import com.tangem.core.ui.test.DeviceSettingsScreenTestTags
|
||||
import com.tangem.core.ui.utils.LazyListItemPositionSemantics
|
||||
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.compose.node.element.lazylist.KLazyListNode
|
||||
import io.github.kakaocup.kakao.common.utilities.getResourceString
|
||||
|
||||
class DeviceSettingsPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) :
|
||||
ComposeScreen<DeviceSettingsPageObject>(semanticsProvider = semanticsProvider) {
|
||||
|
||||
private val lazyList = KLazyListNode(
|
||||
semanticsProvider = semanticsProvider,
|
||||
viewBuilderAction = { hasTestTag(DeviceSettingsScreenTestTags.LAZY_LIST) },
|
||||
itemTypeBuilder = { itemType(::LazyListItemNode) },
|
||||
positionMatcher = { position ->
|
||||
SemanticsMatcher.expectValue(
|
||||
LazyListItemPositionSemantics,
|
||||
position
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
val imageBlock: KNode = child {
|
||||
hasTestTag(DeviceSettingsScreenTestTags.IMAGE_BLOCK)
|
||||
useUnmergedTree = true
|
||||
}
|
||||
|
||||
val resetToFactorySettingsButtonTitle: KNode = child {
|
||||
hasTestTag(DeviceSettingsScreenTestTags.ITEM_TITLE)
|
||||
hasText(getResourceString(R.string.card_settings_reset_card_to_factory))
|
||||
useUnmergedTree = true
|
||||
}
|
||||
|
||||
val scanCardOrRingButton: KNode = child {
|
||||
hasTestTag(BaseButtonTestTags.TEXT)
|
||||
hasText(getResourceString(R.string.scan_card_settings_button))
|
||||
useUnmergedTree = true
|
||||
}
|
||||
|
||||
fun resetToFactorySettingsButtonSubtitle(withBackup: Boolean = false): KNode = child {
|
||||
hasTestTag(DeviceSettingsScreenTestTags.ITEM_SUBTITLE)
|
||||
useUnmergedTree = true
|
||||
if (withBackup) {
|
||||
hasText(getResourceString(R.string.reset_card_with_backup_to_factory_message))
|
||||
} else {
|
||||
hasText(getResourceString(R.string.reset_card_without_backup_to_factory_message))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal fun BaseTestCase.onDeviceSettingsScreen(function: DeviceSettingsPageObject.() -> Unit) =
|
||||
onComposeScreen(composeTestRule, function)
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
package com.tangem.screens
|
||||
|
||||
import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
|
||||
import com.tangem.common.BaseTestCase
|
||||
import com.tangem.core.ui.test.BaseButtonTestTags
|
||||
import com.tangem.core.ui.test.ResetCardScreenTestTags
|
||||
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
|
||||
import androidx.compose.ui.test.hasTestTag as withTestTag
|
||||
import androidx.compose.ui.test.hasText as withText
|
||||
|
||||
class ResetCardPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) :
|
||||
ComposeScreen<ResetCardPageObject>(semanticsProvider = semanticsProvider) {
|
||||
|
||||
val title: KNode = child {
|
||||
hasTestTag(ResetCardScreenTestTags.TITLE)
|
||||
hasText(getResourceString(R.string.card_settings_reset_card_to_factory))
|
||||
useUnmergedTree = true
|
||||
}
|
||||
|
||||
val attentionImage: KNode = child {
|
||||
hasTestTag(ResetCardScreenTestTags.ATTENTION_IMAGE)
|
||||
useUnmergedTree = true
|
||||
}
|
||||
|
||||
val subtitle: KNode = child {
|
||||
hasTestTag(ResetCardScreenTestTags.SUBTITLE)
|
||||
hasText(getResourceString(R.string.common_attention))
|
||||
useUnmergedTree = true
|
||||
}
|
||||
|
||||
val description: KNode = child {
|
||||
hasTestTag(ResetCardScreenTestTags.DESCRIPTION)
|
||||
useUnmergedTree = true
|
||||
}
|
||||
|
||||
val lostWalletAccessCheckBox: KNode = child {
|
||||
hasTestTag(ResetCardScreenTestTags.CHECKBOX)
|
||||
hasAnySibling(
|
||||
withTestTag(ResetCardScreenTestTags.CHECKBOX_TEXT) and
|
||||
withText(getResourceString(R.string.reset_card_to_factory_condition_1))
|
||||
)
|
||||
useUnmergedTree = true
|
||||
}
|
||||
|
||||
val lostPasswordRestoreCheckBox: KNode = child {
|
||||
hasTestTag(ResetCardScreenTestTags.CHECKBOX)
|
||||
hasAnySibling(
|
||||
withTestTag(ResetCardScreenTestTags.CHECKBOX_TEXT) and
|
||||
withText(getResourceString(R.string.reset_card_to_factory_condition_2))
|
||||
)
|
||||
useUnmergedTree = true
|
||||
}
|
||||
|
||||
val resetCardButton: KNode = child {
|
||||
hasTestTag(BaseButtonTestTags.BUTTON)
|
||||
hasText(getResourceString(R.string.reset_card_to_factory_button_title))
|
||||
}
|
||||
}
|
||||
|
||||
internal fun BaseTestCase.onResetCardScreen(function: ResetCardPageObject.() -> Unit) =
|
||||
onComposeScreen(composeTestRule, function)
|
||||
|
|
@ -21,7 +21,7 @@ class WalletSettingsPageObject(semanticsProvider: SemanticsNodeInteractionsProvi
|
|||
val linkMoreCardsButton: KNode = walletSettingsItem.child {
|
||||
hasText(getResourceString(R.string.details_row_title_create_backup))
|
||||
}
|
||||
val cardSettingsButton: KNode = walletSettingsItem.child {
|
||||
val deviceSettingsButton: KNode = walletSettingsItem.child {
|
||||
hasText(getResourceString(R.string.card_settings_title))
|
||||
}
|
||||
val referralProgramButton: KNode = walletSettingsItem.child {
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ class DetailsTest : BaseTestCase() {
|
|||
linkMoreCardsButton.assertIsDisplayed()
|
||||
}
|
||||
step("Assert 'Card Settings' button is visible") {
|
||||
cardSettingsButton.assertIsDisplayed()
|
||||
deviceSettingsButton.assertIsDisplayed()
|
||||
}
|
||||
step("Assert 'Referral program' button is visible") {
|
||||
referralProgramButton.assertIsDisplayed()
|
||||
|
|
@ -105,7 +105,7 @@ class DetailsTest : BaseTestCase() {
|
|||
linkMoreCardsButton.assertIsNotDisplayed()
|
||||
}
|
||||
step("Assert 'Card Settings' button is visible") {
|
||||
cardSettingsButton.assertIsDisplayed()
|
||||
deviceSettingsButton.assertIsDisplayed()
|
||||
}
|
||||
step("Assert 'Referral program' button is visible") {
|
||||
referralProgramButton.assertIsDisplayed()
|
||||
|
|
@ -152,7 +152,7 @@ class DetailsTest : BaseTestCase() {
|
|||
}
|
||||
onWalletSettingsScreen {
|
||||
step("Assert 'Card Settings' button is visible") {
|
||||
cardSettingsButton.assertIsDisplayed()
|
||||
deviceSettingsButton.assertIsDisplayed()
|
||||
}
|
||||
step("Assert 'Referral program' button does not exist") {
|
||||
referralProgramButton.assertIsNotDisplayed()
|
||||
|
|
|
|||
85
app/src/androidTest/kotlin/com/tangem/tests/ResetCardTest.kt
Normal file
85
app/src/androidTest/kotlin/com/tangem/tests/ResetCardTest.kt
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
package com.tangem.tests
|
||||
|
||||
import com.tangem.common.BaseTestCase
|
||||
import com.tangem.domain.models.scan.ProductType
|
||||
import com.tangem.scenarios.*
|
||||
import com.tangem.tap.domain.sdk.mocks.content.BackupWalletMockContent
|
||||
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
|
||||
class ResetCardTest : BaseTestCase() {
|
||||
|
||||
@AllureId("3988")
|
||||
@DisplayName("Reset card: reset Wallet 1.0 card without backup")
|
||||
@Test
|
||||
fun resetWallet1CardWithoutBackupTest() {
|
||||
setupHooks().run {
|
||||
step("Open 'Main Screen'") {
|
||||
openMainScreen()
|
||||
}
|
||||
step("Open 'Device settings' screen") {
|
||||
openDeviceSettingsScreen()
|
||||
}
|
||||
step("Open 'Reset card' screen") {
|
||||
openResetCardScreen()
|
||||
}
|
||||
step("Check 'Reset card' screen") {
|
||||
checkResetCardScreen()
|
||||
}
|
||||
step("Check checkbox logic") {
|
||||
checkCheckBoxLogic()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@AllureId("3987")
|
||||
@DisplayName("Reset card: reset Wallet 1.0 card with backup")
|
||||
@Test
|
||||
fun resetWallet1CardWithBackupTest() {
|
||||
setupHooks().run {
|
||||
step("Open 'Main Screen'") {
|
||||
openMainScreen(mockContent = BackupWalletMockContent)
|
||||
}
|
||||
step("Open 'Device settings' screen") {
|
||||
openDeviceSettingsScreen()
|
||||
}
|
||||
step("Open 'Reset card' screen") {
|
||||
openResetCardScreen(withBackup = true)
|
||||
}
|
||||
step("Check 'Reset card' screen") {
|
||||
checkResetCardScreen(withBackup = true)
|
||||
}
|
||||
step("Check checkbox logic") {
|
||||
checkCheckBoxLogic(withBackup = true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@AllureId("3974")
|
||||
@DisplayName("Reset card: reset Wallet 2.0 card with backup")
|
||||
@Ignore("toDo [REDACTED_TASK_KEY]: On CI Already used wallet dialog doesn't displayed")
|
||||
@Test
|
||||
fun resetWallet2CardWithBackupTest() {
|
||||
setupHooks().run {
|
||||
step("Open 'Main Screen'") {
|
||||
openMainScreen(productType = ProductType.Wallet2, alreadyActivatedDialogIsShown = true)
|
||||
}
|
||||
step("Open 'Device settings' screen") {
|
||||
openDeviceSettingsScreen()
|
||||
}
|
||||
step("Open 'Reset card' screen") {
|
||||
openResetCardScreen(withBackup = true)
|
||||
}
|
||||
step("Check 'Reset card' screen") {
|
||||
checkResetCardScreen(withBackup = true)
|
||||
}
|
||||
step("Check checkbox logic") {
|
||||
checkCheckBoxLogic(withBackup = true)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue