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