Add send data to VaultDataStateFlow (#553)

This commit is contained in:
David Perez 2024-01-09 13:18:40 -06:00 committed by Álison Fernandes
parent 70b5bdfe17
commit 84d8afd027
7 changed files with 71 additions and 2 deletions

View file

@ -1,5 +1,6 @@
package com.x8bit.bitwarden.data.platform.repository.util
import com.x8bit.bitwarden.data.platform.annotation.OmitFromCoverage
import com.x8bit.bitwarden.data.platform.repository.model.DataState
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
@ -115,6 +116,7 @@ fun <T1, T2, R> combineDataStates(
*
* See [combineDataStates] for details.
*/
@OmitFromCoverage
fun <T1, T2, T3, R> combineDataStates(
dataState1: DataState<T1>,
dataState2: DataState<T2>,
@ -127,11 +129,35 @@ fun <T1, T2, T3, R> combineDataStates(
transform(t1t2Pair.first, t1t2Pair.second, t3)
}
/**
* Combines the [dataState1], [dataState2], [dataState3], and [dataState4] [DataState]s together
* using the provided [transform].
*
* See [combineDataStates] for details.
*/
@OmitFromCoverage
fun <T1, T2, T3, T4, R> combineDataStates(
dataState1: DataState<T1>,
dataState2: DataState<T2>,
dataState3: DataState<T3>,
dataState4: DataState<T4>,
transform: (t1: T1, t2: T2, t3: T3, t4: T4) -> R,
): DataState<R> =
dataState1
.combineDataStatesWith(dataState2) { t1, t2 -> t1 to t2 }
.combineDataStatesWith(dataState3) { t1t2Pair, t3 ->
Triple(t1t2Pair.first, t1t2Pair.second, t3)
}
.combineDataStatesWith(dataState4) { t1t2t3Triple, t3 ->
transform(t1t2t3Triple.first, t1t2t3Triple.second, t1t2t3Triple.third, t3)
}
/**
* Combines [dataState2] with the given [DataState] using the provided [transform].
*
* See [combineDataStates] for details.
*/
@OmitFromCoverage
fun <T1, T2, R> DataState<T1>.combineDataStatesWith(
dataState2: DataState<T2>,
transform: (t1: T1, t2: T2) -> R,

View file

@ -107,16 +107,19 @@ class VaultRepositoryImpl(
ciphersStateFlow,
foldersStateFlow,
collectionsStateFlow,
) { ciphersDataState, foldersDataState, collectionsDataState ->
sendDataStateFlow,
) { ciphersDataState, foldersDataState, collectionsDataState, sendsDataState ->
combineDataStates(
ciphersDataState,
foldersDataState,
collectionsDataState,
) { ciphersData, foldersData, collectionsData ->
sendsDataState,
) { ciphersData, foldersData, collectionsData, sendsData ->
VaultData(
cipherViewList = ciphersData,
folderViewList = foldersData,
collectionViewList = collectionsData,
sendViewList = sendsData.sendViewList,
)
}
}

View file

@ -3,6 +3,7 @@ package com.x8bit.bitwarden.data.vault.repository.model
import com.bitwarden.core.CipherView
import com.bitwarden.core.CollectionView
import com.bitwarden.core.FolderView
import com.bitwarden.core.SendView
/**
* Represents decrypted vault data.
@ -10,9 +11,11 @@ import com.bitwarden.core.FolderView
* @param cipherViewList List of decrypted ciphers.
* @param collectionViewList List of decrypted collections.
* @param folderViewList List of decrypted folders.
* @param sendViewList List of decrypted sends.
*/
data class VaultData(
val cipherViewList: List<CipherView>,
val collectionViewList: List<CollectionView>,
val folderViewList: List<FolderView>,
val sendViewList: List<SendView>,
)

View file

@ -966,10 +966,12 @@ class VaultRepositoryTest {
val ciphersFlow = bufferedMutableSharedFlow<List<SyncResponseJson.Cipher>>()
val collectionsFlow = bufferedMutableSharedFlow<List<SyncResponseJson.Collection>>()
val foldersFlow = bufferedMutableSharedFlow<List<SyncResponseJson.Folder>>()
val sendsFlow = bufferedMutableSharedFlow<List<SyncResponseJson.Send>>()
setupVaultDiskSourceFlows(
ciphersFlow = ciphersFlow,
collectionsFlow = collectionsFlow,
foldersFlow = foldersFlow,
sendsFlow = sendsFlow,
)
vaultRepository.vaultDataStateFlow.test {
@ -978,6 +980,7 @@ class VaultRepositoryTest {
ciphersFlow.tryEmit(listOf(createMockCipher(number = 1)))
collectionsFlow.tryEmit(listOf(createMockCollection(number = 1)))
foldersFlow.tryEmit(listOf(createMockFolder(number = 1)))
sendsFlow.tryEmit(listOf(createMockSend(number = 1)))
assertEquals(
DataState.Loaded(
@ -985,6 +988,7 @@ class VaultRepositoryTest {
cipherViewList = listOf(createMockCipherView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
),
),
awaitItem(),

View file

@ -7,6 +7,7 @@ import com.x8bit.bitwarden.data.platform.repository.model.DataState
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCollectionView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockFolderView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSendView
import com.x8bit.bitwarden.data.vault.repository.VaultRepository
import com.x8bit.bitwarden.data.vault.repository.model.VaultData
import com.x8bit.bitwarden.ui.platform.base.BaseViewModelTest
@ -102,6 +103,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
),
folderViewList = listOf(createMockFolderView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
),
),
)
@ -129,6 +131,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
cipherViewList = emptyList(),
folderViewList = emptyList(),
collectionViewList = emptyList(),
sendViewList = emptyList(),
),
),
)
@ -148,6 +151,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
cipherViewList = listOf(createMockCipherView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
),
),
)
@ -180,6 +184,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = false)),
folderViewList = listOf(createMockFolderView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
),
),
)
@ -206,6 +211,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
cipherViewList = listOf(createMockCipherView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
),
),
)
@ -226,6 +232,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
cipherViewList = listOf(createMockCipherView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
),
),
)
@ -266,6 +273,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = false)),
folderViewList = listOf(createMockFolderView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
),
error = IllegalStateException(),
),
@ -293,6 +301,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
cipherViewList = emptyList(),
folderViewList = emptyList(),
collectionViewList = emptyList(),
sendViewList = emptyList(),
),
error = IllegalStateException(),
),
@ -316,6 +325,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = true)),
folderViewList = listOf(createMockFolderView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
),
error = IllegalStateException(),
),
@ -359,6 +369,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = false)),
folderViewList = listOf(createMockFolderView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
),
),
)
@ -385,6 +396,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
cipherViewList = emptyList(),
folderViewList = emptyList(),
collectionViewList = emptyList(),
sendViewList = emptyList(),
),
),
)
@ -407,6 +419,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = true)),
folderViewList = listOf(createMockFolderView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
),
),
)

