Updated on 2026-08-14

This commit is contained in:
Tangem 2025-08-08 12:36:38 +03:00
parent 6178034e71
commit a30eeb4f5d
7 changed files with 161 additions and 8 deletions

View file

@ -80,9 +80,12 @@ abstract class BaseTestCase : TestCase(
) = before { ) = before {
hiltRule.inject() hiltRule.inject()
runBlocking { runBlocking {
appPreferencesStore.editData { mutablePreferences -> mutablePreferences.set( appPreferencesStore.editData { mutablePreferences ->
key = PreferencesKeys.NOTIFICATIONS_USER_ALLOW_SEND_ADDRESSES_KEY, value = false mutablePreferences.set(
) } key = PreferencesKeys.NOTIFICATIONS_USER_ALLOW_SEND_ADDRESSES_KEY,
value = false
)
}
} }
apiEnvironmentRule.setup(apiConfigsManager) apiEnvironmentRule.setup(apiConfigsManager)
ActivityScenario.launch(MainActivity::class.java) ActivityScenario.launch(MainActivity::class.java)

View file

@ -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<ReferralProgramPageObject>(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)

View file

@ -5,9 +5,12 @@ import com.tangem.common.extensions.clickWithAssertion
import com.tangem.domain.models.scan.ProductType import com.tangem.domain.models.scan.ProductType
import com.tangem.scenarios.OpenMainScreenScenario import com.tangem.scenarios.OpenMainScreenScenario
import com.tangem.screens.onDetailsScreen import com.tangem.screens.onDetailsScreen
import com.tangem.screens.onReferralProgramScreen
import com.tangem.screens.onTopBar import com.tangem.screens.onTopBar
import com.tangem.screens.onWalletSettingsScreen import com.tangem.screens.onWalletSettingsScreen
import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltAndroidTest
import io.qameta.allure.kotlin.AllureId
import io.qameta.allure.kotlin.junit4.DisplayName
import org.junit.Test import org.junit.Test
@HiltAndroidTest @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() }
}
}
} }

View file

@ -28,7 +28,7 @@ import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.test.BaseButtonTestTags import com.tangem.core.ui.test.BaseButtonTestTags
import com.tangem.core.ui.utils.MultipleClickPreventer import com.tangem.core.ui.utils.MultipleClickPreventer
@Suppress("LongParameterList") @Suppress("LongParameterList", "LongMethod")
@Composable @Composable
fun TangemButton( fun TangemButton(
text: String, text: String,
@ -78,7 +78,8 @@ fun TangemButton(
ResizableText( ResizableText(
modifier = Modifier modifier = Modifier
.weight(1f, fill = false) .weight(1f, fill = false)
.heightIn(MinButtonContentSize, maxContentSize), .heightIn(MinButtonContentSize, maxContentSize)
.testTag(BaseButtonTestTags.TEXT),
text = text, text = text,
style = textStyle, style = textStyle,
color = colors.contentColor(enabled = enabled).value, color = colors.contentColor(enabled = enabled).value,
@ -92,7 +93,8 @@ fun TangemButton(
Icon( Icon(
modifier = Modifier modifier = Modifier
.buttonContentSize(maxContentSize) .buttonContentSize(maxContentSize)
.padding(vertical = 2.dp), .padding(vertical = 2.dp)
.testTag(BaseButtonTestTags.ICON),
painter = painterResource(id = iconResId), painter = painterResource(id = iconResId),
tint = colors.contentColor(enabled = enabled).value, tint = colors.contentColor(enabled = enabled).value,
contentDescription = null, contentDescription = null,

View file

@ -2,4 +2,6 @@ package com.tangem.core.ui.test
object BaseButtonTestTags { object BaseButtonTestTags {
const val BUTTON = "BASE_BUTTON" const val BUTTON = "BASE_BUTTON"
const val ICON = "BASE_BUTTON_ICON"
const val TEXT = "BASE_BUTTON_TEXT"
} }

View file

@ -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"
}

View file

@ -16,6 +16,7 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.SpanStyle 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.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview 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.ExpectedAward
import com.tangem.feature.referral.domain.models.ExpectedAwards import com.tangem.feature.referral.domain.models.ExpectedAwards
import com.tangem.feature.referral.models.DemoModeException import com.tangem.feature.referral.models.DemoModeException
@ -138,7 +140,8 @@ private fun Header() {
modifier = Modifier modifier = Modifier
.padding(horizontal = TangemTheme.dimens.spacing32) .padding(horizontal = TangemTheme.dimens.spacing32)
.fillMaxWidth() .fillMaxWidth()
.height(TangemTheme.dimens.size200), .height(TangemTheme.dimens.size200)
.testTag(ReferralProgramScreenTestTags.IMAGE),
) )
SpacerH24() SpacerH24()
Text( Text(
@ -233,7 +236,9 @@ private fun LoadingCondition(@DrawableRes iconResId: Int) {
@Composable @Composable
private fun Condition(@DrawableRes iconResId: Int, infoBlock: @Composable () -> Unit) { private fun Condition(@DrawableRes iconResId: Int, infoBlock: @Composable () -> Unit) {
Row( 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), horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing12),
verticalAlignment = Alignment.Top, verticalAlignment = Alignment.Top,
) { ) {
@ -268,6 +273,7 @@ private fun InfoForYou(award: String, networkName: String, address: String? = nu
), ),
color = TangemTheme.colors.text.tertiary, color = TangemTheme.colors.text.tertiary,
style = TangemTheme.typography.body2, 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, text = title,
color = TangemTheme.colors.text.primary1, color = TangemTheme.colors.text.primary1,
style = TangemTheme.typography.subtitle1, style = TangemTheme.typography.subtitle1,
modifier = Modifier.testTag(ReferralProgramScreenTestTags.INFO_FOR_YOUR_FRIEND_TEXT),
) )
subtitleContent() subtitleContent()
} }