Add initial Landing screen & Login nav graph (#19)

This commit is contained in:
Caleb Derosier
2023-08-31 08:41:56 -05:00
committed by GitHub
parent 7f0d09a93b
commit e97659c7c9
8 changed files with 398 additions and 34 deletions

View File

@@ -0,0 +1,46 @@
package com.x8bit.bitwarden.example.ui.feature.landing
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performClick
import com.x8bit.bitwarden.example.ui.BaseComposeTest
import com.x8bit.bitwarden.ui.feature.landing.LandingAction
import com.x8bit.bitwarden.ui.feature.landing.LandingScreen
import com.x8bit.bitwarden.ui.feature.landing.LandingState
import com.x8bit.bitwarden.ui.feature.landing.LandingViewModel
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.emptyFlow
import org.junit.Test
/**
* Example showing that Compose tests using "junit" imports and Robolectric work.
*/
class LandingScreenTest : BaseComposeTest() {
@Test
fun `continue button click should send ContinueButtonClicked action`() {
val viewModel = mockk<LandingViewModel>(relaxed = true) {
every { eventFlow } returns emptyFlow()
every { stateFlow } returns MutableStateFlow(
LandingState(
initialEmailAddress = "",
isContinueButtonEnabled = true,
isRememberMeEnabled = false,
),
)
every { trySendAction(LandingAction.ContinueButtonClick) } returns Unit
}
composeTestRule.setContent {
LandingScreen(
onNavigateToCreateAccount = {},
viewModel = viewModel,
)
}
composeTestRule.onNodeWithTag("Continue button").performClick()
verify {
viewModel.trySendAction(LandingAction.ContinueButtonClick)
}
}
}

View File

@@ -0,0 +1,58 @@
package com.x8bit.bitwarden.example.ui.feature.landing
import app.cash.turbine.test
import com.x8bit.bitwarden.example.ui.BaseViewModelTest
import com.x8bit.bitwarden.ui.feature.landing.LandingAction
import com.x8bit.bitwarden.ui.feature.landing.LandingEvent
import com.x8bit.bitwarden.ui.feature.landing.LandingState
import com.x8bit.bitwarden.ui.feature.landing.LandingViewModel
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
class LandingViewModelTest : BaseViewModelTest() {
@Test
fun `ContinueButtonClick should disable continue button`() = runTest {
val viewModel = LandingViewModel()
viewModel.eventFlow.test {
viewModel.actionChannel.trySend(LandingAction.ContinueButtonClick)
assertEquals(
viewModel.stateFlow.value,
DEFAULT_STATE.copy(isContinueButtonEnabled = false),
)
}
}
@Test
fun `CreateAccountClick should emit NavigateToCreateAccount`() = runTest {
val viewModel = LandingViewModel()
viewModel.eventFlow.test {
viewModel.actionChannel.trySend(LandingAction.CreateAccountClick)
assertEquals(
LandingEvent.NavigateToCreateAccount,
awaitItem(),
)
}
}
@Test
fun `RememberMeToggle should update value of isRememberMeToggled`() = runTest {
val viewModel = LandingViewModel()
viewModel.eventFlow.test {
viewModel.actionChannel.trySend(LandingAction.RememberMeToggle(true))
assertEquals(
viewModel.stateFlow.value,
DEFAULT_STATE.copy(isRememberMeEnabled = true),
)
}
}
companion object {
private val DEFAULT_STATE = LandingState(
initialEmailAddress = "",
isContinueButtonEnabled = true,
isRememberMeEnabled = false,
)
}
}