BIT-1244: Implement dynamic vault filtering (#451)

This commit is contained in:
Brian Yencho
2023-12-29 09:21:43 -06:00
committed by GitHub
parent 3ba6fa4f0f
commit b5fe7a560f
4 changed files with 202 additions and 49 deletions

View File

@@ -19,6 +19,7 @@ import com.x8bit.bitwarden.ui.platform.base.util.asText
import com.x8bit.bitwarden.ui.platform.components.model.AccountSummary
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterData
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType
import com.x8bit.bitwarden.ui.vault.feature.vault.util.toViewState
import com.x8bit.bitwarden.ui.vault.model.VaultItemListingType
import io.mockk.every
import io.mockk.just
@@ -306,14 +307,19 @@ class VaultViewModelTest : BaseViewModelTest() {
}
}
@Suppress("MaxLineLength")
@Test
fun `on VaultFilterTypeSelect should update the selected filter type`() {
val viewModel = createViewModel()
// Update to state with filters
val initialState = DEFAULT_STATE.copy(
appBarTitle = R.string.vaults.asText(),
vaultFilterData = VAULT_FILTER_DATA,
fun `on VaultFilterTypeSelect should update the selected filter type and re-filter any existing data`() {
// Update to state with filters and content
val vaultData = VaultData(
cipherViewList = listOf(createMockCipherView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
)
mutableVaultDataStateFlow.tryEmit(
value = DataState.Loaded(
data = vaultData,
),
)
mutableUserStateFlow.value = DEFAULT_USER_STATE
.copy(
@@ -329,6 +335,14 @@ class VaultViewModelTest : BaseViewModelTest() {
DEFAULT_USER_STATE.accounts[1],
),
)
val viewModel = createViewModel()
val initialState = createMockVaultState(
viewState = vaultData.toViewState(VaultFilterType.AllVaults),
)
.copy(
appBarTitle = R.string.vaults.asText(),
vaultFilterData = VAULT_FILTER_DATA,
)
assertEquals(
initialState,
viewModel.stateFlow.value,
@@ -341,6 +355,7 @@ class VaultViewModelTest : BaseViewModelTest() {
vaultFilterData = VAULT_FILTER_DATA.copy(
selectedVaultFilterType = VaultFilterType.MyVault,
),
viewState = vaultData.toViewState(VaultFilterType.MyVault),
),
viewModel.stateFlow.value,
)

View File

@@ -19,6 +19,7 @@ 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.additem.VaultAddItemState
import com.x8bit.bitwarden.ui.vault.feature.vault.VaultState
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType
import com.x8bit.bitwarden.ui.vault.model.VaultLinkedFieldType
import io.mockk.every
import io.mockk.mockkStatic
@@ -36,15 +37,16 @@ class VaultDataExtensionsTest {
unmockkStatic(Instant::class)
}
@Suppress("MaxLineLength")
@Test
fun `toViewState should transform full VaultData into ViewState Content`() {
fun `toViewState for AllVaults should transform full VaultData into ViewState Content without filtering`() {
val vaultData = VaultData(
cipherViewList = listOf(createMockCipherView(number = 1)),
collectionViewList = listOf(createMockCollectionView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
)
val actual = vaultData.toViewState()
val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.AllVaults)
assertEquals(
VaultState.ViewState.Content(
@@ -74,6 +76,86 @@ class VaultDataExtensionsTest {
)
}
@Suppress("MaxLineLength")
@Test
fun `toViewState for MyVault should transform full VaultData into ViewState Content with filtering of non-user data`() {
val vaultData = VaultData(
cipherViewList = listOf(
createMockCipherView(number = 1).copy(organizationId = null),
createMockCipherView(number = 2),
),
collectionViewList = listOf(createMockCollectionView(number = 1)),
folderViewList = listOf(createMockFolderView(number = 1)),
)
val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.MyVault)
assertEquals(
VaultState.ViewState.Content(
loginItemsCount = 1,
cardItemsCount = 0,
identityItemsCount = 0,
secureNoteItemsCount = 0,
favoriteItems = listOf(),
folderItems = listOf(
VaultState.ViewState.FolderItem(
id = "mockId-1",
name = "mockName-1".asText(),
itemCount = 1,
),
),
collectionItems = listOf(),
noFolderItems = listOf(),
trashItemsCount = 0,
),
actual,
)
}
@Suppress("MaxLineLength")
@Test
fun `toViewState for OrganizationVault should transform full VaultData into ViewState Content with filtering of non-organization data`() {
val vaultData = VaultData(
cipherViewList = listOf(
createMockCipherView(number = 1),
createMockCipherView(number = 2),
),
collectionViewList = listOf(
createMockCollectionView(number = 1),
createMockCollectionView(number = 2),
),
folderViewList = listOf(createMockFolderView(number = 1)),
)
val actual = vaultData.toViewState(
vaultFilterType = VaultFilterType.OrganizationVault(
organizationId = "mockOrganizationId-1",
organizationName = "Mock Organization 1",
),
)
assertEquals(
VaultState.ViewState.Content(
loginItemsCount = 1,
cardItemsCount = 0,
identityItemsCount = 0,
secureNoteItemsCount = 0,
favoriteItems = listOf(),
folderItems = listOf(),
collectionItems = listOf(
VaultState.ViewState.CollectionItem(
id = "mockId-1",
name = "mockName-1",
itemCount = 1,
),
),
noFolderItems = listOf(),
trashItemsCount = 0,
),
actual,
)
}
@Test
fun `toViewState should transform empty VaultData into ViewState NoItems`() {
val vaultData = VaultData(
@@ -82,7 +164,7 @@ class VaultDataExtensionsTest {
folderViewList = emptyList(),
)
val actual = vaultData.toViewState()
val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.AllVaults)
assertEquals(
VaultState.ViewState.NoItems,
@@ -98,32 +180,10 @@ class VaultDataExtensionsTest {
folderViewList = listOf(createMockFolderView(number = 1)),
)
val actual = vaultData.toViewState()
val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.AllVaults)
assertEquals(
VaultState.ViewState.Content(
loginItemsCount = 0,
cardItemsCount = 0,
identityItemsCount = 0,
secureNoteItemsCount = 0,
favoriteItems = emptyList(),
folderItems = listOf(
VaultState.ViewState.FolderItem(
id = "mockId-1",
name = "mockName-1".asText(),
itemCount = 0,
),
),
collectionItems = listOf(
VaultState.ViewState.CollectionItem(
id = "mockId-1",
name = "mockName-1",
itemCount = 0,
),
),
noFolderItems = emptyList(),
trashItemsCount = 0,
),
VaultState.ViewState.NoItems,
actual,
)
}