From ecebb7ad25f967f611f1404f5eaaec07054b94d8 Mon Sep 17 00:00:00 2001 From: David Perez Date: Mon, 6 Apr 2026 16:05:18 -0500 Subject: [PATCH] Add 'isActive' extension menthods for CipherView and CipherListView --- .../provider/AutofillCipherProviderImpl.kt | 13 ++-- .../autofill/util/CipherListViewExtensions.kt | 7 +-- .../autofill/util/CipherViewExtensions.kt | 7 +-- .../manager/PremiumStateManagerImpl.kt | 3 +- .../platform/util/CipherListViewExtensions.kt | 9 +++ .../platform/util/CipherViewExtensions.kt | 6 ++ .../vault/repository/VaultRepositoryImpl.kt | 4 +- .../search/util/SearchTypeDataExtensions.kt | 47 ++++----------- .../reviewexport/ReviewExportViewModel.kt | 5 +- .../vault/feature/item/VaultItemViewModel.kt | 3 +- .../util/VaultItemListingDataExtensions.kt | 17 +++--- .../feature/util/CipherListViewExtensions.kt | 5 +- .../feature/vault/util/VaultDataExtensions.kt | 5 +- .../util/CipherListViewExtensionsTest.kt | 59 +++++++++++++++++++ .../platform/util/CipherViewExtensionsTest.kt | 59 +++++++++++++++++++ 15 files changed, 176 insertions(+), 73 deletions(-) create mode 100644 app/src/main/kotlin/com/x8bit/bitwarden/data/platform/util/CipherListViewExtensions.kt create mode 100644 app/src/test/kotlin/com/x8bit/bitwarden/data/platform/util/CipherListViewExtensionsTest.kt create mode 100644 app/src/test/kotlin/com/x8bit/bitwarden/data/platform/util/CipherViewExtensionsTest.kt diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/provider/AutofillCipherProviderImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/provider/AutofillCipherProviderImpl.kt index 704b01bc80b..1b92bc05920 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/provider/AutofillCipherProviderImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/provider/AutofillCipherProviderImpl.kt @@ -10,6 +10,7 @@ import com.x8bit.bitwarden.data.autofill.model.AutofillCipher import com.x8bit.bitwarden.data.platform.manager.PolicyManager import com.x8bit.bitwarden.data.platform.manager.ciphermatching.CipherMatchingManager import com.x8bit.bitwarden.data.platform.util.firstWithTimeoutOrNull +import com.x8bit.bitwarden.data.platform.util.isActive import com.x8bit.bitwarden.data.platform.util.subtitle import com.x8bit.bitwarden.data.vault.manager.model.GetCipherResult import com.x8bit.bitwarden.data.vault.repository.VaultRepository @@ -66,10 +67,8 @@ class AutofillCipherProviderImpl( .takeIf { // Must be card type. it.type is CipherListViewType.Card && - // Must not be deleted. - it.deletedDate == null && - // Must not be archived. - it.archivedDate == null && + // Must still be active. + it.isActive && // Must not require a reprompt. it.reprompt == CipherRepromptType.NONE && // Must not be restricted by organization. @@ -106,10 +105,8 @@ class AutofillCipherProviderImpl( .filter { // Must be login type it.type is CipherListViewType.Login && - // Must not be deleted. - it.deletedDate == null && - // Must not be archived. - it.archivedDate == null && + // Must still be active. + it.isActive && // Must not require a reprompt. it.reprompt == CipherRepromptType.NONE } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherListViewExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherListViewExtensions.kt index 96a43ef05b4..a8015cec9e4 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherListViewExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherListViewExtensions.kt @@ -5,21 +5,20 @@ import com.bitwarden.vault.CipherListView import com.bitwarden.vault.CipherListViewType import com.bitwarden.vault.CopyableCipherFields import com.bitwarden.vault.LoginListView +import com.x8bit.bitwarden.data.platform.util.isActive /** * Returns true when the cipher is not archived, not deleted and contains at least one FIDO 2 * credential. */ val CipherListView.isActiveWithFido2Credentials: Boolean - get() = archivedDate == null && deletedDate == null && login?.hasFido2 ?: false + get() = isActive && login?.hasFido2 ?: false /** * Returns true when the cipher type is not archived, not deleted and contains a copyable password. */ val CipherListView.isActiveWithCopyablePassword: Boolean - get() = archivedDate == null && - deletedDate == null && - copyableFields.contains(CopyableCipherFields.LOGIN_PASSWORD) + get() = isActive && copyableFields.contains(CopyableCipherFields.LOGIN_PASSWORD) /** * Returns the [LoginListView] if the cipher is of type [CipherListViewType.Login], otherwise null. diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherViewExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherViewExtensions.kt index 2e829a5432e..34e5d22d393 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherViewExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/CipherViewExtensions.kt @@ -3,6 +3,7 @@ package com.x8bit.bitwarden.data.autofill.util import com.bitwarden.vault.CipherView import com.x8bit.bitwarden.data.autofill.model.AutofillCipher import com.x8bit.bitwarden.data.autofill.provider.AutofillCipherProvider +import com.x8bit.bitwarden.data.platform.util.isActive import com.x8bit.bitwarden.data.platform.util.subtitle /** @@ -52,13 +53,11 @@ fun CipherView.toAutofillCipherProvider(): AutofillCipherProvider = * credential. */ val CipherView.isActiveWithFido2Credentials: Boolean - get() = archivedDate == null && - deletedDate == null && - !(login?.fido2Credentials.isNullOrEmpty()) + get() = isActive && !(login?.fido2Credentials.isNullOrEmpty()) /** * Returns true when the cipher is not archived, not deleted and contains at least one Password * credential. */ val CipherView.isActiveWithPasswordCredentials: Boolean - get() = archivedDate == null && deletedDate == null && !(login?.password.isNullOrEmpty()) + get() = isActive && !(login?.password.isNullOrEmpty()) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManagerImpl.kt index 2a02f85a7ae..31af9155308 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/billing/manager/PremiumStateManagerImpl.kt @@ -9,6 +9,7 @@ import com.x8bit.bitwarden.data.auth.repository.util.activeUserIdChangesFlow import com.x8bit.bitwarden.data.billing.repository.BillingRepository import com.x8bit.bitwarden.data.platform.datasource.disk.SettingsDiskSource import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager +import com.x8bit.bitwarden.data.platform.util.isActive import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.data.vault.repository.model.VaultData import kotlinx.coroutines.CoroutineScope @@ -116,7 +117,7 @@ private fun DataState.activeVaultItemCount(): Int = data ?.decryptCipherListResult ?.successes - ?.count { it.deletedDate == null && it.archivedDate == null } + ?.count { it.isActive } ?: 0 private const val PREMIUM_UPGRADE_MINIMUM_VAULT_ITEMS: Int = 5 diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/util/CipherListViewExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/util/CipherListViewExtensions.kt new file mode 100644 index 00000000000..6c768af3d49 --- /dev/null +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/util/CipherListViewExtensions.kt @@ -0,0 +1,9 @@ +package com.x8bit.bitwarden.data.platform.util + +import com.bitwarden.vault.CipherListView + +/** + * Indicates if this [CipherListView] is active based on its deleted or archived status. + */ +val CipherListView.isActive: Boolean + get() = this.archivedDate == null && this.deletedDate == null diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/util/CipherViewExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/util/CipherViewExtensions.kt index 9f451a7aba9..90cef6b85af 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/util/CipherViewExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/util/CipherViewExtensions.kt @@ -15,6 +15,12 @@ private const val AMEX_DIGITS_DISPLAYED: Int = 5 */ private const val CARD_DIGITS_DISPLAYED: Int = 4 +/** + * Indicates if this [CipherView] is active based on its deleted or archived status. + */ +val CipherView.isActive: Boolean + get() = this.archivedDate == null && this.deletedDate == null + /** * The subtitle for a [CipherView] used to give extra information about a particular instance. */ diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt index e4605741ef7..d1b1a71fbbb 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt @@ -22,6 +22,7 @@ import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.repository.util.toSdkParams import com.x8bit.bitwarden.data.autofill.util.login import com.x8bit.bitwarden.data.platform.error.NoActiveUserException +import com.x8bit.bitwarden.data.platform.util.isActive import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource import com.x8bit.bitwarden.data.vault.manager.CipherManager @@ -191,8 +192,7 @@ class VaultRepositoryImpl( .filter { it.type is CipherListViewType.Login && !it.login?.totp.isNullOrBlank() && - it.deletedDate == null && - it.archivedDate == null + it.isActive } .toFilteredList(vaultFilterType) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensions.kt index 8a0c2bf4266..9dd7955d87a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensions.kt @@ -20,6 +20,7 @@ import com.bitwarden.vault.CipherView import com.bitwarden.vault.FolderView import com.x8bit.bitwarden.data.autofill.util.isActiveWithFido2Credentials import com.x8bit.bitwarden.data.autofill.util.login +import com.x8bit.bitwarden.data.platform.util.isActive import com.x8bit.bitwarden.ui.platform.feature.search.SearchState import com.x8bit.bitwarden.ui.platform.feature.search.SearchTypeData import com.x8bit.bitwarden.ui.platform.feature.search.model.AutofillSelectionOption @@ -111,46 +112,20 @@ private fun CipherListView.filterBySearchType( searchTypeData: SearchTypeData.Vault, ): Boolean = when (searchTypeData) { - SearchTypeData.Vault.All -> deletedDate == null && archivedDate == null + SearchTypeData.Vault.All -> isActive SearchTypeData.Vault.Archive -> archivedDate != null && deletedDate == null - is SearchTypeData.Vault.Cards -> { - type is CipherListViewType.Card && deletedDate == null && archivedDate == null - } - + is SearchTypeData.Vault.Cards -> type is CipherListViewType.Card && isActive is SearchTypeData.Vault.Collection -> { - searchTypeData.collectionId in this.collectionIds && - deletedDate == null && - archivedDate == null - } - - is SearchTypeData.Vault.Folder -> { - folderId == searchTypeData.folderId && deletedDate == null && archivedDate == null - } - - SearchTypeData.Vault.NoFolder -> { - folderId == null && deletedDate == null && archivedDate == null - } - - is SearchTypeData.Vault.Identities -> { - type is CipherListViewType.Identity && deletedDate == null && archivedDate == null - } - - is SearchTypeData.Vault.Logins -> { - type is CipherListViewType.Login && deletedDate == null && archivedDate == null - } - - is SearchTypeData.Vault.SecureNotes -> { - type is CipherListViewType.SecureNote && deletedDate == null && archivedDate == null - } - - is SearchTypeData.Vault.SshKeys -> { - type is CipherListViewType.SshKey && deletedDate == null && archivedDate == null - } - - is SearchTypeData.Vault.VerificationCodes -> { - login?.totp != null && deletedDate == null && archivedDate == null + searchTypeData.collectionId in this.collectionIds && isActive } + is SearchTypeData.Vault.Folder -> folderId == searchTypeData.folderId && isActive + SearchTypeData.Vault.NoFolder -> folderId == null && isActive + is SearchTypeData.Vault.Identities -> type is CipherListViewType.Identity && isActive + is SearchTypeData.Vault.Logins -> type is CipherListViewType.Login && isActive + is SearchTypeData.Vault.SecureNotes -> type is CipherListViewType.SecureNote && isActive + is SearchTypeData.Vault.SshKeys -> type is CipherListViewType.SshKey && isActive + is SearchTypeData.Vault.VerificationCodes -> login?.totp != null && isActive is SearchTypeData.Vault.Trash -> deletedDate != null } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/reviewexport/ReviewExportViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/reviewexport/ReviewExportViewModel.kt index 16a4ae0b121..43b86c8aabd 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/reviewexport/ReviewExportViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/reviewexport/ReviewExportViewModel.kt @@ -23,6 +23,7 @@ import com.x8bit.bitwarden.data.autofill.util.isActiveWithFido2Credentials import com.x8bit.bitwarden.data.platform.manager.PolicyManager import com.x8bit.bitwarden.data.platform.manager.SpecialCircumstanceManager import com.x8bit.bitwarden.data.platform.manager.util.toImportCredentialsRequestDataOrNull +import com.x8bit.bitwarden.data.platform.util.isActive import com.x8bit.bitwarden.data.vault.repository.VaultRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.launchIn @@ -94,7 +95,7 @@ class ReviewExportViewModel @Inject constructor( .value .data ?.successes - ?.filter { it.deletedDate == null && it.archivedDate == null } + ?.filter { it.isActive } .filterRestrictedItemsIfNecessary(), ) .fold( @@ -241,7 +242,7 @@ class ReviewExportViewModel @Inject constructor( var secureNoteItemCount = 0 this@toItemTypeCounts ?.successes - ?.filter { it.deletedDate == null && it.archivedDate == null } + ?.filter { it.isActive } .orEmpty() .forEach { when { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt index acf2e02b629..a0bb049de2a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt @@ -33,6 +33,7 @@ import com.x8bit.bitwarden.data.platform.manager.event.OrganizationEventManager import com.x8bit.bitwarden.data.platform.manager.model.OrganizationEvent import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository import com.x8bit.bitwarden.data.platform.repository.SettingsRepository +import com.x8bit.bitwarden.data.platform.util.isActive import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.data.vault.repository.model.ArchiveCipherResult import com.x8bit.bitwarden.data.vault.repository.model.DeleteCipherResult @@ -1516,7 +1517,7 @@ data class VaultItemState( viewState.asContentOrNull() ?.common ?.currentCipher - ?.let { it.archivedDate == null && it.deletedDate == null } == true + ?.isActive == true /** * Helper to determine if the UI should display the unarchive button. diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensions.kt index 7d605df6911..2256ac61f5a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensions.kt @@ -22,6 +22,7 @@ import com.x8bit.bitwarden.data.autofill.model.AutofillSelectionData import com.x8bit.bitwarden.data.autofill.util.isActiveWithFido2Credentials import com.x8bit.bitwarden.data.autofill.util.login import com.x8bit.bitwarden.data.credentials.model.CreateCredentialRequest +import com.x8bit.bitwarden.data.platform.util.isActive import com.x8bit.bitwarden.data.vault.repository.model.VaultData import com.x8bit.bitwarden.data.vault.repository.util.toFailureCipherListView import com.x8bit.bitwarden.ui.tools.feature.send.util.toLabelIcons @@ -50,33 +51,31 @@ fun CipherListView.determineListingPredicate( ): Boolean = when (itemListingType) { is VaultItemListingState.ItemListingType.Vault.Card -> { - type is CipherListViewType.Card && deletedDate == null && archivedDate == null + type is CipherListViewType.Card && isActive } is VaultItemListingState.ItemListingType.Vault.Collection -> { - itemListingType.collectionId in this.collectionIds && - deletedDate == null && - archivedDate == null + itemListingType.collectionId in this.collectionIds && isActive } is VaultItemListingState.ItemListingType.Vault.Folder -> { - folderId == itemListingType.folderId && deletedDate == null && archivedDate == null + folderId == itemListingType.folderId && isActive } is VaultItemListingState.ItemListingType.Vault.Identity -> { - type is CipherListViewType.Identity && deletedDate == null && archivedDate == null + type is CipherListViewType.Identity && isActive } is VaultItemListingState.ItemListingType.Vault.Login -> { - type is CipherListViewType.Login && deletedDate == null && archivedDate == null + type is CipherListViewType.Login && isActive } is VaultItemListingState.ItemListingType.Vault.SecureNote -> { - type is CipherListViewType.SecureNote && deletedDate == null && archivedDate == null + type is CipherListViewType.SecureNote && isActive } is VaultItemListingState.ItemListingType.Vault.SshKey -> { - type is CipherListViewType.SshKey && deletedDate == null && archivedDate == null + type is CipherListViewType.SshKey && isActive } is VaultItemListingState.ItemListingType.Vault.Trash -> { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/util/CipherListViewExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/util/CipherListViewExtensions.kt index 06f531b2c32..7f3974a33d8 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/util/CipherListViewExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/util/CipherListViewExtensions.kt @@ -6,6 +6,7 @@ import com.bitwarden.vault.CipherListViewType import com.bitwarden.vault.CipherView import com.bitwarden.vault.CopyableCipherFields import com.x8bit.bitwarden.data.autofill.util.login +import com.x8bit.bitwarden.data.platform.util.isActive import com.x8bit.bitwarden.ui.vault.feature.itemlisting.model.ListingItemOverflowAction import com.x8bit.bitwarden.ui.vault.model.VaultTrailingIcon import com.x8bit.bitwarden.ui.vault.util.toSdkCipherType @@ -88,9 +89,7 @@ fun CipherListView.toOverflowActions( ListingItemOverflowAction.VaultAction.LaunchClick(url = it) }, ListingItemOverflowAction.VaultAction.ArchiveClick(cipherId = cipherId) - .takeIf { - this.archivedDate == null && deletedDate == null && isArchiveEnabled - }, + .takeIf { this.isActive && isArchiveEnabled }, ListingItemOverflowAction.VaultAction.UnarchiveClick(cipherId = cipherId) .takeIf { this.archivedDate != null && deletedDate == null && isArchiveEnabled diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt index 61deb0a6e5e..a109fcd4173 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt @@ -14,6 +14,7 @@ import com.bitwarden.vault.FolderView import com.bitwarden.vault.LoginUriView import com.x8bit.bitwarden.data.autofill.util.card import com.x8bit.bitwarden.data.autofill.util.login +import com.x8bit.bitwarden.data.platform.util.isActive import com.x8bit.bitwarden.data.vault.repository.model.VaultData import com.x8bit.bitwarden.data.vault.repository.util.toFailureCipherListView import com.x8bit.bitwarden.ui.vault.feature.util.getFilteredCollections @@ -64,9 +65,7 @@ fun VaultData.toViewState( excludeDeleted = false, ) - val activeCipherViews = allCipherViews - .filter { it.deletedDate == null && it.archivedDate == null } - + val activeCipherViews = allCipherViews.filter { it.isActive } val activeDecryptedCipherViews = decryptCipherListResult .successes .applyFilters( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/util/CipherListViewExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/util/CipherListViewExtensionsTest.kt new file mode 100644 index 00000000000..876c7fe4996 --- /dev/null +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/util/CipherListViewExtensionsTest.kt @@ -0,0 +1,59 @@ +package com.x8bit.bitwarden.data.platform.util + +import com.bitwarden.vault.CipherListView +import io.mockk.every +import io.mockk.mockk +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test +import java.time.Clock +import java.time.Instant +import java.time.ZoneOffset + +class CipherListViewExtensionsTest { + + private val clock: Clock = Clock.fixed( + Instant.parse("2023-10-27T12:00:00Z"), + ZoneOffset.UTC, + ) + + @Test + fun `isActive should return true when item is not archived and not deleted`() { + val cipherListView = mockk { + every { archivedDate } returns null + every { deletedDate } returns null + } + + assertTrue(cipherListView.isActive) + } + + @Test + fun `isActive should return false when item is archived and not deleted`() { + val cipherListView = mockk { + every { archivedDate } returns clock.instant() + every { deletedDate } returns null + } + + assertFalse(cipherListView.isActive) + } + + @Test + fun `isActive should return false when item is not archived and is deleted`() { + val cipherListView = mockk { + every { archivedDate } returns null + every { deletedDate } returns clock.instant() + } + + assertFalse(cipherListView.isActive) + } + + @Test + fun `isActive should return false when item is archived and is deleted`() { + val cipherListView = mockk { + every { archivedDate } returns clock.instant() + every { deletedDate } returns clock.instant() + } + + assertFalse(cipherListView.isActive) + } +} diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/util/CipherViewExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/util/CipherViewExtensionsTest.kt new file mode 100644 index 00000000000..03f198ca127 --- /dev/null +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/util/CipherViewExtensionsTest.kt @@ -0,0 +1,59 @@ +package com.x8bit.bitwarden.data.platform.util + +import com.bitwarden.vault.CipherView +import io.mockk.every +import io.mockk.mockk +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test +import java.time.Clock +import java.time.Instant +import java.time.ZoneOffset + +class CipherViewExtensionsTest { + + private val clock: Clock = Clock.fixed( + Instant.parse("2023-10-27T12:00:00Z"), + ZoneOffset.UTC, + ) + + @Test + fun `isActive should return true when item is not archived and not deleted`() { + val cipherListView = mockk { + every { archivedDate } returns null + every { deletedDate } returns null + } + + assertTrue(cipherListView.isActive) + } + + @Test + fun `isActive should return false when item is archived and not deleted`() { + val cipherListView = mockk { + every { archivedDate } returns clock.instant() + every { deletedDate } returns null + } + + assertFalse(cipherListView.isActive) + } + + @Test + fun `isActive should return false when item is not archived and is deleted`() { + val cipherListView = mockk { + every { archivedDate } returns null + every { deletedDate } returns clock.instant() + } + + assertFalse(cipherListView.isActive) + } + + @Test + fun `isActive should return false when item is archived and is deleted`() { + val cipherListView = mockk { + every { archivedDate } returns clock.instant() + every { deletedDate } returns clock.instant() + } + + assertFalse(cipherListView.isActive) + } +}