From 9cc876364236565ff980e48bd998d4e589b80b0a Mon Sep 17 00:00:00 2001 From: Oleg Semenenko <146032743+oleg-livefront@users.noreply.github.com> Date: Mon, 22 Jan 2024 22:45:40 -0600 Subject: [PATCH] BIT-1400 Fixing the vault item count to not include trash items (#722) --- .../feature/vault/util/VaultDataExtensions.kt | 18 +++++++-- .../datasource/sdk/model/CipherViewUtil.kt | 2 +- .../VaultItemListingViewModelTest.kt | 6 +-- .../vault/util/VaultDataExtensionsTest.kt | 38 +++++++++++++++++++ .../VerificationCodeViewModelTest.kt | 6 +-- 5 files changed, 59 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt index 76649025a6..b16a01d433 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt @@ -19,13 +19,19 @@ private const val IOS_URI = "iosapp://" /** * Transforms [VaultData] into [VaultState.ViewState] using the given [vaultFilterType]. */ +@Suppress("LongMethod") fun VaultData.toViewState( isPremium: Boolean, isIconLoadingDisabled: Boolean, baseIconUrl: String, vaultFilterType: VaultFilterType, ): VaultState.ViewState { - val filteredCipherViewList = cipherViewList.toFilteredList(vaultFilterType) + + val filteredCipherViewListWithDeletedItems = + cipherViewList.toFilteredList(vaultFilterType) + + val filteredCipherViewList = filteredCipherViewListWithDeletedItems + .filter { it.deletedDate == null } val filteredFolderViewList = folderViewList.toFilteredList(vaultFilterType) val filteredCollectionViewList = collectionViewList.toFilteredList(vaultFilterType) @@ -56,7 +62,10 @@ fun VaultData.toViewState( id = folderView.id, name = folderView.name.asText(), itemCount = filteredCipherViewList - .count { !it.id.isNullOrBlank() && folderView.id == it.folderId }, + .count { + !it.id.isNullOrBlank() && + folderView.id == it.folderId + }, ) }, noFolderItems = filteredCipherViewList @@ -80,8 +89,9 @@ fun VaultData.toViewState( }, ) }, - // TODO need to populate trash item count in BIT-969 - trashItemsCount = 0, + trashItemsCount = filteredCipherViewListWithDeletedItems.count { + it.deletedDate != null + }, ) } } diff --git a/app/src/test/java/com/x8bit/bitwarden/data/vault/datasource/sdk/model/CipherViewUtil.kt b/app/src/test/java/com/x8bit/bitwarden/data/vault/datasource/sdk/model/CipherViewUtil.kt index 9007af3deb..49635aeb54 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/vault/datasource/sdk/model/CipherViewUtil.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/vault/datasource/sdk/model/CipherViewUtil.kt @@ -25,7 +25,7 @@ import java.time.ZonedDateTime */ fun createMockCipherView( number: Int, - isDeleted: Boolean = true, + isDeleted: Boolean = false, cipherType: CipherType = CipherType.LOGIN, ): CipherView = CipherView( diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt index 8368c38c93..cfec78426e 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt @@ -414,7 +414,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { runTest { val dataState = DataState.Loaded( data = VaultData( - cipherViewList = listOf(createMockCipherView(number = 1)), + cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = true)), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), sendViewList = listOf(createMockSendView(number = 1)), @@ -480,7 +480,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { mutableVaultDataStateFlow.tryEmit( value = DataState.Pending( data = VaultData( - cipherViewList = listOf(createMockCipherView(number = 1)), + cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = true)), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), sendViewList = listOf(createMockSendView(number = 1)), @@ -501,7 +501,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { mutableVaultDataStateFlow.tryEmit( value = DataState.Pending( data = VaultData( - cipherViewList = listOf(createMockCipherView(number = 1)), + cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = true)), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), sendViewList = listOf(createMockSendView(number = 1)), diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt index ee61694be6..fb3ba27a69 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt @@ -381,4 +381,42 @@ class VaultDataExtensionsTest { unmockkStatic(Uri::class) } + + @Suppress("MaxLineLength") + @Test + fun `toViewState should only count deleted items for the trash count`() { + val vaultData = VaultData( + cipherViewList = listOf( + createMockCipherView(number = 1, isDeleted = true), + createMockCipherView(number = 2, isDeleted = true), + createMockCipherView(number = 3, isDeleted = false), + ), + collectionViewList = listOf(), + folderViewList = listOf(), + sendViewList = listOf(), + ) + + val actual = vaultData.toViewState( + isPremium = true, + isIconLoadingDisabled = false, + baseIconUrl = Environment.Us.environmentUrlData.baseIconUrl, + vaultFilterType = VaultFilterType.AllVaults, + ) + + assertEquals( + VaultState.ViewState.Content( + loginItemsCount = 1, + cardItemsCount = 0, + identityItemsCount = 0, + secureNoteItemsCount = 0, + favoriteItems = listOf(), + folderItems = listOf(), + collectionItems = listOf(), + noFolderItems = listOf(), + trashItemsCount = 2, + totpItemsCount = 1, + ), + actual, + ) + } } diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeViewModelTest.kt index d238b166f6..ccc1671d12 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeViewModelTest.kt @@ -207,7 +207,7 @@ class VerificationCodeViewModelTest : BaseViewModelTest() { runTest { val dataState = DataState.Pending( data = VaultData( - cipherViewList = listOf(createMockCipherView(number = 1)), + cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = true)), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), sendViewList = listOf(createMockSendView(number = 1)), @@ -226,7 +226,7 @@ class VerificationCodeViewModelTest : BaseViewModelTest() { fun `vaultDataStateFlow Pending with trash data should call NavigateBack event`() = runTest { val dataState = DataState.Pending( data = VaultData( - cipherViewList = listOf(createMockCipherView(number = 1)), + cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = true)), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), sendViewList = listOf(createMockSendView(number = 1)), @@ -454,7 +454,7 @@ class VerificationCodeViewModelTest : BaseViewModelTest() { runTest { val dataState = DataState.Loaded( data = VaultData( - cipherViewList = listOf(createMockCipherView(number = 1)), + cipherViewList = listOf(createMockCipherView(number = 1, isDeleted = true)), folderViewList = listOf(createMockFolderView(number = 1)), collectionViewList = listOf(createMockCollectionView(number = 1)), sendViewList = listOf(createMockSendView(number = 1)),