BIT-202: Adding region selector composable to Landing Screen (#91)

This commit is contained in:
joshua-livefront
2023-10-03 17:37:36 -04:00
committed by GitHub
parent 4f93c3f85e
commit 4e6974deb4
12 changed files with 238 additions and 28 deletions

View File

@@ -28,6 +28,7 @@ class LandingScreenTest : BaseComposeTest() {
emailInput = "",
isContinueButtonEnabled = true,
isRememberMeEnabled = false,
selectedRegion = LandingState.RegionOption.BITWARDEN_US,
),
)
val viewModel = mockk<LandingViewModel>(relaxed = true) {
@@ -37,7 +38,7 @@ class LandingScreenTest : BaseComposeTest() {
composeTestRule.setContent {
LandingScreen(
onNavigateToCreateAccount = {},
onNavigateToLogin = {},
onNavigateToLogin = { _, _ -> },
viewModel = viewModel,
)
}
@@ -57,13 +58,14 @@ class LandingScreenTest : BaseComposeTest() {
emailInput = "",
isContinueButtonEnabled = true,
isRememberMeEnabled = false,
selectedRegion = LandingState.RegionOption.BITWARDEN_US,
),
)
}
composeTestRule.setContent {
LandingScreen(
onNavigateToCreateAccount = {},
onNavigateToLogin = {},
onNavigateToLogin = { _, _ -> },
viewModel = viewModel,
)
}
@@ -82,13 +84,14 @@ class LandingScreenTest : BaseComposeTest() {
emailInput = "",
isContinueButtonEnabled = true,
isRememberMeEnabled = false,
selectedRegion = LandingState.RegionOption.BITWARDEN_US,
),
)
}
composeTestRule.setContent {
LandingScreen(
onNavigateToCreateAccount = {},
onNavigateToLogin = {},
onNavigateToLogin = { _, _ -> },
viewModel = viewModel,
)
}
@@ -111,13 +114,14 @@ class LandingScreenTest : BaseComposeTest() {
emailInput = "",
isContinueButtonEnabled = true,
isRememberMeEnabled = false,
selectedRegion = LandingState.RegionOption.BITWARDEN_US,
),
)
}
composeTestRule.setContent {
LandingScreen(
onNavigateToCreateAccount = {},
onNavigateToLogin = {},
onNavigateToLogin = { _, _ -> },
viewModel = viewModel,
)
}
@@ -137,13 +141,14 @@ class LandingScreenTest : BaseComposeTest() {
emailInput = "",
isContinueButtonEnabled = true,
isRememberMeEnabled = false,
selectedRegion = LandingState.RegionOption.BITWARDEN_US,
),
)
}
composeTestRule.setContent {
LandingScreen(
onNavigateToCreateAccount = {},
onNavigateToLogin = {},
onNavigateToLogin = { _, _ -> },
viewModel = viewModel,
)
}
@@ -163,13 +168,14 @@ class LandingScreenTest : BaseComposeTest() {
emailInput = "",
isContinueButtonEnabled = true,
isRememberMeEnabled = false,
selectedRegion = LandingState.RegionOption.BITWARDEN_US,
),
)
}
composeTestRule.setContent {
LandingScreen(
onNavigateToCreateAccount = { onNavigateToCreateAccountCalled = true },
onNavigateToLogin = {},
onNavigateToLogin = { _, _ -> },
viewModel = viewModel,
)
}
@@ -179,24 +185,69 @@ class LandingScreenTest : BaseComposeTest() {
@Test
fun `NavigateToLogin event should call onNavigateToLogin`() {
val testEmail = "test@test.com"
var onNavigateToLoginEmail = ""
val testRegion = "bitwarden.com"
var capturedEmail: String? = null
var capturedRegion: String? = null
val viewModel = mockk<LandingViewModel>(relaxed = true) {
every { eventFlow } returns flowOf(LandingEvent.NavigateToLogin(testEmail))
every { eventFlow } returns flowOf(LandingEvent.NavigateToLogin(testEmail, testRegion))
every { stateFlow } returns MutableStateFlow(
LandingState(
emailInput = "",
isContinueButtonEnabled = true,
isRememberMeEnabled = false,
selectedRegion = LandingState.RegionOption.BITWARDEN_US,
),
)
}
composeTestRule.setContent {
LandingScreen(
onNavigateToCreateAccount = { },
onNavigateToLogin = { onNavigateToLoginEmail = it },
onNavigateToLogin = { email, region ->
capturedEmail = email
capturedRegion = region
},
viewModel = viewModel,
)
}
assertEquals(testEmail, onNavigateToLoginEmail)
assertEquals(testEmail, capturedEmail)
assertEquals(testRegion, capturedRegion)
}
@Test
fun `selecting region should send RegionOptionSelect action`() {
val selectedRegion = LandingState.RegionOption.BITWARDEN_EU
val viewModel = mockk<LandingViewModel>(relaxed = true) {
every { eventFlow } returns emptyFlow()
every { stateFlow } returns MutableStateFlow(
LandingState(
emailInput = "",
isContinueButtonEnabled = true,
isRememberMeEnabled = false,
selectedRegion = LandingState.RegionOption.BITWARDEN_US,
),
)
}
composeTestRule.setContent {
LandingScreen(
onNavigateToCreateAccount = {},
onNavigateToLogin = { _, _ -> },
viewModel = viewModel,
)
}
// Clicking to open dropdown
composeTestRule.onNodeWithText(LandingState.RegionOption.BITWARDEN_US.label).performClick()
// Clicking item from the dropdown menu
composeTestRule.onNodeWithText(selectedRegion.label).performClick()
verify {
viewModel.trySendAction(LandingAction.RegionOptionSelect(selectedRegion))
}
}
}

