BIT-553: Apply design reskin on current LoginScreen (#90)

This commit is contained in:
Brian Yencho
2023-10-03 15:44:58 -05:00
committed by GitHub
parent ab891bd733
commit 4f93c3f85e
10 changed files with 481 additions and 62 deletions

View File

@@ -1,8 +1,16 @@
package com.x8bit.bitwarden.ui.auth.feature.login
import android.content.Intent
import androidx.compose.ui.test.assertCountEquals
import androidx.compose.ui.test.filter
import androidx.compose.ui.test.filterToOne
import androidx.compose.ui.test.hasAnyAncestor
import androidx.compose.ui.test.isPopup
import androidx.compose.ui.test.onAllNodesWithText
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import androidx.compose.ui.test.performTextInput
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.util.IntentHandler
@@ -17,6 +25,30 @@ import org.junit.Test
class LoginScreenTest : BaseComposeTest() {
@Test
fun `close button click should send CloseButtonClick action`() {
val viewModel = mockk<LoginViewModel>(relaxed = true) {
every { eventFlow } returns emptyFlow()
every { stateFlow } returns MutableStateFlow(
LoginState(
emailAddress = "",
isLoginButtonEnabled = false,
passwordInput = "",
),
)
}
composeTestRule.setContent {
LoginScreen(
onNavigateBack = {},
viewModel = viewModel,
)
}
composeTestRule.onNodeWithContentDescription("Close").performClick()
verify {
viewModel.trySendAction(LoginAction.CloseButtonClick)
}
}
@Test
fun `Not you text click should send NotYouButtonClick action`() {
val viewModel = mockk<LoginViewModel>(relaxed = true) {
@@ -35,12 +67,71 @@ class LoginScreenTest : BaseComposeTest() {
viewModel = viewModel,
)
}
composeTestRule.onNodeWithText("Not you?").performClick()
composeTestRule.onNodeWithText("Not you?").performScrollTo().performClick()
verify {
viewModel.trySendAction(LoginAction.NotYouButtonClick)
}
}
@Test
fun `master password hint text click should send MasterPasswordHintClick action`() {
val viewModel = mockk<LoginViewModel>(relaxed = true) {
every { eventFlow } returns emptyFlow()
every { stateFlow } returns MutableStateFlow(
LoginState(
emailAddress = "",
isLoginButtonEnabled = false,
passwordInput = "",
),
)
}
composeTestRule.setContent {
LoginScreen(
onNavigateBack = {},
viewModel = viewModel,
)
}
composeTestRule.onNodeWithText("Get your master password hint").performClick()
verify {
viewModel.trySendAction(LoginAction.MasterPasswordHintClick)
}
}
@Test
fun `master password hint option menu click should send MasterPasswordHintClick action`() {
val viewModel = mockk<LoginViewModel>(relaxed = true) {
every { eventFlow } returns emptyFlow()
every { stateFlow } returns MutableStateFlow(
LoginState(
emailAddress = "",
isLoginButtonEnabled = false,
passwordInput = "",
),
)
}
composeTestRule.setContent {
LoginScreen(
onNavigateBack = {},
viewModel = viewModel,
)
}
// Confirm dropdown version of item is absent
composeTestRule
.onAllNodesWithText("Get your master password hint")
.filter(hasAnyAncestor(isPopup()))
.assertCountEquals(0)
// Open the overflow menu
composeTestRule.onNodeWithContentDescription("More").performClick()
// Click on the password hint item in the dropdown
composeTestRule
.onAllNodesWithText("Get your master password hint")
.filterToOne(hasAnyAncestor(isPopup()))
.performClick()
verify {
viewModel.trySendAction(LoginAction.MasterPasswordHintClick)
}
}
@Test
fun `password input change should send PasswordInputChanged action`() {
val input = "input"

View File

@@ -73,6 +73,23 @@ class LoginViewModelTest : BaseViewModelTest() {
}
}
@Test
fun `CloseButtonClick should emit NavigateBack`() = runTest {
val viewModel = LoginViewModel(
authRepository = mockk {
every { captchaTokenResultFlow } returns flowOf()
},
savedStateHandle = savedStateHandle,
)
viewModel.eventFlow.test {
viewModel.actionChannel.trySend(LoginAction.CloseButtonClick)
assertEquals(
LoginEvent.NavigateBack,
awaitItem(),
)
}
}
@Test
fun `LoginButtonClick login returns error should do nothing`() = runTest {
// TODO: handle and display errors (BIT-320)
@@ -147,7 +164,25 @@ class LoginViewModelTest : BaseViewModelTest() {
}
@Test
fun `SingleSignOnClick should do nothing`() = runTest {
fun `MasterPasswordHintClick should emit ShowToast`() = runTest {
val viewModel = LoginViewModel(
authRepository = mockk {
every { captchaTokenResultFlow } returns flowOf()
},
savedStateHandle = savedStateHandle,
)
viewModel.eventFlow.test {
viewModel.actionChannel.trySend(LoginAction.MasterPasswordHintClick)
assertEquals(DEFAULT_STATE, viewModel.stateFlow.value)
assertEquals(
LoginEvent.ShowToast("Not yet implemented."),
awaitItem(),
)
}
}
@Test
fun `SingleSignOnClick should emit ShowToast`() = runTest {
val viewModel = LoginViewModel(
authRepository = mockk {
every { captchaTokenResultFlow } returns flowOf()
@@ -157,6 +192,10 @@ class LoginViewModelTest : BaseViewModelTest() {
viewModel.eventFlow.test {
viewModel.actionChannel.trySend(LoginAction.SingleSignOnClick)
assertEquals(DEFAULT_STATE, viewModel.stateFlow.value)
assertEquals(
LoginEvent.ShowToast("Not yet implemented."),
awaitItem(),
)
}
}