From 87f89244a60ff5b6effaeb86a489a3afe50bdaaa Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 19 Apr 2024 10:33:19 +0200 Subject: [PATCH] Avoid getting roomInfo again. Also add a test to cover the case of non-null inviter. --- .../joinroom/impl/JoinRoomPresenter.kt | 23 ++++++---------- .../joinroom/impl/JoinRoomPresenterTest.kt | 27 +++++++++++++++++++ 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenter.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenter.kt index 8e85b846cc..3edfb97d93 100644 --- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenter.kt +++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenter.kt @@ -40,7 +40,6 @@ import io.element.android.libraries.matrix.api.room.MatrixRoomInfo import io.element.android.libraries.matrix.api.room.preview.RoomPreview import io.element.android.libraries.matrix.ui.model.InviteSender import io.element.android.libraries.matrix.ui.model.toInviteSender -import kotlinx.coroutines.flow.first import java.util.Optional import kotlin.jvm.optionals.getOrNull @@ -78,22 +77,16 @@ class JoinRoomPresenter @AssistedInject constructor( else -> { value = ContentState.Loading(roomIdOrAlias) val result = matrixClient.getRoomPreview(roomId.toRoomIdOrAlias()) - result.fold( - onSuccess = { - value = it.toContentState(null) - if (it.isInvited) { - // Get the inviteSender - matrixClient.getRoomInfoFlow(roomId).first() - .getOrNull() - ?.inviter - ?.toInviteSender() - ?.let { inviteSender -> - value = it.toContentState(inviteSender) - } - } + value = result.fold( + onSuccess = { roomPreview -> + val inviteSender = roomInfo.getOrNull() + ?.takeIf { roomPreview.isInvited } + ?.inviter + ?.toInviteSender() + roomPreview.toContentState(inviteSender) }, onFailure = { throwable -> - value = if (throwable.message?.contains("403") == true) { + if (throwable.message?.contains("403") == true) { ContentState.UnknownRoom(roomIdOrAlias) } else { ContentState.Failure(roomIdOrAlias, throwable) diff --git a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt index e2fa92a8a3..939f60a4c8 100644 --- a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt +++ b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt @@ -25,6 +25,7 @@ import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomAlias import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias import io.element.android.libraries.matrix.api.room.CurrentUserMembership import io.element.android.libraries.matrix.api.room.preview.RoomPreview @@ -33,6 +34,8 @@ import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_ROOM_NAME import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.matrix.test.room.aRoomInfo +import io.element.android.libraries.matrix.test.room.aRoomMember +import io.element.android.libraries.matrix.ui.model.toInviteSender import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.lambda.assert import io.element.android.tests.testutils.lambda.lambdaRecorder @@ -106,6 +109,30 @@ class JoinRoomPresenterTest { } } + @Test + fun `present - when room is invited then join authorization is equal to invited, and inviter is provided`() = runTest { + val inviter = aRoomMember(userId = UserId("@bob:example.com"), displayName = "Bob") + val expectedInviteSender = inviter.toInviteSender() + val roomInfo = aRoomInfo( + currentUserMembership = CurrentUserMembership.INVITED, + inviter = inviter, + ) + val matrixClient = FakeMatrixClient().apply { + getRoomInfoFlowLambda = { _ -> + flowOf(Optional.of(roomInfo)) + } + } + val presenter = createJoinRoomPresenter( + matrixClient = matrixClient + ) + presenter.test { + skipItems(1) + awaitItem().also { state -> + assertThat(state.joinAuthorisationStatus).isEqualTo(JoinAuthorisationStatus.IsInvited(expectedInviteSender)) + } + } + } + @Test fun `present - when room is invited then accept and decline events are sent to acceptDeclinePresenter`() = runTest { val eventSinkRecorder = lambdaRecorder { _: AcceptDeclineInviteEvents -> }