Updated on 2026-08-14
This commit is contained in:
parent
6178034e71
commit
a30eeb4f5d
7 changed files with 161 additions and 8 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -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() }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
@ -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"
|
||||||
|
}
|
||||||
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue