parent
5fc3974129
commit
c18160356e
|
@ -58,6 +58,7 @@ class HomeTestSetup(
|
||||||
@Composable
|
@Composable
|
||||||
@Suppress("TestFunctionName")
|
@Suppress("TestFunctionName")
|
||||||
fun DefaultContent() {
|
fun DefaultContent() {
|
||||||
|
val drawerValues = drawerBackHandler()
|
||||||
Home(
|
Home(
|
||||||
walletSnapshot,
|
walletSnapshot,
|
||||||
transactionHistory = persistentListOf(),
|
transactionHistory = persistentListOf(),
|
||||||
|
@ -84,6 +85,8 @@ class HomeTestSetup(
|
||||||
onSendCount.incrementAndGet()
|
onSendCount.incrementAndGet()
|
||||||
},
|
},
|
||||||
resetSdk = {},
|
resetSdk = {},
|
||||||
|
drawerState = drawerValues.drawerState,
|
||||||
|
scope = drawerValues.scope
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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<UiTestingActivity>()
|
||||||
|
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,6 +5,7 @@ package co.electriccoin.zcash.ui.screen.home
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.compose.BackHandler
|
import androidx.activity.compose.BackHandler
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
|
import androidx.compose.material3.DrawerState
|
||||||
import androidx.compose.material3.DrawerValue
|
import androidx.compose.material3.DrawerValue
|
||||||
import androidx.compose.material3.rememberDrawerState
|
import androidx.compose.material3.rememberDrawerState
|
||||||
import androidx.compose.runtime.Composable
|
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.settings.viewmodel.SettingsViewModel
|
||||||
import co.electriccoin.zcash.ui.screen.update.AppUpdateCheckerImp
|
import co.electriccoin.zcash.ui.screen.update.AppUpdateCheckerImp
|
||||||
import co.electriccoin.zcash.ui.screen.update.model.UpdateState
|
import co.electriccoin.zcash.ui.screen.update.model.UpdateState
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@Suppress("LongParameterList")
|
@Suppress("LongParameterList")
|
||||||
|
@ -89,13 +91,7 @@ internal fun WrapHome(
|
||||||
|
|
||||||
val transactionSnapshot = walletViewModel.transactionSnapshot.collectAsStateWithLifecycle().value
|
val transactionSnapshot = walletViewModel.transactionSnapshot.collectAsStateWithLifecycle().value
|
||||||
|
|
||||||
val drawerState = rememberDrawerState(DrawerValue.Closed)
|
val drawerValues = drawerBackHandler()
|
||||||
val scope = rememberCoroutineScope()
|
|
||||||
|
|
||||||
// override Android back navigation action to close drawer, if opened
|
|
||||||
BackHandler(drawerState.isOpen) {
|
|
||||||
drawerState.closeDrawerMenu(scope)
|
|
||||||
}
|
|
||||||
|
|
||||||
Home(
|
Home(
|
||||||
walletSnapshot,
|
walletSnapshot,
|
||||||
|
@ -112,9 +108,31 @@ internal fun WrapHome(
|
||||||
goSend = goSend,
|
goSend = goSend,
|
||||||
resetSdk = {
|
resetSdk = {
|
||||||
walletViewModel.resetSdk()
|
walletViewModel.resetSdk()
|
||||||
}
|
},
|
||||||
|
drawerState = drawerValues.drawerState,
|
||||||
|
scope = drawerValues.scope
|
||||||
)
|
)
|
||||||
|
|
||||||
activity.reportFullyDrawn()
|
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
|
||||||
|
)
|
||||||
|
|
|
@ -8,4 +8,6 @@ object HomeTag {
|
||||||
const val PROGRESS = "progress_bar"
|
const val PROGRESS = "progress_bar"
|
||||||
const val SINGLE_LINE_TEXT = "single_line_text"
|
const val SINGLE_LINE_TEXT = "single_line_text"
|
||||||
const val FIAT_CONVERSION = "fiat_conversion"
|
const val FIAT_CONVERSION = "fiat_conversion"
|
||||||
|
const val DRAWER_MENU = "drawer_menu"
|
||||||
|
const val DRAWER_MENU_OPEN_BUTTON = "drawer_menu_open_button"
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,7 +95,9 @@ fun ComposablePreview() {
|
||||||
goAbout = {},
|
goAbout = {},
|
||||||
goReceive = {},
|
goReceive = {},
|
||||||
goSend = {},
|
goSend = {},
|
||||||
resetSdk = {}
|
resetSdk = {},
|
||||||
|
drawerState = rememberDrawerState(DrawerValue.Closed),
|
||||||
|
scope = rememberCoroutineScope()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,8 +120,8 @@ fun Home(
|
||||||
goReceive: () -> Unit,
|
goReceive: () -> Unit,
|
||||||
goSend: () -> Unit,
|
goSend: () -> Unit,
|
||||||
resetSdk: () -> Unit,
|
resetSdk: () -> Unit,
|
||||||
drawerState: DrawerState = rememberDrawerState(DrawerValue.Closed),
|
drawerState: DrawerState,
|
||||||
scope: CoroutineScope = rememberCoroutineScope()
|
scope: CoroutineScope
|
||||||
) {
|
) {
|
||||||
ModalNavigationDrawer(
|
ModalNavigationDrawer(
|
||||||
drawerState = drawerState,
|
drawerState = drawerState,
|
||||||
|
@ -166,7 +168,8 @@ private fun HomeTopAppBar(
|
||||||
title = { Text(text = stringResource(id = R.string.app_name)) },
|
title = { Text(text = stringResource(id = R.string.app_name)) },
|
||||||
navigationIcon = {
|
navigationIcon = {
|
||||||
IconButton(
|
IconButton(
|
||||||
onClick = openDrawer
|
onClick = openDrawer,
|
||||||
|
modifier = Modifier.testTag(HomeTag.DRAWER_MENU_OPEN_BUTTON)
|
||||||
) {
|
) {
|
||||||
Icon(
|
Icon(
|
||||||
imageVector = Icons.Filled.Menu,
|
imageVector = Icons.Filled.Menu,
|
||||||
|
@ -232,7 +235,9 @@ private fun HomeDrawer(
|
||||||
goSupport: () -> Unit,
|
goSupport: () -> Unit,
|
||||||
goAbout: () -> Unit,
|
goAbout: () -> Unit,
|
||||||
) {
|
) {
|
||||||
ModalDrawerSheet {
|
ModalDrawerSheet(
|
||||||
|
modifier = Modifier.testTag(HomeTag.DRAWER_MENU)
|
||||||
|
) {
|
||||||
Spacer(Modifier.height(12.dp))
|
Spacer(Modifier.height(12.dp))
|
||||||
NavigationDrawerItem(
|
NavigationDrawerItem(
|
||||||
icon = { Icon(Icons.Default.Password, contentDescription = null) },
|
icon = { Icon(Icons.Default.Password, contentDescription = null) },
|
||||||
|
|
Loading…
Reference in New Issue