From 034284fad4a1264d84e541a9c819c2d6a7163d98 Mon Sep 17 00:00:00 2001 From: Ramsey Smith <142836716+ramsey-livefront@users.noreply.github.com> Date: Tue, 30 Jan 2024 16:01:20 -0700 Subject: [PATCH] BIT-1575: Collection Screen (#878) --- .../vaultunlocked/VaultUnlockedNavigation.kt | 14 +++- .../components/CollectionItemSelector.kt | 26 +++--- .../feature/addedit/VaultAddEditNavigation.kt | 2 +- .../feature/addedit/VaultAddEditScreen.kt | 7 +- .../vault/feature/item/VaultItemNavigation.kt | 2 +- .../ui/vault/feature/item/VaultItemScreen.kt | 7 +- .../VaultMoveToOrganizationContent.kt | 66 ++++++++------- .../VaultMoveToOrganizationNavigation.kt | 22 ++++- .../VaultMoveToOrganizationScreen.kt | 5 +- .../VaultMoveToOrganizationViewModel.kt | 16 ++++ .../feature/addedit/VaultAddEditScreenTest.kt | 2 +- .../vault/feature/item/VaultItemScreenTest.kt | 4 +- .../VaultMoveToOrganizationScreenTest.kt | 82 +++++++++++++++++++ .../VaultMoveToOrganizationViewModelTest.kt | 3 + 14 files changed, 194 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlocked/VaultUnlockedNavigation.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlocked/VaultUnlockedNavigation.kt index ce36228f3b..da453887dc 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlocked/VaultUnlockedNavigation.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlocked/VaultUnlockedNavigation.kt @@ -108,8 +108,11 @@ fun NavGraphBuilder.vaultUnlockedGraph( onNavigateBack = { navController.popBackStack() }, onNavigateToGeneratorModal = { navController.navigateToGeneratorModal(mode = it) }, onNavigateToAttachments = { navController.navigateToAttachment(it) }, - onNavigateToMoveToOrganization = { - navController.navigateToVaultMoveToOrganization(it) + onNavigateToMoveToOrganization = { vaultItemId, showOnlyCollections -> + navController.navigateToVaultMoveToOrganization( + vaultItemId = vaultItemId, + showOnlyCollections = showOnlyCollections, + ) }, ) vaultMoveToOrganizationDestination( @@ -126,8 +129,11 @@ fun NavGraphBuilder.vaultUnlockedGraph( }, ) }, - onNavigateToMoveToOrganization = { - navController.navigateToVaultMoveToOrganization(it) + onNavigateToMoveToOrganization = { vaultItemId, showOnlyCollections -> + navController.navigateToVaultMoveToOrganization( + vaultItemId = vaultItemId, + showOnlyCollections = showOnlyCollections, + ) }, onNavigateToAttachments = { navController.navigateToAttachment(it) }, ) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/components/CollectionItemSelector.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/components/CollectionItemSelector.kt index 22464edaf6..d368d07ec2 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/components/CollectionItemSelector.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/components/CollectionItemSelector.kt @@ -24,15 +24,19 @@ import com.x8bit.bitwarden.ui.vault.model.VaultCollection fun LazyListScope.collectionItemsSelector( collectionList: List?, onCollectionSelect: (VaultCollection) -> Unit, + isCollectionsTitleVisible: Boolean = true, ) { - item { - Spacer(modifier = Modifier.height(8.dp)) - BitwardenListHeaderText( - label = stringResource(id = R.string.collections), - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), - ) + + if (isCollectionsTitleVisible) { + item { + Spacer(modifier = Modifier.height(8.dp)) + BitwardenListHeaderText( + label = stringResource(id = R.string.collections), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + ) + } } if (collectionList?.isNotEmpty() == true) { @@ -54,14 +58,14 @@ fun LazyListScope.collectionItemsSelector( Spacer(modifier = Modifier.height(8.dp)) Column( horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), ) { Text( text = stringResource(id = R.string.no_collections_to_list), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), ) } } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditNavigation.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditNavigation.kt index 8cf2b7f918..213aaa4062 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditNavigation.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditNavigation.kt @@ -49,7 +49,7 @@ fun NavGraphBuilder.vaultAddEditDestination( onNavigateToQrCodeScanScreen: () -> Unit, onNavigateToGeneratorModal: (GeneratorMode.Modal) -> Unit, onNavigateToAttachments: (cipherId: String) -> Unit, - onNavigateToMoveToOrganization: (cipherId: String) -> Unit, + onNavigateToMoveToOrganization: (cipherId: String, showOnlyCollections: Boolean) -> Unit, ) { composableWithSlideTransitions( route = ADD_EDIT_ITEM_ROUTE, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreen.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreen.kt index 3d831e4764..9357781f47 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreen.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreen.kt @@ -57,7 +57,7 @@ fun VaultAddEditScreen( onNavigateToManualCodeEntryScreen: () -> Unit, onNavigateToGeneratorModal: (GeneratorMode.Modal) -> Unit, onNavigateToAttachments: (cipherId: String) -> Unit, - onNavigateToMoveToOrganization: (cipherId: String) -> Unit, + onNavigateToMoveToOrganization: (cipherId: String, showOnlyCollections: Boolean) -> Unit, ) { val state by viewModel.stateFlow.collectAsStateWithLifecycle() val context = LocalContext.current @@ -83,12 +83,11 @@ fun VaultAddEditScreen( is VaultAddEditEvent.NavigateToAttachments -> onNavigateToAttachments(event.cipherId) is VaultAddEditEvent.NavigateToMoveToOrganization -> { - onNavigateToMoveToOrganization(event.cipherId) + onNavigateToMoveToOrganization(event.cipherId, false) } is VaultAddEditEvent.NavigateToCollections -> { - // TODO implement Collections in BIT-1575 - Toast.makeText(context, "Not yet implemented.", Toast.LENGTH_SHORT).show() + onNavigateToMoveToOrganization(event.cipherId, true) } VaultAddEditEvent.NavigateBack -> onNavigateBack.invoke() diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemNavigation.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemNavigation.kt index 4f94fe80cf..273cfb7308 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemNavigation.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemNavigation.kt @@ -29,7 +29,7 @@ data class VaultItemArgs(val vaultItemId: String) { fun NavGraphBuilder.vaultItemDestination( onNavigateBack: () -> Unit, onNavigateToVaultEditItem: (vaultItemId: String, isClone: Boolean) -> Unit, - onNavigateToMoveToOrganization: (vaultItemId: String) -> Unit, + onNavigateToMoveToOrganization: (vaultItemId: String, showOnlyCollections: Boolean) -> Unit, onNavigateToAttachments: (vaultItemId: String) -> Unit, ) { composableWithSlideTransitions( diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt index 5ef7a82ee5..bac5ee7030 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt @@ -61,7 +61,7 @@ fun VaultItemScreen( intentManager: IntentManager = LocalIntentManager.current, onNavigateBack: () -> Unit, onNavigateToVaultAddEditItem: (vaultItemId: String, isClone: Boolean) -> Unit, - onNavigateToMoveToOrganization: (vaultItemId: String) -> Unit, + onNavigateToMoveToOrganization: (vaultItemId: String, showOnlyCollections: Boolean) -> Unit, onNavigateToAttachments: (vaultItemId: String) -> Unit, ) { val state by viewModel.stateFlow.collectAsStateWithLifecycle() @@ -94,12 +94,11 @@ fun VaultItemScreen( is VaultItemEvent.NavigateToAttachments -> onNavigateToAttachments(event.itemId) is VaultItemEvent.NavigateToMoveToOrganization -> { - onNavigateToMoveToOrganization(event.itemId) + onNavigateToMoveToOrganization(event.itemId, false) } is VaultItemEvent.NavigateToCollections -> { - // TODO implement Collections in BIT-1575 - Toast.makeText(context, "Not yet implemented.", Toast.LENGTH_SHORT).show() + onNavigateToMoveToOrganization(event.itemId, true) } is VaultItemEvent.ShowToast -> { diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt index 8cc487bf1b..e356645dfa 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt @@ -27,6 +27,7 @@ import kotlinx.collections.immutable.toImmutableList @Composable fun VaultMoveToOrganizationContent( state: VaultMoveToOrganizationState.ViewState.Content, + showOnlyCollections: Boolean, organizationSelect: (VaultMoveToOrganizationState.ViewState.Content.Organization) -> Unit, collectionSelect: (VaultCollection) -> Unit, modifier: Modifier = Modifier, @@ -34,44 +35,47 @@ fun VaultMoveToOrganizationContent( LazyColumn( modifier = modifier, ) { - item { - Spacer(modifier = Modifier.height(8.dp)) - BitwardenMultiSelectButton( - label = stringResource(id = R.string.organization), - options = state - .organizations - .map { it.name } - .toImmutableList(), - selectedOption = state.selectedOrganization.name, - onOptionSelected = { selectedString -> - organizationSelect( - state - .organizations - .first { it.name == selectedString }, - ) - }, - modifier = Modifier.padding(horizontal = 16.dp), - ) - } - - item { - Spacer(modifier = Modifier.height(8.dp)) - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Text( - text = stringResource(id = R.string.move_to_org_desc), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - fontSize = 12.sp, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 32.dp), + if (!showOnlyCollections) { + item { + Spacer(modifier = Modifier.height(8.dp)) + BitwardenMultiSelectButton( + label = stringResource(id = R.string.organization), + options = state + .organizations + .map { it.name } + .toImmutableList(), + selectedOption = state.selectedOrganization.name, + onOptionSelected = { selectedString -> + organizationSelect( + state + .organizations + .first { it.name == selectedString }, + ) + }, + modifier = Modifier.padding(horizontal = 16.dp), ) } + + item { + Spacer(modifier = Modifier.height(8.dp)) + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Text( + text = stringResource(id = R.string.move_to_org_desc), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + fontSize = 12.sp, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 32.dp), + ) + } + } } collectionItemsSelector( collectionList = state.selectedOrganization.collections, onCollectionSelect = collectionSelect, + isCollectionsTitleVisible = !showOnlyCollections, ) } } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationNavigation.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationNavigation.kt index 2cc2d5e66c..3599d7f4ca 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationNavigation.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationNavigation.kt @@ -11,16 +11,26 @@ import com.x8bit.bitwarden.ui.platform.base.util.composableWithSlideTransitions private const val VAULT_MOVE_TO_ORGANIZATION_PREFIX = "vault_move_to_organization" private const val VAULT_MOVE_TO_ORGANIZATION_ID = "vault_move_to_organization_id" +private const val VAULT_MOVE_TO_ORGANIZATION_ONLY_COLLECTIONS = + "vault_move_to_organization_only_collections" private const val VAULT_MOVE_TO_ORGANIZATION_ROUTE = - "$VAULT_MOVE_TO_ORGANIZATION_PREFIX/{$VAULT_MOVE_TO_ORGANIZATION_ID}" + VAULT_MOVE_TO_ORGANIZATION_PREFIX + + "/{$VAULT_MOVE_TO_ORGANIZATION_ID}" + + "/{$VAULT_MOVE_TO_ORGANIZATION_ONLY_COLLECTIONS}" /** * Class to retrieve vault move to organization arguments from the [SavedStateHandle]. */ @OmitFromCoverage -data class VaultMoveToOrganizationArgs(val vaultItemId: String) { +data class VaultMoveToOrganizationArgs( + val vaultItemId: String, + val showOnlyCollections: Boolean, +) { constructor(savedStateHandle: SavedStateHandle) : this( - checkNotNull(savedStateHandle[VAULT_MOVE_TO_ORGANIZATION_ID]) as String, + vaultItemId = checkNotNull(savedStateHandle[VAULT_MOVE_TO_ORGANIZATION_ID]) as String, + showOnlyCollections = + (checkNotNull(savedStateHandle[VAULT_MOVE_TO_ORGANIZATION_ONLY_COLLECTIONS]) as String) + .toBoolean(), ) } @@ -34,6 +44,9 @@ fun NavGraphBuilder.vaultMoveToOrganizationDestination( route = VAULT_MOVE_TO_ORGANIZATION_ROUTE, arguments = listOf( navArgument(VAULT_MOVE_TO_ORGANIZATION_ID) { type = NavType.StringType }, + navArgument(VAULT_MOVE_TO_ORGANIZATION_ONLY_COLLECTIONS) { + type = NavType.StringType + }, ), ) { VaultMoveToOrganizationScreen( @@ -47,10 +60,11 @@ fun NavGraphBuilder.vaultMoveToOrganizationDestination( */ fun NavController.navigateToVaultMoveToOrganization( vaultItemId: String, + showOnlyCollections: Boolean, navOptions: NavOptions? = null, ) { navigate( - route = "$VAULT_MOVE_TO_ORGANIZATION_PREFIX/$vaultItemId", + route = "$VAULT_MOVE_TO_ORGANIZATION_PREFIX/$vaultItemId/$showOnlyCollections", navOptions = navOptions, ) } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreen.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreen.kt index 6c21522a2d..87a7a9d4e7 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreen.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreen.kt @@ -109,14 +109,14 @@ private fun VaultMoveToOrganizationScaffold( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.move_to_organization), + title = state.appBarText(), scrollBehavior = scrollBehavior, navigationIcon = painterResource(id = R.drawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = closeClick, actions = { BitwardenTextButton( - label = stringResource(id = R.string.move), + label = state.appBarButtonText(), onClick = moveClick, isEnabled = state.viewState is VaultMoveToOrganizationState.ViewState.Content, @@ -134,6 +134,7 @@ private fun VaultMoveToOrganizationScaffold( is VaultMoveToOrganizationState.ViewState.Content -> { VaultMoveToOrganizationContent( state = state.viewState, + showOnlyCollections = state.onlyShowCollections, organizationSelect = organizationSelect, collectionSelect = collectionSelect, modifier = modifier, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt index 064d0473d8..5a120779c1 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt @@ -45,6 +45,7 @@ class VaultMoveToOrganizationViewModel @Inject constructor( ?: run { VaultMoveToOrganizationState( vaultItemId = VaultMoveToOrganizationArgs(savedStateHandle).vaultItemId, + onlyShowCollections = VaultMoveToOrganizationArgs(savedStateHandle).showOnlyCollections, viewState = VaultMoveToOrganizationState.ViewState.Loading, dialogState = null, ) @@ -306,10 +307,25 @@ class VaultMoveToOrganizationViewModel @Inject constructor( @Parcelize data class VaultMoveToOrganizationState( val vaultItemId: String, + val onlyShowCollections: Boolean, val viewState: ViewState, val dialogState: DialogState?, ) : Parcelable { + val appBarText: Text + get() = if (onlyShowCollections) { + R.string.collections.asText() + } else { + R.string.move_to_organization.asText() + } + + val appBarButtonText: Text + get() = if (onlyShowCollections) { + R.string.save.asText() + } else { + R.string.move.asText() + } + /** * Represents the current state of any dialogs on the screen. */ diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt index fe6a3ef8c4..dca1b5ea6b 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreenTest.kt @@ -89,7 +89,7 @@ class VaultAddEditScreenTest : BaseComposeTest() { }, onNavigateToGeneratorModal = { onNavigateToGeneratorModalType = it }, onNavigateToAttachments = { onNavigateToAttachmentsId = it }, - onNavigateToMoveToOrganization = { onNavigateToMoveToOrganizationId = it }, + onNavigateToMoveToOrganization = { id, _ -> onNavigateToMoveToOrganizationId = id }, viewModel = viewModel, permissionsManager = fakePermissionManager, ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt index d4d977f122..b864ed4c9e 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt @@ -76,7 +76,9 @@ class VaultItemScreenTest : BaseComposeTest() { viewModel = viewModel, onNavigateBack = { onNavigateBackCalled = true }, onNavigateToVaultAddEditItem = { id, _ -> onNavigateToVaultEditItemId = id }, - onNavigateToMoveToOrganization = { onNavigateToMoveToOrganizationItemId = it }, + onNavigateToMoveToOrganization = { id, _ -> + onNavigateToMoveToOrganizationItemId = id + }, onNavigateToAttachments = { onNavigateToAttachmentsId = it }, intentManager = intentManager, ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreenTest.kt index bcd5df5c2a..d9f208e9b5 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreenTest.kt @@ -50,6 +50,87 @@ class VaultMoveToOrganizationScreenTest : BaseComposeTest() { } } + @Test + fun `the app bar title should display according to state`() { + mutableStateFlow.update { currentState -> + currentState.copy(viewState = VaultMoveToOrganizationState.ViewState.Loading) + } + + composeTestRule + .onNodeWithText(text = "Collections") + .assertIsNotDisplayed() + composeTestRule + .onNodeWithText(text = "Move to Organization") + .assertIsDisplayed() + + mutableStateFlow.update { currentState -> + currentState.copy(onlyShowCollections = true) + } + + composeTestRule + .onNodeWithText(text = "Move to Organization") + .assertIsNotDisplayed() + composeTestRule + .onNodeWithText(text = "Collections") + .assertIsDisplayed() + } + + @Test + fun `the app bar button text should display according to state`() { + mutableStateFlow.update { currentState -> + currentState.copy(viewState = VaultMoveToOrganizationState.ViewState.Loading) + } + + composeTestRule + .onNodeWithText(text = "Save") + .assertIsNotDisplayed() + composeTestRule + .onNodeWithText(text = "Move") + .assertIsDisplayed() + + mutableStateFlow.update { currentState -> + currentState.copy(onlyShowCollections = true) + } + + composeTestRule + .onNodeWithText(text = "Move") + .assertIsNotDisplayed() + composeTestRule + .onNodeWithText(text = "Save") + .assertIsDisplayed() + } + + @Test + fun `the organization option field should update according to state`() { + composeTestRule + .onNodeWithContentDescription(label = "Organization, mockOrganizationName-1") + .assertIsDisplayed() + + mutableStateFlow.update { currentState -> + currentState.copy(onlyShowCollections = true) + } + + composeTestRule + .onNodeWithContentDescription(label = "Organization, mockOrganizationName-1") + .assertIsNotDisplayed() + } + + @Test + fun `the organization option field description should update according to state`() { + composeTestRule + .onNodeWithText(text = "Choose an organization that", substring = true) + .assertIsDisplayed() + + mutableStateFlow.update { currentState -> + currentState.copy(onlyShowCollections = true) + } + + composeTestRule + composeTestRule + .onNodeWithText(text = "Choose an organization that", substring = true) + .assertIsNotDisplayed() + } + @Test fun `on NavigateBack event should invoke onNavigateBack`() { mutableEventFlow.tryEmit(VaultMoveToOrganizationEvent.NavigateBack) @@ -235,4 +316,5 @@ private fun createVaultMoveToOrganizationState(): VaultMoveToOrganizationState = selectedOrganizationId = "mockOrganizationId-1", ), dialogState = null, + onlyShowCollections = false, ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt index 1fa579e0cd..5b6a96a9d1 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt @@ -391,9 +391,11 @@ class VaultMoveToOrganizationViewModelTest : BaseViewModelTest() { private fun createSavedStateHandleWithState( state: VaultMoveToOrganizationState? = null, vaultItemId: String = "mockCipherId", + showOnlyCollections: Boolean = false, ) = SavedStateHandle().apply { set("state", state) set("vault_move_to_organization_id", vaultItemId) + set("vault_move_to_organization_only_collections", "$showOnlyCollections") } @Suppress("MaxLineLength") @@ -405,6 +407,7 @@ class VaultMoveToOrganizationViewModelTest : BaseViewModelTest() { vaultItemId = vaultItemId, viewState = viewState, dialogState = dialogState, + onlyShowCollections = false, ) }