diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModel.kt index 06f4bb20e..1b8a3d590 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModel.kt @@ -42,7 +42,7 @@ class LoginViewModel @Inject constructor( initialState = savedStateHandle[KEY_STATE] ?: LoginState( emailAddress = LoginArgs(savedStateHandle).emailAddress, - isLoginButtonEnabled = true, + isLoginButtonEnabled = false, passwordInput = "", environmentLabel = environmentRepository.environment.label, loadingDialogState = LoadingDialogState.Hidden, @@ -208,7 +208,12 @@ class LoginViewModel @Inject constructor( } private fun handlePasswordInputChanged(action: LoginAction.PasswordInputChanged) { - mutableStateFlow.update { it.copy(passwordInput = action.input) } + mutableStateFlow.update { + it.copy( + passwordInput = action.input, + isLoginButtonEnabled = action.input.isNotBlank(), + ) + } } } diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt index 3a9250467..5ae120cee 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt @@ -343,17 +343,49 @@ class LoginViewModelTest : BaseViewModelTest() { } @Test - fun `PasswordInputChanged should update password input`() = runTest { - val input = "input" - val viewModel = createViewModel() - viewModel.eventFlow.test { - viewModel.actionChannel.trySend(LoginAction.PasswordInputChanged(input)) - assertEquals( - DEFAULT_STATE.copy(passwordInput = input), - viewModel.stateFlow.value, - ) + fun `PasswordInputChanged should update input and enable button if password is not blank`() = + runTest { + val input = "input" + val viewModel = createViewModel() + viewModel.eventFlow.test { + viewModel.actionChannel.trySend(LoginAction.PasswordInputChanged(input)) + assertEquals( + DEFAULT_STATE.copy( + passwordInput = input, + isLoginButtonEnabled = true, + ), + viewModel.stateFlow.value, + ) + } + } + + @Test + fun `PasswordInputChanged should update input and disable button if password is blank`() = + runTest { + val input = "input" + val viewModel = createViewModel() + viewModel.eventFlow.test { + // set isLoginButtonEnabled to true + viewModel.actionChannel.trySend(LoginAction.PasswordInputChanged(input)) + assertEquals( + DEFAULT_STATE.copy( + passwordInput = input, + isLoginButtonEnabled = true, + ), + viewModel.stateFlow.value, + ) + + // set isLoginButtonEnabled to false + viewModel.actionChannel.trySend(LoginAction.PasswordInputChanged("")) + assertEquals( + DEFAULT_STATE.copy( + passwordInput = "", + isLoginButtonEnabled = false, + ), + viewModel.stateFlow.value, + ) + } } - } @Test fun `captchaTokenFlow success update should trigger a login`() = runTest { @@ -383,7 +415,7 @@ class LoginViewModelTest : BaseViewModelTest() { private val DEFAULT_STATE = LoginState( emailAddress = "test@gmail.com", passwordInput = "", - isLoginButtonEnabled = true, + isLoginButtonEnabled = false, environmentLabel = Environment.Us.label, loadingDialogState = LoadingDialogState.Hidden, errorDialogState = BasicDialogState.Hidden,