From 9625042e8dd9dd154d2e2db2bd306422e42378e4 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 11 Feb 2025 12:50:16 +0500 Subject: [PATCH] Updated on 2026-08-14 --- app/build.gradle.kts | 12 +- .../kotlin/com/tangem/common/BaseTestCase.kt | 68 ++--- .../kotlin/com/tangem/common/di/TestModule.kt | 2 +- .../com/tangem/common/extensions/KNode.kt | 8 - .../tangem/common/extensions/TestDataUtils.kt | 9 + .../com/tangem/scenarios/MainPageScenario.kt | 27 ++ .../scenarios/OpenMainScreenScenario.kt | 44 --- .../kotlin/com/tangem/screens/DetailsPage.kt | 16 ++ .../com/tangem/screens/DetailsTestScreen.kt | 51 ---- .../com/tangem/screens/DisclaimerPage.kt | 9 + .../tangem/screens/DisclaimerTestScreen.kt | 17 -- .../kotlin/com/tangem/screens/MainPage.kt | 9 + .../com/tangem/screens/MainTestScreen.kt | 11 - .../kotlin/com/tangem/screens/StoriesPage.kt | 10 + .../com/tangem/screens/StoriesTestScreen.kt | 32 --- .../kotlin/com/tangem/screens/TestTopBar.kt | 16 -- .../kotlin/com/tangem/screens/TopBarPage.kt | 9 + .../com/tangem/screens/WalletSettingsPage.kt | 13 + .../screens/WalletSettingsTestScreen.kt | 31 --- .../com/tangem/tests/DetailsScreenTest.kt | 259 ++++++++---------- .../kotlin/com/tangem/tests/MainScreenTest.kt | 16 -- .../kotlin/com/tangem/tests/ScanErrorTest.kt | 56 ++-- .../kotlin/com/tangem/tests/StoriesTest.kt | 49 ++-- gradle/dependencies.toml | 10 +- 24 files changed, 317 insertions(+), 467 deletions(-) delete mode 100644 app/src/androidTest/kotlin/com/tangem/common/extensions/KNode.kt create mode 100644 app/src/androidTest/kotlin/com/tangem/common/extensions/TestDataUtils.kt create mode 100644 app/src/androidTest/kotlin/com/tangem/scenarios/MainPageScenario.kt delete mode 100644 app/src/androidTest/kotlin/com/tangem/scenarios/OpenMainScreenScenario.kt create mode 100644 app/src/androidTest/kotlin/com/tangem/screens/DetailsPage.kt delete mode 100644 app/src/androidTest/kotlin/com/tangem/screens/DetailsTestScreen.kt create mode 100644 app/src/androidTest/kotlin/com/tangem/screens/DisclaimerPage.kt delete mode 100644 app/src/androidTest/kotlin/com/tangem/screens/DisclaimerTestScreen.kt create mode 100644 app/src/androidTest/kotlin/com/tangem/screens/MainPage.kt delete mode 100644 app/src/androidTest/kotlin/com/tangem/screens/MainTestScreen.kt create mode 100644 app/src/androidTest/kotlin/com/tangem/screens/StoriesPage.kt delete mode 100644 app/src/androidTest/kotlin/com/tangem/screens/StoriesTestScreen.kt delete mode 100644 app/src/androidTest/kotlin/com/tangem/screens/TestTopBar.kt create mode 100644 app/src/androidTest/kotlin/com/tangem/screens/TopBarPage.kt create mode 100644 app/src/androidTest/kotlin/com/tangem/screens/WalletSettingsPage.kt delete mode 100644 app/src/androidTest/kotlin/com/tangem/screens/WalletSettingsTestScreen.kt delete mode 100644 app/src/androidTest/kotlin/com/tangem/tests/MainScreenTest.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4031596459..cce042451f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -272,13 +272,19 @@ dependencies { testImplementation(deps.test.mockk) testImplementation(deps.test.truth) androidTestImplementation(deps.test.junit.android) - androidTestImplementation(deps.test.espresso) + androidTestImplementation(deps.test.espresso){ + exclude(group = "com.google.protobuf", module = "protobuf-lite") //conflicting with firebasePerf + } androidTestImplementation(deps.test.espresso.intents) - androidTestImplementation(deps.test.kaspresso) - androidTestImplementation(deps.test.kaspresso.compose) + { + exclude(group = "com.google.protobuf", module = "protobuf-lite") //conflicting with firebasePerf + } androidTestImplementation(deps.test.compose.junit) androidTestImplementation(deps.test.hamcrest) androidTestImplementation(deps.test.hilt) + androidTestImplementation(deps.test.ultron.android) + androidTestImplementation(deps.test.ultron.compose) + androidTestImplementation(deps.test.ultron.allure) kaptAndroidTest(deps.test.hilt.compiler) /** Chucker */ diff --git a/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt b/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt index 3ff0cba81e..b028458c9b 100644 --- a/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt +++ b/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt @@ -1,78 +1,66 @@ package com.tangem.common import android.Manifest -import android.content.Context -import android.util.Log -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import androidx.test.espresso.intent.Intents -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.rule.GrantPermissionRule -import com.kaspersky.components.composesupport.config.withComposeSupport -import com.kaspersky.kaspresso.kaspresso.Kaspresso -import com.kaspersky.kaspresso.testcases.api.testcase.TestCase +import com.atiurin.ultron.core.compose.config.UltronComposeConfig +import com.atiurin.ultron.core.compose.createUltronComposeRule +import com.atiurin.ultron.core.compose.listeners.ComposDebugListener +import com.atiurin.ultron.core.config.UltronCommonConfig +import com.atiurin.ultron.core.config.UltronConfig +import com.atiurin.ultron.core.test.UltronTest import com.tangem.datasource.local.preferences.AppPreferencesStore +import com.tangem.sdk.api.TangemSdkManager import com.tangem.tap.MainActivity -import com.tangem.tap.domain.sdk.TangemSdkManager import dagger.hilt.android.testing.HiltAndroidRule import kotlinx.coroutines.delay import kotlinx.coroutines.runBlocking +import org.junit.BeforeClass import org.junit.Rule -import org.junit.rules.RuleChain -import org.junit.runner.RunWith import javax.inject.Inject -@RunWith(AndroidJUnit4::class) -abstract class BaseTestCase : TestCase( - kaspressoBuilder = Kaspresso.Builder.withComposeSupport() -) { - +abstract class BaseTestCase : UltronTest() { @Inject lateinit var tangemSdkManager: TangemSdkManager @Inject lateinit var appPreferencesStore: AppPreferencesStore - @get:Rule - open val composeTestRule = createAndroidComposeRule() - - @get:Rule + @get:Rule(order = 0) val grantPermissionRule: GrantPermissionRule = GrantPermissionRule.grant( Manifest.permission.POST_NOTIFICATIONS, Manifest.permission.CAMERA ) + @get:Rule(order = 1) + val hiltRule = HiltAndroidRule(this) - private val hiltRule = HiltAndroidRule(this) + @get:Rule (order = 2) + val injectionRule = ApplicationInjectionExecutionRule() - @Rule - @JvmField - val ruleChain = RuleChain - .outerRule(hiltRule) - .around(ApplicationInjectionExecutionRule()) + @get:Rule(order = 3) + val composeRule = createUltronComposeRule() - protected fun setupHooks( - additionalBeforeSection: () -> Unit = {}, - additionalAfterSection: () -> Unit = {}, - ) = before { + override val beforeTest: () -> Unit = { hiltRule.inject() - Intents.init() - additionalBeforeSection() - runBlocking { delay(INIT_DELAY) } + } - }.after { + override val afterTest: () -> Unit = { runBlocking { appPreferencesStore.editData { prefs -> prefs.clear() } } - - additionalAfterSection() - Intents.release() } companion object { - private const val INIT_DELAY = 1000L - } + @BeforeClass + @JvmStatic + fun config() { + UltronConfig.applyRecommended() + UltronComposeConfig.applyRecommended() + UltronCommonConfig.addListener(ComposDebugListener()) + } + private const val INIT_DELAY = 2000L + } } \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/common/di/TestModule.kt b/app/src/androidTest/kotlin/com/tangem/common/di/TestModule.kt index 106c04012d..9ac4e38e62 100644 --- a/app/src/androidTest/kotlin/com/tangem/common/di/TestModule.kt +++ b/app/src/androidTest/kotlin/com/tangem/common/di/TestModule.kt @@ -1,9 +1,9 @@ package com.tangem.common.di import android.content.Context +import com.tangem.sdk.api.TangemSdkManager import com.tangem.tap.di.TangemSdkManagerModule import com.tangem.tap.domain.sdk.impl.MockTangemSdkManager -import com.tangem.tap.domain.sdk.TangemSdkManager import dagger.Module import dagger.Provides import dagger.hilt.android.qualifiers.ApplicationContext diff --git a/app/src/androidTest/kotlin/com/tangem/common/extensions/KNode.kt b/app/src/androidTest/kotlin/com/tangem/common/extensions/KNode.kt deleted file mode 100644 index a7baa714a4..0000000000 --- a/app/src/androidTest/kotlin/com/tangem/common/extensions/KNode.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.tangem.common.extensions - -import io.github.kakaocup.compose.node.element.KNode - -fun KNode.clickWithAssertion() { - assertIsDisplayed() - performClick() -} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/common/extensions/TestDataUtils.kt b/app/src/androidTest/kotlin/com/tangem/common/extensions/TestDataUtils.kt new file mode 100644 index 0000000000..671c7e4c60 --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/common/extensions/TestDataUtils.kt @@ -0,0 +1,9 @@ +package com.tangem.common.extensions + +import androidx.test.platform.app.InstrumentationRegistry + +object TestDataUtils { + fun getResourceString(resourceId: Int): String { + return InstrumentationRegistry.getInstrumentation().targetContext.resources.getString(resourceId) + } +} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/scenarios/MainPageScenario.kt b/app/src/androidTest/kotlin/com/tangem/scenarios/MainPageScenario.kt new file mode 100644 index 0000000000..2513c160b0 --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/scenarios/MainPageScenario.kt @@ -0,0 +1,27 @@ +package com.tangem.scenarios + +import com.atiurin.ultron.allure.step.step +import com.atiurin.ultron.extensions.assertIsDisplayed +import com.atiurin.ultron.extensions.click +import com.tangem.domain.models.scan.ProductType +import com.tangem.screens.DisclaimerPage +import com.tangem.screens.MainPage +import com.tangem.screens.StoriesPage +import com.tangem.tap.domain.sdk.mocks.MockProvider + +object MainPageScenario { + fun open(productType: ProductType? = null) { + if (productType != null) { + MockProvider.setMocks(productType) + } + step("Click on \"Accept\" button") { + DisclaimerPage.acceptButton.click() + } + step("Click on \"Scan\" button emulating scan error") { + StoriesPage.scanButton.click() + } + step("Assert: main is displayed") { + MainPage.container.assertIsDisplayed() + } + } +} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/scenarios/OpenMainScreenScenario.kt b/app/src/androidTest/kotlin/com/tangem/scenarios/OpenMainScreenScenario.kt deleted file mode 100644 index cd966f6a0f..0000000000 --- a/app/src/androidTest/kotlin/com/tangem/scenarios/OpenMainScreenScenario.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.tangem.scenarios - -import androidx.compose.ui.test.junit4.ComposeTestRule -import com.kaspersky.kaspresso.testcases.api.scenario.Scenario -import com.kaspersky.kaspresso.testcases.core.testcontext.TestContext -import com.tangem.common.extensions.clickWithAssertion -import com.tangem.domain.models.scan.ProductType -import com.tangem.screens.DisclaimerTestScreen -import com.tangem.screens.MainTestScreen -import com.tangem.screens.StoriesTestScreen -import com.tangem.screens.TestTopBar -import com.tangem.tap.domain.sdk.mocks.MockProvider -import io.github.kakaocup.compose.node.element.ComposeScreen - -class OpenMainScreenScenario( - private val testRule: ComposeTestRule, - private val productType: ProductType? = null, -) : Scenario() { - override val steps: TestContext.() -> Unit = { - if (productType != null) { - MockProvider.setMocks(productType) - } - ComposeScreen.onComposeScreen(testRule) { - step("Click on \"Accept\" button") { - acceptButton.clickWithAssertion() - } - } - ComposeScreen.onComposeScreen(testRule) { - step("Click on \"Scan\" button") { - scanButton.clickWithAssertion() - } - } - ComposeScreen.onComposeScreen(testRule) { - step("Make sure wallet screen is visible") { - assertIsDisplayed() - } - } - ComposeScreen.onComposeScreen(testRule) { - step("Close Markets tooltip"){ - performClick() - } - } - } -} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/DetailsPage.kt b/app/src/androidTest/kotlin/com/tangem/screens/DetailsPage.kt new file mode 100644 index 0000000000..990f09205c --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/screens/DetailsPage.kt @@ -0,0 +1,16 @@ +package com.tangem.screens + +import androidx.compose.ui.test.hasText +import com.atiurin.ultron.page.Page +import com.tangem.common.extensions.TestDataUtils.getResourceString +import com.tangem.wallet.R + +object DetailsPage : Page() { + val walletConnectButton = hasText(getResourceString(R.string.wallet_connect_title)) + val walletNameButton = hasText(getResourceString(R.string.manage_tokens_network_selector_wallet)) + val scanCardButton = hasText(getResourceString(R.string.scan_card_settings_button)) + val buyTangemButton = hasText(getResourceString(R.string.details_buy_wallet)) + val appSettingsButton = hasText(getResourceString(R.string.app_settings_title)) + val contactSupportButton = hasText(getResourceString(R.string.details_row_title_contact_to_support)) + val toSButton = hasText(getResourceString(R.string.disclaimer_title)) +} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/DetailsTestScreen.kt b/app/src/androidTest/kotlin/com/tangem/screens/DetailsTestScreen.kt deleted file mode 100644 index 528989a4e3..0000000000 --- a/app/src/androidTest/kotlin/com/tangem/screens/DetailsTestScreen.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.tangem.screens - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import com.tangem.core.ui.test.TestTags -import com.tangem.wallet.R -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode -import io.github.kakaocup.kakao.common.utilities.getResourceString - -class DetailsTestScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag(TestTags.DETAILS_SCREEN) } - ) { - - val walletConnectButton: KNode = child { - hasTestTag(TestTags.DETAILS_SCREEN_ITEM) - hasText(getResourceString(R.string.wallet_connect_title)) - } - - private val walletBlock: KNode = child { - hasTestTag(TestTags.DETAILS_SCREEN_ITEM) - } - - val walletNameButton: KNode = walletBlock.child { - hasClickAction() - hasPosition(0) - } - - val scanCardButton: KNode = walletBlock.child { - hasText(getResourceString(R.string.scan_card_settings_button)) - } - - val buyTangemButton: KNode = child { - hasTestTag(TestTags.DETAILS_SCREEN_ITEM) - hasText(getResourceString(R.string.details_buy_wallet)) - } - - val appSettingsButton: KNode = child { - hasTestTag(TestTags.DETAILS_SCREEN_ITEM) - hasText(getResourceString(R.string.app_settings_title)) - } - val contactSupportButton: KNode = child { - hasTestTag(TestTags.DETAILS_SCREEN_ITEM) - hasText(getResourceString(R.string.details_row_title_contact_to_support)) - } - val toSButton: KNode = child { - hasTestTag(TestTags.DETAILS_SCREEN_ITEM) - hasText(getResourceString(R.string.disclaimer_title)) - } -} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/DisclaimerPage.kt b/app/src/androidTest/kotlin/com/tangem/screens/DisclaimerPage.kt new file mode 100644 index 0000000000..b8dbd41150 --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/screens/DisclaimerPage.kt @@ -0,0 +1,9 @@ +package com.tangem.screens + +import androidx.compose.ui.test.hasTestTag +import com.atiurin.ultron.page.Page +import com.tangem.core.ui.test.TestTags + +object DisclaimerPage : Page() { + val acceptButton = hasTestTag(TestTags.DISCLAIMER_SCREEN_ACCEPT_BUTTON) +} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/DisclaimerTestScreen.kt b/app/src/androidTest/kotlin/com/tangem/screens/DisclaimerTestScreen.kt deleted file mode 100644 index 4af7f33d51..0000000000 --- a/app/src/androidTest/kotlin/com/tangem/screens/DisclaimerTestScreen.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.tangem.screens - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import com.tangem.core.ui.test.TestTags -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode - -class DisclaimerTestScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag(TestTags.DISCLAIMER_SCREEN_CONTAINER) } - ) { - - val acceptButton: KNode = child { - hasTestTag(TestTags.DISCLAIMER_SCREEN_ACCEPT_BUTTON) - } -} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/MainPage.kt b/app/src/androidTest/kotlin/com/tangem/screens/MainPage.kt new file mode 100644 index 0000000000..f9016b3f69 --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/screens/MainPage.kt @@ -0,0 +1,9 @@ +package com.tangem.screens + +import androidx.compose.ui.test.hasTestTag +import com.atiurin.ultron.page.Page +import com.tangem.core.ui.test.TestTags + +object MainPage : Page() { + val container = hasTestTag(TestTags.MAIN_SCREEN) +} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/MainTestScreen.kt b/app/src/androidTest/kotlin/com/tangem/screens/MainTestScreen.kt deleted file mode 100644 index a342754478..0000000000 --- a/app/src/androidTest/kotlin/com/tangem/screens/MainTestScreen.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.tangem.screens - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import com.tangem.core.ui.test.TestTags -import io.github.kakaocup.compose.node.element.ComposeScreen - -class MainTestScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag(TestTags.MAIN_SCREEN) } - ) \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/StoriesPage.kt b/app/src/androidTest/kotlin/com/tangem/screens/StoriesPage.kt new file mode 100644 index 0000000000..51f472521a --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/screens/StoriesPage.kt @@ -0,0 +1,10 @@ +package com.tangem.screens + +import androidx.compose.ui.test.hasTestTag +import com.atiurin.ultron.page.Page +import com.tangem.core.ui.test.TestTags + +object StoriesPage : Page() { + val scanButton = hasTestTag(TestTags.STORIES_SCREEN_SCAN_BUTTON) + val orderButton = hasTestTag(TestTags.STORIES_SCREEN_ORDER_BUTTON) +} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/StoriesTestScreen.kt b/app/src/androidTest/kotlin/com/tangem/screens/StoriesTestScreen.kt deleted file mode 100644 index 9dd1a415e9..0000000000 --- a/app/src/androidTest/kotlin/com/tangem/screens/StoriesTestScreen.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.tangem.screens - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import com.tangem.core.ui.test.TestTags -import com.tangem.wallet.R -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode -import io.github.kakaocup.kakao.common.views.KView -import io.github.kakaocup.kakao.text.KButton - -class StoriesTestScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag(TestTags.STORIES_SCREEN) } - ) { - - val scanButton: KNode = child { - hasTestTag(TestTags.STORIES_SCREEN_SCAN_BUTTON) - } - - val orderButton: KNode = child { - hasTestTag(TestTags.STORIES_SCREEN_ORDER_BUTTON) - } - - val enableNFCAlert: KView = KView { - withId(R.id.alertTitle) - } - - val cancelButton: KButton = KButton { - withId(android.R.id.button2) - } -} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/TestTopBar.kt b/app/src/androidTest/kotlin/com/tangem/screens/TestTopBar.kt deleted file mode 100644 index 83d2e8a6a9..0000000000 --- a/app/src/androidTest/kotlin/com/tangem/screens/TestTopBar.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.tangem.screens - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import com.tangem.core.ui.test.TestTags -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode - -class TestTopBar(semanticsProvider: SemanticsNodeInteractionsProvider) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag(TestTags.MAIN_SCREEN_TOP_BAR) } - ) { - val moreButton: KNode = child { - hasTestTag(TestTags.MAIN_SCREEN_MORE_BUTTON) - } -} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/TopBarPage.kt b/app/src/androidTest/kotlin/com/tangem/screens/TopBarPage.kt new file mode 100644 index 0000000000..2505ffae8b --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/screens/TopBarPage.kt @@ -0,0 +1,9 @@ +package com.tangem.screens + +import androidx.compose.ui.test.hasTestTag +import com.atiurin.ultron.page.Page +import com.tangem.core.ui.test.TestTags + +object TopBarPage : Page() { + val moreButton = hasTestTag(TestTags.MAIN_SCREEN_MORE_BUTTON) +} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/WalletSettingsPage.kt b/app/src/androidTest/kotlin/com/tangem/screens/WalletSettingsPage.kt new file mode 100644 index 0000000000..a38559a523 --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/screens/WalletSettingsPage.kt @@ -0,0 +1,13 @@ +package com.tangem.screens + +import androidx.compose.ui.test.hasText +import com.atiurin.ultron.page.Page +import com.tangem.common.extensions.TestDataUtils.getResourceString +import com.tangem.wallet.R + +object WalletSettingsPage : Page() { + val linkMoreCardsButton = hasText(getResourceString(R.string.details_row_title_create_backup)) + val cardSettingsButton = hasText(getResourceString(R.string.card_settings_title)) + val referralProgramButton = hasText(getResourceString(R.string.details_referral_title)) + val forgetWalletButton = hasText(getResourceString(R.string.settings_forget_wallet)) +} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/WalletSettingsTestScreen.kt b/app/src/androidTest/kotlin/com/tangem/screens/WalletSettingsTestScreen.kt deleted file mode 100644 index 1b31bd509c..0000000000 --- a/app/src/androidTest/kotlin/com/tangem/screens/WalletSettingsTestScreen.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.tangem.screens - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import com.tangem.core.ui.test.TestTags -import com.tangem.wallet.R -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode -import io.github.kakaocup.kakao.common.utilities.getResourceString - -class WalletSettingsTestScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag(TestTags.WALLET_SETTINGS_SCREEN) } - ) { - private val walletSettingsItem: KNode = child { - hasTestTag(TestTags.WALLET_SETTINGS_SCREEN_ITEM) - } - - val linkMoreCardsButton: KNode = walletSettingsItem.child { - hasText(getResourceString(R.string.details_row_title_create_backup)) - } - val cardSettingsButton: KNode = walletSettingsItem.child { - hasText(getResourceString(R.string.card_settings_title)) - } - val referralProgramButton: KNode = walletSettingsItem.child { - hasText(getResourceString(R.string.details_referral_title)) - } - val forgetWalletButton: KNode = walletSettingsItem.child { - hasText(getResourceString(R.string.settings_forget_wallet)) - } -} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/tests/DetailsScreenTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/DetailsScreenTest.kt index dd86a046cc..1951caf4d7 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/DetailsScreenTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/DetailsScreenTest.kt @@ -1,157 +1,138 @@ package com.tangem.tests +import com.atiurin.ultron.allure.step.step +import com.atiurin.ultron.extensions.assertIsDisplayed +import com.atiurin.ultron.extensions.assertIsNotDisplayed +import com.atiurin.ultron.extensions.click import com.tangem.common.BaseTestCase -import com.tangem.common.extensions.clickWithAssertion import com.tangem.domain.models.scan.ProductType -import com.tangem.scenarios.OpenMainScreenScenario -import com.tangem.screens.DetailsTestScreen -import com.tangem.screens.TestTopBar -import com.tangem.screens.WalletSettingsTestScreen +import com.tangem.scenarios.MainPageScenario +import com.tangem.screens.DetailsPage +import com.tangem.screens.TopBarPage +import com.tangem.screens.WalletSettingsPage import dagger.hilt.android.testing.HiltAndroidTest -import io.github.kakaocup.compose.node.element.ComposeScreen import org.junit.Test @HiltAndroidTest class DetailsScreenTest : BaseTestCase() { @Test - fun walletWithoutBackupDetails() = - setupHooks().run { - scenario(OpenMainScreenScenario(composeTestRule)) - ComposeScreen.onComposeScreen(composeTestRule) { - step("Open wallet details") { - moreButton.clickWithAssertion() - } - } - ComposeScreen.onComposeScreen(composeTestRule) { - step("Assert wallet connect button is visible") { - walletConnectButton.assertIsDisplayed() - } - step("Assert scan card button is visible") { - scanCardButton.assertIsDisplayed() - } - step("Assert buy Tangem card button is visible") { - buyTangemButton.assertIsDisplayed() - } - step("Assert app settings button is visible") { - appSettingsButton.assertIsDisplayed() - } - step("Assert contact support button is visible") { - contactSupportButton.assertIsDisplayed() - } - step("Assert terms or service button is visible") { - toSButton.assertIsDisplayed() - } - step("Open wallet settings screen") { - walletNameButton.clickWithAssertion() - } - } - ComposeScreen.onComposeScreen(composeTestRule) { - step("Assert Link more cards button is visible") { - linkMoreCardsButton.assertIsDisplayed() - } - step("Assert Card Settings button is visible") { - cardSettingsButton.assertIsDisplayed() - } - step("Assert Referral program button is visible") { - referralProgramButton.assertIsDisplayed() - } - step("Assert Forget wallet button is visible") { - forgetWalletButton.assertIsDisplayed() - } - } + fun walletWithoutBackupDetails() { + MainPageScenario.open() + step("Open wallet details") { + TopBarPage.moreButton.click() } + step("Assert wallet connect button is visible") { + DetailsPage.walletConnectButton.assertIsDisplayed() + } + step("Assert scan card button is visible") { + DetailsPage.scanCardButton.assertIsDisplayed() + } + step("Assert buy Tangem card button is visible") { + DetailsPage.buyTangemButton.assertIsDisplayed() + } + step("Assert app settings button is visible") { + DetailsPage.appSettingsButton.assertIsDisplayed() + } + step("Assert contact support button is visible") { + DetailsPage.contactSupportButton.assertIsDisplayed() + } + step("Assert terms or service button is visible") { + DetailsPage.toSButton.assertIsDisplayed() + } + step("Open wallet settings screen") { + DetailsPage.walletNameButton.click() + } + step("Assert Link more cards button is visible") { + WalletSettingsPage.linkMoreCardsButton.assertIsDisplayed() + } + step("Assert Card Settings button is visible") { + WalletSettingsPage.cardSettingsButton.assertIsDisplayed() + } + step("Assert Referral program button is visible") { + WalletSettingsPage.referralProgramButton.assertIsDisplayed() + } + step("Assert Forget wallet button is visible") { + WalletSettingsPage.forgetWalletButton.assertIsDisplayed() + } + } @Test - fun wallet2Details() = - setupHooks().run { - scenario(OpenMainScreenScenario(composeTestRule, ProductType.Wallet2)) - ComposeScreen.onComposeScreen(composeTestRule) { - step("Open wallet details") { - moreButton.clickWithAssertion() - } - } - ComposeScreen.onComposeScreen(composeTestRule) { - step("Assert wallet connect button is visible") { - walletConnectButton.assertIsDisplayed() - } - step("Assert scan card button is visible") { - scanCardButton.assertIsDisplayed() - } - step("Assert buy Tangem card button is visible") { - buyTangemButton.assertIsDisplayed() - } - step("Assert app settings button is visible") { - appSettingsButton.assertIsDisplayed() - } - step("Assert contact support button is visible") { - contactSupportButton.assertIsDisplayed() - } - step("Assert terms or service button is visible") { - toSButton.assertIsDisplayed() - } - step("Open wallet settings screen") { - walletNameButton.clickWithAssertion() - } - } - ComposeScreen.onComposeScreen(composeTestRule) { - step("Assert Link more cards button does not exist") { - linkMoreCardsButton.assertIsNotDisplayed() - } - step("Assert Card Settings button is visible") { - cardSettingsButton.assertIsDisplayed() - } - step("Assert Referral program button is visible") { - referralProgramButton.assertIsDisplayed() - } - step("Assert Forget wallet button is visible") { - forgetWalletButton.assertIsDisplayed() - } - } + fun wallet2Details() { + MainPageScenario.open(ProductType.Wallet2) + step("Open wallet details") { + TopBarPage.moreButton.click() } + step("Assert wallet connect button is visible") { + DetailsPage.walletConnectButton.assertIsDisplayed() + } + step("Assert scan card button is visible") { + DetailsPage.scanCardButton.assertIsDisplayed() + } + step("Assert buy Tangem card button is visible") { + DetailsPage.buyTangemButton.assertIsDisplayed() + } + step("Assert app settings button is visible") { + DetailsPage.appSettingsButton.assertIsDisplayed() + } + step("Assert contact support button is visible") { + DetailsPage.contactSupportButton.assertIsDisplayed() + } + step("Assert terms or service button is visible") { + DetailsPage.toSButton.assertIsDisplayed() + } + step("Open wallet settings screen") { + DetailsPage.walletNameButton.click() + } + step("Assert Link more cards button does not exist") { + WalletSettingsPage.linkMoreCardsButton.assertIsNotDisplayed() + } + step("Assert Card Settings button is visible") { + WalletSettingsPage.cardSettingsButton.assertIsDisplayed() + } + step("Assert Referral program button is visible") { + WalletSettingsPage.referralProgramButton.assertIsDisplayed() + } + step("Assert Forget wallet button is visible") { + WalletSettingsPage.forgetWalletButton.assertIsDisplayed() + } + } @Test - fun noteDetails() = - setupHooks().run { - scenario(OpenMainScreenScenario(composeTestRule, ProductType.Note)) - ComposeScreen.onComposeScreen(composeTestRule) { - step("Open wallet details") { - moreButton.clickWithAssertion() - } - } - ComposeScreen.onComposeScreen(composeTestRule) { - step("Assert wallet connect button does not exist") { - walletConnectButton.assertIsNotDisplayed() - } - step("Assert scan card button is visible") { - scanCardButton.assertIsDisplayed() - } - step("Assert buy Tangem card button is visible") { - buyTangemButton.assertIsDisplayed() - } - step("Assert app settings button is visible") { - appSettingsButton.assertIsDisplayed() - } - step("Assert contact support button is visible") { - contactSupportButton.assertIsDisplayed() - } - step("Assert terms or service button is visible") { - toSButton.assertIsDisplayed() - } - step("Open wallet settings screen") { - walletNameButton.clickWithAssertion() - } - } - ComposeScreen.onComposeScreen(composeTestRule) { - step("Assert Card Settings button is visible") { - cardSettingsButton.assertIsDisplayed() - } - step("Assert Referral program button does not exist") { - referralProgramButton.assertIsNotDisplayed() - } - step("Assert Forget wallet button is visible") { - forgetWalletButton.assertIsDisplayed() - } - } + fun noteDetails() { + MainPageScenario.open(ProductType.Note) + step("Open wallet details") { + TopBarPage.moreButton.click() } -} \ No newline at end of file + step("Assert wallet connect button does not exist") { + DetailsPage.walletConnectButton.assertIsNotDisplayed() + } + step("Assert scan card button is visible") { + DetailsPage.scanCardButton.assertIsDisplayed() + } + step("Assert buy Tangem card button is visible") { + DetailsPage.buyTangemButton.assertIsDisplayed() + } + step("Assert app settings button is visible") { + DetailsPage.appSettingsButton.assertIsDisplayed() + } + step("Assert contact support button is visible") { + DetailsPage.contactSupportButton.assertIsDisplayed() + } + step("Assert terms or service button is visible") { + DetailsPage.toSButton.assertIsDisplayed() + } + step("Open wallet settings screen") { + DetailsPage.walletNameButton.click() + } + step("Assert Card Settings button is visible") { + WalletSettingsPage.cardSettingsButton.assertIsDisplayed() + } + step("Assert Referral program button does not exist") { + WalletSettingsPage.referralProgramButton.assertIsNotDisplayed() + } + step("Assert Forget wallet button is visible") { + WalletSettingsPage.forgetWalletButton.assertIsDisplayed() + } + } +} diff --git a/app/src/androidTest/kotlin/com/tangem/tests/MainScreenTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/MainScreenTest.kt deleted file mode 100644 index 98e9cad75c..0000000000 --- a/app/src/androidTest/kotlin/com/tangem/tests/MainScreenTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.tangem.tests - -import com.tangem.common.BaseTestCase -import com.tangem.scenarios.OpenMainScreenScenario -import dagger.hilt.android.testing.HiltAndroidTest -import org.junit.Test - -@HiltAndroidTest -class MainScreenTest : BaseTestCase() { - - @Test - fun goToMain() = - setupHooks().run { - scenario(OpenMainScreenScenario(composeTestRule)) - } -} \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/tests/ScanErrorTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/ScanErrorTest.kt index da686950a7..de198088d3 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/ScanErrorTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/ScanErrorTest.kt @@ -1,40 +1,42 @@ package com.tangem.tests +import com.atiurin.ultron.allure.step.step +import com.atiurin.ultron.extensions.assertIsDisplayed +import com.atiurin.ultron.extensions.assertIsNotDisplayed +import com.atiurin.ultron.extensions.click import com.tangem.common.BaseTestCase -import com.tangem.common.extensions.clickWithAssertion -import com.tangem.screens.DisclaimerTestScreen -import com.tangem.screens.MainTestScreen -import com.tangem.screens.StoriesTestScreen +import com.tangem.screens.DisclaimerPage +import com.tangem.screens.MainPage +import com.tangem.screens.StoriesPage import com.tangem.tap.domain.sdk.mocks.MockProvider import dagger.hilt.android.testing.HiltAndroidTest -import io.github.kakaocup.compose.node.element.ComposeScreen import org.junit.Test @HiltAndroidTest class ScanErrorTest : BaseTestCase() { @Test - fun goToMain() = - setupHooks().run { - ComposeScreen.onComposeScreen(composeTestRule) { - step("Click on \"Accept\" button") { - acceptButton.clickWithAssertion() - } - } - ComposeScreen.onComposeScreen(composeTestRule) { - step("Click on \"Scan\" button emulating scan error") { - MockProvider.setEmulateError() - scanButton.clickWithAssertion() - } - step("Click on \"Scan\" button again without emulating error") { - MockProvider.resetEmulateError() - scanButton.clickWithAssertion() - } - } - ComposeScreen.onComposeScreen(composeTestRule) { - step("Make sure wallet screen is visible") { - assertIsDisplayed() - } - } + fun goToMain() { + step("Click on \"Accept\" button") { + DisclaimerPage.acceptButton.click() } + step("Emulate scan error") { + MockProvider.setEmulateError() + } + step("Click on \"Scan\" button emulating scan error") { + StoriesPage.scanButton.click() + } + step("Assert: Error is displayed") { + MainPage.container.assertIsNotDisplayed() + } + step("Emulate success scan") { + MockProvider.resetEmulateError() + } + step("Click on \"Scan\" button") { + StoriesPage.scanButton.click() + } + step("Assert: wallet screen is displayed") { + MainPage.container.assertIsDisplayed() + } + } } \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/tests/StoriesTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/StoriesTest.kt index eab4389f6b..5adaaeada1 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/StoriesTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/StoriesTest.kt @@ -1,41 +1,36 @@ package com.tangem.tests import android.content.Intent.ACTION_VIEW -import androidx.test.espresso.intent.matcher.UriMatchers +import androidx.test.espresso.intent.Intents +import androidx.test.espresso.intent.matcher.IntentMatchers.hasAction +import androidx.test.espresso.intent.matcher.IntentMatchers.hasData +import com.atiurin.ultron.allure.step.step +import com.atiurin.ultron.core.config.UltronConfig.UiAutomator.Companion.uiDevice +import com.atiurin.ultron.extensions.click import com.tangem.common.BaseTestCase -import com.tangem.common.extensions.clickWithAssertion -import com.tangem.screens.DisclaimerTestScreen -import com.tangem.screens.StoriesTestScreen +import com.tangem.screens.DisclaimerPage +import com.tangem.screens.StoriesPage import com.tangem.tap.features.home.redux.HomeMiddleware.NEW_BUY_WALLET_URL import dagger.hilt.android.testing.HiltAndroidTest -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.kakao.intent.KIntent -import org.hamcrest.Matchers +import org.hamcrest.core.AllOf.allOf import org.junit.Test @HiltAndroidTest class StoriesTest : BaseTestCase() { @Test - fun clickOnOrderButton() = - setupHooks().run { - ComposeScreen.onComposeScreen(composeTestRule) { - step("Click on \"Accept\" button") { - acceptButton.clickWithAssertion() - } - } - ComposeScreen.onComposeScreen(composeTestRule) { - step("Click on \"Order\" button") { - orderButton.clickWithAssertion() - } - step("Assert: browser opened") { - val expectedIntent = KIntent { - hasAction(ACTION_VIEW) - hasData { toString().startsWith(NEW_BUY_WALLET_URL) } - } - expectedIntent.intended() - device.uiDevice.pressBack() - } - } + fun checkOrderButton() { + Intents.init() + step("Click Accept on ToS") { + DisclaimerPage.acceptButton.click() } + step("Click order button ") { + StoriesPage.orderButton.click() + } + step("Assert: browser is opened ") { + Intents.intended(allOf(hasAction(ACTION_VIEW), hasData(NEW_BUY_WALLET_URL))) + uiDevice.pressBack() + Intents.release() + } + } } \ No newline at end of file diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index ed30a72958..94a1dc8b50 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -109,8 +109,9 @@ junit = "4.13.2" junitAndroidExt = "1.1.5" mockk = "1.13.4" truth = "1.1.3" -kaspresso = "1.5.4" -kaspresso-compose = "1.5.4" +ultron-android = "2.5.4" +ultron-compose = "2.5.4" +ultron-allure ="2.5.4" compose-junit = "1.6.2" hamcrest = "2.2" # endregion Testing @@ -210,8 +211,9 @@ test-junit = { module = "junit:junit", version.ref = "junit" } test-junit-android = { module = "androidx.test.ext:junit", version.ref = "junitAndroidExt" } test-truth = { module = "com.google.truth:truth", version.ref = "truth" } test-mockk = { module = "io.mockk:mockk", version.ref = "mockk" } -test-kaspresso = { module = "com.kaspersky.android-components:kaspresso", version.ref = "kaspresso" } -test-kaspresso-compose = { module = "com.kaspersky.android-components:kaspresso-compose-support", version.ref = "kaspresso-compose" } +test-ultron-android = { module = "com.atiurin:ultron-android", version.ref = "ultron-android" } +test-ultron-compose = { module = "com.atiurin:ultron-compose", version.ref = "ultron-compose" } +test-ultron-allure = { module = "com.atiurin:ultron-allure", version.ref = "ultron-allure" } test-compose-junit = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "compose-junit" } test-hamcrest = { module = "org.hamcrest:hamcrest", version.ref = "hamcrest" } test-hilt = { module = "com.google.dagger:hilt-android-testing", version.ref = "hilt" }