@@ -23,6 +23,7 @@ import com.wire.android.assertIs
2323import com.wire.android.config.CoroutineTestExtension
2424import com.wire.android.config.TestDispatcherProvider
2525import com.wire.android.ui.home.HomeSnackBarMessage
26+ import com.wire.android.ui.home.conversationslist.model.LeaveGroupDialogState
2627import com.wire.android.workmanager.worker.ConversationDeletionLocallyStatus
2728import com.wire.android.workmanager.worker.enqueueConversationDeletionLocally
2829import com.wire.kalium.common.error.CoreFailure
@@ -51,6 +52,7 @@ import com.wire.kalium.logic.feature.conversation.folder.RemoveConversationFromF
5152import com.wire.kalium.logic.feature.conversation.folder.RemoveConversationFromFolderUseCase
5253import com.wire.kalium.logic.feature.team.DeleteTeamConversationUseCase
5354import com.wire.kalium.logic.feature.team.Result
55+ import com.wire.kalium.logic.feature.user.IsPreventAdminlessGroupsEnabledUseCase
5456import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase
5557import io.mockk.MockKAnnotations
5658import io.mockk.coEvery
@@ -589,6 +591,57 @@ class ConversationOptionsMenuViewModelTest {
589591 }
590592 }
591593
594+ @Test
595+ fun `given preventAdminlessGroups disabled, when onLeaveGroup, then show simple leave dialog` () =
596+ runTest(dispatcherProvider.main()) {
597+ val (arrangement, viewModel) = Arrangement ()
598+ .withPreventAdminlessGroupsEnabled(false )
599+ .arrange()
600+
601+ viewModel.onLeaveGroup(LeaveGroupDialogState (conversationId, " name" ))
602+
603+ coVerify(exactly = 0 ) { arrangement.checkConversationLeaveConditions(any()) }
604+ assertEquals(true , viewModel.leaveGroupDialogState.isVisible)
605+ assertEquals(false , viewModel.leaveGroupOptionsDialogState.isVisible)
606+ }
607+
608+ @Test
609+ fun `given preventAdminlessGroups enabled and conditions allow, when onLeaveGroup, then show simple leave dialog` () =
610+ runTest(dispatcherProvider.main()) {
611+ val (arrangement, viewModel) = Arrangement ()
612+ .withPreventAdminlessGroupsEnabled(true )
613+ .withCheckConversationLeaveConditions(CheckConversationLeaveConditionsUseCase .Result .Allow )
614+ .arrange()
615+
616+ viewModel.onLeaveGroup(LeaveGroupDialogState (conversationId, " name" ))
617+
618+ coVerify(exactly = 1 ) { arrangement.checkConversationLeaveConditions(conversationId) }
619+ assertEquals(true , viewModel.leaveGroupDialogState.isVisible)
620+ assertEquals(false , viewModel.leaveGroupOptionsDialogState.isVisible)
621+ }
622+
623+ @Test
624+ fun `given preventAdminlessGroups enabled and conditions error, when onLeaveGroup, then show snackbar error` () =
625+ runTest(dispatcherProvider.main()) {
626+ val (arrangement, viewModel) = Arrangement ()
627+ .withPreventAdminlessGroupsEnabled(true )
628+ .withCheckConversationLeaveConditions(
629+ CheckConversationLeaveConditionsUseCase .Result .Error (CoreFailure .Unknown (null ))
630+ )
631+ .arrange()
632+
633+ viewModel.actions.test {
634+ viewModel.onLeaveGroup(LeaveGroupDialogState (conversationId, " name" ))
635+
636+ coVerify(exactly = 1 ) { arrangement.checkConversationLeaveConditions(conversationId) }
637+ assertIs<ConversationOptionsMenuViewAction .Message >(awaitItem()).also {
638+ assertIs<HomeSnackBarMessage .LeaveConversationError >(it.message)
639+ }
640+ assertEquals(false , viewModel.leaveGroupDialogState.isVisible)
641+ cancelAndIgnoreRemainingEvents()
642+ }
643+ }
644+
592645 inner class Arrangement {
593646 @MockK
594647 lateinit var observeConversationDetails: ObserveConversationDetailsUseCase
@@ -623,6 +676,9 @@ class ConversationOptionsMenuViewModelTest {
623676 @MockK
624677 lateinit var checkConversationLeaveConditions: CheckConversationLeaveConditionsUseCase
625678
679+ @MockK
680+ lateinit var isPreventAdminlessGroupsEnabled: IsPreventAdminlessGroupsEnabledUseCase
681+
626682 @MockK
627683 lateinit var blockUser: BlockUserUseCase
628684
@@ -638,6 +694,7 @@ class ConversationOptionsMenuViewModelTest {
638694 init {
639695 MockKAnnotations .init (this , relaxUnitFun = true )
640696 mockkStatic(" com.wire.android.workmanager.worker.DeleteConversationLocallyWorkerKt" )
697+ coEvery { isPreventAdminlessGroupsEnabled() } returns true
641698 }
642699
643700 fun arrange () = this to ConversationOptionsMenuViewModelImpl (
@@ -653,6 +710,7 @@ class ConversationOptionsMenuViewModelTest {
653710 markConversationAsDeletedLocally = markConversationAsDeletedLocally,
654711 leaveConversation = leaveConversation,
655712 checkConversationLeaveConditions = checkConversationLeaveConditions,
713+ isPreventAdminlessGroupsEnabled = isPreventAdminlessGroupsEnabled,
656714 blockUser = blockUser,
657715 unblockUser = unblockUser,
658716 clearConversationContent = clearConversationContent,
@@ -708,6 +766,14 @@ class ConversationOptionsMenuViewModelTest {
708766 fun withClearConversationContent (result : ClearConversationContentUseCase .Result ) = apply {
709767 coEvery { clearConversationContent(any(), any()) } returns result
710768 }
769+
770+ fun withPreventAdminlessGroupsEnabled (enabled : Boolean ) = apply {
771+ coEvery { isPreventAdminlessGroupsEnabled() } returns enabled
772+ }
773+
774+ fun withCheckConversationLeaveConditions (result : CheckConversationLeaveConditionsUseCase .Result ) = apply {
775+ coEvery { checkConversationLeaveConditions(any()) } returns result
776+ }
711777 }
712778
713779 companion object {
0 commit comments