misc(power level) : update tests following api change
This commit is contained in:
parent
541a1d29bd
commit
d26f21a53b
25 changed files with 475 additions and 637 deletions
|
|
@ -99,6 +99,7 @@ import timber.log.Timber
|
|||
import kotlin.time.Duration.Companion.seconds
|
||||
import io.element.android.libraries.core.mimetype.MimeTypes.Any as AnyMimeTypes
|
||||
|
||||
@Suppress("LargeClass")
|
||||
@AssistedInject
|
||||
class MessageComposerPresenter(
|
||||
@Assisted private val navigator: MessagesNavigator,
|
||||
|
|
@ -397,7 +398,7 @@ class MessageComposerPresenter(
|
|||
val currentUserId = room.sessionId
|
||||
|
||||
suspend fun canSendRoomMention(): Boolean {
|
||||
val userCanSendAtRoom = room.roomPermissions().use(false){ perms ->
|
||||
val userCanSendAtRoom = room.roomPermissions().use(false) { perms ->
|
||||
perms.canOwnUserTriggerRoomNotification()
|
||||
}
|
||||
return !room.isDm() && userCanSendAtRoom
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@ import io.element.android.features.poll.api.actions.EndPollAction
|
|||
import io.element.android.features.poll.api.actions.SendPollResponseAction
|
||||
import io.element.android.features.roomcall.api.RoomCallState
|
||||
import io.element.android.libraries.architecture.Presenter
|
||||
import io.element.android.libraries.core.bool.orFalse
|
||||
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
||||
import io.element.android.libraries.di.annotations.SessionCoroutineScope
|
||||
import io.element.android.libraries.featureflag.api.FeatureFlagService
|
||||
|
|
@ -96,6 +95,7 @@ class TimelinePresenter(
|
|||
private val analyticsService: AnalyticsService,
|
||||
) : Presenter<TimelineState> {
|
||||
private val tag = "TimelinePresenter"
|
||||
|
||||
@AssistedFactory
|
||||
interface Factory {
|
||||
fun create(
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@ import io.element.android.libraries.matrix.api.permalink.PermalinkParser
|
|||
import io.element.android.libraries.matrix.api.room.MessageEventType
|
||||
import io.element.android.libraries.matrix.api.room.RoomMembersState
|
||||
import io.element.android.libraries.matrix.api.room.RoomMembershipState
|
||||
import io.element.android.libraries.matrix.api.room.StateEventType
|
||||
import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom
|
||||
import io.element.android.libraries.matrix.api.timeline.Timeline
|
||||
import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo
|
||||
|
|
@ -86,6 +87,7 @@ import io.element.android.libraries.matrix.test.room.FakeBaseRoom
|
|||
import io.element.android.libraries.matrix.test.room.FakeJoinedRoom
|
||||
import io.element.android.libraries.matrix.test.room.aRoomInfo
|
||||
import io.element.android.libraries.matrix.test.room.aRoomMember
|
||||
import io.element.android.libraries.matrix.test.room.powerlevels.FakeRoomPermissions
|
||||
import io.element.android.libraries.matrix.test.timeline.FakeTimeline
|
||||
import io.element.android.libraries.matrix.test.timeline.aTimelineItemDebugInfo
|
||||
import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails
|
||||
|
|
@ -143,11 +145,7 @@ class MessagesPresenterTest {
|
|||
fun `present - check that the room's unread flag is removed`() = runTest {
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
markAsReadResult = { lambdaError() }
|
||||
),
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
|
|
@ -173,11 +171,7 @@ class MessagesPresenterTest {
|
|||
}
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
),
|
||||
liveTimeline = timeline,
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
|
|
@ -223,11 +217,7 @@ class MessagesPresenterTest {
|
|||
}
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
),
|
||||
liveTimeline = timeline,
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
|
|
@ -288,11 +278,7 @@ class MessagesPresenterTest {
|
|||
val event = aMessageEvent()
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
eventPermalinkResult = { Result.success("a link") },
|
||||
),
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
|
|
@ -514,11 +500,7 @@ class MessagesPresenterTest {
|
|||
val liveTimeline = FakeTimeline()
|
||||
val joinedRoom = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
),
|
||||
liveTimeline = liveTimeline,
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
|
|
@ -586,11 +568,7 @@ class MessagesPresenterTest {
|
|||
fun `present - shows prompt to reinvite users in DM`() = runTest {
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
).apply {
|
||||
givenRoomInfo(aRoomInfo(isDirect = true, joinedMembersCount = 1, activeMembersCount = 1))
|
||||
},
|
||||
|
|
@ -619,11 +597,7 @@ class MessagesPresenterTest {
|
|||
fun `present - doesn't show reinvite prompt in non-direct room`() = runTest {
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
).apply {
|
||||
givenRoomInfo(aRoomInfo(isDirect = false, joinedMembersCount = 1, activeMembersCount = 1))
|
||||
},
|
||||
|
|
@ -645,11 +619,7 @@ class MessagesPresenterTest {
|
|||
fun `present - doesn't show reinvite prompt if other party is present`() = runTest {
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
).apply {
|
||||
givenRoomInfo(aRoomInfo(isDirect = true, joinedMembersCount = 2, activeMembersCount = 2))
|
||||
},
|
||||
|
|
@ -672,11 +642,7 @@ class MessagesPresenterTest {
|
|||
val inviteUserResult = lambdaRecorder { _: UserId -> Result.success(Unit) }
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
),
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
inviteUserResult = inviteUserResult,
|
||||
|
|
@ -707,11 +673,7 @@ class MessagesPresenterTest {
|
|||
val inviteUserResult = lambdaRecorder { _: UserId -> Result.success(Unit) }
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
),
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
inviteUserResult = inviteUserResult,
|
||||
|
|
@ -744,11 +706,7 @@ class MessagesPresenterTest {
|
|||
fun `present - handle reinviting other user when memberlist is not ready`() = runTest {
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
),
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
)
|
||||
|
|
@ -769,11 +727,7 @@ class MessagesPresenterTest {
|
|||
fun `present - handle reinviting other user when inviting fails`() = runTest {
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
),
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
inviteUserResult = { Result.failure(RuntimeException("Oops!")) },
|
||||
|
|
@ -807,17 +761,7 @@ class MessagesPresenterTest {
|
|||
fun `present - permission to post`() = runTest {
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
canUserSendMessageResult = { _, messageEventType ->
|
||||
when (messageEventType) {
|
||||
MessageEventType.RoomMessage -> Result.success(true)
|
||||
MessageEventType.Reaction -> Result.success(true)
|
||||
else -> lambdaError()
|
||||
}
|
||||
},
|
||||
roomPermissions = roomPermissions(),
|
||||
),
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
)
|
||||
|
|
@ -833,17 +777,9 @@ class MessagesPresenterTest {
|
|||
fun `present - no permission to post`() = runTest {
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
canUserSendMessageResult = { _, messageEventType ->
|
||||
when (messageEventType) {
|
||||
MessageEventType.RoomMessage -> Result.success(false)
|
||||
MessageEventType.Reaction -> Result.success(false)
|
||||
else -> lambdaError()
|
||||
}
|
||||
},
|
||||
roomPermissions = roomPermissions(
|
||||
canSendMessage = false
|
||||
),
|
||||
),
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
)
|
||||
|
|
@ -859,11 +795,9 @@ class MessagesPresenterTest {
|
|||
fun `present - permission to redact own`() = runTest {
|
||||
val joinedRoom = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(false) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(
|
||||
canRedactOther = false
|
||||
),
|
||||
),
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
)
|
||||
|
|
@ -880,11 +814,9 @@ class MessagesPresenterTest {
|
|||
fun `present - permission to redact other`() = runTest {
|
||||
val joinedRoom = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(false) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(
|
||||
canRedactOwn = false
|
||||
),
|
||||
),
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
)
|
||||
|
|
@ -929,11 +861,7 @@ class MessagesPresenterTest {
|
|||
val timeline = FakeTimeline()
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
),
|
||||
liveTimeline = timeline,
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
|
|
@ -973,11 +901,7 @@ class MessagesPresenterTest {
|
|||
val analyticsService = FakeAnalyticsService()
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
),
|
||||
liveTimeline = timeline,
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
|
|
@ -1074,11 +998,7 @@ class MessagesPresenterTest {
|
|||
}
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
),
|
||||
liveTimeline = timeline,
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
|
|
@ -1115,11 +1035,7 @@ class MessagesPresenterTest {
|
|||
val successorReason = "This room has been moved to a new location"
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
initialRoomInfo = aRoomInfo(
|
||||
successorRoom = SuccessorRoom(
|
||||
roomId = successorRoomId,
|
||||
|
|
@ -1143,11 +1059,7 @@ class MessagesPresenterTest {
|
|||
fun `present - room without successor room has null successor info in state`() = runTest {
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
initialRoomInfo = aRoomInfo(successorRoom = null)
|
||||
),
|
||||
typingNoticeResult = { Result.success(Unit) },
|
||||
|
|
@ -1165,11 +1077,13 @@ class MessagesPresenterTest {
|
|||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
sessionId = A_SESSION_ID,
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = FakeRoomPermissions(
|
||||
canSendState = { true },
|
||||
canSendMessage = { true },
|
||||
canRedactOther = true,
|
||||
canRedactOwn = true,
|
||||
canPinUnpin = true,
|
||||
),
|
||||
initialRoomInfo = aRoomInfo(isDirect = true, isEncrypted = true)
|
||||
).apply {
|
||||
givenRoomMembersState(RoomMembersState.Ready(persistentListOf(aRoomMember(userId = A_SESSION_ID), aRoomMember(userId = A_USER_ID_2))))
|
||||
|
|
@ -1312,16 +1226,44 @@ class MessagesPresenterTest {
|
|||
}
|
||||
}
|
||||
|
||||
private fun roomPermissions(
|
||||
canStartCall: Boolean = true,
|
||||
canRedactOther: Boolean = true,
|
||||
canRedactOwn: Boolean = true,
|
||||
canSendMessage: Boolean = true,
|
||||
canSendReaction: Boolean = true,
|
||||
canPinUnpin: Boolean = true,
|
||||
) = FakeRoomPermissions(
|
||||
canSendState = { type ->
|
||||
when (type) {
|
||||
StateEventType.CALL_MEMBER -> canStartCall
|
||||
else -> lambdaError()
|
||||
}
|
||||
},
|
||||
canSendMessage = { type ->
|
||||
when (type) {
|
||||
MessageEventType.RoomMessage -> canSendMessage
|
||||
MessageEventType.Reaction -> canSendReaction
|
||||
else -> lambdaError()
|
||||
}
|
||||
},
|
||||
canRedactOther = canRedactOther,
|
||||
canRedactOwn = canRedactOwn,
|
||||
canPinUnpin = canPinUnpin,
|
||||
)
|
||||
|
||||
private fun TestScope.createMessagesPresenter(
|
||||
coroutineDispatchers: CoroutineDispatchers = testCoroutineDispatchers(),
|
||||
timeline: Timeline = FakeTimeline(),
|
||||
joinedRoom: FakeJoinedRoom = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserJoinCallResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = FakeRoomPermissions(
|
||||
canSendState = { true },
|
||||
canSendMessage = { true },
|
||||
canRedactOther = true,
|
||||
canRedactOwn = true,
|
||||
canPinUnpin = true,
|
||||
),
|
||||
).apply {
|
||||
givenRoomInfo(aRoomInfo(id = roomId, name = ""))
|
||||
},
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ import io.element.android.libraries.matrix.test.room.FakeBaseRoom
|
|||
import io.element.android.libraries.matrix.test.room.FakeJoinedRoom
|
||||
import io.element.android.libraries.matrix.test.room.aRoomInfo
|
||||
import io.element.android.libraries.matrix.test.room.aRoomMember
|
||||
import io.element.android.libraries.matrix.test.room.powerlevels.FakeRoomPermissions
|
||||
import io.element.android.libraries.matrix.test.timeline.FakeTimeline
|
||||
import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails
|
||||
import io.element.android.libraries.mediapickers.api.PickerProvider
|
||||
|
|
@ -991,9 +992,12 @@ class MessageComposerPresenterTest {
|
|||
val invitedUser = aRoomMember(userId = A_USER_ID_3, membership = RoomMembershipState.INVITE)
|
||||
val bob = aRoomMember(userId = A_USER_ID_2, membership = RoomMembershipState.JOIN)
|
||||
val david = aRoomMember(userId = A_USER_ID_4, displayName = "Dave", membership = RoomMembershipState.JOIN)
|
||||
var canUserTriggerRoomNotificationResult = true
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(canUserTriggerRoomNotificationResult = { Result.success(canUserTriggerRoomNotificationResult) }),
|
||||
baseRoom = FakeBaseRoom(
|
||||
roomPermissions = FakeRoomPermissions(
|
||||
canTriggerRoomNotification = true,
|
||||
)
|
||||
),
|
||||
typingNoticeResult = { Result.success(Unit) }
|
||||
).apply {
|
||||
givenRoomMembersState(
|
||||
|
|
@ -1033,10 +1037,38 @@ class MessageComposerPresenterTest {
|
|||
// If the suggestion isn't a mention, no suggestions are returned
|
||||
initialState.eventSink(MessageComposerEvent.SuggestionReceived(Suggestion(0, 0, SuggestionType.Command, "")))
|
||||
assertThat(awaitItem().suggestions).isEmpty()
|
||||
}
|
||||
}
|
||||
|
||||
// If user has no permission to send `@room` mentions, `RoomMemberSuggestion.Room` is not returned
|
||||
canUserTriggerRoomNotificationResult = false
|
||||
@Test
|
||||
fun `present - room mention suggestions no permission`() = runTest {
|
||||
val currentUser = aRoomMember(userId = A_USER_ID, membership = RoomMembershipState.JOIN)
|
||||
val invitedUser = aRoomMember(userId = A_USER_ID_3, membership = RoomMembershipState.INVITE)
|
||||
val bob = aRoomMember(userId = A_USER_ID_2, membership = RoomMembershipState.JOIN)
|
||||
val david = aRoomMember(userId = A_USER_ID_4, displayName = "Dave", membership = RoomMembershipState.JOIN)
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
roomPermissions = FakeRoomPermissions(
|
||||
canTriggerRoomNotification = false,
|
||||
)
|
||||
),
|
||||
typingNoticeResult = { Result.success(Unit) }
|
||||
).apply {
|
||||
givenRoomMembersState(
|
||||
RoomMembersState.Ready(
|
||||
persistentListOf(currentUser, invitedUser, bob, david),
|
||||
)
|
||||
)
|
||||
givenRoomInfo(aRoomInfo(isDirect = false))
|
||||
}
|
||||
val presenter = createPresenter(room)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
val initialState = awaitItem()
|
||||
// An empty suggestion returns the joined members that are not the current user, but not the room
|
||||
initialState.eventSink(MessageComposerEvent.SuggestionReceived(Suggestion(0, 0, SuggestionType.Mention, "")))
|
||||
skipItems(1)
|
||||
assertThat(awaitItem().suggestions)
|
||||
.containsExactly(ResolvedSuggestion.Member(bob), ResolvedSuggestion.Member(david))
|
||||
}
|
||||
|
|
@ -1049,7 +1081,9 @@ class MessageComposerPresenterTest {
|
|||
val bob = aRoomMember(userId = A_USER_ID_2, membership = RoomMembershipState.JOIN)
|
||||
val david = aRoomMember(userId = A_USER_ID_4, displayName = "Dave", membership = RoomMembershipState.JOIN)
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(canUserTriggerRoomNotificationResult = { Result.success(true) }),
|
||||
baseRoom = FakeBaseRoom(
|
||||
roomPermissions = FakeRoomPermissions(canTriggerRoomNotification = true),
|
||||
),
|
||||
typingNoticeResult = { Result.success(Unit) }
|
||||
).apply {
|
||||
givenRoomMembersState(
|
||||
|
|
@ -1069,7 +1103,6 @@ class MessageComposerPresenterTest {
|
|||
presenter.present()
|
||||
}.test {
|
||||
val initialState = awaitItem()
|
||||
|
||||
// An empty suggestion returns the joined members that are not the current user, but not the room
|
||||
initialState.eventSink(MessageComposerEvent.SuggestionReceived(Suggestion(0, 0, SuggestionType.Mention, "")))
|
||||
skipItems(1)
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ import io.element.android.libraries.matrix.test.A_UNIQUE_ID
|
|||
import io.element.android.libraries.matrix.test.room.FakeBaseRoom
|
||||
import io.element.android.libraries.matrix.test.room.FakeJoinedRoom
|
||||
import io.element.android.libraries.matrix.test.room.aRoomInfo
|
||||
import io.element.android.libraries.matrix.test.room.powerlevels.FakeRoomPermissions
|
||||
import io.element.android.libraries.matrix.test.sync.FakeSyncService
|
||||
import io.element.android.libraries.matrix.test.timeline.FakeTimeline
|
||||
import io.element.android.libraries.matrix.test.timeline.aMessageContent
|
||||
|
|
@ -55,9 +56,7 @@ class PinnedMessagesListPresenterTest {
|
|||
fun `present - initial state`() = runTest {
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
).apply {
|
||||
givenRoomInfo(aRoomInfo(pinnedEventIds = listOf(AN_EVENT_ID)))
|
||||
}
|
||||
|
|
@ -74,9 +73,7 @@ class PinnedMessagesListPresenterTest {
|
|||
fun `present - timeline failure state`() = runTest {
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
).apply {
|
||||
givenRoomInfo(aRoomInfo(pinnedEventIds = listOf(AN_EVENT_ID)))
|
||||
},
|
||||
|
|
@ -95,9 +92,7 @@ class PinnedMessagesListPresenterTest {
|
|||
fun `present - empty state`() = runTest {
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
).apply {
|
||||
givenRoomInfo(aRoomInfo(pinnedEventIds = listOf()))
|
||||
},
|
||||
|
|
@ -117,9 +112,7 @@ class PinnedMessagesListPresenterTest {
|
|||
val pinnedEventsTimeline = createPinnedMessagesTimeline()
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
).apply {
|
||||
givenRoomInfo(aRoomInfo(pinnedEventIds = listOf(AN_EVENT_ID)))
|
||||
},
|
||||
|
|
@ -146,9 +139,7 @@ class PinnedMessagesListPresenterTest {
|
|||
val analyticsService = FakeAnalyticsService()
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
).apply {
|
||||
givenRoomInfo(aRoomInfo(pinnedEventIds = listOf(AN_EVENT_ID)))
|
||||
},
|
||||
|
|
@ -194,9 +185,7 @@ class PinnedMessagesListPresenterTest {
|
|||
val pinnedEventsTimeline = createPinnedMessagesTimeline()
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
).apply {
|
||||
givenRoomInfo(aRoomInfo(pinnedEventIds = listOf(AN_EVENT_ID)))
|
||||
},
|
||||
|
|
@ -225,9 +214,7 @@ class PinnedMessagesListPresenterTest {
|
|||
val pinnedEventsTimeline = createPinnedMessagesTimeline()
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
).apply {
|
||||
givenRoomInfo(aRoomInfo(pinnedEventIds = listOf(AN_EVENT_ID)))
|
||||
},
|
||||
|
|
@ -256,9 +243,7 @@ class PinnedMessagesListPresenterTest {
|
|||
val pinnedEventsTimeline = createPinnedMessagesTimeline()
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canRedactOwnResult = { Result.success(true) },
|
||||
canRedactOtherResult = { Result.success(true) },
|
||||
canUserPinUnpinResult = { Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
).apply {
|
||||
givenRoomInfo(aRoomInfo(pinnedEventIds = listOf(AN_EVENT_ID)))
|
||||
},
|
||||
|
|
@ -295,6 +280,16 @@ class PinnedMessagesListPresenterTest {
|
|||
)
|
||||
}
|
||||
|
||||
private fun roomPermissions(
|
||||
canRedactOther: Boolean = true,
|
||||
canRedactOwn: Boolean = true,
|
||||
canPinUnpin: Boolean = true,
|
||||
) = FakeRoomPermissions(
|
||||
canRedactOther = canRedactOther,
|
||||
canRedactOwn = canRedactOwn,
|
||||
canPinUnpin = canPinUnpin,
|
||||
)
|
||||
|
||||
private fun TestScope.createPinnedMessagesListPresenter(
|
||||
navigator: PinnedMessagesListNavigator = FakePinnedMessagesListNavigator(),
|
||||
room: JoinedRoom = FakeJoinedRoom(),
|
||||
|
|
|
|||
|
|
@ -8,8 +8,6 @@
|
|||
|
||||
package io.element.android.features.messages.impl.timeline
|
||||
|
||||
import app.cash.molecule.RecompositionMode
|
||||
import app.cash.molecule.moleculeFlow
|
||||
import app.cash.turbine.ReceiveTurbine
|
||||
import app.cash.turbine.test
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
|
|
@ -35,6 +33,7 @@ import io.element.android.libraries.matrix.api.core.RoomId
|
|||
import io.element.android.libraries.matrix.api.core.ThreadId
|
||||
import io.element.android.libraries.matrix.api.core.UniqueId
|
||||
import io.element.android.libraries.matrix.api.core.asEventId
|
||||
import io.element.android.libraries.matrix.api.room.MessageEventType
|
||||
import io.element.android.libraries.matrix.api.room.RoomMembersState
|
||||
import io.element.android.libraries.matrix.api.room.tombstone.PredecessorRoom
|
||||
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
|
||||
|
|
@ -55,6 +54,7 @@ import io.element.android.libraries.matrix.test.A_USER_ID
|
|||
import io.element.android.libraries.matrix.test.room.FakeBaseRoom
|
||||
import io.element.android.libraries.matrix.test.room.FakeJoinedRoom
|
||||
import io.element.android.libraries.matrix.test.room.aRoomMember
|
||||
import io.element.android.libraries.matrix.test.room.powerlevels.FakeRoomPermissions
|
||||
import io.element.android.libraries.matrix.test.timeline.FakeTimeline
|
||||
import io.element.android.libraries.matrix.test.timeline.aMessageContent
|
||||
import io.element.android.libraries.matrix.test.timeline.anEventTimelineItem
|
||||
|
|
@ -66,6 +66,7 @@ import io.element.android.tests.testutils.awaitLastSequentialItem
|
|||
import io.element.android.tests.testutils.consumeItemsUntilPredicate
|
||||
import io.element.android.tests.testutils.lambda.any
|
||||
import io.element.android.tests.testutils.lambda.assert
|
||||
import io.element.android.tests.testutils.lambda.lambdaError
|
||||
import io.element.android.tests.testutils.lambda.lambdaRecorder
|
||||
import io.element.android.tests.testutils.lambda.value
|
||||
import io.element.android.tests.testutils.test
|
||||
|
|
@ -97,9 +98,7 @@ class TimelinePresenterTest {
|
|||
@Test
|
||||
fun `present - initial state`() = runTest {
|
||||
val presenter = createTimelinePresenter()
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.timelineItems).isEmpty()
|
||||
assertThat(initialState.isLive).isTrue()
|
||||
|
|
@ -118,9 +117,7 @@ class TimelinePresenterTest {
|
|||
this.paginateLambda = paginateLambda
|
||||
}
|
||||
val presenter = createTimelinePresenter(timeline = timeline)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitItem()
|
||||
initialState.eventSink.invoke(TimelineEvents.LoadMore(Timeline.PaginationDirection.BACKWARDS))
|
||||
initialState.eventSink.invoke(TimelineEvents.LoadMore(Timeline.PaginationDirection.FORWARDS))
|
||||
|
|
@ -166,9 +163,6 @@ class TimelinePresenterTest {
|
|||
)
|
||||
val room = FakeJoinedRoom(
|
||||
liveTimeline = timeline,
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
)
|
||||
)
|
||||
val sessionPreferencesStore = InMemorySessionPreferencesStore(isSendPublicReadReceiptsEnabled = isSendPublicReadReceiptsEnabled)
|
||||
val presenter = createTimelinePresenter(
|
||||
|
|
@ -176,9 +170,7 @@ class TimelinePresenterTest {
|
|||
room = room,
|
||||
sessionPreferencesStore = sessionPreferencesStore,
|
||||
)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
initialState.eventSink.invoke(TimelineEvents.OnScrollFinished(0))
|
||||
runCurrent()
|
||||
|
|
@ -211,9 +203,7 @@ class TimelinePresenterTest {
|
|||
this.sendReadReceiptLambda = sendReadReceiptsLambda
|
||||
}
|
||||
val presenter = createTimelinePresenter(timeline)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
skipItems(1)
|
||||
awaitItem().run {
|
||||
eventSink.invoke(TimelineEvents.OnScrollFinished(1))
|
||||
|
|
@ -252,9 +242,7 @@ class TimelinePresenterTest {
|
|||
timeline = timeline,
|
||||
sessionPreferencesStore = sessionPreferencesStore,
|
||||
)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
skipItems(1)
|
||||
awaitItem().run {
|
||||
eventSink.invoke(TimelineEvents.OnScrollFinished(0))
|
||||
|
|
@ -290,9 +278,7 @@ class TimelinePresenterTest {
|
|||
this.sendReadReceiptLambda = sendReadReceiptsLambda
|
||||
}
|
||||
val presenter = createTimelinePresenter(timeline)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
skipItems(1)
|
||||
awaitItem().run {
|
||||
eventSink.invoke(TimelineEvents.OnScrollFinished(1))
|
||||
|
|
@ -320,9 +306,7 @@ class TimelinePresenterTest {
|
|||
this.sendReadReceiptLambda = sendReadReceiptsLambda
|
||||
}
|
||||
val presenter = createTimelinePresenter(timeline)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
skipItems(1)
|
||||
val initialState = awaitFirstItem()
|
||||
initialState.eventSink.invoke(TimelineEvents.OnScrollFinished(1))
|
||||
|
|
@ -339,9 +323,7 @@ class TimelinePresenterTest {
|
|||
markAsReadResult = { Result.success(Unit) },
|
||||
)
|
||||
val presenter = createTimelinePresenter(timeline)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.newEventState).isEqualTo(NewEventState.None)
|
||||
assertThat(initialState.timelineItems.size).isEqualTo(0)
|
||||
|
|
@ -390,9 +372,7 @@ class TimelinePresenterTest {
|
|||
timelineItems = timelineItems,
|
||||
)
|
||||
val presenter = createTimelinePresenter(timeline)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.newEventState).isEqualTo(NewEventState.None)
|
||||
assertThat(initialState.timelineItems.size).isEqualTo(0)
|
||||
|
|
@ -446,9 +426,7 @@ class TimelinePresenterTest {
|
|||
val presenter = createTimelinePresenter(
|
||||
sendPollResponseAction = sendPollResponseAction,
|
||||
)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
initialState.eventSink.invoke(TimelineEvents.SelectPollAnswer(AN_EVENT_ID, "anAnswerId"))
|
||||
}
|
||||
|
|
@ -462,9 +440,7 @@ class TimelinePresenterTest {
|
|||
val presenter = createTimelinePresenter(
|
||||
endPollAction = endPollAction,
|
||||
)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
initialState.eventSink.invoke(TimelineEvents.EndPoll(AN_EVENT_ID))
|
||||
}
|
||||
|
|
@ -481,9 +457,7 @@ class TimelinePresenterTest {
|
|||
val presenter = createTimelinePresenter(
|
||||
messagesNavigator = navigator,
|
||||
)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
awaitFirstItem().eventSink(TimelineEvents.EditPoll(AN_EVENT_ID))
|
||||
onEditPollClickLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID))
|
||||
}
|
||||
|
|
@ -500,9 +474,7 @@ class TimelinePresenterTest {
|
|||
),
|
||||
redactedVoiceMessageManager = redactedVoiceMessageManager,
|
||||
)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
assertThat(redactedVoiceMessageManager.invocations.size).isEqualTo(0)
|
||||
skipItems(2)
|
||||
assertThat(redactedVoiceMessageManager.invocations.size).isEqualTo(1)
|
||||
|
|
@ -528,16 +500,14 @@ class TimelinePresenterTest {
|
|||
liveTimeline = liveTimeline,
|
||||
createTimelineResult = { Result.success(detachedTimeline) },
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
threadRootIdForEventResult = { _ -> Result.success(null) },
|
||||
),
|
||||
)
|
||||
val presenter = createTimelinePresenter(
|
||||
room = room,
|
||||
)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
initialState.eventSink.invoke(TimelineEvents.FocusOnEvent(AN_EVENT_ID))
|
||||
awaitItem().also { state ->
|
||||
|
|
@ -579,15 +549,13 @@ class TimelinePresenterTest {
|
|||
)
|
||||
),
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
threadRootIdForEventResult = { Result.success(null) },
|
||||
),
|
||||
),
|
||||
timelineItemIndexer = timelineItemIndexer,
|
||||
)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
|
||||
advanceUntilIdle()
|
||||
|
|
@ -619,14 +587,12 @@ class TimelinePresenterTest {
|
|||
),
|
||||
createTimelineResult = { Result.failure(RuntimeException("An error")) },
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
threadRootIdForEventResult = { _ -> Result.success(null) },
|
||||
),
|
||||
)
|
||||
)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
initialState.eventSink(TimelineEvents.FocusOnEvent(AN_EVENT_ID))
|
||||
awaitItem().also { state ->
|
||||
|
|
@ -668,7 +634,7 @@ class TimelinePresenterTest {
|
|||
liveTimeline = liveTimeline,
|
||||
createTimelineResult = { Result.success(detachedTimeline) },
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
threadRootIdForEventResult = { _ -> Result.success(threadId) },
|
||||
),
|
||||
)
|
||||
|
|
@ -679,9 +645,7 @@ class TimelinePresenterTest {
|
|||
timeline = liveTimeline,
|
||||
messagesNavigator = navigator,
|
||||
)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
initialState.eventSink.invoke(TimelineEvents.FocusOnEvent(AN_EVENT_ID))
|
||||
|
||||
|
|
@ -729,7 +693,7 @@ class TimelinePresenterTest {
|
|||
liveTimeline = liveTimeline,
|
||||
createTimelineResult = { Result.success(detachedTimeline) },
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
threadRootIdForEventResult = { _ -> Result.success(threadId) },
|
||||
),
|
||||
)
|
||||
|
|
@ -740,9 +704,7 @@ class TimelinePresenterTest {
|
|||
timeline = liveTimeline,
|
||||
messagesNavigator = navigator,
|
||||
)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
initialState.eventSink.invoke(TimelineEvents.FocusOnEvent(AN_EVENT_ID))
|
||||
|
||||
|
|
@ -785,7 +747,7 @@ class TimelinePresenterTest {
|
|||
liveTimeline = liveTimeline,
|
||||
createTimelineResult = { Result.success(detachedTimeline) },
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
// Use a different thread id
|
||||
threadRootIdForEventResult = { _ -> Result.success(A_THREAD_ID_2) },
|
||||
),
|
||||
|
|
@ -797,9 +759,7 @@ class TimelinePresenterTest {
|
|||
timeline = liveTimeline,
|
||||
messagesNavigator = navigator,
|
||||
)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
initialState.eventSink.invoke(TimelineEvents.FocusOnEvent(AN_EVENT_ID))
|
||||
|
||||
|
|
@ -846,7 +806,7 @@ class TimelinePresenterTest {
|
|||
liveTimeline = liveTimeline,
|
||||
createTimelineResult = { Result.success(detachedTimeline) },
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
// The event is in the main timeline, not in a thread
|
||||
threadRootIdForEventResult = { _ -> Result.success(null) },
|
||||
),
|
||||
|
|
@ -858,9 +818,7 @@ class TimelinePresenterTest {
|
|||
timeline = liveTimeline,
|
||||
messagesNavigator = navigator,
|
||||
)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
initialState.eventSink.invoke(TimelineEvents.FocusOnEvent(AN_EVENT_ID))
|
||||
|
||||
|
|
@ -891,9 +849,7 @@ class TimelinePresenterTest {
|
|||
fun `present - show shield hide shield`() = runTest {
|
||||
val presenter = createTimelinePresenter()
|
||||
val shield = aCriticalShield()
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.messageShield).isNull()
|
||||
initialState.eventSink(TimelineEvents.ShowShieldDialog(shield))
|
||||
|
|
@ -929,7 +885,9 @@ class TimelinePresenterTest {
|
|||
)
|
||||
val room = FakeJoinedRoom(
|
||||
liveTimeline = timeline,
|
||||
baseRoom = FakeBaseRoom(canUserSendMessageResult = { _, _ -> Result.success(true) }),
|
||||
baseRoom = FakeBaseRoom(
|
||||
roomPermissions = roomPermissions(),
|
||||
),
|
||||
).apply {
|
||||
givenRoomMembersState(RoomMembersState.Unknown)
|
||||
}
|
||||
|
|
@ -937,9 +895,7 @@ class TimelinePresenterTest {
|
|||
val avatarUrl = "https://domain.com/avatar.jpg"
|
||||
|
||||
val presenter = createTimelinePresenter(timeline, room)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = consumeItemsUntilPredicate(30.seconds) { it.timelineItems.isNotEmpty() }.last()
|
||||
val event = initialState.timelineItems.first() as TimelineItem.Event
|
||||
assertThat(event.senderAvatar.url).isNull()
|
||||
|
|
@ -963,15 +919,13 @@ class TimelinePresenterTest {
|
|||
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
predecessorRoomResult = { predecessorRoom }
|
||||
),
|
||||
)
|
||||
|
||||
val presenter = createTimelinePresenter(room = room)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.timelineRoomInfo.predecessorRoom).isNotNull()
|
||||
assertThat(initialState.timelineRoomInfo.predecessorRoom?.roomId).isEqualTo(predecessorRoomId)
|
||||
|
|
@ -982,14 +936,12 @@ class TimelinePresenterTest {
|
|||
fun `present - timeline room info no predecessor`() = runTest {
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
predecessorRoomResult = { null }
|
||||
),
|
||||
)
|
||||
val presenter = createTimelinePresenter(room = room)
|
||||
moleculeFlow(RecompositionMode.Immediate) {
|
||||
presenter.present()
|
||||
}.test {
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.timelineRoomInfo.predecessorRoom).isNull()
|
||||
}
|
||||
|
|
@ -999,7 +951,7 @@ class TimelinePresenterTest {
|
|||
fun `present - timeline event navigate to room`() = runTest {
|
||||
val room = FakeJoinedRoom(
|
||||
baseRoom = FakeBaseRoom(
|
||||
canUserSendMessageResult = { _, _ -> Result.success(true) },
|
||||
roomPermissions = roomPermissions(),
|
||||
),
|
||||
)
|
||||
val onNavigateToRoomLambda = lambdaRecorder<RoomId, EventId?, List<String>, Unit> { _, _, _ -> }
|
||||
|
|
@ -1025,11 +977,32 @@ class TimelinePresenterTest {
|
|||
return awaitItem()
|
||||
}
|
||||
|
||||
private fun roomPermissions(
|
||||
canRedactOther: Boolean = false,
|
||||
canRedactOwn: Boolean = true,
|
||||
canSendMessage: Boolean = true,
|
||||
canSendReaction: Boolean = true,
|
||||
canPinUnpin: Boolean = false,
|
||||
) = FakeRoomPermissions(
|
||||
canSendMessage = { type ->
|
||||
when (type) {
|
||||
MessageEventType.RoomMessage -> canSendMessage
|
||||
MessageEventType.Reaction -> canSendReaction
|
||||
else -> lambdaError()
|
||||
}
|
||||
},
|
||||
canRedactOther = canRedactOther,
|
||||
canRedactOwn = canRedactOwn,
|
||||
canPinUnpin = canPinUnpin,
|
||||
)
|
||||
|
||||
private fun TestScope.createTimelinePresenter(
|
||||
timeline: Timeline = FakeTimeline(),
|
||||
room: FakeJoinedRoom = FakeJoinedRoom(
|
||||
liveTimeline = timeline,
|
||||
baseRoom = FakeBaseRoom(canUserSendMessageResult = { _, _ -> Result.success(true) }),
|
||||
baseRoom = FakeBaseRoom(
|
||||
roomPermissions = roomPermissions(),
|
||||
),
|
||||
),
|
||||
redactedVoiceMessageManager: RedactedVoiceMessageManager = FakeRedactedVoiceMessageManager(),
|
||||
messagesNavigator: FakeMessagesNavigator = FakeMessagesNavigator(),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue