diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModel.kt index 0c414a600..02f4ca813 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModel.kt @@ -108,7 +108,7 @@ class LoginApprovalViewModel @Inject constructor( } private fun handleCloseClicked() { - closeScreen() + sendClosingEvent() } private fun handleDeclineRequestClicked() { @@ -138,7 +138,7 @@ class LoginApprovalViewModel @Inject constructor( when (action.result) { is AuthRequestResult.Success -> { sendEvent(LoginApprovalEvent.ShowToast(R.string.login_approved.asText())) - sendEvent(LoginApprovalEvent.NavigateBack) + sendClosingEvent() } is AuthRequestResult.Error -> { @@ -184,7 +184,7 @@ class LoginApprovalViewModel @Inject constructor( AuthRequestUpdatesResult.Declined, AuthRequestUpdatesResult.Expired, -> { - closeScreen() + sendClosingEvent() } } } @@ -195,7 +195,7 @@ class LoginApprovalViewModel @Inject constructor( when (action.result) { is AuthRequestResult.Success -> { sendEvent(LoginApprovalEvent.ShowToast(R.string.log_in_denied.asText())) - sendEvent(LoginApprovalEvent.NavigateBack) + sendClosingEvent() } is AuthRequestResult.Error -> { @@ -206,12 +206,14 @@ class LoginApprovalViewModel @Inject constructor( } } - private fun closeScreen() { - if (state.specialCircumstance?.shouldFinishWhenComplete == true) { - sendEvent(LoginApprovalEvent.ExitApp) + private fun sendClosingEvent() { + val event = if (state.specialCircumstance?.shouldFinishWhenComplete == true) { + LoginApprovalEvent.ExitApp } else { - sendEvent(LoginApprovalEvent.NavigateBack) + LoginApprovalEvent.NavigateBack } + + sendEvent(event) } } diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModelTest.kt index 6edd88f26..d2e4c8d18 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModelTest.kt @@ -189,6 +189,44 @@ class LoginApprovalViewModelTest : BaseViewModelTest() { } } + @Test + @Suppress("MaxLineLength") + fun `When approval request is successful, should emit ExitApp when shouldFinishWhenComplete is true`() = + runTest { + val specialCircumstance = SpecialCircumstance.PasswordlessRequest( + passwordlessRequestData = PasswordlessRequestData( + loginRequestId = REQUEST_ID, + userId = USER_ID, + ), + shouldFinishWhenComplete = true, + ) + every { + mockSpecialCircumstanceManager.specialCircumstance + } returns specialCircumstance + val viewModel = createViewModel( + state = DEFAULT_STATE.copy( + specialCircumstance = specialCircumstance, + ), + ) + coEvery { + mockAuthRepository.updateAuthRequest( + requestId = REQUEST_ID, + masterPasswordHash = PASSWORD_HASH, + publicKey = PUBLIC_KEY, + isApproved = true, + ) + } returns AuthRequestResult.Success(AUTH_REQUEST) + + viewModel.eventFlow.test { + viewModel.trySendAction(LoginApprovalAction.ApproveRequestClick) + assertEquals( + LoginApprovalEvent.ShowToast(R.string.login_approved.asText()), + awaitItem(), + ) + assertEquals(LoginApprovalEvent.ExitApp, awaitItem()) + } + } + @Test fun `on DeclineRequestClick should deny auth request`() = runTest { val viewModel = createViewModel() @@ -220,6 +258,44 @@ class LoginApprovalViewModelTest : BaseViewModelTest() { } } + @Test + @Suppress("MaxLineLength") + fun `When deny request is successful, should emit ExitApp when shouldFinishWhenComplete is true`() = + runTest { + val specialCircumstance = SpecialCircumstance.PasswordlessRequest( + passwordlessRequestData = PasswordlessRequestData( + loginRequestId = REQUEST_ID, + userId = USER_ID, + ), + shouldFinishWhenComplete = true, + ) + every { + mockSpecialCircumstanceManager.specialCircumstance + } returns specialCircumstance + val viewModel = createViewModel( + state = DEFAULT_STATE.copy( + specialCircumstance = specialCircumstance, + ), + ) + coEvery { + mockAuthRepository.updateAuthRequest( + requestId = REQUEST_ID, + masterPasswordHash = PASSWORD_HASH, + publicKey = PUBLIC_KEY, + isApproved = false, + ) + } returns AuthRequestResult.Success(AUTH_REQUEST) + + viewModel.eventFlow.test { + viewModel.trySendAction(LoginApprovalAction.DeclineRequestClick) + assertEquals( + LoginApprovalEvent.ShowToast(R.string.log_in_denied.asText()), + awaitItem(), + ) + assertEquals(LoginApprovalEvent.ExitApp, awaitItem()) + } + } + @Test fun `on ErrorDialogDismiss should update state`() = runTest { val viewModel = createViewModel()