From e1a078e511fcd6384555c458b6dfab8e35aca819 Mon Sep 17 00:00:00 2001 From: Brian Yencho Date: Tue, 23 Jan 2024 14:51:15 -0600 Subject: [PATCH] Decouple unlocking and syncing and add syncIfNecessary (#733) --- .../auth/repository/AuthRepositoryImpl.kt | 2 +- .../data/vault/repository/VaultRepository.kt | 22 ++++++--- .../vault/repository/VaultRepositoryImpl.kt | 15 +++--- .../vaultunlock/VaultUnlockViewModel.kt | 4 +- .../ui/vault/feature/vault/VaultViewModel.kt | 3 ++ .../auth/repository/AuthRepositoryTest.kt | 8 +-- .../vault/repository/VaultRepositoryTest.kt | 49 +++++++++---------- .../vaultunlock/VaultUnlockViewModelTest.kt | 40 +++++++-------- .../vault/feature/vault/VaultViewModelTest.kt | 4 +- 9 files changed, 77 insertions(+), 70 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryImpl.kt index 4a35d53172..9b2f3f221d 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryImpl.kt @@ -227,7 +227,7 @@ class AuthRepositoryImpl( settingsRepository.setDefaultsIfNecessary( userId = userStateJson.activeUserId, ) - vaultRepository.sync() + vaultRepository.syncIfNecessary() hasPendingAccountAddition = false LoginResult.Success } diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepository.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepository.kt index 79ffb4a302..7796fee6c6 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepository.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepository.kt @@ -95,10 +95,19 @@ interface VaultRepository : VaultLockManager { fun deleteVaultData(userId: String) /** - * Attempt to sync the vault data. + * Sync the vault data for the current user. + * + * Unlike [syncIfNecessary], this will always perform the requested sync and should only be + * utilized in cases where the user specifically requested the action. */ fun sync() + /** + * Checks if conditions have been met to perform a sync request and, if so, syncs the vault + * data for the current user. + */ + fun syncIfNecessary() + /** * Flow that represents the data for a specific vault item as found by ID. This may emit `null` * if the item cannot be found. @@ -129,18 +138,17 @@ interface VaultRepository : VaultLockManager { fun emitTotpCodeResult(totpCodeResult: TotpCodeResult) /** - * Attempt to unlock the vault with the given [masterPassword] and syncs the vault data for the - * currently active user. + * Attempt to unlock the vault with the given [masterPassword] and for the currently active + * user. */ - suspend fun unlockVaultWithMasterPasswordAndSync( + suspend fun unlockVaultWithMasterPassword( masterPassword: String, ): VaultUnlockResult /** - * Attempt to unlock the vault with the given [pin] and syncs the vault data for the currently - * active user. + * Attempt to unlock the vault with the given [pin] for the currently active user. */ - suspend fun unlockVaultWithPinAndSync( + suspend fun unlockVaultWithPin( pin: String, ): VaultUnlockResult 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 3d9b07cebd..0dd9201d41 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 @@ -257,6 +257,11 @@ class VaultRepositoryImpl( } } + override fun syncIfNecessary() { + // TODO: Add conditions for when a sync may be performed and test accordingly (BIT-1454) + sync() + } + override fun getVaultItemStateFlow(itemId: String): StateFlow> = vaultDataStateFlow .map { dataState -> @@ -346,7 +351,7 @@ class VaultRepositoryImpl( } @Suppress("ReturnCount") - override suspend fun unlockVaultWithMasterPasswordAndSync( + override suspend fun unlockVaultWithMasterPassword( masterPassword: String, ): VaultUnlockResult { val userId = activeUserId ?: return VaultUnlockResult.InvalidStateError @@ -361,14 +366,13 @@ class VaultRepositoryImpl( ) .also { if (it is VaultUnlockResult.Success) { - sync() deriveTemporaryPinProtectedUserKeyIfNecessary(userId = userId) } } } @Suppress("ReturnCount") - override suspend fun unlockVaultWithPinAndSync( + override suspend fun unlockVaultWithPin( pin: String, ): VaultUnlockResult { val userId = activeUserId ?: return VaultUnlockResult.InvalidStateError @@ -381,11 +385,6 @@ class VaultRepositoryImpl( pinProtectedUserKey = pinProtectedUserKey, ), ) - .also { - if (it is VaultUnlockResult.Success) { - sync() - } - } } override suspend fun unlockVault( diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt index a54fadcd1c..fa7df12d63 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt @@ -133,13 +133,13 @@ class VaultUnlockViewModel @Inject constructor( viewModelScope.launch { val vaultUnlockResult = when (state.vaultUnlockType) { VaultUnlockType.MASTER_PASSWORD -> { - vaultRepo.unlockVaultWithMasterPasswordAndSync( + vaultRepo.unlockVaultWithMasterPassword( mutableStateFlow.value.input, ) } VaultUnlockType.PIN -> { - vaultRepo.unlockVaultWithPinAndSync( + vaultRepo.unlockVaultWithPin( mutableStateFlow.value.input, ) } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt index 619bb4c09f..757b6493fd 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt @@ -74,6 +74,9 @@ class VaultViewModel @Inject constructor( get() = state.vaultFilterData?.selectedVaultFilterType ?: VaultFilterType.AllVaults init { + // Attempt a sync each time we are on a fresh Vault Screen. + vaultRepository.syncIfNecessary() + // Reset the current vault filter type for the current user vaultRepository.vaultFilterType = vaultFilterTypeOrDefault settingsRepository diff --git a/app/src/test/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt index 82c7c746b7..1200fe58d0 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt @@ -517,7 +517,7 @@ class AuthRepositoryTest { masterPassword = PASSWORD, ) } returns VaultUnlockResult.Success - coEvery { vaultRepository.sync() } just runs + coEvery { vaultRepository.syncIfNecessary() } just runs every { GET_TOKEN_RESPONSE_SUCCESS.toUserState( previousUserState = null, @@ -552,7 +552,7 @@ class AuthRepositoryTest { organizationKeys = null, masterPassword = PASSWORD, ) - vaultRepository.sync() + vaultRepository.syncIfNecessary() } assertEquals( SINGLE_USER_STATE_1, @@ -595,7 +595,7 @@ class AuthRepositoryTest { masterPassword = PASSWORD, ) } returns VaultUnlockResult.Success - coEvery { vaultRepository.sync() } just runs + coEvery { vaultRepository.syncIfNecessary() } just runs every { GET_TOKEN_RESPONSE_SUCCESS.toUserState( previousUserState = SINGLE_USER_STATE_2, @@ -632,7 +632,7 @@ class AuthRepositoryTest { organizationKeys = null, masterPassword = PASSWORD, ) - vaultRepository.sync() + vaultRepository.syncIfNecessary() } assertEquals( MULTI_USER_STATE, 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 aff0177008..1695a6f47b 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 @@ -587,7 +587,7 @@ class VaultRepositoryTest { @Suppress("MaxLineLength") @Test - fun `unlockVaultWithMasterPasswordAndSync with missing user state should return InvalidStateError `() = + fun `unlockVaultWithMasterPassword with missing user state should return InvalidStateError `() = runTest { fakeAuthDiskSource.userState = null assertEquals( @@ -598,7 +598,7 @@ class VaultRepositoryTest { vaultRepository.vaultStateFlow.value, ) - val result = vaultRepository.unlockVaultWithMasterPasswordAndSync(masterPassword = "") + val result = vaultRepository.unlockVaultWithMasterPassword(masterPassword = "") assertEquals( VaultUnlockResult.InvalidStateError, @@ -615,7 +615,7 @@ class VaultRepositoryTest { @Suppress("MaxLineLength") @Test - fun `unlockVaultWithMasterPasswordAndSync with missing user key should return InvalidStateError `() = + fun `unlockVaultWithMasterPassword with missing user key should return InvalidStateError `() = runTest { assertEquals( VaultState( @@ -625,7 +625,7 @@ class VaultRepositoryTest { vaultRepository.vaultStateFlow.value, ) - val result = vaultRepository.unlockVaultWithMasterPasswordAndSync(masterPassword = "") + val result = vaultRepository.unlockVaultWithMasterPassword(masterPassword = "") fakeAuthDiskSource.storeUserKey( userId = "mockId-1", userKey = null, @@ -650,7 +650,7 @@ class VaultRepositoryTest { @Suppress("MaxLineLength") @Test - fun `unlockVaultWithMasterPasswordAndSync with missing private key should return InvalidStateError `() = + fun `unlockVaultWithMasterPassword with missing private key should return InvalidStateError `() = runTest { assertEquals( VaultState( @@ -659,7 +659,7 @@ class VaultRepositoryTest { ), vaultRepository.vaultStateFlow.value, ) - val result = vaultRepository.unlockVaultWithMasterPasswordAndSync(masterPassword = "") + val result = vaultRepository.unlockVaultWithMasterPassword(masterPassword = "") fakeAuthDiskSource.storeUserKey( userId = "mockId-1", userKey = "mockKey-1", @@ -685,7 +685,7 @@ class VaultRepositoryTest { @Suppress("MaxLineLength") @Test - fun `unlockVaultWithMasterPasswordAndSync with VaultLockManager Success and no encrypted PIN should unlock for the current user, sync, and return Success`() = + fun `unlockVaultWithMasterPassword with VaultLockManager Success and no encrypted PIN should unlock for the current user and return Success`() = runTest { val userId = "mockId-1" val mockVaultUnlockResult = VaultUnlockResult.Success @@ -705,7 +705,7 @@ class VaultRepositoryTest { ) } - val result = vaultRepository.unlockVaultWithMasterPasswordAndSync( + val result = vaultRepository.unlockVaultWithMasterPassword( masterPassword = "mockPassword-1", ) @@ -713,7 +713,6 @@ class VaultRepositoryTest { mockVaultUnlockResult, result, ) - coVerify { syncService.sync() } coVerify { vaultLockManager.unlockVault( userId = userId, @@ -733,7 +732,7 @@ class VaultRepositoryTest { @Suppress("MaxLineLength") @Test - fun `unlockVaultWithMasterPasswordAndSync with VaultLockManager Success and a stored encrypted pin should unlock for the current user, sync, derive a new pin-protected key, and return Success`() = + fun `unlockVaultWithMasterPassword with VaultLockManager Success and a stored encrypted pin should unlock for the current user, derive a new pin-protected key, and return Success`() = runTest { val userId = "mockId-1" val encryptedPin = "encryptedPin" @@ -758,7 +757,7 @@ class VaultRepositoryTest { ) } - val result = vaultRepository.unlockVaultWithMasterPasswordAndSync( + val result = vaultRepository.unlockVaultWithMasterPassword( masterPassword = "mockPassword-1", ) @@ -771,7 +770,6 @@ class VaultRepositoryTest { pinProtectedUserKey = pinProtectedUserKey, inMemoryOnly = true, ) - coVerify { syncService.sync() } coVerify { vaultLockManager.unlockVault( userId = userId, @@ -795,13 +793,13 @@ class VaultRepositoryTest { @Suppress("MaxLineLength") @Test - fun `unlockVaultWithMasterPasswordAndSync with VaultLockManager non-Success should unlock for the current user and return the error`() = + fun `unlockVaultWithMasterPassword with VaultLockManager non-Success should unlock for the current user and return the error`() = runTest { val userId = "mockId-1" val mockVaultUnlockResult = VaultUnlockResult.InvalidStateError prepareStateForUnlocking(unlockResult = mockVaultUnlockResult) - val result = vaultRepository.unlockVaultWithMasterPasswordAndSync( + val result = vaultRepository.unlockVaultWithMasterPassword( masterPassword = "mockPassword-1", ) @@ -809,7 +807,6 @@ class VaultRepositoryTest { mockVaultUnlockResult, result, ) - coVerify(exactly = 0) { syncService.sync() } coVerify { vaultLockManager.unlockVault( userId = userId, @@ -828,7 +825,7 @@ class VaultRepositoryTest { @Suppress("MaxLineLength") @Test - fun `unlockVaultWithPinAndSync with missing user state should return InvalidStateError `() = + fun `unlockVaultWithPin with missing user state should return InvalidStateError `() = runTest { fakeAuthDiskSource.userState = null assertEquals( @@ -839,7 +836,7 @@ class VaultRepositoryTest { vaultRepository.vaultStateFlow.value, ) - val result = vaultRepository.unlockVaultWithPinAndSync(pin = "1234") + val result = vaultRepository.unlockVaultWithPin(pin = "1234") assertEquals( VaultUnlockResult.InvalidStateError, @@ -856,7 +853,7 @@ class VaultRepositoryTest { @Suppress("MaxLineLength") @Test - fun `unlockVaultWithPinAndSync with missing pin-protected user key should return InvalidStateError `() = + fun `unlockVaultWithPin with missing pin-protected user key should return InvalidStateError `() = runTest { assertEquals( VaultState( @@ -866,7 +863,7 @@ class VaultRepositoryTest { vaultRepository.vaultStateFlow.value, ) - val result = vaultRepository.unlockVaultWithPinAndSync(pin = "1234") + val result = vaultRepository.unlockVaultWithPin(pin = "1234") fakeAuthDiskSource.storePinProtectedUserKey( userId = "mockId-1", pinProtectedUserKey = null, @@ -891,7 +888,7 @@ class VaultRepositoryTest { @Suppress("MaxLineLength") @Test - fun `unlockVaultWithPinAndSync with missing private key should return InvalidStateError `() = + fun `unlockVaultWithPin with missing private key should return InvalidStateError `() = runTest { assertEquals( VaultState( @@ -900,7 +897,7 @@ class VaultRepositoryTest { ), vaultRepository.vaultStateFlow.value, ) - val result = vaultRepository.unlockVaultWithPinAndSync(pin = "1234") + val result = vaultRepository.unlockVaultWithPin(pin = "1234") fakeAuthDiskSource.storePinProtectedUserKey( userId = "mockId-1", pinProtectedUserKey = "mockKey-1", @@ -925,19 +922,18 @@ class VaultRepositoryTest { @Suppress("MaxLineLength") @Test - fun `unlockVaultWithPinAndSync with VaultLockManager Success should unlock for the current user, sync, and return Success`() = + fun `unlockVaultWithPin with VaultLockManager Success should unlock for the current user and return Success`() = runTest { val userId = "mockId-1" val mockVaultUnlockResult = VaultUnlockResult.Success prepareStateForUnlocking(unlockResult = mockVaultUnlockResult) - val result = vaultRepository.unlockVaultWithPinAndSync(pin = "1234") + val result = vaultRepository.unlockVaultWithPin(pin = "1234") assertEquals( mockVaultUnlockResult, result, ) - coVerify { syncService.sync() } coVerify { vaultLockManager.unlockVault( userId = userId, @@ -955,19 +951,18 @@ class VaultRepositoryTest { @Suppress("MaxLineLength") @Test - fun `unlockVaultWithPinAndSync with VaultLockManager non-Success should unlock for the current user and return the error`() = + fun `unlockVaultWithPin with VaultLockManager non-Success should unlock for the current user and return the error`() = runTest { val userId = "mockId-1" val mockVaultUnlockResult = VaultUnlockResult.InvalidStateError prepareStateForUnlocking(unlockResult = mockVaultUnlockResult) - val result = vaultRepository.unlockVaultWithPinAndSync(pin = "1234") + val result = vaultRepository.unlockVaultWithPin(pin = "1234") assertEquals( mockVaultUnlockResult, result, ) - coVerify(exactly = 0) { syncService.sync() } coVerify { vaultLockManager.unlockVault( userId = userId, diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt index 159f0c50b8..25fd74e3cc 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt @@ -259,7 +259,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { ) val viewModel = createViewModel(state = initialState) coEvery { - vaultRepository.unlockVaultWithMasterPasswordAndSync(password) + vaultRepository.unlockVaultWithMasterPassword(password) } returns VaultUnlockResult.AuthenticationError viewModel.trySendAction(VaultUnlockAction.UnlockClick) @@ -272,7 +272,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { viewModel.stateFlow.value, ) coVerify { - vaultRepository.unlockVaultWithMasterPasswordAndSync(password) + vaultRepository.unlockVaultWithMasterPassword(password) } } @@ -285,7 +285,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { ) val viewModel = createViewModel(state = initialState) coEvery { - vaultRepository.unlockVaultWithMasterPasswordAndSync(password) + vaultRepository.unlockVaultWithMasterPassword(password) } returns VaultUnlockResult.GenericError viewModel.trySendAction(VaultUnlockAction.UnlockClick) @@ -298,7 +298,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { viewModel.stateFlow.value, ) coVerify { - vaultRepository.unlockVaultWithMasterPasswordAndSync(password) + vaultRepository.unlockVaultWithMasterPassword(password) } } @@ -311,7 +311,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { ) val viewModel = createViewModel(state = initialState) coEvery { - vaultRepository.unlockVaultWithMasterPasswordAndSync(password) + vaultRepository.unlockVaultWithMasterPassword(password) } returns VaultUnlockResult.InvalidStateError viewModel.trySendAction(VaultUnlockAction.UnlockClick) @@ -324,7 +324,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { viewModel.stateFlow.value, ) coVerify { - vaultRepository.unlockVaultWithMasterPasswordAndSync(password) + vaultRepository.unlockVaultWithMasterPassword(password) } } @@ -337,7 +337,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { ) val viewModel = createViewModel(state = initialState) coEvery { - vaultRepository.unlockVaultWithMasterPasswordAndSync(password) + vaultRepository.unlockVaultWithMasterPassword(password) } returns VaultUnlockResult.Success viewModel.trySendAction(VaultUnlockAction.UnlockClick) @@ -346,7 +346,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { viewModel.stateFlow.value, ) coVerify { - vaultRepository.unlockVaultWithMasterPasswordAndSync(password) + vaultRepository.unlockVaultWithMasterPassword(password) } } @@ -360,7 +360,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { val resultFlow = bufferedMutableSharedFlow() val viewModel = createViewModel(state = initialState) coEvery { - vaultRepository.unlockVaultWithMasterPasswordAndSync(password) + vaultRepository.unlockVaultWithMasterPassword(password) } coAnswers { resultFlow.first() } viewModel.trySendAction(VaultUnlockAction.UnlockClick) @@ -383,7 +383,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { viewModel.stateFlow.value, ) coVerify { - vaultRepository.unlockVaultWithMasterPasswordAndSync(password) + vaultRepository.unlockVaultWithMasterPassword(password) } } @@ -396,7 +396,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { ) val viewModel = createViewModel(state = initialState) coEvery { - vaultRepository.unlockVaultWithPinAndSync(pin) + vaultRepository.unlockVaultWithPin(pin) } returns VaultUnlockResult.AuthenticationError viewModel.trySendAction(VaultUnlockAction.UnlockClick) @@ -409,7 +409,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { viewModel.stateFlow.value, ) coVerify { - vaultRepository.unlockVaultWithPinAndSync(pin) + vaultRepository.unlockVaultWithPin(pin) } } @@ -422,7 +422,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { ) val viewModel = createViewModel(state = initialState) coEvery { - vaultRepository.unlockVaultWithPinAndSync(pin) + vaultRepository.unlockVaultWithPin(pin) } returns VaultUnlockResult.GenericError viewModel.trySendAction(VaultUnlockAction.UnlockClick) @@ -435,7 +435,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { viewModel.stateFlow.value, ) coVerify { - vaultRepository.unlockVaultWithPinAndSync(pin) + vaultRepository.unlockVaultWithPin(pin) } } @@ -448,7 +448,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { ) val viewModel = createViewModel(state = initialState) coEvery { - vaultRepository.unlockVaultWithPinAndSync(pin) + vaultRepository.unlockVaultWithPin(pin) } returns VaultUnlockResult.InvalidStateError viewModel.trySendAction(VaultUnlockAction.UnlockClick) @@ -461,7 +461,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { viewModel.stateFlow.value, ) coVerify { - vaultRepository.unlockVaultWithPinAndSync(pin) + vaultRepository.unlockVaultWithPin(pin) } } @@ -474,7 +474,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { ) val viewModel = createViewModel(state = initialState) coEvery { - vaultRepository.unlockVaultWithPinAndSync(pin) + vaultRepository.unlockVaultWithPin(pin) } returns VaultUnlockResult.Success viewModel.trySendAction(VaultUnlockAction.UnlockClick) @@ -483,7 +483,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { viewModel.stateFlow.value, ) coVerify { - vaultRepository.unlockVaultWithPinAndSync(pin) + vaultRepository.unlockVaultWithPin(pin) } } @@ -497,7 +497,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { val resultFlow = bufferedMutableSharedFlow() val viewModel = createViewModel(state = initialState) coEvery { - vaultRepository.unlockVaultWithPinAndSync(pin) + vaultRepository.unlockVaultWithPin(pin) } coAnswers { resultFlow.first() } viewModel.trySendAction(VaultUnlockAction.UnlockClick) @@ -520,7 +520,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { viewModel.stateFlow.value, ) coVerify { - vaultRepository.unlockVaultWithPinAndSync(pin) + vaultRepository.unlockVaultWithPin(pin) } } 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 dafc6cfb50..a82ff5a7a2 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 @@ -69,14 +69,16 @@ class VaultViewModelTest : BaseViewModelTest() { every { vaultFilterType = any() } returns Unit every { vaultDataStateFlow } returns mutableVaultDataStateFlow every { sync() } just runs + every { syncIfNecessary() } just runs every { lockVaultForCurrentUser() } just runs every { lockVault(any()) } just runs } @Test - fun `initial state should be correct`() { + fun `initial state should be correct and should trigger a syncIfNecessary call`() { val viewModel = createViewModel() assertEquals(DEFAULT_STATE, viewModel.stateFlow.value) + verify { vaultRepository.syncIfNecessary() } } @Test