From c075cbaf42f965770401a89857920cf479c2c290 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 22 Aug 2024 15:01:00 +0200 Subject: [PATCH 1/4] Remove unused code. --- .../android/libraries/matrix/ui/room/MatrixRoomMembers.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembers.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembers.kt index c04406228f..2dbbe70f32 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembers.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembers.kt @@ -46,12 +46,6 @@ fun getRoomMemberAsState(roomMembersState: MatrixRoomMembersState, userId: UserI } } -@Composable -fun MatrixRoom.getDirectRoomMember(): State { - val roomMembersState by membersStateFlow.collectAsState() - return getDirectRoomMember(roomMembersState = roomMembersState) -} - @Composable fun MatrixRoom.getDirectRoomMember(roomMembersState: MatrixRoomMembersState): State { val roomMembers = roomMembersState.roomMembers() From 4e82cb1ddc834d2984ff4dcc66177a0786268b1d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 22 Aug 2024 15:20:37 +0200 Subject: [PATCH 2/4] Add test on extension MatrixRoom.getDirectRoomMember --- .../matrix/ui/room/MatrixRoomMembersTest.kt | 161 ++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembersTest.kt diff --git a/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembersTest.kt b/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembersTest.kt new file mode 100644 index 0000000000..246f4f4fd5 --- /dev/null +++ b/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembersTest.kt @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.ui.room + +import app.cash.molecule.RecompositionMode +import app.cash.molecule.moleculeFlow +import app.cash.turbine.test +import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState +import io.element.android.libraries.matrix.api.room.RoomMembershipState +import io.element.android.libraries.matrix.test.A_USER_ID +import io.element.android.libraries.matrix.test.A_USER_ID_2 +import io.element.android.libraries.matrix.test.A_USER_ID_3 +import io.element.android.libraries.matrix.test.room.FakeMatrixRoom +import io.element.android.libraries.matrix.test.room.aRoomMember +import kotlinx.collections.immutable.persistentListOf +import kotlinx.coroutines.test.runTest +import org.junit.Test + +class MatrixRoomMembersTest { + private val roomMember1 = aRoomMember(A_USER_ID) + private val roomMember2 = aRoomMember(A_USER_ID_2) + private val roomMember3 = aRoomMember(A_USER_ID_3) + + @Test + fun `getDirectRoomMember emits other member for encrypted DM with 2 joined members`() = runTest { + val matrixRoom = FakeMatrixRoom( + sessionId = A_USER_ID, + isEncrypted = true, + isDirect = true, + ) + moleculeFlow(RecompositionMode.Immediate) { + matrixRoom.getDirectRoomMember( + MatrixRoomMembersState.Ready(persistentListOf(roomMember1, roomMember2)) + ) + }.test { + assertThat(awaitItem().value).isEqualTo(roomMember2) + } + } + + @Test + fun `getDirectRoomMember emit null if the room is not a dm`() = runTest { + val matrixRoom = FakeMatrixRoom( + sessionId = A_USER_ID, + isEncrypted = true, + isDirect = false, + ) + moleculeFlow(RecompositionMode.Immediate) { + matrixRoom.getDirectRoomMember( + MatrixRoomMembersState.Ready(persistentListOf(roomMember1, roomMember2)) + ) + }.test { + assertThat(awaitItem().value).isNull() + } + } + + @Test + fun `getDirectRoomMember emit null if the room is not encrypted`() = runTest { + val matrixRoom = FakeMatrixRoom( + sessionId = A_USER_ID, + isEncrypted = false, + isDirect = true, + ) + moleculeFlow(RecompositionMode.Immediate) { + matrixRoom.getDirectRoomMember( + MatrixRoomMembersState.Ready(persistentListOf(roomMember1, roomMember2)) + ) + }.test { + assertThat(awaitItem().value).isNull() + } + } + + @Test + fun `getDirectRoomMember emit null if the room has only 1 member`() = runTest { + val matrixRoom = FakeMatrixRoom( + sessionId = A_USER_ID, + isEncrypted = true, + isDirect = true, + ) + moleculeFlow(RecompositionMode.Immediate) { + matrixRoom.getDirectRoomMember( + MatrixRoomMembersState.Ready(persistentListOf(roomMember1)) + ) + }.test { + assertThat(awaitItem().value).isNull() + } + } + + @Test + fun `getDirectRoomMember emit null if the room has only 3 members`() = runTest { + val matrixRoom = FakeMatrixRoom( + sessionId = A_USER_ID, + isEncrypted = true, + isDirect = true, + ) + moleculeFlow(RecompositionMode.Immediate) { + matrixRoom.getDirectRoomMember( + MatrixRoomMembersState.Ready(persistentListOf(roomMember1, roomMember2, roomMember3)) + ) + }.test { + assertThat(awaitItem().value).isNull() + } + } + + @Test + fun `getDirectRoomMember emit null if the other member is not active`() = runTest { + val matrixRoom = FakeMatrixRoom( + sessionId = A_USER_ID, + isEncrypted = true, + isDirect = true, + ) + moleculeFlow(RecompositionMode.Immediate) { + matrixRoom.getDirectRoomMember( + MatrixRoomMembersState.Ready( + persistentListOf( + roomMember1, + roomMember2.copy(membership = RoomMembershipState.BAN), + ) + ) + ) + }.test { + assertThat(awaitItem().value).isNull() + } + } + + @Test + fun `getDirectRoomMember emit the other member if there are 2 active members`() = runTest { + val matrixRoom = FakeMatrixRoom( + sessionId = A_USER_ID, + isEncrypted = true, + isDirect = true, + ) + moleculeFlow(RecompositionMode.Immediate) { + matrixRoom.getDirectRoomMember( + MatrixRoomMembersState.Ready( + persistentListOf( + roomMember1, + roomMember2, + roomMember3.copy(membership = RoomMembershipState.BAN), + ) + ) + ) + }.test { + assertThat(awaitItem().value).isEqualTo(roomMember2) + } + } +} From f7fe898e662478bcd6210bbd600988ecfc295cf7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 22 Aug 2024 15:22:14 +0200 Subject: [PATCH 3/4] Add test on extension MatrixRoom.getCurrentRoomMember --- .../matrix/ui/room/MatrixRoomMembersTest.kt | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembersTest.kt b/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembersTest.kt index 246f4f4fd5..1c3d6a82ad 100644 --- a/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembersTest.kt +++ b/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembersTest.kt @@ -158,4 +158,39 @@ class MatrixRoomMembersTest { assertThat(awaitItem().value).isEqualTo(roomMember2) } } + + @Test + fun `getCurrentRoomMember returns the current user`() = runTest { + val matrixRoom = FakeMatrixRoom(sessionId = A_USER_ID) + moleculeFlow(RecompositionMode.Immediate) { + matrixRoom.getCurrentRoomMember( + MatrixRoomMembersState.Ready( + persistentListOf( + roomMember1, + roomMember2, + roomMember3, + ) + ) + ) + }.test { + assertThat(awaitItem().value).isEqualTo(roomMember1) + } + } + + @Test + fun `getCurrentRoomMember returns null if the member is not found`() = runTest { + val matrixRoom = FakeMatrixRoom(sessionId = A_USER_ID) + moleculeFlow(RecompositionMode.Immediate) { + matrixRoom.getCurrentRoomMember( + MatrixRoomMembersState.Ready( + persistentListOf( + roomMember2, + roomMember3, + ) + ) + ) + }.test { + assertThat(awaitItem().value).isNull() + } + } } From 89316b0a259a5bb9343e1103a903f301a921022e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 22 Aug 2024 15:25:04 +0200 Subject: [PATCH 4/4] Reuse existing function --- .../android/libraries/matrix/ui/room/MatrixRoomMembers.kt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembers.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembers.kt index 2dbbe70f32..dfbaaeb2df 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembers.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembers.kt @@ -61,11 +61,5 @@ fun MatrixRoom.getDirectRoomMember(roomMembersState: MatrixRoomMembersState): St @Composable fun MatrixRoom.getCurrentRoomMember(roomMembersState: MatrixRoomMembersState): State { - val roomMembers = roomMembersState.roomMembers() - return remember(roomMembersState) { - derivedStateOf { - roomMembers - ?.find { it.userId == sessionId } - } - } + return getRoomMemberAsState(roomMembersState = roomMembersState, userId = sessionId) }