View File

@@ -38,7 +38,7 @@ class LandingViewModelTest : BaseViewModelTest() {
viewModel.eventFlow.test {
viewModel.actionChannel.trySend(LandingAction.ContinueButtonClick)
assertEquals(
LandingEvent.NavigateToLogin("input"),
LandingEvent.NavigateToLogin("input", "bitwarden.com"),
awaitItem(),
)
}
@@ -106,11 +106,26 @@ class LandingViewModelTest : BaseViewModelTest() {
}
}
@Test
fun `RegionOptionSelect should update value of selected region`() = runTest {
val inputRegion = LandingState.RegionOption.BITWARDEN_EU
val viewModel = LandingViewModel(SavedStateHandle())
viewModel.stateFlow.test {
awaitItem()
viewModel.trySendAction(LandingAction.RegionOptionSelect(inputRegion))
assertEquals(
DEFAULT_STATE.copy(selectedRegion = LandingState.RegionOption.BITWARDEN_EU),
awaitItem(),
)
}
}
companion object {
private val DEFAULT_STATE = LandingState(
emailInput = "",
isContinueButtonEnabled = false,
isRememberMeEnabled = false,
selectedRegion = LandingState.RegionOption.BITWARDEN_US,
)
}
}

View File

@@ -34,6 +34,7 @@ class LoginScreenTest : BaseComposeTest() {
emailAddress = "",
isLoginButtonEnabled = false,
passwordInput = "",
region = "",
),
)
}
@@ -58,6 +59,7 @@ class LoginScreenTest : BaseComposeTest() {
emailAddress = "",
isLoginButtonEnabled = false,
passwordInput = "",
region = "",
),
)
}
@@ -82,6 +84,7 @@ class LoginScreenTest : BaseComposeTest() {
emailAddress = "",
isLoginButtonEnabled = false,
passwordInput = "",
region = "",
),
)
}
@@ -106,6 +109,7 @@ class LoginScreenTest : BaseComposeTest() {
emailAddress = "",
isLoginButtonEnabled = false,
passwordInput = "",
region = "",
),
)
}
@@ -142,6 +146,7 @@ class LoginScreenTest : BaseComposeTest() {
emailAddress = "",
isLoginButtonEnabled = false,
passwordInput = "",
region = "",
),
)
}
@@ -167,6 +172,7 @@ class LoginScreenTest : BaseComposeTest() {
emailAddress = "",
isLoginButtonEnabled = false,
passwordInput = "",
region = "",
),
)
}
@@ -192,6 +198,7 @@ class LoginScreenTest : BaseComposeTest() {
emailAddress = "",
isLoginButtonEnabled = false,
passwordInput = "",
region = "",
),
)
}

View File

@@ -25,6 +25,7 @@ class LoginViewModelTest : BaseViewModelTest() {
private val savedStateHandle = SavedStateHandle().also {
it["email_address"] = "test@gmail.com"
it["region_label"] = ""
}
@BeforeEach
@@ -262,6 +263,7 @@ class LoginViewModelTest : BaseViewModelTest() {
emailAddress = "test@gmail.com",
passwordInput = "",
isLoginButtonEnabled = true,
region = "",
)
private const val LOGIN_RESULT_PATH =