From 20682ca353556a03e3299a02fc726cf6b8a65dbd Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 24 Oct 2025 12:44:09 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/scenarios/ReceiveScenarios.kt | 41 +++ .../OperationIsUnavailableDialogPageObject.kt | 30 +++ .../SwapIsNotSupportedDialogPageObject.kt | 35 +++ .../tangem/screens/TokenDetailsPageObject.kt | 14 +- .../kotlin/com/tangem/tests/BlockchainTest.kt | 2 +- .../kotlin/com/tangem/tests/FeedbackTest.kt | 2 +- .../kotlin/com/tangem/tests/SwapTokenTest.kt | 6 +- .../MainScreenActionButtonsTest.kt | 46 +--- .../TokenDetailsScreenActionButtonsTest.kt | 255 ++++++++++++++++++ .../ui/components/buttons/actions/Actions.kt | 9 + 10 files changed, 393 insertions(+), 47 deletions(-) create mode 100644 app/src/androidTest/kotlin/com/tangem/scenarios/ReceiveScenarios.kt create mode 100644 app/src/androidTest/kotlin/com/tangem/screens/OperationIsUnavailableDialogPageObject.kt create mode 100644 app/src/androidTest/kotlin/com/tangem/screens/SwapIsNotSupportedDialogPageObject.kt create mode 100644 app/src/androidTest/kotlin/com/tangem/tests/actionButtons/TokenDetailsScreenActionButtonsTest.kt diff --git a/app/src/androidTest/kotlin/com/tangem/scenarios/ReceiveScenarios.kt b/app/src/androidTest/kotlin/com/tangem/scenarios/ReceiveScenarios.kt new file mode 100644 index 0000000000..57aff3cecc --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/scenarios/ReceiveScenarios.kt @@ -0,0 +1,41 @@ +package com.tangem.scenarios + +import com.tangem.common.BaseTestCase +import com.tangem.common.extensions.clickWithAssertion +import com.tangem.screens.onReceiveAssetsBottomSheet +import com.tangem.screens.onTokenReceiveQrCodeBottomSheet +import com.tangem.screens.onTokenReceiveWarningBottomSheet +import io.qameta.allure.kotlin.Allure.step + +fun BaseTestCase.goToQrCodeBottomSheet() { + step("Assert 'Token receive warning' bottom sheet is displayed") { + onTokenReceiveWarningBottomSheet { bottomSheet.assertIsDisplayed() } + } + step("Click on 'Got it' button") { + onTokenReceiveWarningBottomSheet { gotItButton.performClick() } + } + step("Click on 'Show QR code' button") { + onReceiveAssetsBottomSheet { showQrCodeButton.clickWithAssertion() } + } +} + +fun BaseTestCase.checkQrCodeBottomSheetScenario() { + step("Assert bottom sheet with QR code title is displayed") { + onTokenReceiveQrCodeBottomSheet { title.assertIsDisplayed() } + } + step("Assert QR code is displayed") { + onTokenReceiveQrCodeBottomSheet { qrCode.assertIsDisplayed() } + } + step("Assert address title is displayed") { + onTokenReceiveQrCodeBottomSheet { addressTitle.assertIsDisplayed() } + } + step("Assert address is displayed") { + onTokenReceiveQrCodeBottomSheet { address.assertIsDisplayed() } + } + step("Assert 'Copy' button is displayed") { + onTokenReceiveQrCodeBottomSheet { copyButton.assertIsDisplayed() } + } + step("Assert 'Share' button is displayed") { + onTokenReceiveQrCodeBottomSheet { shareButton.assertIsDisplayed() } + } +} diff --git a/app/src/androidTest/kotlin/com/tangem/screens/OperationIsUnavailableDialogPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/OperationIsUnavailableDialogPageObject.kt new file mode 100644 index 0000000000..b4e9fd6f91 --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/screens/OperationIsUnavailableDialogPageObject.kt @@ -0,0 +1,30 @@ +package com.tangem.screens + +import androidx.compose.ui.test.SemanticsNodeInteractionsProvider +import com.tangem.common.BaseTestCase +import com.tangem.core.ui.R +import com.tangem.core.ui.test.BaseButtonTestTags +import com.tangem.core.ui.test.BaseDialogTestTags +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.common.ui.R as CommonUIR + +class OperationIsUnavailableDialogPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) : + ComposeScreen(semanticsProvider = semanticsProvider) { + + val text: KNode = child { + hasTestTag(BaseDialogTestTags.TEXT) + hasText(getResourceString(CommonUIR.string.token_button_unavailability_generic_description)) + useUnmergedTree = true + } + + val okButton: KNode = child { + hasTestTag(BaseButtonTestTags.BUTTON) + hasText(getResourceString(R.string.common_ok)) + } +} + +internal fun BaseTestCase.onOperationIsUnavailableDialog(function: OperationIsUnavailableDialogPageObject.() -> Unit) = + onComposeScreen(composeTestRule, function) \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/SwapIsNotSupportedDialogPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/SwapIsNotSupportedDialogPageObject.kt new file mode 100644 index 0000000000..2f897e61fd --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/screens/SwapIsNotSupportedDialogPageObject.kt @@ -0,0 +1,35 @@ +package com.tangem.screens + +import androidx.compose.ui.test.SemanticsNodeInteractionsProvider +import com.tangem.common.BaseTestCase +import com.tangem.core.ui.R +import com.tangem.core.ui.test.BaseButtonTestTags +import com.tangem.core.ui.test.BaseDialogTestTags +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.common.ui.R as CommonUIR + +class SwapIsNotSupportedDialogPageObject(semanticsProvider: SemanticsNodeInteractionsProvider) : + ComposeScreen(semanticsProvider = semanticsProvider) { + + fun text(currencyName: String): KNode = child { + hasTestTag(BaseDialogTestTags.TEXT) + hasText( + getResourceString( + CommonUIR.string.token_button_unavailability_reason_not_exchangeable, + currencyName + ) + ) + useUnmergedTree = true + } + + val okButton: KNode = child { + hasTestTag(BaseButtonTestTags.BUTTON) + hasText(getResourceString(R.string.common_ok)) + } +} + +internal fun BaseTestCase.onSwapIsNotSupportedDialog(function: SwapIsNotSupportedDialogPageObject.() -> Unit) = + onComposeScreen(composeTestRule, function) \ No newline at end of file diff --git a/app/src/androidTest/kotlin/com/tangem/screens/TokenDetailsPageObject.kt b/app/src/androidTest/kotlin/com/tangem/screens/TokenDetailsPageObject.kt index 1c3fa1fbb1..dff98cfcee 100644 --- a/app/src/androidTest/kotlin/com/tangem/screens/TokenDetailsPageObject.kt +++ b/app/src/androidTest/kotlin/com/tangem/screens/TokenDetailsPageObject.kt @@ -97,25 +97,31 @@ class TokenDetailsPageObject(semanticsProvider: SemanticsNodeInteractionsProvide ) @OptIn(ExperimentalTestApi::class) - val swapButton: LazyListItemNode = horizontalActionChips.childWith { + fun receiveButton(): LazyListItemNode = horizontalActionChips.childWith { + hasTestTag(BaseActionButtonsBlockTestTags.ACTION_BUTTON) + hasText(getResourceString(R.string.common_receive)) + } + + @OptIn(ExperimentalTestApi::class) + fun swapButton(): LazyListItemNode = horizontalActionChips.childWith { hasTestTag(BaseActionButtonsBlockTestTags.ACTION_BUTTON) hasText(getResourceString(R.string.common_swap)) } @OptIn(ExperimentalTestApi::class) - val sellButton: LazyListItemNode = horizontalActionChips.childWith { + fun sellButton(): LazyListItemNode = horizontalActionChips.childWith { hasTestTag(BaseActionButtonsBlockTestTags.ACTION_BUTTON) hasText(getResourceString(R.string.common_sell)) } @OptIn(ExperimentalTestApi::class) - val buyButton: LazyListItemNode = horizontalActionChips.childWith { + fun buyButton(): LazyListItemNode = horizontalActionChips.childWith { hasTestTag(BaseActionButtonsBlockTestTags.ACTION_BUTTON) hasText(getResourceString(R.string.common_buy)) } @OptIn(ExperimentalTestApi::class) - val sendButton: LazyListItemNode = horizontalActionChips.childWith { + fun sendButton(): LazyListItemNode = horizontalActionChips.childWith { hasTestTag(BaseActionButtonsBlockTestTags.ACTION_BUTTON) hasText(getResourceString(R.string.common_send)) } diff --git a/app/src/androidTest/kotlin/com/tangem/tests/BlockchainTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/BlockchainTest.kt index 4a78ce56a9..d705db7b8b 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/BlockchainTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/BlockchainTest.kt @@ -55,7 +55,7 @@ class BlockchainTest : BaseTestCase() { onMainScreen { tokenWithTitleAndAddress(tokenName).clickWithAssertion() } } step("Click on 'Send' button") { - onTokenDetailsScreen { sendButton.performClick() } + onTokenDetailsScreen { sendButton().performClick() } } step("Type '$errorSendAmount' in input text field") { onSendScreen { diff --git a/app/src/androidTest/kotlin/com/tangem/tests/FeedbackTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/FeedbackTest.kt index 210063dedb..aad0dd2377 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/FeedbackTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/FeedbackTest.kt @@ -73,7 +73,7 @@ class FeedbackTest : BaseTestCase() { onMainScreen { tokenWithTitleAndAddress(tokenName).clickWithAssertion() } } step("Click 'Send' button") { - onTokenDetailsScreen { sendButton.performClick() } + onTokenDetailsScreen { sendButton().performClick() } } step("Type '$sendAmount' in input text field") { onSendScreen { diff --git a/app/src/androidTest/kotlin/com/tangem/tests/SwapTokenTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/SwapTokenTest.kt index 014b42a242..d237730598 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/SwapTokenTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/SwapTokenTest.kt @@ -47,7 +47,7 @@ class SwapTokenTest : BaseTestCase() { onTokenDetailsScreen { title.assertIsDisplayed() } } step("Click on 'Swap' button") { - onTokenDetailsScreen { swapButton.performClick() } + onTokenDetailsScreen { swapButton().performClick() } } step("Close 'Stories' screen") { onSwapStoriesScreen { closeButton.clickWithAssertion() } @@ -131,7 +131,7 @@ class SwapTokenTest : BaseTestCase() { disableMobileData() } step("Click on 'Swap' button") { - onTokenDetailsScreen { swapButton.performClick() } + onTokenDetailsScreen { swapButton().performClick() } } step("Close 'Stories' screen") { onSwapStoriesScreen { closeButton.clickWithAssertion() } @@ -175,7 +175,7 @@ class SwapTokenTest : BaseTestCase() { onTokenDetailsScreen { title.assertIsDisplayed() } } step("Click on 'Swap' button") { - onTokenDetailsScreen { swapButton.performClick() } + onTokenDetailsScreen { swapButton().performClick() } } step("Close 'Stories' screen") { onSwapStoriesScreen { closeButton.clickWithAssertion() } diff --git a/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/MainScreenActionButtonsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/MainScreenActionButtonsTest.kt index 927bbf228a..f206d38d05 100644 --- a/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/MainScreenActionButtonsTest.kt +++ b/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/MainScreenActionButtonsTest.kt @@ -6,14 +6,8 @@ import com.tangem.common.constants.TestConstants.BITCOIN_ADDRESS import com.tangem.common.constants.TestConstants.WAIT_UNTIL_TIMEOUT import com.tangem.common.extensions.clickWithAssertion import com.tangem.common.extensions.* -import com.tangem.common.utils.assertClipboardTextEquals -import com.tangem.common.utils.clearClipboard -import com.tangem.common.utils.resetWireMockScenarioState -import com.tangem.common.utils.setWireMockScenarioState -import com.tangem.scenarios.assertActionButtonsForMultiCurrencyWallet -import com.tangem.scenarios.checkActionIsUnavailableDialog -import com.tangem.scenarios.openMainScreen -import com.tangem.scenarios.synchronizeAddresses +import com.tangem.common.utils.* +import com.tangem.scenarios.* import com.tangem.screens.* import com.tangem.tap.domain.sdk.mocks.MockContent import com.tangem.tap.domain.sdk.mocks.content.TwinsMockContent @@ -288,37 +282,13 @@ class MainScreenActionButtonsTest : BaseTestCase() { step("Click on 'Receive' button") { onTokenActionsBottomSheet { receiveButton.performClick() } } - step("Assert 'Token receive warning' bottom sheet is displayed") { - waitForIdle() + step("Go to QR code bottom sheet") { flakySafely(WAIT_UNTIL_TIMEOUT) { - onTokenReceiveWarningBottomSheet { - bottomSheet.assertIsDisplayed() - } + goToQrCodeBottomSheet() } } - step("Click on 'Got it' button") { - onTokenReceiveWarningBottomSheet { gotItButton.performClick() } - } - step("Click on 'Show QR code' button") { - onReceiveAssetsBottomSheet { showQrCodeButton.clickWithAssertion() } - } - step("Assert bottom sheet with QR code title is displayed") { - onTokenReceiveQrCodeBottomSheet { title.assertIsDisplayed() } - } - step("Assert QR code is displayed") { - onTokenReceiveQrCodeBottomSheet { qrCode.assertIsDisplayed() } - } - step("Assert address title is displayed") { - onTokenReceiveQrCodeBottomSheet { addressTitle.assertIsDisplayed() } - } - step("Assert address is displayed") { - onTokenReceiveQrCodeBottomSheet { address.assertIsDisplayed() } - } - step("Assert 'Copy' button is displayed") { - onTokenReceiveQrCodeBottomSheet { copyButton.assertIsDisplayed() } - } - step("Assert 'Share' button is displayed") { - onTokenReceiveQrCodeBottomSheet { shareButton.assertIsDisplayed() } + step("Check QR code bottom sheet") { + checkQrCodeBottomSheetScenario() } } } @@ -349,10 +319,10 @@ class MainScreenActionButtonsTest : BaseTestCase() { } } } - step("Assert 'Receive' button is displayed") { + step("Assert 'Sell' button is displayed") { onTokenActionsBottomSheet { sellButton.assertIsDisplayed() } } - step("Click on 'Receive' button") { + step("Click on 'Sell' button") { onTokenActionsBottomSheet { sellButton.performClick() } } step("Assert Chrome Browser is opened") { diff --git a/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/TokenDetailsScreenActionButtonsTest.kt b/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/TokenDetailsScreenActionButtonsTest.kt new file mode 100644 index 0000000000..a531a3cc1a --- /dev/null +++ b/app/src/androidTest/kotlin/com/tangem/tests/actionButtons/TokenDetailsScreenActionButtonsTest.kt @@ -0,0 +1,255 @@ +package com.tangem.tests.actionButtons + +import com.tangem.common.BaseTestCase +import com.tangem.common.constants.TestConstants.WAIT_UNTIL_TIMEOUT +import com.tangem.common.extensions.SwipeDirection +import com.tangem.common.extensions.clickWithAssertion +import com.tangem.common.extensions.swipeVertical +import com.tangem.common.utils.resetWireMockScenarioState +import com.tangem.common.utils.setWireMockScenarioState +import com.tangem.scenarios.checkQrCodeBottomSheetScenario +import com.tangem.scenarios.goToQrCodeBottomSheet +import com.tangem.scenarios.openMainScreen +import com.tangem.scenarios.synchronizeAddresses +import com.tangem.screens.* +import com.tangem.screens.onMainScreen +import com.tangem.screens.onSwapStoriesScreen +import com.tangem.screens.onSwapTokenScreen +import com.tangem.screens.onTokenDetailsScreen +import dagger.hilt.android.testing.HiltAndroidTest +import io.qameta.allure.kotlin.AllureId +import io.qameta.allure.kotlin.junit4.DisplayName +import org.junit.Test + +@HiltAndroidTest +class TokenDetailsScreenActionButtonsTest : BaseTestCase() { + + @AllureId("594") + @DisplayName("Action buttons (token details screen): validate UI") + @Test + fun actionButtonsValidateUiTest() { + val tokenTitle = "Bitcoin" + + setupHooks().run { + step("Open 'Main Screen'") { + openMainScreen() + } + step("Synchronize addresses") { + synchronizeAddresses() + } + step("Click on token with name: '$tokenTitle'") { + waitForIdle() + onMainScreen { tokenWithTitleAndAddress(tokenTitle).performClick() } + } + step("Assert 'Receive' button is displayed") { + onTokenDetailsScreen { receiveButton().assertIsDisplayed() } + } + step("Assert 'Buy' button is displayed") { + onTokenDetailsScreen { buyButton().assertIsDisplayed() } + } + step("Assert 'Send' button is displayed") { + onTokenDetailsScreen { sendButton().assertIsDisplayed() } + } + step("Assert 'Swap' button is displayed") { + onTokenDetailsScreen { swapButton().assertIsDisplayed() } + } + step("Assert 'Sell' button is displayed") { + onTokenDetailsScreen { sellButton().assertIsDisplayed() } + } + } + } + + @AllureId("593") + @DisplayName("Action buttons (token details screen): check buttons state") + @Test + fun checkActionButtonsStateTest() { + val tokenTitle = "Bitcoin" + val actionButtonIsNotDimmed = "Action button is not dimmed" + val actionButtonIsDimmed = "Action button is dimmed" + + setupHooks().run { + step("Open 'Main Screen'") { + openMainScreen() + } + step("Synchronize addresses") { + synchronizeAddresses() + } + step("Click on token with name: '$tokenTitle'") { + waitForIdle() + onMainScreen { tokenWithTitleAndAddress(tokenTitle).performClick() } + } + step("Assert 'Receive' button is not dimmed") { + onTokenDetailsScreen { receiveButton().assertContentDescriptionEquals(actionButtonIsNotDimmed) } + } + step("Assert 'Buy' button is not dimmed") { + onTokenDetailsScreen { buyButton().assertContentDescriptionEquals(actionButtonIsNotDimmed) } + } + step("Assert 'Send' button is dimmed") { + onTokenDetailsScreen { sendButton().assertContentDescriptionEquals(actionButtonIsDimmed) } + } + step("Assert 'Swap' button is dimmed") { + onTokenDetailsScreen { swapButton().assertContentDescriptionEquals(actionButtonIsDimmed) } + } + step("Assert 'Sell' button is dimmed") { + onTokenDetailsScreen { sellButton().assertContentDescriptionEquals(actionButtonIsDimmed) } + } + } + } + + @AllureId("4459") + @DisplayName("Action buttons (token details screen): check 'Swap' button (success)") + @Test + fun checkSwapButtonSuccessTest() { + val tokenTitle = "Ethereum" + val tokenSymbol = "ETH" + + setupHooks().run { + step("Open 'Main Screen'") { + openMainScreen() + } + step("Synchronize addresses") { + synchronizeAddresses() + } + step("Click on token with name: '$tokenTitle'") { + waitForIdle() + onMainScreen { tokenWithTitleAndAddress(tokenTitle).performClick() } + } + step("Click on 'Swap' button") { + onTokenDetailsScreen { swapButton().performClick() } + } + step("Close 'Stories' screen") { + onSwapStoriesScreen { closeButton.clickWithAssertion() } + } + step("Assert 'Swap' screen title is displayed") { + onSwapTokenScreen { title.assertIsDisplayed() } + } + step("Assert token symbol: '$tokenSymbol' is displayed") { + onSwapTokenScreen { tokenSymbol(tokenSymbol).assertIsDisplayed() } + } + } + } + + @AllureId("4460") + @DisplayName("Action buttons (token details screen): check 'Swap' button (provider error)") + @Test + fun checkSwapButtonProviderErrorTest() { + val tokenTitle = "POL (ex-MATIC)" + val actionButtonIsDimmed = "Action button is dimmed" + + setupHooks().run { + step("Open 'Main Screen'") { + openMainScreen() + } + step("Synchronize addresses") { + synchronizeAddresses() + } + step("Swipe up") { + swipeVertical(SwipeDirection.UP) + } + step("Click on token with name: '$tokenTitle'") { + waitForIdle() + onMainScreen { tokenWithTitleAndAddress(tokenTitle).performClick() } + } + step("Assert 'Swap' button is dimmed") { + onTokenDetailsScreen { swapButton().assertContentDescriptionEquals(actionButtonIsDimmed) } + } + step("Click on 'Swap' button") { + onTokenDetailsScreen { swapButton().performClick() } + } + step("Assert swapping $tokenTitle is not supported dialog text is displayed") { + onSwapIsNotSupportedDialog { text(tokenTitle).assertIsDisplayed() } + } + step("Assert 'Ok' button is displayed") { + onSwapIsNotSupportedDialog { okButton.assertIsDisplayed() } + } + step("Click on 'Ok' button") { + onSwapIsNotSupportedDialog { okButton.performClick() } + } + step("Assert 'Swap' button is dimmed") { + onTokenDetailsScreen { swapButton().assertContentDescriptionEquals(actionButtonIsDimmed) } + } + } + } + + @AllureId("4461") + @DisplayName("Action buttons (token details screen): check 'Swap' button (Express error)") + @Test + fun checkSwapButtonExpressErrorTest() { + val tokenTitle = "Polygon" + val actionButtonIsDimmed = "Action button is dimmed" + val scenarioName = "express_api_assets" + val scenarioState = "Error" + + setupHooks( + additionalAfterSection = { + resetWireMockScenarioState(scenarioName) + } + ).run { + step("Set WireMock scenario: '$scenarioName' to state: '$scenarioState'") { + setWireMockScenarioState(scenarioName, scenarioState) + } + step("Open 'Main Screen'") { + openMainScreen() + } + step("Synchronize addresses") { + synchronizeAddresses() + } + step("Swipe up") { + swipeVertical(SwipeDirection.UP) + } + step("Click on token with name: '$tokenTitle'") { + waitForIdle() + onMainScreen { tokenWithTitleAndAddress(tokenTitle).performClick() } + } + step("Assert 'Swap' button is dimmed") { + onTokenDetailsScreen { swapButton().assertContentDescriptionEquals(actionButtonIsDimmed) } + } + step("Click on 'Swap' button") { + onTokenDetailsScreen { swapButton().performClick() } + } + step("Assert operation is unavailable dialog text is displayed") { + onOperationIsUnavailableDialog { text.assertIsDisplayed() } + } + step("Assert 'Ok' button is displayed") { + onOperationIsUnavailableDialog { okButton.assertIsDisplayed() } + } + step("Click on 'Ok' button") { + onOperationIsUnavailableDialog { okButton.performClick() } + } + step("Assert 'Swap' button is dimmed") { + onTokenDetailsScreen { swapButton().assertContentDescriptionEquals(actionButtonIsDimmed) } + } + } + } + + @AllureId("3590") + @DisplayName("Action buttons (token details screen): validate UI") + @Test + fun checkReceiveButtonTest() { + val tokenTitle = "Bitcoin" + + setupHooks().run { + step("Open 'Main Screen'") { + openMainScreen() + } + step("Synchronize addresses") { + synchronizeAddresses() + } + step("Click on token with name: '$tokenTitle'") { + waitForIdle() + onMainScreen { tokenWithTitleAndAddress(tokenTitle).performClick() } + } + step("Assert 'Receive' button is displayed") { + onTokenDetailsScreen { receiveButton().performClick() } + } + step("Go to QR code bottom sheet") { + flakySafely(WAIT_UNTIL_TIMEOUT) { + goToQrCodeBottomSheet() + } + } + step("Check QR code bottom sheet") { + checkQrCodeBottomSheetScenario() + } + } + } +} \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/buttons/actions/Actions.kt b/core/ui/src/main/java/com/tangem/core/ui/components/buttons/actions/Actions.kt index 8a639e82bf..ef86d84493 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/buttons/actions/Actions.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/buttons/actions/Actions.kt @@ -22,6 +22,8 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter @@ -133,6 +135,13 @@ fun ActionBaseButton( } } .clip(shape) + .semantics { + contentDescription = if (config.shouldDimContent) { + "Action button is dimmed" + } else { + "Action button is not dimmed" + } + } .combinedClickable( enabled = config.isEnabled, onClick = config.onClick,