7
7
8
8
package io.element.android.libraries.matrix.impl.room
9
9
10
+ import app.cash.turbine.TurbineTestContext
11
+ import app.cash.turbine.test
10
12
import com.google.common.truth.Truth.assertThat
13
+ import io.element.android.libraries.matrix.api.room.CurrentUserMembership
14
+ import io.element.android.libraries.matrix.api.room.RoomInfo
11
15
import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
16
+ import io.element.android.libraries.matrix.api.timeline.item.event.MembershipChange
12
17
import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeRustRoom
13
18
import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeRustRoomListService
14
19
import io.element.android.libraries.matrix.test.A_DEVICE_ID
15
20
import io.element.android.libraries.matrix.test.A_SESSION_ID
16
21
import io.element.android.libraries.matrix.test.room.aRoomInfo
17
22
import io.element.android.tests.testutils.testCoroutineDispatchers
23
+ import kotlinx.coroutines.flow.SharingStarted
24
+ import kotlinx.coroutines.flow.shareIn
18
25
import kotlinx.coroutines.isActive
19
26
import kotlinx.coroutines.test.TestScope
20
27
import kotlinx.coroutines.test.runTest
@@ -29,22 +36,115 @@ class RustBaseRoomTest {
29
36
assertThat(rustBaseRoom.roomCoroutineScope.isActive).isFalse()
30
37
}
31
38
32
- private fun TestScope.createRustBaseRoom (): RustBaseRoom {
39
+ @Test
40
+ fun `when currentUserMembership=JOINED and user leave room succeed then roomMembershipObserver emits change as LEFT` () = runTest {
41
+ val roomMembershipObserver = RoomMembershipObserver ()
42
+ val rustBaseRoom = createRustBaseRoom(
43
+ initialRoomInfo = aRoomInfo(currentUserMembership = CurrentUserMembership .JOINED ),
44
+ innerRoom = FakeRustRoom (
45
+ leaveLambda = {
46
+ // Simulate a successful leave
47
+ }
48
+ ),
49
+ roomMembershipObserver = roomMembershipObserver,
50
+ )
51
+ leaveRoomAndObserveMembershipChange(roomMembershipObserver, rustBaseRoom) {
52
+ val membershipUpdate = awaitItem()
53
+ assertThat(membershipUpdate.roomId).isEqualTo(rustBaseRoom.roomId)
54
+ assertThat(membershipUpdate.isUserInRoom).isFalse()
55
+ assertThat(membershipUpdate.change).isEqualTo(MembershipChange .LEFT )
56
+ }
57
+ }
58
+
59
+ @Test
60
+ fun `when currentUserMembership=KNOCKED and user leave room succeed then roomMembershipObserver emits change as KNOCK_RETRACTED` () = runTest {
61
+ val roomMembershipObserver = RoomMembershipObserver ()
62
+ val rustBaseRoom = createRustBaseRoom(
63
+ initialRoomInfo = aRoomInfo(currentUserMembership = CurrentUserMembership .KNOCKED ),
64
+ innerRoom = FakeRustRoom (
65
+ leaveLambda = {
66
+ // Simulate a successful leave
67
+ }
68
+ ),
69
+ roomMembershipObserver = roomMembershipObserver,
70
+ )
71
+ leaveRoomAndObserveMembershipChange(roomMembershipObserver, rustBaseRoom) {
72
+ val membershipUpdate = awaitItem()
73
+ assertThat(membershipUpdate.roomId).isEqualTo(rustBaseRoom.roomId)
74
+ assertThat(membershipUpdate.isUserInRoom).isFalse()
75
+ assertThat(membershipUpdate.change).isEqualTo(MembershipChange .KNOCK_RETRACTED )
76
+ }
77
+ }
78
+
79
+ @Test
80
+ fun `when currentUserMembership=INVITED and user leave room succeed then roomMembershipObserver emits change as INVITATION_REJECTED` () = runTest {
81
+ val roomMembershipObserver = RoomMembershipObserver ()
82
+ val rustBaseRoom = createRustBaseRoom(
83
+ initialRoomInfo = aRoomInfo(currentUserMembership = CurrentUserMembership .INVITED ),
84
+ innerRoom = FakeRustRoom (
85
+ leaveLambda = {
86
+ // Simulate a successful leave
87
+ }
88
+ ),
89
+ roomMembershipObserver = roomMembershipObserver,
90
+ )
91
+ leaveRoomAndObserveMembershipChange(roomMembershipObserver, rustBaseRoom) {
92
+ val membershipUpdate = awaitItem()
93
+ assertThat(membershipUpdate.roomId).isEqualTo(rustBaseRoom.roomId)
94
+ assertThat(membershipUpdate.isUserInRoom).isFalse()
95
+ assertThat(membershipUpdate.change).isEqualTo(MembershipChange .INVITATION_REJECTED )
96
+ }
97
+ }
98
+
99
+ @Test
100
+ fun `when user leave room fails then roomMembershipObserver emits nothing` () = runTest {
101
+ val roomMembershipObserver = RoomMembershipObserver ()
102
+ val rustBaseRoom = createRustBaseRoom(
103
+ initialRoomInfo = aRoomInfo(currentUserMembership = CurrentUserMembership .INVITED ),
104
+ innerRoom = FakeRustRoom (
105
+ leaveLambda = { error(" Leave failed" ) }
106
+ ),
107
+ roomMembershipObserver = roomMembershipObserver,
108
+ )
109
+ leaveRoomAndObserveMembershipChange(roomMembershipObserver, rustBaseRoom) {
110
+ // No emit
111
+ }
112
+ }
113
+
114
+ private suspend fun TestScope.leaveRoomAndObserveMembershipChange (
115
+ roomMembershipObserver : RoomMembershipObserver ,
116
+ rustBaseRoom : RustBaseRoom ,
117
+ validate : suspend TurbineTestContext <RoomMembershipObserver .RoomMembershipUpdate >.() -> Unit
118
+ ) {
119
+ val shared = roomMembershipObserver.updates.shareIn(scope = backgroundScope, started = SharingStarted .Eagerly , replay = 1 )
120
+ rustBaseRoom.leave()
121
+ shared.test {
122
+ validate()
123
+ ensureAllEventsConsumed()
124
+ }
125
+ rustBaseRoom.destroy()
126
+ }
127
+
128
+ private fun TestScope.createRustBaseRoom (
129
+ initialRoomInfo : RoomInfo = aRoomInfo(),
130
+ innerRoom : FakeRustRoom = FakeRustRoom (),
131
+ roomMembershipObserver : RoomMembershipObserver = RoomMembershipObserver (),
132
+ ): RustBaseRoom {
33
133
val dispatchers = testCoroutineDispatchers()
34
134
return RustBaseRoom (
35
135
sessionId = A_SESSION_ID ,
36
136
deviceId = A_DEVICE_ID ,
37
- innerRoom = FakeRustRoom () ,
137
+ innerRoom = innerRoom ,
38
138
coroutineDispatchers = dispatchers,
39
139
roomSyncSubscriber = RoomSyncSubscriber (
40
140
roomListService = FakeRustRoomListService (),
41
141
dispatchers = dispatchers,
42
142
),
43
- roomMembershipObserver = RoomMembershipObserver () ,
143
+ roomMembershipObserver = roomMembershipObserver ,
44
144
// Not using backgroundScope here, but the test scope
45
145
sessionCoroutineScope = this ,
46
146
roomInfoMapper = RoomInfoMapper (),
47
- initialRoomInfo = aRoomInfo() ,
147
+ initialRoomInfo = initialRoomInfo ,
48
148
)
49
149
}
50
150
}
0 commit comments