From ef3b7730d0b072eaf5d2bff9bd1d628e0842234b Mon Sep 17 00:00:00 2001 From: Dave Severns <149429124+dseverns-livefront@users.noreply.github.com> Date: Tue, 18 Mar 2025 09:51:30 -0400 Subject: [PATCH] PM-19289 propagating remaining vault result errors. (#4881) --- .../processor/Fido2ProviderProcessorImpl.kt | 2 +- .../data/vault/manager/CipherManagerImpl.kt | 2 +- .../vault/repository/VaultRepositoryImpl.kt | 16 +++++++++----- ...ecryptFido2CredentialAutofillViewResult.kt | 2 +- .../model/DownloadAttachmentResult.kt | 2 +- .../repository/model/ExportVaultDataResult.kt | 2 +- .../repository/model/GenerateTotpResult.kt | 2 +- .../vault/repository/model/TotpCodeResult.kt | 2 +- .../exportvault/ExportVaultViewModel.kt | 1 + .../feature/addedit/VaultAddEditViewModel.kt | 7 +++--- .../vault/feature/item/VaultItemViewModel.kt | 3 ++- .../feature/qrcodescan/QrCodeScanViewModel.kt | 6 ++--- .../processor/Fido2ProviderProcessorTest.kt | 2 +- .../data/vault/manager/CipherManagerTest.kt | 22 ++++++++++++------- .../vault/repository/VaultRepositoryTest.kt | 17 ++++++++------ .../feature/search/SearchViewModelTest.kt | 4 ++-- .../exportvault/ExportVaultViewModelTest.kt | 5 +++-- .../feature/item/VaultItemViewModelTest.kt | 5 +++-- .../VaultItemListingViewModelTest.kt | 9 ++++---- .../qrcodescan/QrCodeScanViewModelTest.kt | 16 +++++++------- .../vault/feature/vault/VaultViewModelTest.kt | 2 +- 21 files changed, 74 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/data/autofill/fido2/processor/Fido2ProviderProcessorImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/autofill/fido2/processor/Fido2ProviderProcessorImpl.kt index 3e92b6979b..aca3f989c5 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/autofill/fido2/processor/Fido2ProviderProcessorImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/autofill/fido2/processor/Fido2ProviderProcessorImpl.kt @@ -267,7 +267,7 @@ class Fido2ProviderProcessorImpl( val result = vaultRepository .getDecryptedFido2CredentialAutofillViews(cipherViews) return when (result) { - DecryptFido2CredentialAutofillViewResult.Error -> { + is DecryptFido2CredentialAutofillViewResult.Error -> { throw GetCredentialUnknownException("Error decrypting credentials.") } diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/manager/CipherManagerImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/manager/CipherManagerImpl.kt index e76597dccd..4f2d247a26 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/manager/CipherManagerImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/manager/CipherManagerImpl.kt @@ -411,7 +411,7 @@ class CipherManagerImpl( ) .fold( onSuccess = { DownloadAttachmentResult.Success(file = it) }, - onFailure = { DownloadAttachmentResult.Failure }, + onFailure = { DownloadAttachmentResult.Failure(error = it) }, ) private suspend fun downloadAttachmentForResult( diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt index 8592b147c3..3a970cd185 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt @@ -511,11 +511,13 @@ class VaultRepositoryImpl( ): DecryptFido2CredentialAutofillViewResult { return vaultSdkSource .decryptFido2CredentialAutofillViews( - userId = activeUserId ?: return DecryptFido2CredentialAutofillViewResult.Error, + userId = activeUserId ?: return DecryptFido2CredentialAutofillViewResult.Error( + error = NoActiveUserException(), + ), cipherViews = cipherViewList.toTypedArray(), ) .fold( - onFailure = { DecryptFido2CredentialAutofillViewResult.Error }, + onFailure = { DecryptFido2CredentialAutofillViewResult.Error(error = it) }, onSuccess = { DecryptFido2CredentialAutofillViewResult.Success(it) }, ) } @@ -780,7 +782,8 @@ class VaultRepositoryImpl( totpCode: String, time: DateTime, ): GenerateTotpResult { - val userId = activeUserId ?: return GenerateTotpResult.Error + val userId = activeUserId + ?: return GenerateTotpResult.Error(error = NoActiveUserException()) return vaultSdkSource.generateTotp( time = time, userId = userId, @@ -793,7 +796,7 @@ class VaultRepositoryImpl( periodSeconds = it.period.toInt(), ) }, - onFailure = { GenerateTotpResult.Error }, + onFailure = { GenerateTotpResult.Error(error = it) }, ) } @@ -900,7 +903,8 @@ class VaultRepositoryImpl( } override suspend fun exportVaultDataToString(format: ExportFormat): ExportVaultDataResult { - val userId = activeUserId ?: return ExportVaultDataResult.Error + val userId = activeUserId + ?: return ExportVaultDataResult.Error(error = NoActiveUserException()) val folders = vaultDiskSource .getFolders(userId) .firstOrNull() @@ -923,7 +927,7 @@ class VaultRepositoryImpl( ) .fold( onSuccess = { ExportVaultDataResult.Success(it) }, - onFailure = { ExportVaultDataResult.Error }, + onFailure = { ExportVaultDataResult.Error(error = it) }, ) } diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/DecryptFido2CredentialAutofillViewResult.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/DecryptFido2CredentialAutofillViewResult.kt index 3b34bc5255..83f7ef3f56 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/DecryptFido2CredentialAutofillViewResult.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/DecryptFido2CredentialAutofillViewResult.kt @@ -16,5 +16,5 @@ sealed class DecryptFido2CredentialAutofillViewResult { /** * Generic error while decrypting credentials. */ - data object Error : DecryptFido2CredentialAutofillViewResult() + data class Error(val error: Throwable) : DecryptFido2CredentialAutofillViewResult() } diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/DownloadAttachmentResult.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/DownloadAttachmentResult.kt index ea96d6f449..fd326de746 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/DownloadAttachmentResult.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/DownloadAttachmentResult.kt @@ -14,5 +14,5 @@ sealed class DownloadAttachmentResult { /** * The attachment could not be downloaded. */ - data object Failure : DownloadAttachmentResult() + data class Failure(val error: Throwable) : DownloadAttachmentResult() } diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/ExportVaultDataResult.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/ExportVaultDataResult.kt index b7cf05071b..a3fa711a49 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/ExportVaultDataResult.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/ExportVaultDataResult.kt @@ -14,5 +14,5 @@ sealed class ExportVaultDataResult { /** * There was an error converting the vault data. */ - data object Error : ExportVaultDataResult() + data class Error(val error: Throwable) : ExportVaultDataResult() } diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/GenerateTotpResult.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/GenerateTotpResult.kt index 8410a5a72e..5c22ff4c9a 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/GenerateTotpResult.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/GenerateTotpResult.kt @@ -16,5 +16,5 @@ sealed class GenerateTotpResult { /** * An error occurred while generating the code. */ - data object Error : GenerateTotpResult() + data class Error(val error: Throwable) : GenerateTotpResult() } diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/TotpCodeResult.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/TotpCodeResult.kt index d6b4cd785a..f3d12bbd39 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/TotpCodeResult.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/model/TotpCodeResult.kt @@ -13,5 +13,5 @@ sealed class TotpCodeResult { /** * There was an error scanning the code. */ - data object CodeScanningError : TotpCodeResult() + data class CodeScanningError(val error: Throwable? = null) : TotpCodeResult() } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt index 77ebcfbdbb..409bf6847a 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt @@ -334,6 +334,7 @@ class ExportVaultViewModel @Inject constructor( is ExportVaultDataResult.Error -> { updateStateWithError( message = R.string.export_vault_failure.asText(), + error = result.error, ) } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt index 8431df7f79..65189b0758 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt @@ -1742,7 +1742,7 @@ class VaultAddEditViewModel @Inject constructor( } private fun handleVaultTotpCodeReceive(action: VaultAddEditAction.Internal.TotpCodeReceive) { - when (action.totpResult) { + when (val result = action.totpResult) { is TotpCodeResult.Success -> { sendEvent( event = VaultAddEditEvent.ShowToast( @@ -1751,15 +1751,16 @@ class VaultAddEditViewModel @Inject constructor( ) updateLoginContent { loginType -> - loginType.copy(totp = action.totpResult.code) + loginType.copy(totp = result.code) } } - TotpCodeResult.CodeScanningError -> { + is TotpCodeResult.CodeScanningError -> { showDialog( dialogState = VaultAddEditState.DialogState.Generic( title = R.string.an_error_has_occurred.asText(), message = R.string.authenticator_key_read_error.asText(), + error = result.error, ), ) } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt index fe96a377d8..62263aea8c 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt @@ -1295,10 +1295,11 @@ class VaultItemViewModel @Inject constructor( action: VaultItemAction.Internal.AttachmentDecryptReceive, ) { when (val result = action.result) { - DownloadAttachmentResult.Failure -> { + is DownloadAttachmentResult.Failure -> { updateDialogState( VaultItemState.DialogState.Generic( message = R.string.unable_to_download_file.asText(), + error = result.error, ), ) } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/qrcodescan/QrCodeScanViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/qrcodescan/QrCodeScanViewModel.kt index be797ab9f0..91e03b2300 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/qrcodescan/QrCodeScanViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/qrcodescan/QrCodeScanViewModel.kt @@ -51,7 +51,7 @@ class QrCodeScanViewModel @Inject constructor( val scannedCode = action.qrCode if (scannedCode.isBlank() || !scannedCode.startsWith(TOTP_CODE_PREFIX)) { - vaultRepository.emitTotpCodeResult(TotpCodeResult.CodeScanningError) + vaultRepository.emitTotpCodeResult(TotpCodeResult.CodeScanningError()) sendEvent(QrCodeScanEvent.NavigateBack) return } @@ -59,14 +59,14 @@ class QrCodeScanViewModel @Inject constructor( val scannedCodeUri = Uri.parse(scannedCode) val secretValue = scannedCodeUri.getQueryParameter(SECRET) if (secretValue == null || !secretValue.isBase32()) { - vaultRepository.emitTotpCodeResult(TotpCodeResult.CodeScanningError) + vaultRepository.emitTotpCodeResult(TotpCodeResult.CodeScanningError()) sendEvent(QrCodeScanEvent.NavigateBack) return } val values = scannedCodeUri.queryParameterNames if (!areParametersValid(scannedCode, values)) { - result = TotpCodeResult.CodeScanningError + result = TotpCodeResult.CodeScanningError() } vaultRepository.emitTotpCodeResult(result) diff --git a/app/src/test/java/com/x8bit/bitwarden/data/autofill/fido2/processor/Fido2ProviderProcessorTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/autofill/fido2/processor/Fido2ProviderProcessorTest.kt index eb55f8e037..884e8fdd4b 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/autofill/fido2/processor/Fido2ProviderProcessorTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/autofill/fido2/processor/Fido2ProviderProcessorTest.kt @@ -557,7 +557,7 @@ class Fido2ProviderProcessorTest { every { callback.onError(capture(captureSlot)) } just runs coEvery { vaultRepository.getDecryptedFido2CredentialAutofillViews(any()) - } returns DecryptFido2CredentialAutofillViewResult.Error + } returns DecryptFido2CredentialAutofillViewResult.Error(error = Throwable("Ooops")) coEvery { vaultRepository.silentlyDiscoverCredentials( userId = DEFAULT_USER_STATE.activeUserId, diff --git a/app/src/test/java/com/x8bit/bitwarden/data/vault/manager/CipherManagerTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/vault/manager/CipherManagerTest.kt index d2328fc568..6f3293df76 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/vault/manager/CipherManagerTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/vault/manager/CipherManagerTest.kt @@ -100,6 +100,10 @@ class CipherManagerTest { every { anyConstructed() == any() } returns true + mockkConstructor(IllegalStateException::class) + every { + anyConstructed() == any() + } returns true } @AfterEach @@ -107,6 +111,7 @@ class CipherManagerTest { unmockkStatic(Uri::class, Instant::class) unmockkStatic(Cipher::toEncryptedNetworkCipherResponse) unmockkConstructor(NoActiveUserException::class) + unmockkConstructor(IllegalStateException::class) } @Test @@ -1714,7 +1719,7 @@ class CipherManagerTest { } returns cipher.asSuccess() assertEquals( - DownloadAttachmentResult.Failure, + DownloadAttachmentResult.Failure(IllegalStateException()), cipherManager.downloadAttachment( cipherView = cipherView, attachmentId = attachmentId, @@ -1752,13 +1757,14 @@ class CipherManagerTest { cipherView = cipherView, ) } returns cipher.asSuccess() + val error = Throwable() coEvery { ciphersService.getCipherAttachment(cipherId = any(), attachmentId = any()) - } returns Throwable().asFailure() + } returns error.asFailure() assertEquals( - DownloadAttachmentResult.Failure, + DownloadAttachmentResult.Failure(error = error), cipherManager.downloadAttachment( cipherView = cipherView, attachmentId = attachmentId, @@ -1805,7 +1811,7 @@ class CipherManagerTest { } returns response.asSuccess() assertEquals( - DownloadAttachmentResult.Failure, + DownloadAttachmentResult.Failure(error = IllegalStateException()), cipherManager.downloadAttachment( cipherView = cipherView, attachmentId = attachmentId, @@ -1857,7 +1863,7 @@ class CipherManagerTest { } returns DownloadResult.Failure assertEquals( - DownloadAttachmentResult.Failure, + DownloadAttachmentResult.Failure(IllegalStateException()), cipherManager.downloadAttachment( cipherView = cipherView, attachmentId = attachmentId, @@ -1912,7 +1918,7 @@ class CipherManagerTest { coEvery { fileManager.downloadFileToCache(url = any()) } returns DownloadResult.Success(file) - + val error = Throwable("Fail") coEvery { vaultSdkSource.decryptFile( userId = MOCK_USER_STATE.activeUserId, @@ -1921,10 +1927,10 @@ class CipherManagerTest { encryptedFilePath = "path/to/encrypted/file", decryptedFilePath = "path/to/encrypted/file_decrypted", ) - } returns Throwable().asFailure() + } returns error.asFailure() assertEquals( - DownloadAttachmentResult.Failure, + DownloadAttachmentResult.Failure(error = error), cipherManager.downloadAttachment( cipherView = cipherView, attachmentId = attachmentId, diff --git a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt index 3e6170bdd5..dc79047637 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt @@ -2707,7 +2707,7 @@ class VaultRepositoryTest { ) assertEquals( - GenerateTotpResult.Error, + GenerateTotpResult.Error(error = NoActiveUserException()), result, ) } @@ -4410,12 +4410,12 @@ class VaultRepositoryTest { coEvery { vaultDiskSource.getFolders(userId) } returns flowOf(listOf(createMockFolder(1))) - + val error = Throwable("Fail") coEvery { vaultSdkSource.exportVaultDataToString(userId, any(), any(), format) - } returns Throwable("Fail").asFailure() + } returns error.asFailure() - val expected = ExportVaultDataResult.Error + val expected = ExportVaultDataResult.Error(error = error) val result = vaultRepository.exportVaultDataToString(format = format) assertEquals( @@ -4429,7 +4429,9 @@ class VaultRepositoryTest { runTest { fakeAuthDiskSource.userState = null - val expected = DecryptFido2CredentialAutofillViewResult.Error + val expected = DecryptFido2CredentialAutofillViewResult.Error( + error = NoActiveUserException(), + ) val result = vaultRepository .getDecryptedFido2CredentialAutofillViews( cipherViewList = listOf(createMockCipherView(number = 1)), @@ -4449,18 +4451,19 @@ class VaultRepositoryTest { runTest { fakeAuthDiskSource.userState = MOCK_USER_STATE val cipherViewList = listOf(createMockCipherView(number = 1)) + val error = Throwable() coEvery { vaultSdkSource.decryptFido2CredentialAutofillViews( userId = MOCK_USER_STATE.activeUserId, cipherViews = cipherViewList.toTypedArray(), ) - } returns Throwable().asFailure() + } returns error.asFailure() val result = vaultRepository.getDecryptedFido2CredentialAutofillViews( cipherViewList = cipherViewList, ) - assertEquals(DecryptFido2CredentialAutofillViewResult.Error, result) + assertEquals(DecryptFido2CredentialAutofillViewResult.Error(error = error), result) coVerify { vaultSdkSource.decryptFido2CredentialAutofillViews( userId = MOCK_USER_STATE.activeUserId, diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt index 7bab6ef279..2eb45496ec 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt @@ -918,10 +918,10 @@ class SearchViewModelTest : BaseViewModelTest() { fun `OverflowOptionClick Vault CopyTotpClick with GenerateTotpCode failure should not call setText on the ClipboardManager`() = runTest { val totpCode = "totpCode" - + val error = Throwable("Fail") coEvery { vaultRepository.generateTotp(totpCode, clock.instant()) - } returns GenerateTotpResult.Error + } returns GenerateTotpResult.Error(error = error) val viewModel = createViewModel() viewModel.trySendAction( diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt index d6abab4b0b..501bbac763 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt @@ -538,10 +538,10 @@ class ExportVaultViewModelTest : BaseViewModelTest() { @Test fun `ReceiveExportVaultDataToStringResult should update state to error if result is error`() { val viewModel = createViewModel() - + val error = Throwable("Fail") viewModel.trySendAction( ExportVaultAction.Internal.ReceiveExportVaultDataToStringResult( - result = ExportVaultDataResult.Error, + result = ExportVaultDataResult.Error(error = error), ), ) @@ -550,6 +550,7 @@ class ExportVaultViewModelTest : BaseViewModelTest() { dialogState = ExportVaultState.DialogState.Error( title = R.string.an_error_has_occurred.asText(), message = R.string.export_vault_failure.asText(), + error = error, ), ), viewModel.stateFlow.value, diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt index 00a0022540..2626eff14e 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt @@ -1707,10 +1707,10 @@ class VaultItemViewModelTest : BaseViewModelTest() { url = "https://example.com", title = "test.mp4", ) - + val error = Throwable("Fail") coEvery { vaultRepo.downloadAttachment(any(), any()) - } returns DownloadAttachmentResult.Failure + } returns DownloadAttachmentResult.Failure(error = error) viewModel.stateFlow.test { assertEquals( @@ -1731,6 +1731,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { loginState.copy( dialog = VaultItemState.DialogState.Generic( R.string.unable_to_download_file.asText(), + error = error, ), ), awaitItem(), diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt index 0fd9b754f6..9526147208 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt @@ -139,6 +139,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { } private val mutableVaultDataStateFlow = MutableStateFlow>(DataState.Loading) + private val defaultError = Throwable("Fail") private val vaultRepository: VaultRepository = mockk { every { vaultFilterType } returns VaultFilterType.AllVaults every { vaultDataStateFlow } returns mutableVaultDataStateFlow @@ -146,7 +147,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { every { sync(forced = any()) } just runs coEvery { getDecryptedFido2CredentialAutofillViews(any()) - } returns DecryptFido2CredentialAutofillViewResult.Error + } returns DecryptFido2CredentialAutofillViewResult.Error(error = defaultError) } private val environmentRepository: EnvironmentRepository = mockk { every { environment } returns Environment.Us @@ -422,7 +423,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { vaultRepository.getDecryptedFido2CredentialAutofillViews( cipherViewList = listOf(cipherView), ) - } returns DecryptFido2CredentialAutofillViewResult.Error + } returns DecryptFido2CredentialAutofillViewResult.Error(error = defaultError) specialCircumstanceManager.specialCircumstance = SpecialCircumstance.AutofillSelection( autofillSelectionData = AutofillSelectionData( type = AutofillSelectionData.Type.LOGIN, @@ -469,7 +470,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { vaultRepository.getDecryptedFido2CredentialAutofillViews( cipherViewList = listOf(cipherView), ) - } returns DecryptFido2CredentialAutofillViewResult.Error + } returns DecryptFido2CredentialAutofillViewResult.Error(error = defaultError) specialCircumstanceManager.specialCircumstance = SpecialCircumstance.AutofillSelection( autofillSelectionData = AutofillSelectionData( @@ -1491,7 +1492,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { coEvery { vaultRepository.generateTotp(totpCode, clock.instant()) - } returns GenerateTotpResult.Error + } returns GenerateTotpResult.Error(error = defaultError) val viewModel = createVaultItemListingViewModel() viewModel.trySendAction( diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/qrcodescan/QrCodeScanViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/qrcodescan/QrCodeScanViewModelTest.kt index 0648ce37c1..cf89a1372f 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/qrcodescan/QrCodeScanViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/qrcodescan/QrCodeScanViewModelTest.kt @@ -117,7 +117,7 @@ class QrCodeScanViewModelTest : BaseViewModelTest() { setupMockUri(algorithm = "SHA-224") val viewModel = createViewModel() - val result = TotpCodeResult.CodeScanningError + val result = TotpCodeResult.CodeScanningError() val invalidCode = "otpauth://totp/Test:me?secret=JBSWY3dpeHPK3PXP&algorithm=sha224" viewModel.eventFlow.test { @@ -133,7 +133,7 @@ class QrCodeScanViewModelTest : BaseViewModelTest() { setupMockUri(digits = "11") val viewModel = createViewModel() - val result = TotpCodeResult.CodeScanningError + val result = TotpCodeResult.CodeScanningError() val invalidCode = "otpauth://totp/Test:me?secret=JBSWY3dpeHPK3PXP&digits=11" viewModel.eventFlow.test { @@ -149,7 +149,7 @@ class QrCodeScanViewModelTest : BaseViewModelTest() { setupMockUri(period = "0") val viewModel = createViewModel() - val result = TotpCodeResult.CodeScanningError + val result = TotpCodeResult.CodeScanningError() val invalidCode = "otpauth://totp/Test:me?secret=JBSWY3dpeHPK3PXP&period=0" viewModel.eventFlow.test { @@ -164,7 +164,7 @@ class QrCodeScanViewModelTest : BaseViewModelTest() { fun `QrCodeScan should emit failure result without correct prefix`() = runTest { val viewModel = createViewModel() - val result = TotpCodeResult.CodeScanningError + val result = TotpCodeResult.CodeScanningError() val invalidCode = "nototpauth://totp/Test:me?secret=JBSWY3dpeHPK3PXP" viewModel.eventFlow.test { @@ -180,7 +180,7 @@ class QrCodeScanViewModelTest : BaseViewModelTest() { setupMockUri(secret = "JBSWY3dpeHPK3PXP1") val viewModel = createViewModel() - val result = TotpCodeResult.CodeScanningError + val result = TotpCodeResult.CodeScanningError() val invalidCode = "otpauth://totp/Test:me?secret=JBSWY3dpeHPK3PXP1" viewModel.eventFlow.test { @@ -196,7 +196,7 @@ class QrCodeScanViewModelTest : BaseViewModelTest() { setupMockUri(secret = null) val viewModel = createViewModel() - val result = TotpCodeResult.CodeScanningError + val result = TotpCodeResult.CodeScanningError() val invalidCode = "otpauth://totp/Test:me" viewModel.eventFlow.test { @@ -212,7 +212,7 @@ class QrCodeScanViewModelTest : BaseViewModelTest() { setupMockUri(secret = "") val viewModel = createViewModel() - val result = TotpCodeResult.CodeScanningError + val result = TotpCodeResult.CodeScanningError() val invalidCode = "otpauth://totp/Test:me?secret= " viewModel.eventFlow.test { @@ -226,7 +226,7 @@ class QrCodeScanViewModelTest : BaseViewModelTest() { @Test fun `QrCodeScan should emit failure result and NavigateBack if code is empty`() = runTest { val viewModel = createViewModel() - val result = TotpCodeResult.CodeScanningError + val result = TotpCodeResult.CodeScanningError() val invalidCode = "" viewModel.eventFlow.test { diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt index 2250f1be60..9b6a08ae45 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt @@ -1481,7 +1481,7 @@ class VaultViewModelTest : BaseViewModelTest() { coEvery { vaultRepository.generateTotp(totpCode, clock.instant()) - } returns GenerateTotpResult.Error + } returns GenerateTotpResult.Error(error = Throwable("Fail")) val viewModel = createViewModel() viewModel.trySendAction(