Update tests.

This commit is contained in:
Benoit Marty 2026-05-20 10:53:50 +02:00
parent 53fe12bdda
commit dc05388cca
7 changed files with 119 additions and 5 deletions

View file

@ -13,6 +13,7 @@ import io.element.android.libraries.matrix.api.permalink.PermalinkData
import io.element.android.tests.testutils.lambda.lambdaError
class FakeJoinedRoomLoadedFlowNodeCallback : JoinedRoomLoadedFlowNode.Callback {
override fun onDone() = lambdaError()
override fun navigateToRoom(roomId: RoomId, serverNames: List<String>, clearBackStack: Boolean) = lambdaError()
override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) = lambdaError()
override fun navigateToGlobalNotificationSettings() = lambdaError()

View file

@ -70,6 +70,7 @@ dependencies {
testImplementation(projects.libraries.mediaviewer.test)
testImplementation(projects.libraries.permissions.test)
testImplementation(projects.libraries.preferences.test)
testImplementation(projects.libraries.push.test)
testImplementation(projects.libraries.usersearch.test)
testImplementation(projects.libraries.featureflag.test)
testImplementation(projects.features.call.test)

View file

@ -287,8 +287,6 @@ class RoomDetailsPresenter(
room.setUnreadFlag(isUnread = true)
.onSuccess {
analyticsService.captureInteraction(name = Interaction.Name.MobileRoomListRoomContextMenuUnreadToggle)
}
.onSuccess {
navigator.onDone()
}
}

View file

@ -68,6 +68,7 @@ class DefaultRoomDetailsEntryPointTest {
)
}
val callback = object : RoomDetailsEntryPoint.Callback {
override fun onDone() = lambdaError()
override fun navigateToGlobalNotificationSettings() = lambdaError()
override fun navigateToDeveloperSettings() = lambdaError()
override fun navigateToRoom(roomId: RoomId, serverNames: List<String>, clearBackStack: Boolean) = lambdaError()

View file

@ -0,0 +1,16 @@
/*
* Copyright (c) 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.roomdetails.impl
import io.element.android.tests.testutils.lambda.lambdaError
class FakeRoomDetailsNavigator(
private val onDoneResult: () -> Unit = { lambdaError() }
) : RoomDetailsNavigator {
override fun onDone() = onDoneResult()
}

View file

@ -15,6 +15,7 @@ import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.join.JoinRule
import io.element.android.libraries.matrix.api.room.powerlevels.RoomPermissions
import io.element.android.libraries.matrix.api.timeline.ReceiptType
import io.element.android.libraries.matrix.test.AN_AVATAR_URL
import io.element.android.libraries.matrix.test.A_ROOM_ALIAS
import io.element.android.libraries.matrix.test.A_ROOM_ID
@ -28,7 +29,7 @@ import io.element.android.libraries.matrix.test.room.aRoomInfo
import io.element.android.libraries.matrix.test.room.powerlevels.FakeRoomPermissions
import io.element.android.tests.testutils.lambda.lambdaError
fun aRoom(
fun aFakeBaseRoom(
sessionId: SessionId = A_SESSION_ID,
roomId: RoomId = A_ROOM_ID,
displayName: String = A_ROOM_NAME,
@ -49,6 +50,7 @@ fun aRoom(
getUpdatedMemberResult: (UserId) -> Result<RoomMember> = { lambdaError() },
userRoleResult: () -> Result<RoomMember.Role> = { lambdaError() },
setIsFavoriteResult: (Boolean) -> Result<Unit> = { lambdaError() },
markAsReadResult: (ReceiptType) -> Result<Unit> = { lambdaError() },
) = FakeBaseRoom(
sessionId = sessionId,
roomId = roomId,
@ -57,6 +59,7 @@ fun aRoom(
getUpdatedMemberResult = getUpdatedMemberResult,
userRoleResult = userRoleResult,
setIsFavoriteResult = setIsFavoriteResult,
markAsReadResult = markAsReadResult,
roomPermissions = roomPermissions,
initialRoomInfo = aRoomInfo(
name = displayName,
@ -106,6 +109,7 @@ fun aJoinedRoom(
publishRoomAliasInRoomDirectoryResult: (RoomAlias) -> Result<Boolean> = { lambdaError() },
removeRoomAliasFromRoomDirectoryResult: (RoomAlias) -> Result<Boolean> = { lambdaError() },
setIsFavoriteResult: (Boolean) -> Result<Unit> = { lambdaError() },
markAsReadResult: (ReceiptType) -> Result<Unit> = { lambdaError() },
) = FakeJoinedRoom(
roomNotificationSettingsService = notificationSettingsService,
setNameResult = setNameResult,
@ -118,7 +122,7 @@ fun aJoinedRoom(
updateCanonicalAliasResult = updateCanonicalAliasResult,
publishRoomAliasInRoomDirectoryResult = publishRoomAliasInRoomDirectoryResult,
removeRoomAliasFromRoomDirectoryResult = removeRoomAliasFromRoomDirectoryResult,
baseRoom = aRoom(
baseRoom = aFakeBaseRoom(
sessionId = sessionId,
roomId = roomId,
roomPermissions = roomPermissions,
@ -139,5 +143,6 @@ fun aJoinedRoom(
joinedMemberCount = joinedMemberCount,
activeMemberCount = activeMemberCount,
invitedMemberCount = invitedMemberCount,
markAsReadResult = markAsReadResult,
)
)

View file

@ -21,6 +21,8 @@ import io.element.android.libraries.androidutils.clipboard.ClipboardHelper
import io.element.android.libraries.androidutils.clipboard.FakeClipboardHelper
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.JoinedRoom
import io.element.android.libraries.matrix.api.room.RoomMembersState
@ -28,6 +30,7 @@ import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import io.element.android.libraries.matrix.api.room.StateEventType
import io.element.android.libraries.matrix.api.room.join.JoinRule
import io.element.android.libraries.matrix.api.room.powerlevels.RoomPermissions
import io.element.android.libraries.matrix.api.timeline.ReceiptType
import io.element.android.libraries.matrix.test.AN_AVATAR_URL
import io.element.android.libraries.matrix.test.AN_EVENT_ID
import io.element.android.libraries.matrix.test.A_ROOM_NAME
@ -41,7 +44,11 @@ import io.element.android.libraries.matrix.test.notificationsettings.FakeNotific
import io.element.android.libraries.matrix.test.room.aRoomInfo
import io.element.android.libraries.matrix.test.room.powerlevels.FakeRoomPermissions
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore
import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore
import io.element.android.libraries.push.api.notifications.NotificationCleaner
import io.element.android.libraries.push.test.notifications.FakeNotificationCleaner
import io.element.android.services.analytics.api.AnalyticsService
import io.element.android.services.analytics.test.FakeAnalyticsService
import io.element.android.tests.testutils.EventsRecorder
@ -79,7 +86,10 @@ class RoomDetailsPresenterTest {
analyticsService: AnalyticsService = FakeAnalyticsService(),
encryptionService: FakeEncryptionService = FakeEncryptionService(),
clipboardHelper: ClipboardHelper = FakeClipboardHelper(),
appPreferencesStore: AppPreferencesStore = InMemoryAppPreferencesStore()
appPreferencesStore: AppPreferencesStore = InMemoryAppPreferencesStore(),
navigator: RoomDetailsNavigator = FakeRoomDetailsNavigator(),
notificationCleaner: NotificationCleaner = FakeNotificationCleaner(),
sessionPreferencesStore: SessionPreferencesStore = InMemorySessionPreferencesStore(),
): RoomDetailsPresenter {
val matrixClient = FakeMatrixClient(notificationSettingsService = notificationSettingsService)
val roomMemberDetailsPresenterFactory = object : RoomMemberDetailsPresenter.Factory {
@ -96,6 +106,7 @@ class RoomDetailsPresenterTest {
}
}
return RoomDetailsPresenter(
navigator = navigator,
client = matrixClient,
room = room,
notificationSettingsService = matrixClient.notificationSettingsService,
@ -106,6 +117,8 @@ class RoomDetailsPresenterTest {
analyticsService = analyticsService,
clipboardHelper = clipboardHelper,
appPreferencesStore = appPreferencesStore,
notificationCleaner = notificationCleaner,
sessionPreferencesStore = sessionPreferencesStore,
)
}
@ -598,6 +611,85 @@ class RoomDetailsPresenterTest {
}
}
@Test
fun `present - mark as read`() = runTest {
val markAsReadResult = lambdaRecorder<ReceiptType, Result<Unit>> { _ -> Result.success(Unit) }
val room = aJoinedRoom(
markAsReadResult = markAsReadResult,
)
val clearMessagesForRoomResult = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> Result.success(Unit) }
val notificationCleaner = FakeNotificationCleaner(
clearMessagesForRoomLambda = clearMessagesForRoomResult,
)
val presenter = createRoomDetailsPresenter(
room = room,
notificationCleaner = notificationCleaner,
)
presenter.testWithLifecycleOwner(lifecycleOwner = fakeLifecycleOwner) {
skipItems(1)
with(awaitItem()) {
eventSink(RoomDetailsEvent.MarkAsRead)
}
assertThat(room.baseRoom.setUnreadFlagCalls).containsExactly(false)
markAsReadResult.assertions().isCalledOnce().with(value(ReceiptType.READ))
clearMessagesForRoomResult.assertions().isCalledOnce().with(
value(room.sessionId), value(room.roomId)
)
}
}
@Test
fun `present - mark as read - private`() = runTest {
val markAsReadResult = lambdaRecorder<ReceiptType, Result<Unit>> { _ -> Result.success(Unit) }
val room = aJoinedRoom(
markAsReadResult = markAsReadResult,
)
val sessionPreferencesStore = InMemorySessionPreferencesStore(
isSendPublicReadReceiptsEnabled = false,
)
val clearMessagesForRoomResult = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> Result.success(Unit) }
val notificationCleaner = FakeNotificationCleaner(
clearMessagesForRoomLambda = clearMessagesForRoomResult,
)
val presenter = createRoomDetailsPresenter(
room = room,
notificationCleaner = notificationCleaner,
sessionPreferencesStore = sessionPreferencesStore,
)
presenter.testWithLifecycleOwner(lifecycleOwner = fakeLifecycleOwner) {
skipItems(1)
with(awaitItem()) {
eventSink(RoomDetailsEvent.MarkAsRead)
}
assertThat(room.baseRoom.setUnreadFlagCalls).containsExactly(false)
markAsReadResult.assertions().isCalledOnce().with(value(ReceiptType.READ_PRIVATE))
clearMessagesForRoomResult.assertions().isCalledOnce().with(
value(room.sessionId), value(room.roomId)
)
}
}
@Test
fun `present - mark as unread`() = runTest {
val room = aJoinedRoom()
val onDoneResult = lambdaRecorder<Unit> { }
val navigator = FakeRoomDetailsNavigator(
onDoneResult = onDoneResult
)
val presenter = createRoomDetailsPresenter(
room = room,
navigator = navigator,
)
presenter.testWithLifecycleOwner(lifecycleOwner = fakeLifecycleOwner) {
skipItems(1)
with(awaitItem()) {
eventSink(RoomDetailsEvent.MarkAsUnread)
}
onDoneResult.assertions().isCalledOnce()
assertThat(room.baseRoom.setUnreadFlagCalls).containsExactly(true)
}
}
private fun roomPermissions(
canInvite: Boolean = true,
canKick: Boolean = true,