Skip to content

Commit eeeb8fc

Browse files
authored
Merge pull request #3327 from element-hq/feature/bma/moreTests
Add unit test on MatrixRoom extension
2 parents a942fd4 + bb08525 commit eeeb8fc

File tree

2 files changed

+197
-13
lines changed

2 files changed

+197
-13
lines changed

libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomMembers.kt

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,6 @@ fun getRoomMemberAsState(roomMembersState: MatrixRoomMembersState, userId: UserI
4646
}
4747
}
4848

49-
@Composable
50-
fun MatrixRoom.getDirectRoomMember(): State<RoomMember?> {
51-
val roomMembersState by membersStateFlow.collectAsState()
52-
return getDirectRoomMember(roomMembersState = roomMembersState)
53-
}
54-
5549
@Composable
5650
fun MatrixRoom.getDirectRoomMember(roomMembersState: MatrixRoomMembersState): State<RoomMember?> {
5751
val roomMembers = roomMembersState.roomMembers()
@@ -67,11 +61,5 @@ fun MatrixRoom.getDirectRoomMember(roomMembersState: MatrixRoomMembersState): St
6761

6862
@Composable
6963
fun MatrixRoom.getCurrentRoomMember(roomMembersState: MatrixRoomMembersState): State<RoomMember?> {
70-
val roomMembers = roomMembersState.roomMembers()
71-
return remember(roomMembersState) {
72-
derivedStateOf {
73-
roomMembers
74-
?.find { it.userId == sessionId }
75-
}
76-
}
64+
return getRoomMemberAsState(roomMembersState = roomMembersState, userId = sessionId)
7765
}
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
/*
2+
* Copyright (c) 2024 New Vector Ltd
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.element.android.libraries.matrix.ui.room
18+
19+
import app.cash.molecule.RecompositionMode
20+
import app.cash.molecule.moleculeFlow
21+
import app.cash.turbine.test
22+
import com.google.common.truth.Truth.assertThat
23+
import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState
24+
import io.element.android.libraries.matrix.api.room.RoomMembershipState
25+
import io.element.android.libraries.matrix.test.A_USER_ID
26+
import io.element.android.libraries.matrix.test.A_USER_ID_2
27+
import io.element.android.libraries.matrix.test.A_USER_ID_3
28+
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
29+
import io.element.android.libraries.matrix.test.room.aRoomMember
30+
import kotlinx.collections.immutable.persistentListOf
31+
import kotlinx.coroutines.test.runTest
32+
import org.junit.Test
33+
34+
class MatrixRoomMembersTest {
35+
private val roomMember1 = aRoomMember(A_USER_ID)
36+
private val roomMember2 = aRoomMember(A_USER_ID_2)
37+
private val roomMember3 = aRoomMember(A_USER_ID_3)
38+
39+
@Test
40+
fun `getDirectRoomMember emits other member for encrypted DM with 2 joined members`() = runTest {
41+
val matrixRoom = FakeMatrixRoom(
42+
sessionId = A_USER_ID,
43+
isEncrypted = true,
44+
isDirect = true,
45+
)
46+
moleculeFlow(RecompositionMode.Immediate) {
47+
matrixRoom.getDirectRoomMember(
48+
MatrixRoomMembersState.Ready(persistentListOf(roomMember1, roomMember2))
49+
)
50+
}.test {
51+
assertThat(awaitItem().value).isEqualTo(roomMember2)
52+
}
53+
}
54+
55+
@Test
56+
fun `getDirectRoomMember emit null if the room is not a dm`() = runTest {
57+
val matrixRoom = FakeMatrixRoom(
58+
sessionId = A_USER_ID,
59+
isEncrypted = true,
60+
isDirect = false,
61+
)
62+
moleculeFlow(RecompositionMode.Immediate) {
63+
matrixRoom.getDirectRoomMember(
64+
MatrixRoomMembersState.Ready(persistentListOf(roomMember1, roomMember2))
65+
)
66+
}.test {
67+
assertThat(awaitItem().value).isNull()
68+
}
69+
}
70+
71+
@Test
72+
fun `getDirectRoomMember emit null if the room is not encrypted`() = runTest {
73+
val matrixRoom = FakeMatrixRoom(
74+
sessionId = A_USER_ID,
75+
isEncrypted = false,
76+
isDirect = true,
77+
)
78+
moleculeFlow(RecompositionMode.Immediate) {
79+
matrixRoom.getDirectRoomMember(
80+
MatrixRoomMembersState.Ready(persistentListOf(roomMember1, roomMember2))
81+
)
82+
}.test {
83+
assertThat(awaitItem().value).isNull()
84+
}
85+
}
86+
87+
@Test
88+
fun `getDirectRoomMember emit null if the room has only 1 member`() = runTest {
89+
val matrixRoom = FakeMatrixRoom(
90+
sessionId = A_USER_ID,
91+
isEncrypted = true,
92+
isDirect = true,
93+
)
94+
moleculeFlow(RecompositionMode.Immediate) {
95+
matrixRoom.getDirectRoomMember(
96+
MatrixRoomMembersState.Ready(persistentListOf(roomMember1))
97+
)
98+
}.test {
99+
assertThat(awaitItem().value).isNull()
100+
}
101+
}
102+
103+
@Test
104+
fun `getDirectRoomMember emit null if the room has only 3 members`() = runTest {
105+
val matrixRoom = FakeMatrixRoom(
106+
sessionId = A_USER_ID,
107+
isEncrypted = true,
108+
isDirect = true,
109+
)
110+
moleculeFlow(RecompositionMode.Immediate) {
111+
matrixRoom.getDirectRoomMember(
112+
MatrixRoomMembersState.Ready(persistentListOf(roomMember1, roomMember2, roomMember3))
113+
)
114+
}.test {
115+
assertThat(awaitItem().value).isNull()
116+
}
117+
}
118+
119+
@Test
120+
fun `getDirectRoomMember emit null if the other member is not active`() = runTest {
121+
val matrixRoom = FakeMatrixRoom(
122+
sessionId = A_USER_ID,
123+
isEncrypted = true,
124+
isDirect = true,
125+
)
126+
moleculeFlow(RecompositionMode.Immediate) {
127+
matrixRoom.getDirectRoomMember(
128+
MatrixRoomMembersState.Ready(
129+
persistentListOf(
130+
roomMember1,
131+
roomMember2.copy(membership = RoomMembershipState.BAN),
132+
)
133+
)
134+
)
135+
}.test {
136+
assertThat(awaitItem().value).isNull()
137+
}
138+
}
139+
140+
@Test
141+
fun `getDirectRoomMember emit the other member if there are 2 active members`() = runTest {
142+
val matrixRoom = FakeMatrixRoom(
143+
sessionId = A_USER_ID,
144+
isEncrypted = true,
145+
isDirect = true,
146+
)
147+
moleculeFlow(RecompositionMode.Immediate) {
148+
matrixRoom.getDirectRoomMember(
149+
MatrixRoomMembersState.Ready(
150+
persistentListOf(
151+
roomMember1,
152+
roomMember2,
153+
roomMember3.copy(membership = RoomMembershipState.BAN),
154+
)
155+
)
156+
)
157+
}.test {
158+
assertThat(awaitItem().value).isEqualTo(roomMember2)
159+
}
160+
}
161+
162+
@Test
163+
fun `getCurrentRoomMember returns the current user`() = runTest {
164+
val matrixRoom = FakeMatrixRoom(sessionId = A_USER_ID)
165+
moleculeFlow(RecompositionMode.Immediate) {
166+
matrixRoom.getCurrentRoomMember(
167+
MatrixRoomMembersState.Ready(
168+
persistentListOf(
169+
roomMember1,
170+
roomMember2,
171+
roomMember3,
172+
)
173+
)
174+
)
175+
}.test {
176+
assertThat(awaitItem().value).isEqualTo(roomMember1)
177+
}
178+
}
179+
180+
@Test
181+
fun `getCurrentRoomMember returns null if the member is not found`() = runTest {
182+
val matrixRoom = FakeMatrixRoom(sessionId = A_USER_ID)
183+
moleculeFlow(RecompositionMode.Immediate) {
184+
matrixRoom.getCurrentRoomMember(
185+
MatrixRoomMembersState.Ready(
186+
persistentListOf(
187+
roomMember2,
188+
roomMember3,
189+
)
190+
)
191+
)
192+
}.test {
193+
assertThat(awaitItem().value).isNull()
194+
}
195+
}
196+
}

0 commit comments

Comments
 (0)