diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/home/HomeTestSetup.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/home/HomeTestSetup.kt index a0c97b67..34484f8c 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/home/HomeTestSetup.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/home/HomeTestSetup.kt @@ -58,6 +58,7 @@ class HomeTestSetup( @Composable @Suppress("TestFunctionName") fun DefaultContent() { + val drawerValues = drawerBackHandler() Home( walletSnapshot, transactionHistory = persistentListOf(), @@ -84,6 +85,8 @@ class HomeTestSetup( onSendCount.incrementAndGet() }, resetSdk = {}, + drawerState = drawerValues.drawerState, + scope = drawerValues.scope ) } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/home/integration/HomeActivityTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/home/integration/HomeActivityTest.kt new file mode 100644 index 00000000..8a227ce0 --- /dev/null +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/home/integration/HomeActivityTest.kt @@ -0,0 +1,64 @@ +package co.electriccoin.zcash.ui.screen.home.integration + +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsNotDisplayed +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.performClick +import androidx.test.espresso.Espresso +import androidx.test.filters.MediumTest +import cash.z.ecc.android.sdk.Synchronizer +import cash.z.ecc.android.sdk.model.PercentDecimal +import co.electriccoin.zcash.test.UiTestPrerequisites +import co.electriccoin.zcash.ui.common.UiTestingActivity +import co.electriccoin.zcash.ui.fixture.WalletSnapshotFixture +import co.electriccoin.zcash.ui.screen.home.HomeTag +import co.electriccoin.zcash.ui.screen.home.HomeTestSetup +import co.electriccoin.zcash.ui.screen.home.model.WalletSnapshot +import org.junit.Rule +import org.junit.Test + +class HomeActivityTest : UiTestPrerequisites() { + + @get:Rule + val composeTestRule = createAndroidComposeRule() + + private fun newTestSetup(walletSnapshot: WalletSnapshot) = HomeTestSetup( + composeTestRule, + walletSnapshot, + isShowFiatConversion = false + ) + + @Test + @MediumTest + fun open_close_drawer_menu_test() { + val walletSnapshot = WalletSnapshotFixture.new( + status = Synchronizer.Status.DOWNLOADING, + progress = PercentDecimal(0.5f) + ) + val testSetup = newTestSetup(walletSnapshot) + testSetup.setDefaultContent() + + composeTestRule.onNodeWithTag(HomeTag.DRAWER_MENU).also { + it.assertIsNotDisplayed() + } + composeTestRule.onNodeWithTag(HomeTag.DRAWER_MENU_OPEN_BUTTON).also { + it.assertIsDisplayed() + it.performClick() + } + + composeTestRule.waitForIdle() + + composeTestRule.onNodeWithTag(HomeTag.DRAWER_MENU).also { + it.assertIsDisplayed() + } + + Espresso.pressBack() + + composeTestRule.waitForIdle() + + composeTestRule.onNodeWithTag(HomeTag.DRAWER_MENU).also { + it.assertIsNotDisplayed() + } + } +} diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/AndroidHome.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/AndroidHome.kt index b210bf8b..4fb3d7c6 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/AndroidHome.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/AndroidHome.kt @@ -5,6 +5,7 @@ package co.electriccoin.zcash.ui.screen.home import androidx.activity.ComponentActivity import androidx.activity.compose.BackHandler import androidx.activity.viewModels +import androidx.compose.material3.DrawerState import androidx.compose.material3.DrawerValue import androidx.compose.material3.rememberDrawerState import androidx.compose.runtime.Composable @@ -24,6 +25,7 @@ import co.electriccoin.zcash.ui.screen.home.viewmodel.WalletViewModel import co.electriccoin.zcash.ui.screen.settings.viewmodel.SettingsViewModel import co.electriccoin.zcash.ui.screen.update.AppUpdateCheckerImp import co.electriccoin.zcash.ui.screen.update.model.UpdateState +import kotlinx.coroutines.CoroutineScope @Composable @Suppress("LongParameterList") @@ -89,13 +91,7 @@ internal fun WrapHome( val transactionSnapshot = walletViewModel.transactionSnapshot.collectAsStateWithLifecycle().value - val drawerState = rememberDrawerState(DrawerValue.Closed) - val scope = rememberCoroutineScope() - - // override Android back navigation action to close drawer, if opened - BackHandler(drawerState.isOpen) { - drawerState.closeDrawerMenu(scope) - } + val drawerValues = drawerBackHandler() Home( walletSnapshot, @@ -112,9 +108,31 @@ internal fun WrapHome( goSend = goSend, resetSdk = { walletViewModel.resetSdk() - } + }, + drawerState = drawerValues.drawerState, + scope = drawerValues.scope ) activity.reportFullyDrawn() } } + +/** + * Custom Drawer menu composable with back navigation handling feature, which returns its necessary values. + */ +@Composable +internal fun drawerBackHandler( + drawerState: DrawerState = rememberDrawerState(DrawerValue.Closed), + scope: CoroutineScope = rememberCoroutineScope() +): DrawerValuesWrapper { + // Override Android back navigation action to close drawer, if opened + BackHandler(drawerState.isOpen) { + drawerState.closeDrawerMenu(scope) + } + return DrawerValuesWrapper(drawerState, scope) +} + +internal data class DrawerValuesWrapper( + val drawerState: DrawerState, + val scope: CoroutineScope +) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/HomeTag.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/HomeTag.kt index f8b2303c..3154766f 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/HomeTag.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/HomeTag.kt @@ -8,4 +8,6 @@ object HomeTag { const val PROGRESS = "progress_bar" const val SINGLE_LINE_TEXT = "single_line_text" const val FIAT_CONVERSION = "fiat_conversion" + const val DRAWER_MENU = "drawer_menu" + const val DRAWER_MENU_OPEN_BUTTON = "drawer_menu_open_button" } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/view/HomeView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/view/HomeView.kt index 773b4b98..9476c411 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/view/HomeView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/view/HomeView.kt @@ -95,7 +95,9 @@ fun ComposablePreview() { goAbout = {}, goReceive = {}, goSend = {}, - resetSdk = {} + resetSdk = {}, + drawerState = rememberDrawerState(DrawerValue.Closed), + scope = rememberCoroutineScope() ) } } @@ -118,8 +120,8 @@ fun Home( goReceive: () -> Unit, goSend: () -> Unit, resetSdk: () -> Unit, - drawerState: DrawerState = rememberDrawerState(DrawerValue.Closed), - scope: CoroutineScope = rememberCoroutineScope() + drawerState: DrawerState, + scope: CoroutineScope ) { ModalNavigationDrawer( drawerState = drawerState, @@ -166,7 +168,8 @@ private fun HomeTopAppBar( title = { Text(text = stringResource(id = R.string.app_name)) }, navigationIcon = { IconButton( - onClick = openDrawer + onClick = openDrawer, + modifier = Modifier.testTag(HomeTag.DRAWER_MENU_OPEN_BUTTON) ) { Icon( imageVector = Icons.Filled.Menu, @@ -232,7 +235,9 @@ private fun HomeDrawer( goSupport: () -> Unit, goAbout: () -> Unit, ) { - ModalDrawerSheet { + ModalDrawerSheet( + modifier = Modifier.testTag(HomeTag.DRAWER_MENU) + ) { Spacer(Modifier.height(12.dp)) NavigationDrawerItem( icon = { Icon(Icons.Default.Password, contentDescription = null) },