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 76899b967..15526b993 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 @@ -89,6 +89,11 @@ class LoginViewModel @Inject constructor( private fun attemptLogin(captchaToken: String?) { viewModelScope.launch { // TODO: show progress here BIT-320 + sendEvent( + event = LoginEvent.ShowToast( + message = "Loading...", + ), + ) val result = authRepository.login( email = mutableStateFlow.value.emailAddress, password = mutableStateFlow.value.passwordInput, @@ -96,7 +101,13 @@ class LoginViewModel @Inject constructor( ) when (result) { // TODO: show an error here BIT-320 - LoginResult.Error -> Unit + LoginResult.Error -> { + sendEvent( + event = LoginEvent.ShowToast( + message = "Error when logging in", + ), + ) + } // No action required on success, root nav will navigate to logged in state LoginResult.Success -> Unit is LoginResult.CaptchaRequired -> { 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 004f0e4c1..2009b2e6b 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 @@ -92,7 +92,7 @@ class LoginViewModelTest : BaseViewModelTest() { } @Test - fun `LoginButtonClick login returns error should do nothing`() = runTest { + fun `LoginButtonClick login returns error should emit error ShowToast`() = runTest { // TODO: handle and display errors (BIT-320) val authRepository = mockk<AuthRepository> { coEvery { @@ -111,6 +111,11 @@ class LoginViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { viewModel.actionChannel.trySend(LoginAction.LoginButtonClick) assertEquals(DEFAULT_STATE, viewModel.stateFlow.value) + assertEquals(LoginEvent.ShowToast("Loading..."), awaitItem()) + assertEquals( + LoginEvent.ShowToast("Error when logging in"), + awaitItem(), + ) } coVerify { authRepository.login(email = "test@gmail.com", password = "", captchaToken = null) @@ -118,7 +123,7 @@ class LoginViewModelTest : BaseViewModelTest() { } @Test - fun `LoginButtonClick login returns success should do nothing`() = runTest { + fun `LoginButtonClick login returns success should emit loading ShowToast`() = runTest { val authRepository = mockk<AuthRepository> { coEvery { login("test@gmail.com", "", captchaToken = null) } returns LoginResult.Success every { captchaTokenResultFlow } returns flowOf() @@ -130,6 +135,7 @@ class LoginViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { viewModel.actionChannel.trySend(LoginAction.LoginButtonClick) assertEquals(DEFAULT_STATE, viewModel.stateFlow.value) + assertEquals(LoginEvent.ShowToast("Loading..."), awaitItem()) } coVerify { authRepository.login(email = "test@gmail.com", password = "", captchaToken = null) @@ -157,6 +163,7 @@ class LoginViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { viewModel.actionChannel.trySend(LoginAction.LoginButtonClick) assertEquals(DEFAULT_STATE, viewModel.stateFlow.value) + assertEquals(LoginEvent.ShowToast("Loading..."), awaitItem()) assertEquals(LoginEvent.NavigateToCaptcha(intent = mockkIntent), awaitItem()) } coVerify {