mirror of
https://github.com/bitwarden/android.git
synced 2026-05-30 16:43:22 -05:00
BIT-1244: Implement dynamic vault filtering (#451)
This commit is contained in:
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user