diff --git a/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt b/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt index 57c7c6cd46..823d7df27c 100644 --- a/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt +++ b/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt @@ -80,9 +80,12 @@ abstract class BaseTestCase : TestCase( ) = before { hiltRule.inject() runBlocking { - appPreferencesStore.editData { mutablePreferences -> mutablePreferences.set( - key = PreferencesKeys.NOTIFICATIONS_USER_ALLOW_SEND_ADDRESSES_KEY, value = false - ) } + appPreferencesStore.editData { mutablePreferences -> + mutablePreferences.set( + key = PreferencesKeys.NOTIFICATIONS_USER_ALLOW_SEND_ADDRESSES_KEY, + value = false + ) + } } apiEnvironmentRule.setup(apiConfigsManager) ActivityScenario.launch(MainActivity::class.java) diff --git a/app/src/androidTest/kotlin/com/tangem/screens/ReferralProgramPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/ReferralProgramPageObject.kt new file mode 100644 index 0000000000..b16bba6546 --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/screens/ReferralProgramPageObject.kt @@ -0,0 +1,84 @@ +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.ReferralProgramScreenTestTags +import com.tangem.core.ui.test.TopAppBarTestTags +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 com.tangem.feature.referral.presentation.R as ReferralPresentationR +import androidx.compose.ui.test.hasText as withText + +class ReferralProgramPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) : + ComposeScreen(semanticsProvider = semanticsProvider) { + + val title: KNode = child { + hasTestTag(TopAppBarTestTags.TITLE) + hasText(getResourceString(R.string.details_referral_title)) + useUnmergedTree = true + } + + val referTitle: KNode = child { + hasText(getResourceString(R.string.referral_title)) + useUnmergedTree = true + } + + val image: KNode = child { + hasTestTag(ReferralProgramScreenTestTags.IMAGE) + useUnmergedTree = true + } + + val infoForYouText: KNode = child { + hasTestTag(ReferralProgramScreenTestTags.INFO_FOR_YOU_TEXT) + useUnmergedTree = true + } + + val infoForYouBlock: KNode = child { + hasTestTag(ReferralProgramScreenTestTags.CONDITION_BLOCK) + hasAnyDescendant( + withText( + getResourceString(ReferralPresentationR.string.referral_point_currencies_title), + substring = true + ) + ) + useUnmergedTree = true + } + + val infoForYourFriendText: KNode = child { + hasTestTag(ReferralProgramScreenTestTags.INFO_FOR_YOUR_FRIEND_TEXT) + useUnmergedTree = true + } + + val infoForYourFriendBlock: KNode = child { + hasTestTag(ReferralProgramScreenTestTags.CONDITION_BLOCK) + hasAnyDescendant( + withText( + getResourceString(ReferralPresentationR.string.referral_point_discount_title), + substring = true + ) + ) + useUnmergedTree = true + } + + val agreementText: KNode = child { + hasText(getResourceString( + ReferralPresentationR.string.referral_tos_not_enroled_prefix) + " " + + getResourceString(ReferralPresentationR.string.common_terms_and_conditions ) + " " + + getResourceString(ReferralPresentationR.string.referral_tos_suffix), + substring = true + ) + useUnmergedTree = true + } + + val participateButton: KNode = child { + hasTestTag(BaseButtonTestTags.TEXT) + useUnmergedTree = true + } +} + +internal fun BaseTestCase.onReferralProgramScreen(function: ReferralProgramPageObject.() -> Unit) = + onComposeScreen(composeTestRule, function) \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/tests/DetailsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/DetailsTest.kt index 805c4bfe72..df318a9456 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/DetailsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/DetailsTest.kt @@ -5,9 +5,12 @@ import com.tangem.common.extensions.clickWithAssertion import com.tangem.domain.models.scan.ProductType import com.tangem.scenarios.OpenMainScreenScenario import com.tangem.screens.onDetailsScreen +import com.tangem.screens.onReferralProgramScreen import com.tangem.screens.onTopBar import com.tangem.screens.onWalletSettingsScreen import dagger.hilt.android.testing.HiltAndroidTest +import io.qameta.allure.kotlin.AllureId +import io.qameta.allure.kotlin.junit4.DisplayName import org.junit.Test @HiltAndroidTest @@ -153,4 +156,48 @@ class DetailsTest : BaseTestCase() { } } } + + @AllureId("3647") + @DisplayName("Referral program: validate screen") + @Test + fun validateReferralProgramScreenTest() = + setupHooks().run { + scenario(OpenMainScreenScenario(composeTestRule)) + step("Open wallet details") { + onTopBar { moreButton.clickWithAssertion() } + } + step("Open 'Wallet settings' screen") { + onDetailsScreen { walletNameButton.clickWithAssertion() } + } + step("Click on 'Referral program' button ") { + onWalletSettingsScreen { referralProgramButton.clickWithAssertion() } + } + step("Assert 'Referral program' screen title is displayed") { + onReferralProgramScreen { title.assertIsDisplayed() } + } + step("Assert 'Referral program' screen image is displayed") { + onReferralProgramScreen { image.assertIsDisplayed() } + } + step("Assert 'Referral program' screen refer title is displayed") { + onReferralProgramScreen { referTitle.assertIsDisplayed() } + } + step("Assert info for you title is displayed") { + onReferralProgramScreen { infoForYouText.assertIsDisplayed() } + } + step("Assert info for you text is displayed") { + onReferralProgramScreen { infoForYouBlock.assertIsDisplayed() } + } + step("Assert info for your friend title is displayed") { + onReferralProgramScreen { infoForYourFriendText.assertIsDisplayed() } + } + step("Assert info for your friend text is displayed") { + onReferralProgramScreen { infoForYourFriendBlock.assertIsDisplayed() } + } + step("Assert agreement text is displayed") { + onReferralProgramScreen { agreementText.assertIsDisplayed() } + } + step("Assert 'Participate' button is displayed") { + onReferralProgramScreen { participateButton.assertIsDisplayed() } + } + } } \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/buttons/common/TangemButton.kt b/core/ui/src/main/java/com/tangem/core/ui/components/buttons/common/TangemButton.kt index 90dbd2db78..aa6f681bce 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/buttons/common/TangemButton.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/buttons/common/TangemButton.kt @@ -28,7 +28,7 @@ import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.test.BaseButtonTestTags import com.tangem.core.ui.utils.MultipleClickPreventer -@Suppress("LongParameterList") +@Suppress("LongParameterList", "LongMethod") @Composable fun TangemButton( text: String, @@ -78,7 +78,8 @@ fun TangemButton( ResizableText( modifier = Modifier .weight(1f, fill = false) - .heightIn(MinButtonContentSize, maxContentSize), + .heightIn(MinButtonContentSize, maxContentSize) + .testTag(BaseButtonTestTags.TEXT), text = text, style = textStyle, color = colors.contentColor(enabled = enabled).value, @@ -92,7 +93,8 @@ fun TangemButton( Icon( modifier = Modifier .buttonContentSize(maxContentSize) - .padding(vertical = 2.dp), + .padding(vertical = 2.dp) + .testTag(BaseButtonTestTags.ICON), painter = painterResource(id = iconResId), tint = colors.contentColor(enabled = enabled).value, contentDescription = null, diff --git a/core/ui/src/main/java/com/tangem/core/ui/test/BaseButtonTestTags.kt b/core/ui/src/main/java/com/tangem/core/ui/test/BaseButtonTestTags.kt index 9d4954ba04..03bfd8f0d3 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/test/BaseButtonTestTags.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/test/BaseButtonTestTags.kt @@ -2,4 +2,6 @@ package com.tangem.core.ui.test object BaseButtonTestTags { const val BUTTON = "BASE_BUTTON" + const val ICON = "BASE_BUTTON_ICON" + const val TEXT = "BASE_BUTTON_TEXT" } \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/test/ReferralProgramScreenTestTags.kt b/core/ui/src/main/java/com/tangem/core/ui/test/ReferralProgramScreenTestTags.kt new file mode 100644 index 0000000000..55a20fabe0 --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/test/ReferralProgramScreenTestTags.kt @@ -0,0 +1,8 @@ +package com.tangem.core.ui.test + +object ReferralProgramScreenTestTags { + const val IMAGE = "REFERRAL_PROGRAM_SCREEN_IMAGE" + const val CONDITION_BLOCK = "REFERRAL_PROGRAM_SCREEN_CONDITION_BLOCK" + const val INFO_FOR_YOU_TEXT = "REFERRAL_PROGRAM_SCREEN_INFO_FOR_YOU_TEXT" + const val INFO_FOR_YOUR_FRIEND_TEXT = "REFERRAL_PROGRAM_INFO_FOR_YOUR_FRIEND_TEXT" +} \ No newline at end of file diff --git a/features/referral/impl/src/main/java/com/tangem/feature/referral/ui/ReferralScreen.kt b/features/referral/impl/src/main/java/com/tangem/feature/referral/ui/ReferralScreen.kt index 5bf12360cb..4aae138a4f 100644 --- a/features/referral/impl/src/main/java/com/tangem/feature/referral/ui/ReferralScreen.kt +++ b/features/referral/impl/src/main/java/com/tangem/feature/referral/ui/ReferralScreen.kt @@ -16,6 +16,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle @@ -34,6 +35,7 @@ import com.tangem.core.ui.components.snackbar.TangemSnackbar 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.ReferralProgramScreenTestTags import com.tangem.feature.referral.domain.models.ExpectedAward import com.tangem.feature.referral.domain.models.ExpectedAwards import com.tangem.feature.referral.models.DemoModeException @@ -138,7 +140,8 @@ private fun Header() { modifier = Modifier .padding(horizontal = TangemTheme.dimens.spacing32) .fillMaxWidth() - .height(TangemTheme.dimens.size200), + .height(TangemTheme.dimens.size200) + .testTag(ReferralProgramScreenTestTags.IMAGE), ) SpacerH24() Text( @@ -233,7 +236,9 @@ private fun LoadingCondition(@DrawableRes iconResId: Int) { @Composable private fun Condition(@DrawableRes iconResId: Int, infoBlock: @Composable () -> Unit) { Row( - modifier = Modifier.padding(horizontal = TangemTheme.dimens.spacing16), + modifier = Modifier + .padding(horizontal = TangemTheme.dimens.spacing16) + .testTag(ReferralProgramScreenTestTags.CONDITION_BLOCK), horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing12), verticalAlignment = Alignment.Top, ) { @@ -268,6 +273,7 @@ private fun InfoForYou(award: String, networkName: String, address: String? = nu ), color = TangemTheme.colors.text.tertiary, style = TangemTheme.typography.body2, + modifier = Modifier.testTag(ReferralProgramScreenTestTags.INFO_FOR_YOU_TEXT), ) } } @@ -332,6 +338,7 @@ private fun ConditionInfo(title: String, subtitleContent: @Composable () -> Unit text = title, color = TangemTheme.colors.text.primary1, style = TangemTheme.typography.subtitle1, + modifier = Modifier.testTag(ReferralProgramScreenTestTags.INFO_FOR_YOUR_FRIEND_TEXT), ) subtitleContent() }