From 44a784fbd5e256b1b336f6a964fa3a324a229e3f Mon Sep 17 00:00:00 2001 From: Andre Rosado Date: Mon, 20 Oct 2025 15:13:54 +0100 Subject: [PATCH] Fixed and added tests to skip account selection on cxp --- .../feature/rootnav/RootNavScreenTest.kt | 21 ++++++ .../feature/rootnav/RootNavViewModelTest.kt | 67 ++++++++++++++++++- .../VerifyPasswordScreenTest.kt | 1 + .../VerifyPasswordViewModelTest.kt | 33 +++++++++ 4 files changed, 121 insertions(+), 1 deletion(-) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreenTest.kt index 7557c3becb..a3a7693cca 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreenTest.kt @@ -25,6 +25,7 @@ import com.x8bit.bitwarden.ui.tools.feature.send.model.SendItemType import com.x8bit.bitwarden.ui.vault.feature.addedit.VaultAddEditMode import com.x8bit.bitwarden.ui.vault.feature.addedit.VaultAddEditRoute import com.x8bit.bitwarden.ui.vault.feature.exportitems.ExportItemsGraphRoute +import com.x8bit.bitwarden.ui.vault.feature.exportitems.verifypassword.VerifyPasswordRoute import com.x8bit.bitwarden.ui.vault.feature.itemlisting.ItemListingType import com.x8bit.bitwarden.ui.vault.feature.itemlisting.VaultItemListingRoute import com.x8bit.bitwarden.ui.vault.model.VaultItemCipherType @@ -450,6 +451,26 @@ class RootNavScreenTest : BitwardenComposeTest() { ) } } + + // Make sure navigating to export items graph works as expected: + rootNavStateFlow.value = RootNavState.CredentialExchangeExportSkipAccountSelection( + userId = "activeUserId", + ) + composeTestRule.runOnIdle { + verify { + mockNavHostController.navigate( + route = ExportItemsGraphRoute, + navOptions = expectedNavOptions, + ) + + mockNavHostController.navigate( + route = VerifyPasswordRoute( + userId = "activeUserId", + ), + navOptions = expectedNavOptions, + ) + } + } } } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModelTest.kt index 6583ccea42..ea4fab0f3a 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModelTest.kt @@ -1441,7 +1441,7 @@ class RootNavViewModelTest : BaseViewModelTest() { requestJson = "mockRequestJson", ), ) - mutableUserStateFlow.tryEmit(MOCK_VAULT_UNLOCKED_USER_STATE) + mutableUserStateFlow.tryEmit(MOCK_VAULT_UNLOCKED_USER_MULTIPLE_ACCOUNTS_STATE) val viewModel = createViewModel() assertEquals( RootNavState.CredentialExchangeExport, @@ -1449,6 +1449,26 @@ class RootNavViewModelTest : BaseViewModelTest() { ) } + @Suppress("MaxLineLength") + @Test + fun `when SpecialCircumstance is CredentialExchangeExport and only has 1 account, the nav state should be CredentialExchangeExportSkipAccountSelection`() { + specialCircumstanceManager.specialCircumstance = + SpecialCircumstance.CredentialExchangeExport( + data = ImportCredentialsRequestData( + uri = mockk(), + requestJson = "mockRequestJson", + ), + ) + mutableUserStateFlow.tryEmit(MOCK_VAULT_UNLOCKED_USER_STATE) + val viewModel = createViewModel() + assertEquals( + RootNavState.CredentialExchangeExportSkipAccountSelection( + userId = "activeUserId", + ), + viewModel.stateFlow.value, + ) + } + private fun createViewModel(): RootNavViewModel = RootNavViewModel( authRepository = authRepository, @@ -1487,3 +1507,48 @@ private val MOCK_VAULT_UNLOCKED_USER_STATE = UserState( ), ), ) + +private val MOCK_VAULT_UNLOCKED_USER_MULTIPLE_ACCOUNTS_STATE = UserState( + activeUserId = "activeUserId", + accounts = listOf( + UserState.Account( + userId = "activeUserId", + name = "name", + email = "email", + avatarColorHex = "avatarColorHex", + environment = Environment.Us, + isPremium = true, + isLoggedIn = true, + isVaultUnlocked = true, + needsPasswordReset = false, + isBiometricsEnabled = false, + organizations = emptyList(), + needsMasterPassword = false, + trustedDevice = null, + hasMasterPassword = true, + isUsingKeyConnector = false, + firstTimeState = FirstTimeState(false), + onboardingStatus = OnboardingStatus.COMPLETE, + ), + + UserState.Account( + userId = "activeUserTwoId", + name = "name two", + email = "email two", + avatarColorHex = "avatarColorHex", + environment = Environment.Us, + isPremium = true, + isLoggedIn = true, + isVaultUnlocked = true, + needsPasswordReset = false, + isBiometricsEnabled = false, + organizations = emptyList(), + needsMasterPassword = false, + trustedDevice = null, + hasMasterPassword = true, + isUsingKeyConnector = false, + firstTimeState = FirstTimeState(false), + onboardingStatus = OnboardingStatus.COMPLETE, + ), + ), +) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordScreenTest.kt index 8c42271c11..3412dcbf45 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordScreenTest.kt @@ -262,4 +262,5 @@ private val DEFAULT_STATE = VerifyPasswordState( accountSummaryListItem = DEFAULT_ACCOUNT_SELECTION_LIST_ITEM, input = "", dialog = null, + hasOtherAccounts = true, ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordViewModelTest.kt index b7da34a968..27376504a6 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/exportitems/verifypassword/VerifyPasswordViewModelTest.kt @@ -86,6 +86,7 @@ class VerifyPasswordViewModelTest : BaseViewModelTest() { isItemRestricted = false, initials = DEFAULT_USER_STATE.activeAccount.initials, ), + hasOtherAccounts = true, ), it.stateFlow.value, ) @@ -108,6 +109,7 @@ class VerifyPasswordViewModelTest : BaseViewModelTest() { .also { assertEquals( VerifyPasswordState( + hasOtherAccounts = true, accountSummaryListItem = DEFAULT_ACCOUNT_SELECTION_LIST_ITEM .copy(isItemRestricted = true), ), @@ -571,6 +573,36 @@ private val DEFAULT_USER_STATE = UserState( onboardingStatus = OnboardingStatus.COMPLETE, firstTimeState = FirstTimeState(showImportLoginsCard = true), ), + + UserState.Account( + userId = "activeUserId2", + name = "Active User Two", + email = "active+two@bitwarden.com", + avatarColorHex = "#aa00aa", + environment = Environment.Us, + isPremium = true, + isLoggedIn = true, + isVaultUnlocked = true, + needsPasswordReset = false, + isBiometricsEnabled = false, + organizations = listOf( + Organization( + id = DEFAULT_ORGANIZATION_ID, + name = "Organization User Two", + shouldUseKeyConnector = false, + shouldManageResetPassword = false, + role = OrganizationType.USER, + keyConnectorUrl = null, + userIsClaimedByOrganization = false, + ), + ), + needsMasterPassword = false, + trustedDevice = null, + hasMasterPassword = true, + isUsingKeyConnector = false, + onboardingStatus = OnboardingStatus.COMPLETE, + firstTimeState = FirstTimeState(showImportLoginsCard = true), + ), ), ) private val DEFAULT_ACCOUNT_SELECTION_LIST_ITEM = AccountSelectionListItem( @@ -581,6 +613,7 @@ private val DEFAULT_ACCOUNT_SELECTION_LIST_ITEM = AccountSelectionListItem( initials = DEFAULT_USER_STATE.activeAccount.initials, ) private val DEFAULT_STATE = VerifyPasswordState( + hasOtherAccounts = true, accountSummaryListItem = DEFAULT_ACCOUNT_SELECTION_LIST_ITEM, input = "", dialog = null,