BIT-406: Allow item listing screen to display Collections data (#394)

This commit is contained in:
Brian Yencho
2023-12-14 15:38:46 -06:00
committed by GitHub
parent 136d62b41e
commit 240e47c161
10 changed files with 129 additions and 18 deletions

View File

@@ -421,6 +421,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
)
}
@Suppress("CyclomaticComplexMethod")
private fun createSavedStateHandleWithVaultItemListingType(
vaultItemListingType: VaultItemListingType,
) = SavedStateHandle().apply {
@@ -428,6 +429,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
"vault_item_listing_type",
when (vaultItemListingType) {
is VaultItemListingType.Card -> "card"
is VaultItemListingType.Collection -> "collection"
is VaultItemListingType.Folder -> "folder"
is VaultItemListingType.Identity -> "identity"
is VaultItemListingType.Login -> "login"
@@ -439,6 +441,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
"id",
when (vaultItemListingType) {
is VaultItemListingType.Card -> null
is VaultItemListingType.Collection -> vaultItemListingType.collectionId
is VaultItemListingType.Folder -> vaultItemListingType.folderId
is VaultItemListingType.Identity -> null
is VaultItemListingType.Login -> null

View File

@@ -2,6 +2,7 @@ package com.x8bit.bitwarden.ui.vault.feature.itemlisting.util
import com.bitwarden.core.CipherType
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.ui.vault.feature.itemlisting.VaultItemListingState
import org.junit.Assert.assertEquals
@@ -25,6 +26,7 @@ class VaultItemListingDataExtensionsTest {
VaultItemListingState.ItemListingType.Identity to false,
VaultItemListingState.ItemListingType.Trash to false,
VaultItemListingState.ItemListingType.Folder(folderId = "mockId-1") to true,
VaultItemListingState.ItemListingType.Collection(collectionId = "mockId-1") to true,
)
.forEach { (type, expected) ->
val result = cipherView.determineListingPredicate(
@@ -53,6 +55,7 @@ class VaultItemListingDataExtensionsTest {
VaultItemListingState.ItemListingType.Identity to false,
VaultItemListingState.ItemListingType.Trash to true,
VaultItemListingState.ItemListingType.Folder(folderId = "mockId-1") to false,
VaultItemListingState.ItemListingType.Collection(collectionId = "mockId-1") to false,
)
.forEach { (type, expected) ->
val result = cipherView.determineListingPredicate(
@@ -81,6 +84,7 @@ class VaultItemListingDataExtensionsTest {
VaultItemListingState.ItemListingType.Identity to false,
VaultItemListingState.ItemListingType.Trash to false,
VaultItemListingState.ItemListingType.Folder(folderId = "mockId-1") to true,
VaultItemListingState.ItemListingType.Collection(collectionId = "mockId-1") to true,
)
.forEach { (type, expected) ->
val result = cipherView.determineListingPredicate(
@@ -109,6 +113,7 @@ class VaultItemListingDataExtensionsTest {
VaultItemListingState.ItemListingType.Identity to false,
VaultItemListingState.ItemListingType.Trash to true,
VaultItemListingState.ItemListingType.Folder(folderId = "mockId-1") to false,
VaultItemListingState.ItemListingType.Collection(collectionId = "mockId-1") to false,
)
.forEach { (type, expected) ->
val result = cipherView.determineListingPredicate(
@@ -137,6 +142,7 @@ class VaultItemListingDataExtensionsTest {
VaultItemListingState.ItemListingType.Identity to true,
VaultItemListingState.ItemListingType.Trash to false,
VaultItemListingState.ItemListingType.Folder(folderId = "mockId-1") to true,
VaultItemListingState.ItemListingType.Collection(collectionId = "mockId-1") to true,
)
.forEach { (type, expected) ->
val result = cipherView.determineListingPredicate(
@@ -165,6 +171,7 @@ class VaultItemListingDataExtensionsTest {
VaultItemListingState.ItemListingType.Identity to false,
VaultItemListingState.ItemListingType.Trash to true,
VaultItemListingState.ItemListingType.Folder(folderId = "mockId-1") to false,
VaultItemListingState.ItemListingType.Collection(collectionId = "mockId-1") to false,
)
.forEach { (type, expected) ->
val result = cipherView.determineListingPredicate(
@@ -193,6 +200,7 @@ class VaultItemListingDataExtensionsTest {
VaultItemListingState.ItemListingType.Identity to false,
VaultItemListingState.ItemListingType.Trash to false,
VaultItemListingState.ItemListingType.Folder(folderId = "mockId-1") to true,
VaultItemListingState.ItemListingType.Collection(collectionId = "mockId-1") to true,
)
.forEach { (type, expected) ->
val result = cipherView.determineListingPredicate(
@@ -221,6 +229,7 @@ class VaultItemListingDataExtensionsTest {
VaultItemListingState.ItemListingType.Identity to false,
VaultItemListingState.ItemListingType.Trash to true,
VaultItemListingState.ItemListingType.Folder(folderId = "mockId-1") to false,
VaultItemListingState.ItemListingType.Collection(collectionId = "mockId-1") to false,
)
.forEach { (type, expected) ->
val result = cipherView.determineListingPredicate(
@@ -292,12 +301,20 @@ class VaultItemListingDataExtensionsTest {
createMockFolderView(number = 2),
createMockFolderView(number = 3),
)
val collectionViewList = listOf(
createMockCollectionView(number = 1),
createMockCollectionView(number = 2),
createMockCollectionView(number = 3),
)
val result = VaultItemListingState.ItemListingType.Folder(
folderId = "mockId-1",
folderName = "wrong name",
)
.updateWithAdditionalDataIfNecessary(folderList = folderViewList)
.updateWithAdditionalDataIfNecessary(
folderList = folderViewList,
collectionList = collectionViewList,
)
assertEquals(
VaultItemListingState.ItemListingType.Folder(
@@ -309,15 +326,55 @@ class VaultItemListingDataExtensionsTest {
}
@Test
fun `updateWithAdditionalDataIfNecessary should not change a non folder itemListingType`() {
fun `updateWithAdditionalDataIfNecessary should update a collection itemListingType`() {
val folderViewList = listOf(
createMockFolderView(number = 1),
createMockFolderView(number = 2),
createMockFolderView(number = 3),
)
val collectionViewList = listOf(
createMockCollectionView(number = 1),
createMockCollectionView(number = 2),
createMockCollectionView(number = 3),
)
val result = VaultItemListingState.ItemListingType.Collection(
collectionId = "mockId-1",
collectionName = "wrong name",
)
.updateWithAdditionalDataIfNecessary(
folderList = folderViewList,
collectionList = collectionViewList,
)
assertEquals(
VaultItemListingState.ItemListingType.Collection(
collectionId = "mockId-1",
collectionName = "mockName-1",
),
result,
)
}
@Suppress("MaxLineLength")
@Test
fun `updateWithAdditionalDataIfNecessary should not change a non-folder or non-collection itemListingType`() {
val folderViewList = listOf(
createMockFolderView(number = 1),
createMockFolderView(number = 2),
createMockFolderView(number = 3),
)
val collectionViewList = listOf(
createMockCollectionView(number = 1),
createMockCollectionView(number = 2),
createMockCollectionView(number = 3),
)
val result = VaultItemListingState.ItemListingType.Login
.updateWithAdditionalDataIfNecessary(folderList = folderViewList)
.updateWithAdditionalDataIfNecessary(
folderList = folderViewList,
collectionList = collectionViewList,
)
assertEquals(
VaultItemListingState.ItemListingType.Login,

View File

@@ -13,6 +13,7 @@ class VaultItemListingTypeExtensionsTest {
val itemListingTypeList = listOf(
VaultItemListingType.Folder(folderId = "mock"),
VaultItemListingType.Trash,
VaultItemListingType.Collection(collectionId = "collectionId"),
)
val result = itemListingTypeList.map { it.toItemListingType() }
@@ -21,6 +22,7 @@ class VaultItemListingTypeExtensionsTest {
listOf(
VaultItemListingState.ItemListingType.Folder(folderId = "mock"),
VaultItemListingState.ItemListingType.Trash,
VaultItemListingState.ItemListingType.Collection(collectionId = "collectionId"),
),
result,
)

View File

@@ -594,21 +594,23 @@ class VaultViewModelTest : BaseViewModelTest() {
}
}
@Suppress("MaxLineLength")
@Test
fun `CollectionClick should emit ShowToast`() = runTest {
val viewModel = createViewModel()
val collectionId = "12345"
val collection = mockk<VaultState.ViewState.CollectionItem> {
every { id } returns collectionId
fun `CollectionClick should emit NavigateToItemListing event with Collection type with the correct collection ID`() =
runTest {
val viewModel = createViewModel()
val collectionId = "12345"
val collection = mockk<VaultState.ViewState.CollectionItem> {
every { id } returns collectionId
}
viewModel.eventFlow.test {
viewModel.trySendAction(VaultAction.CollectionClick(collection))
assertEquals(
VaultEvent.NavigateToItemListing(VaultItemListingType.Collection(collectionId)),
awaitItem(),
)
}
}
viewModel.eventFlow.test {
viewModel.trySendAction(VaultAction.CollectionClick(collection))
assertEquals(
VaultEvent.ShowToast(message = "Not yet implemented."),
awaitItem(),
)
}
}
@Test
fun `IdentityGroupClick should emit NavigateToItemListing event with Identity type`() =