View file

@ -12,6 +12,7 @@ import com.x8bit.bitwarden.data.platform.repository.model.Environment
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCollectionView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockFolderView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSendView
import com.x8bit.bitwarden.data.vault.repository.VaultRepository
import com.x8bit.bitwarden.data.vault.repository.model.VaultData
import com.x8bit.bitwarden.ui.platform.base.BaseViewModelTest
@ -321,6 +322,7 @@ class VaultViewModelTest : BaseViewModelTest() {
cipherViewList = listOf(createMockCipherView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
)
mutableVaultDataStateFlow.tryEmit(
value = DataState.Loaded(
@ -375,6 +377,7 @@ class VaultViewModelTest : BaseViewModelTest() {
cipherViewList = listOf(createMockCipherView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
),
),
)
@ -438,6 +441,7 @@ class VaultViewModelTest : BaseViewModelTest() {
cipherViewList = listOf(createMockCipherView(number = 1)),
collectionViewList = emptyList(),
folderViewList = emptyList(),
sendViewList = emptyList(),
),
),
)
@ -458,6 +462,7 @@ class VaultViewModelTest : BaseViewModelTest() {
cipherViewList = emptyList(),
collectionViewList = emptyList(),
folderViewList = emptyList(),
sendViewList = emptyList(),
),
),
)
@ -484,6 +489,7 @@ class VaultViewModelTest : BaseViewModelTest() {
cipherViewList = emptyList(),
collectionViewList = emptyList(),
folderViewList = emptyList(),
sendViewList = emptyList(),
),
)
@ -503,6 +509,7 @@ class VaultViewModelTest : BaseViewModelTest() {
cipherViewList = listOf(createMockCipherView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
),
),
)
@ -547,6 +554,7 @@ class VaultViewModelTest : BaseViewModelTest() {
cipherViewList = emptyList(),
collectionViewList = emptyList(),
folderViewList = emptyList(),
sendViewList = emptyList(),
),
),
)
@ -598,6 +606,7 @@ class VaultViewModelTest : BaseViewModelTest() {
cipherViewList = listOf(createMockCipherView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
),
),
)
@ -649,6 +658,7 @@ class VaultViewModelTest : BaseViewModelTest() {
cipherViewList = emptyList(),
collectionViewList = emptyList(),
folderViewList = emptyList(),
sendViewList = emptyList(),
),
),
)
@ -693,6 +703,7 @@ class VaultViewModelTest : BaseViewModelTest() {
cipherViewList = listOf(createMockCipherView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
),
),
)
@ -743,6 +754,7 @@ class VaultViewModelTest : BaseViewModelTest() {
cipherViewList = emptyList(),
collectionViewList = emptyList(),
folderViewList = emptyList(),
sendViewList = emptyList(),
),
),
)
@ -784,6 +796,7 @@ class VaultViewModelTest : BaseViewModelTest() {
cipherViewList = emptyList(),
collectionViewList = emptyList(),
folderViewList = emptyList(),
sendViewList = emptyList(),
),
)
@ -940,6 +953,7 @@ class VaultViewModelTest : BaseViewModelTest() {
cipherViewList = emptyList(),
collectionViewList = emptyList(),
folderViewList = emptyList(),
sendViewList = emptyList(),
),
)
val initialState = DEFAULT_STATE.copy(

View file

@ -3,6 +3,7 @@ package com.x8bit.bitwarden.ui.vault.feature.vault.util
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCollectionView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockFolderView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSendView
import com.x8bit.bitwarden.data.vault.repository.model.VaultData
import com.x8bit.bitwarden.ui.platform.base.util.asText
import com.x8bit.bitwarden.ui.vault.feature.vault.VaultState
@ -19,6 +20,7 @@ class VaultDataExtensionsTest {
cipherViewList = listOf(createMockCipherView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
)
val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.AllVaults)
@ -61,6 +63,7 @@ class VaultDataExtensionsTest {
),
collectionViewList = listOf(createMockCollectionView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
)
val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.MyVault)
@ -100,6 +103,7 @@ class VaultDataExtensionsTest {
createMockCollectionView(number = 2),
),
folderViewList = listOf(createMockFolderView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
)
val actual = vaultData.toViewState(
@ -137,6 +141,7 @@ class VaultDataExtensionsTest {
cipherViewList = emptyList(),
collectionViewList = emptyList(),
folderViewList = emptyList(),
sendViewList = emptyList(),
)
val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.AllVaults)
@ -153,6 +158,7 @@ class VaultDataExtensionsTest {
cipherViewList = listOf(createMockCipherView(number = 1).copy(id = null)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
sendViewList = listOf(createMockSendView(number = 1)),
)
val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.AllVaults)