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 6c9c78dcc..0ac3ce19d 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 @@ -272,7 +272,13 @@ class ExportVaultViewModel @Inject constructor( viewModelScope.launch { val result = vaultRepository.exportVaultDataToString( - format = state.exportFormat.toExportFormat(state.passwordInput), + format = state.exportFormat.toExportFormat( + password = if (state.exportFormat == ExportVaultFormat.JSON_ENCRYPTED) { + state.filePasswordInput + } else { + state.passwordInput + }, + ), ) sendAction( @@ -308,8 +314,11 @@ class ExportVaultViewModel @Inject constructor( mutableStateFlow.update { it.copy( + confirmFilePasswordInput = "", dialogState = null, + filePasswordInput = "", passwordInput = "", + passwordStrengthState = PasswordStrengthState.NONE, exportData = result.vaultData, ) } 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 493bde7a2..6bca1629f 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 @@ -3,6 +3,7 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.exportvault import android.net.Uri import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test +import com.bitwarden.core.ExportFormat import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength import com.x8bit.bitwarden.data.auth.repository.AuthRepository @@ -51,7 +52,7 @@ class ExportVaultViewModelTest : BaseViewModelTest() { ) private val vaultRepository: VaultRepository = mockk { - coEvery { exportVaultDataToString(any()) } returns mockk() + coEvery { exportVaultDataToString(any()) } returns ExportVaultDataResult.Success("data") } private val fileManager: FileManager = mockk() @@ -104,6 +105,53 @@ class ExportVaultViewModelTest : BaseViewModelTest() { } } + @Suppress("MaxLineLength") + @Test + fun `ConfirmExportVaultClicked should show success with valid input when export type is JSON_ENCRYPTED`() { + val filePassword = "filePassword" + val password = "password" + val initialState = DEFAULT_STATE.copy( + confirmFilePasswordInput = filePassword, + exportFormat = ExportVaultFormat.JSON_ENCRYPTED, + filePasswordInput = filePassword, + passwordInput = password, + passwordStrengthState = PasswordStrengthState.STRONG, + ) + coEvery { + authRepository.getPasswordStrength( + email = EMAIL_ADDRESS, + password = password, + ) + } returns PasswordStrengthResult.Success( + passwordStrength = PasswordStrength.LEVEL_4, + ) + coEvery { + authRepository.validatePassword( + password = password, + ) + } returns ValidatePasswordResult.Success(isValid = true) + val viewModel = createViewModel( + initialState = initialState, + ) + viewModel.trySendAction(ExportVaultAction.ConfirmExportVaultClicked) + assertEquals( + initialState.copy( + confirmFilePasswordInput = "", + exportData = "data", + filePasswordInput = "", + passwordInput = "", + passwordStrengthState = PasswordStrengthState.NONE, + ), + viewModel.stateFlow.value, + ) + coVerify { + authRepository.validatePassword(password) + vaultRepository.exportVaultDataToString( + format = ExportFormat.EncryptedJson(filePassword), + ) + } + } + @Test fun `ConfirmExportVaultClicked blank password should show an error`() { val viewModel = createViewModel()