From 66e06d7d1c86675d750fe8d34d3bdc39a6c5bc55 Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 30 Jul 2024 16:38:11 +0200 Subject: [PATCH] Pinned event : add some tests --- .../messages/impl/MessagesStateProvider.kt | 4 +- .../messages/impl/MessagesPresenterTest.kt | 73 +++++-- .../actionlist/ActionListPresenterTest.kt | 197 +++++++++++++++--- .../matrix/test/timeline/FakeTimeline.kt | 4 +- 4 files changed, 231 insertions(+), 47 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt index a95657be28..3f3a691a98 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt @@ -144,13 +144,13 @@ fun aUserEventPermissions( canRedactOther: Boolean = false, canSendMessage: Boolean = true, canSendReaction: Boolean = true, - canPin: Boolean = false, + canPinUnpin: Boolean = false, ) = UserEventPermissions( canRedactOwn = canRedactOwn, canRedactOther = canRedactOther, canSendMessage = canSendMessage, canSendReaction = canSendReaction, - canPinUnpin = canPin, + canPinUnpin = canPinUnpin, ) fun aReactionSummaryState( diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt index 74eccd00ca..2704e299c1 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt @@ -155,7 +155,9 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + + ) assertThat(room.markAsReadCalls).isEmpty() val presenter = createMessagesPresenter(matrixRoom = room) moleculeFlow(RecompositionMode.Immediate) { @@ -175,7 +177,9 @@ class MessagesPresenterTest { canRedactOwnResult = { Result.success(true) }, canRedactOtherResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ).apply { + canUserPinUnpinResult = { Result.success(true) }, + + ).apply { givenRoomInfo(aRoomInfo(hasRoomCall = true)) } val presenter = createMessagesPresenter(matrixRoom = room) @@ -203,7 +207,9 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + + ) val presenter = createMessagesPresenter(matrixRoom = room, coroutineDispatchers = coroutineDispatchers) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -240,7 +246,9 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + + ) val presenter = createMessagesPresenter(matrixRoom = room, coroutineDispatchers = coroutineDispatchers) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -298,7 +306,9 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + + ) val presenter = createMessagesPresenter( clipboardHelper = clipboardHelper, matrixRoom = matrixRoom, @@ -487,7 +497,9 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + + ) val redactEventLambda = lambdaRecorder { _: EventId?, _: TransactionId?, _: String? -> Result.success(true) } liveTimeline.redactEventLambda = redactEventLambda @@ -561,7 +573,9 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + + ) val presenter = createMessagesPresenter(matrixRoom = room) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -596,7 +610,9 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + + ) val presenter = createMessagesPresenter(matrixRoom = room) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -620,7 +636,9 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + + ) val presenter = createMessagesPresenter(matrixRoom = room) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -644,7 +662,9 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + + ) room.givenRoomMembersState( MatrixRoomMembersState.Ready( persistentListOf( @@ -679,7 +699,9 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + + ) room.givenRoomMembersState( MatrixRoomMembersState.Error( failure = Throwable(), @@ -715,7 +737,9 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + + ) room.givenRoomMembersState(MatrixRoomMembersState.Unknown) val presenter = createMessagesPresenter(matrixRoom = room) moleculeFlow(RecompositionMode.Immediate) { @@ -741,7 +765,9 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + + ) room.givenRoomMembersState( MatrixRoomMembersState.Ready( persistentListOf( @@ -781,7 +807,9 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + + ) val presenter = createMessagesPresenter(matrixRoom = matrixRoom) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -805,7 +833,9 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + + ) val presenter = createMessagesPresenter(matrixRoom = matrixRoom) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -826,7 +856,8 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(false) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + ) val presenter = createMessagesPresenter(matrixRoom = matrixRoom) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -846,7 +877,8 @@ class MessagesPresenterTest { canRedactOwnResult = { Result.success(false) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, - ) + canUserPinUnpinResult = { Result.success(true) }, + ) val presenter = createMessagesPresenter(matrixRoom = matrixRoom) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -892,6 +924,7 @@ class MessagesPresenterTest { canRedactOtherResult = { Result.success(true) }, canUserJoinCallResult = { Result.success(true) }, typingNoticeResult = { Result.success(Unit) }, + canUserPinUnpinResult = { Result.success(true) }, ).apply { givenRoomInfo(aRoomInfo(id = roomId, name = "")) }, @@ -959,7 +992,11 @@ class MessagesPresenterTest { } } val featureFlagService = FakeFeatureFlagService() - val actionListPresenter = ActionListPresenter(appPreferencesStore = appPreferencesStore, featureFlagsService = featureFlagService) + val actionListPresenter = ActionListPresenter( + appPreferencesStore = appPreferencesStore, + featureFlagsService = featureFlagService, + room = matrixRoom, + ) val typingNotificationPresenter = TypingNotificationPresenter( room = matrixRoom, sessionPreferencesStore = sessionPreferencesStore, diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt index 5bd16bfe61..e8ea7cbbc2 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt @@ -32,8 +32,13 @@ import io.element.android.features.messages.impl.timeline.model.event.aTimelineI import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemStateEventContent import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemVoiceContent import io.element.android.features.poll.api.pollcontent.aPollAnswerItemList +import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.test.FakeFeatureFlagService +import io.element.android.libraries.matrix.api.room.MatrixRoom +import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.libraries.matrix.test.A_MESSAGE +import io.element.android.libraries.matrix.test.room.FakeMatrixRoom +import io.element.android.libraries.matrix.test.room.aRoomInfo import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore import io.element.android.tests.testutils.WarmUpRule import kotlinx.collections.immutable.persistentListOf @@ -48,7 +53,7 @@ class ActionListPresenterTest { @Test fun `present - initial state`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = true) + val presenter = createActionListPresenter(isDeveloperModeEnabled = true, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -59,7 +64,7 @@ class ActionListPresenterTest { @Test fun `present - compute for message from me redacted`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = true) + val presenter = createActionListPresenter(isDeveloperModeEnabled = true, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -73,6 +78,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true, ) ) ) @@ -95,7 +101,7 @@ class ActionListPresenterTest { @Test fun `present - compute for message from others redacted`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = true) + val presenter = createActionListPresenter(isDeveloperModeEnabled = true, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -113,6 +119,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true, ) ) ) @@ -135,7 +142,7 @@ class ActionListPresenterTest { @Test fun `present - compute for others message`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = true) + val presenter = createActionListPresenter(isDeveloperModeEnabled = true, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -153,6 +160,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true, ) ) ) @@ -166,6 +174,7 @@ class ActionListPresenterTest { actions = persistentListOf( TimelineItemAction.Reply, TimelineItemAction.Forward, + TimelineItemAction.Pin, TimelineItemAction.Copy, TimelineItemAction.CopyLink, TimelineItemAction.ViewSource, @@ -180,7 +189,7 @@ class ActionListPresenterTest { @Test fun `present - compute for others message cannot sent message`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = true) + val presenter = createActionListPresenter(isDeveloperModeEnabled = true, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -197,7 +206,8 @@ class ActionListPresenterTest { canRedactOwn = true, canRedactOther = false, canSendMessage = false, - canSendReaction = true + canSendReaction = true, + canPinUnpin = true, ) ) ) @@ -210,6 +220,7 @@ class ActionListPresenterTest { displayEmojiReactions = true, actions = persistentListOf( TimelineItemAction.Forward, + TimelineItemAction.Pin, TimelineItemAction.Copy, TimelineItemAction.CopyLink, TimelineItemAction.ViewSource, @@ -224,7 +235,7 @@ class ActionListPresenterTest { @Test fun `present - compute for others message and can redact`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = true) + val presenter = createActionListPresenter(isDeveloperModeEnabled = true, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -242,6 +253,7 @@ class ActionListPresenterTest { canRedactOther = true, canSendMessage = true, canSendReaction = true, + canPinUnpin = true, ) ) ) @@ -253,6 +265,7 @@ class ActionListPresenterTest { actions = persistentListOf( TimelineItemAction.Reply, TimelineItemAction.Forward, + TimelineItemAction.Pin, TimelineItemAction.Copy, TimelineItemAction.CopyLink, TimelineItemAction.ViewSource, @@ -268,7 +281,7 @@ class ActionListPresenterTest { @Test fun `present - compute for others message and cannot send reaction`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = true) + val presenter = createActionListPresenter(isDeveloperModeEnabled = true, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -285,7 +298,8 @@ class ActionListPresenterTest { canRedactOwn = false, canRedactOther = true, canSendMessage = true, - canSendReaction = false + canSendReaction = false, + canPinUnpin = true, ) ) ) @@ -297,6 +311,7 @@ class ActionListPresenterTest { actions = persistentListOf( TimelineItemAction.Reply, TimelineItemAction.Forward, + TimelineItemAction.Pin, TimelineItemAction.Copy, TimelineItemAction.CopyLink, TimelineItemAction.ViewSource, @@ -312,7 +327,7 @@ class ActionListPresenterTest { @Test fun `present - compute for my message`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = true) + val presenter = createActionListPresenter(isDeveloperModeEnabled = true, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -329,6 +344,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true, ) ) ) @@ -343,6 +359,7 @@ class ActionListPresenterTest { TimelineItemAction.Reply, TimelineItemAction.Forward, TimelineItemAction.Edit, + TimelineItemAction.Pin, TimelineItemAction.Copy, TimelineItemAction.CopyLink, TimelineItemAction.ViewSource, @@ -357,7 +374,7 @@ class ActionListPresenterTest { @Test fun `present - compute for my message cannot redact`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = true) + val presenter = createActionListPresenter(isDeveloperModeEnabled = true, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -374,6 +391,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true, ) ) ) @@ -388,6 +406,7 @@ class ActionListPresenterTest { TimelineItemAction.Reply, TimelineItemAction.Forward, TimelineItemAction.Edit, + TimelineItemAction.Pin, TimelineItemAction.Copy, TimelineItemAction.CopyLink, TimelineItemAction.ViewSource, @@ -401,7 +420,7 @@ class ActionListPresenterTest { @Test fun `present - compute for a media item`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = true) + val presenter = createActionListPresenter(isDeveloperModeEnabled = true, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -419,6 +438,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true, ), ) ) @@ -432,6 +452,7 @@ class ActionListPresenterTest { actions = persistentListOf( TimelineItemAction.Reply, TimelineItemAction.Forward, + TimelineItemAction.Pin, TimelineItemAction.CopyLink, TimelineItemAction.ViewSource, TimelineItemAction.Redact, @@ -445,7 +466,7 @@ class ActionListPresenterTest { @Test fun `present - compute for a state item in debug build`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = true) + val presenter = createActionListPresenter(isDeveloperModeEnabled = true, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -462,6 +483,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true, ) ) ) @@ -484,7 +506,7 @@ class ActionListPresenterTest { @Test fun `present - compute for a state item in non-debuggable build`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = false) + val presenter = createActionListPresenter(isDeveloperModeEnabled = false, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -501,6 +523,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true, ) ) ) @@ -512,7 +535,106 @@ class ActionListPresenterTest { @Test fun `present - compute message in non-debuggable build`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = false) + val presenter = createActionListPresenter(isDeveloperModeEnabled = false, isPinFeatureEnabled = true) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + val messageEvent = aMessageEvent( + isMine = true, + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null) + ) + initialState.eventSink.invoke( + ActionListEvents.ComputeForMessage( + event = messageEvent, + userEventPermissions = aUserEventPermissions( + canRedactOwn = true, + canRedactOther = false, + canSendMessage = true, + canSendReaction = true, + canPinUnpin = true, + ) + ) + ) + // val loadingState = awaitItem() + // assertThat(loadingState.target).isEqualTo(ActionListState.Target.Loading(messageEvent)) + val successState = awaitItem() + assertThat(successState.target).isEqualTo( + ActionListState.Target.Success( + event = messageEvent, + displayEmojiReactions = true, + actions = persistentListOf( + TimelineItemAction.Reply, + TimelineItemAction.Forward, + TimelineItemAction.Edit, + TimelineItemAction.Pin, + TimelineItemAction.Copy, + TimelineItemAction.CopyLink, + TimelineItemAction.Redact, + ) + ) + ) + initialState.eventSink.invoke(ActionListEvents.Clear) + assertThat(awaitItem().target).isEqualTo(ActionListState.Target.None) + } + } + + @Test + fun `present - compute message when user can't pin`() = runTest { + val presenter = createActionListPresenter(isDeveloperModeEnabled = true, isPinFeatureEnabled = true) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + val messageEvent = aMessageEvent( + isMine = true, + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null) + ) + initialState.eventSink.invoke( + ActionListEvents.ComputeForMessage( + event = messageEvent, + userEventPermissions = aUserEventPermissions( + canRedactOwn = true, + canRedactOther = false, + canSendMessage = true, + canSendReaction = true, + canPinUnpin = false, + ) + ) + ) + // val loadingState = awaitItem() + // assertThat(loadingState.target).isEqualTo(ActionListState.Target.Loading(messageEvent)) + val successState = awaitItem() + assertThat(successState.target).isEqualTo( + ActionListState.Target.Success( + event = messageEvent, + displayEmojiReactions = true, + actions = persistentListOf( + TimelineItemAction.Reply, + TimelineItemAction.Forward, + TimelineItemAction.Edit, + TimelineItemAction.Copy, + TimelineItemAction.CopyLink, + TimelineItemAction.ViewSource, + TimelineItemAction.Redact, + ) + ) + ) + initialState.eventSink.invoke(ActionListEvents.Clear) + assertThat(awaitItem().target).isEqualTo(ActionListState.Target.None) + } + } + + @Test + fun `present - compute message when event is already pinned`() = runTest { + val room = FakeMatrixRoom().apply { + givenRoomInfo(aRoomInfo(pinnedEventIds = listOf(AN_EVENT_ID))) + } + val presenter = createActionListPresenter( + isDeveloperModeEnabled = true, + isPinFeatureEnabled = true, + room = room + ) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -529,6 +651,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true, ) ) ) @@ -543,8 +666,10 @@ class ActionListPresenterTest { TimelineItemAction.Reply, TimelineItemAction.Forward, TimelineItemAction.Edit, + TimelineItemAction.Unpin, TimelineItemAction.Copy, TimelineItemAction.CopyLink, + TimelineItemAction.ViewSource, TimelineItemAction.Redact, ) ) @@ -556,7 +681,7 @@ class ActionListPresenterTest { @Test fun `present - compute message with no actions`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = false) + val presenter = createActionListPresenter(isDeveloperModeEnabled = false, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -578,6 +703,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true, ) ) ) @@ -602,7 +728,7 @@ class ActionListPresenterTest { @Test fun `present - compute not sent message`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = false) + val presenter = createActionListPresenter(isDeveloperModeEnabled = false, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -623,6 +749,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true, ) ) ) @@ -643,7 +770,7 @@ class ActionListPresenterTest { @Test fun `present - compute for editable poll message`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = false) + val presenter = createActionListPresenter(isDeveloperModeEnabled = false, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -661,6 +788,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true, ) ) ) @@ -673,6 +801,7 @@ class ActionListPresenterTest { TimelineItemAction.Reply, TimelineItemAction.Edit, TimelineItemAction.EndPoll, + TimelineItemAction.Pin, TimelineItemAction.CopyLink, TimelineItemAction.Redact, ) @@ -683,7 +812,7 @@ class ActionListPresenterTest { @Test fun `present - compute for non-editable poll message`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = false) + val presenter = createActionListPresenter(isDeveloperModeEnabled = false, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -701,6 +830,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true ) ) ) @@ -712,6 +842,7 @@ class ActionListPresenterTest { actions = persistentListOf( TimelineItemAction.Reply, TimelineItemAction.EndPoll, + TimelineItemAction.Pin, TimelineItemAction.CopyLink, TimelineItemAction.Redact, ) @@ -722,7 +853,7 @@ class ActionListPresenterTest { @Test fun `present - compute for ended poll message`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = false) + val presenter = createActionListPresenter(isDeveloperModeEnabled = false, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -740,6 +871,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true, ) ) ) @@ -750,6 +882,7 @@ class ActionListPresenterTest { displayEmojiReactions = true, actions = persistentListOf( TimelineItemAction.Reply, + TimelineItemAction.Pin, TimelineItemAction.CopyLink, TimelineItemAction.Redact, ) @@ -760,7 +893,7 @@ class ActionListPresenterTest { @Test fun `present - compute for voice message`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = false) + val presenter = createActionListPresenter(isDeveloperModeEnabled = false, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -778,6 +911,7 @@ class ActionListPresenterTest { canRedactOther = false, canSendMessage = true, canSendReaction = true, + canPinUnpin = true ) ) ) @@ -789,6 +923,7 @@ class ActionListPresenterTest { actions = persistentListOf( TimelineItemAction.Reply, TimelineItemAction.Forward, + TimelineItemAction.Pin, TimelineItemAction.CopyLink, TimelineItemAction.Redact, ) @@ -799,7 +934,7 @@ class ActionListPresenterTest { @Test fun `present - compute for call notify`() = runTest { - val presenter = createActionListPresenter(isDeveloperModeEnabled = true) + val presenter = createActionListPresenter(isDeveloperModeEnabled = true, isPinFeatureEnabled = true) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -833,8 +968,20 @@ class ActionListPresenterTest { } } -private fun createActionListPresenter(isDeveloperModeEnabled: Boolean): ActionListPresenter { +private fun createActionListPresenter( + isDeveloperModeEnabled: Boolean, + isPinFeatureEnabled: Boolean, + room: MatrixRoom = FakeMatrixRoom(), +): ActionListPresenter { val preferencesStore = InMemoryAppPreferencesStore(isDeveloperModeEnabled = isDeveloperModeEnabled) - val featureFlagsService = FakeFeatureFlagService() - return ActionListPresenter(appPreferencesStore = preferencesStore, featureFlagsService = featureFlagsService) + val featureFlagsService = FakeFeatureFlagService( + initialState = mapOf( + FeatureFlags.PinnedEvents.key to isPinFeatureEnabled, + ) + ) + return ActionListPresenter( + appPreferencesStore = preferencesStore, + featureFlagsService = featureFlagsService, + room = room + ) } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt index 6216c7b182..b10edbad0f 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt @@ -372,12 +372,12 @@ class FakeTimeline( override suspend fun loadReplyDetails(eventId: EventId) = loadReplyDetailsLambda(eventId) - var pinEventLambda: (eventId: EventId) -> Result = lambdaError() + var pinEventLambda: (eventId: EventId) -> Result = { lambdaError()} override suspend fun pinEvent(eventId: EventId): Result { return pinEventLambda(eventId) } - var unpinEventLambda: (eventId: EventId) -> Result = lambdaError() + var unpinEventLambda: (eventId: EventId) -> Result = { lambdaError()} override suspend fun unpinEvent(eventId: EventId): Result { return unpinEventLambda(eventId) }