diff --git a/app/src/androidTest/kotlin/com/tangem/scenarios/GaslessScenarios.kt b/app/src/androidTest/kotlin/com/tangem/scenarios/GaslessScenarios.kt index 90ef47eb41..7e86edb967 100644 --- a/app/src/androidTest/kotlin/com/tangem/scenarios/GaslessScenarios.kt +++ b/app/src/androidTest/kotlin/com/tangem/scenarios/GaslessScenarios.kt @@ -57,6 +57,17 @@ fun BaseTestCase.selectStablecoinAsFeeToken(coinName: String, tokenName: String) step("Select '$tokenName' as the fee-paying token") { onSendFeeSelectorBottomSheet { feeTokenItem(tokenName).performClick() } } + step("Wait until the '$tokenName' fee is loaded and 'Apply' is enabled") { + composeTestRule.waitUntil(timeoutMillis = WAIT_UNTIL_TIMEOUT_LONG) { + runCatching { + onSendFeeSelectorBottomSheet { + networkFeeTitle.assertIsDisplayed() + feeTokenItem(tokenName).assertIsDisplayed() + applyButton.assertIsEnabled() + } + }.isSuccess + } + } } /** diff --git a/app/src/androidTest/kotlin/com/tangem/screens/AppSettingsPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/AppSettingsPageObject.kt index 240f3470e9..3ad8fbea66 100644 --- a/app/src/androidTest/kotlin/com/tangem/screens/AppSettingsPageObject.kt +++ b/app/src/androidTest/kotlin/com/tangem/screens/AppSettingsPageObject.kt @@ -14,6 +14,10 @@ class AppSettingsPageObject(semanticsProvider: SemanticsNodeInteractionsProvider hasTestTag(AppSettingsScreenTestTags.CURRENCY_BUTTON) useUnmergedTree = true } + + val backButton: KNode = child { + hasTestTag(AppSettingsScreenTestTags.BACK_BUTTON) + } } internal fun BaseTestCase.onAppSettingsScreen(function: AppSettingsPageObject.() -> Unit) = diff --git a/app/src/androidTest/kotlin/com/tangem/screens/DetailsPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/DetailsPageObject.kt index ff937e632d..8e39f04196 100644 --- a/app/src/androidTest/kotlin/com/tangem/screens/DetailsPageObject.kt +++ b/app/src/androidTest/kotlin/com/tangem/screens/DetailsPageObject.kt @@ -14,6 +14,10 @@ import androidx.compose.ui.test.hasText as withText class DetailsPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) : ComposeScreen(semanticsProvider = semanticsProvider) { + val screenContainer: KNode = child { + hasTestTag(DetailsScreenTestTags.SCREEN_CONTAINER) + } + val topAppBarBackButton: KNode = child { hasTestTag(TopAppBarTestTags.CLOSE_BUTTON) } diff --git a/app/src/androidTest/kotlin/com/tangem/tests/AppCurrencyTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/AppCurrencyTest.kt index e484f38fd4..990110ee5d 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/AppCurrencyTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/AppCurrencyTest.kt @@ -59,15 +59,15 @@ class AppCurrencyTest : BaseTestCase() { onAppSettingsScreen { currencyButton.assertIsDisplayed() } } } - step("Return to 'Details' screen") { - waitForIdle() - device.uiDevice.pressBack() + step("Return to 'Details' screen via 'Back' button") { + flakySafely(WAIT_UNTIL_TIMEOUT_LONG) { + onAppSettingsScreen { backButton.clickWithAssertion() } + onDetailsScreen { screenContainer.assertIsDisplayed() } + } } step("Return to 'Main' screen via 'Back' button") { - onDetailsScreen { topAppBarBackButton.clickWithAssertion() } - } - step("Assert 'Main' screen is opened") { flakySafely(WAIT_UNTIL_TIMEOUT_LONG) { + onDetailsScreen { topAppBarBackButton.clickWithAssertion() } onMainScreen { screenContainer.assertIsDisplayed() } } } diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsScreen.kt b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsScreen.kt index a7d5a8890a..57e355faae 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsScreen.kt @@ -31,6 +31,7 @@ internal fun AppSettingsScreen(state: AppSettingsScreenState, onBackClick: () -> modifier = modifier, titleRes = R.string.app_settings_title, addBottomInsets = false, + backButtonTestTag = AppSettingsScreenTestTags.BACK_BUTTON, content = { when (state) { is AppSettingsScreenState.Content -> AppSettings(state = state) diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/common/DetailsComposeElements.kt b/app/src/main/java/com/tangem/tap/features/details/ui/common/DetailsComposeElements.kt index 19afbf0689..6b1b95bed3 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/common/DetailsComposeElements.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/common/DetailsComposeElements.kt @@ -8,6 +8,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.tangem.core.ui.components.PrimaryButtonIconEnd @@ -23,6 +24,7 @@ internal fun SettingsScreensScaffold( @StringRes titleRes: Int? = null, addBottomInsets: Boolean = true, snackbarHostState: SnackbarHostState = remember { SnackbarHostState() }, + backButtonTestTag: String? = null, content: @Composable () -> Unit, fab: @Composable () -> Unit = {}, ) { @@ -35,6 +37,7 @@ internal fun SettingsScreensScaffold( modifier = Modifier.statusBarsPadding(), onBackClick = onBackClick, backgroundColor = backgroundColor, + backButtonTestTag = backButtonTestTag, ) }, modifier = modifier, @@ -91,13 +94,17 @@ internal fun EmptyTopBarWithNavigation( onBackClick: () -> Unit, modifier: Modifier = Modifier, backgroundColor: Color = TangemTheme.colors.background.primary, + backButtonTestTag: String? = null, ) { TopAppBar( modifier = modifier, title = { }, navigationIcon = { - IconButton(onClick = onBackClick) { + IconButton( + onClick = onBackClick, + modifier = if (backButtonTestTag != null) Modifier.testTag(backButtonTestTag) else Modifier, + ) { Icon( painter = painterResource(id = R.drawable.ic_back_24), contentDescription = null, diff --git a/core/ui/src/main/java/com/tangem/core/ui/test/AppSettingsScreenTestTags.kt b/core/ui/src/main/java/com/tangem/core/ui/test/AppSettingsScreenTestTags.kt index c8ed037e0b..4d30428c3d 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/test/AppSettingsScreenTestTags.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/test/AppSettingsScreenTestTags.kt @@ -2,4 +2,5 @@ package com.tangem.core.ui.test object AppSettingsScreenTestTags { const val CURRENCY_BUTTON = "APP_SETTINGS_SCREEN_CURRENCY_BUTTON" + const val BACK_BUTTON = "APP_SETTINGS_SCREEN_BACK_BUTTON" } \ No newline at end of file