Skip to content

Commit b67c428

Browse files
committed
Add test on RoomDirectorySearchProcessor
Give the responsibility to the RoomDirectorySearchProcessor to create the `MutableSharedFlow` since it requires a replayCache to work properly.
1 parent d1be434 commit b67c428

File tree

3 files changed

+81
-6
lines changed

3 files changed

+81
-6
lines changed

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchProcessor.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package io.element.android.libraries.matrix.impl.roomdirectory
99

1010
import io.element.android.libraries.matrix.api.roomdirectory.RoomDescription
11+
import kotlinx.coroutines.flow.Flow
1112
import kotlinx.coroutines.flow.MutableSharedFlow
1213
import kotlinx.coroutines.sync.Mutex
1314
import kotlinx.coroutines.sync.withLock
@@ -17,9 +18,11 @@ import timber.log.Timber
1718
import kotlin.coroutines.CoroutineContext
1819

1920
class RoomDirectorySearchProcessor(
20-
private val roomDescriptions: MutableSharedFlow<List<RoomDescription>>,
2121
private val coroutineContext: CoroutineContext,
2222
) {
23+
private val roomDescriptions: MutableSharedFlow<List<RoomDescription>> = MutableSharedFlow(replay = 1)
24+
val roomDescriptionsFlow: Flow<List<RoomDescription>> = roomDescriptions
25+
2326
private val roomDescriptionMapper: RoomDescriptionMapper = RoomDescriptionMapper()
2427
private val mutex = Mutex()
2528

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RustRoomDirectoryList.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,10 @@
77

88
package io.element.android.libraries.matrix.impl.roomdirectory
99

10-
import io.element.android.libraries.matrix.api.roomdirectory.RoomDescription
1110
import io.element.android.libraries.matrix.api.roomdirectory.RoomDirectoryList
1211
import kotlinx.coroutines.CancellationException
1312
import kotlinx.coroutines.CoroutineScope
1413
import kotlinx.coroutines.flow.Flow
15-
import kotlinx.coroutines.flow.MutableSharedFlow
1614
import kotlinx.coroutines.flow.MutableStateFlow
1715
import kotlinx.coroutines.flow.combine
1816
import kotlinx.coroutines.flow.flowOn
@@ -27,8 +25,7 @@ class RustRoomDirectoryList(
2725
private val coroutineContext: CoroutineContext,
2826
) : RoomDirectoryList {
2927
private val hasMoreToLoad = MutableStateFlow(true)
30-
private val items = MutableSharedFlow<List<RoomDescription>>(replay = 1)
31-
private val processor = RoomDirectorySearchProcessor(items, coroutineContext)
28+
private val processor = RoomDirectorySearchProcessor(coroutineContext)
3229

3330
init {
3431
launchIn(coroutineScope)
@@ -77,7 +74,7 @@ class RustRoomDirectoryList(
7774
}
7875

7976
override val state: Flow<RoomDirectoryList.State> =
80-
combine(hasMoreToLoad, items) { hasMoreToLoad, items ->
77+
combine(hasMoreToLoad, processor.roomDescriptionsFlow) { hasMoreToLoad, items ->
8178
RoomDirectoryList.State(
8279
hasMoreToLoad = hasMoreToLoad,
8380
items = items
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* Copyright 2024 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only
5+
* Please see LICENSE in the repository root for full details.
6+
*/
7+
8+
package io.element.android.libraries.matrix.impl.roomdirectory
9+
10+
import app.cash.turbine.test
11+
import com.google.common.truth.Truth.assertThat
12+
import io.element.android.libraries.matrix.impl.fixtures.factories.aRustRoomDescription
13+
import io.element.android.libraries.matrix.test.A_ROOM_ID
14+
import io.element.android.libraries.matrix.test.A_ROOM_ID_2
15+
import io.element.android.libraries.matrix.test.A_ROOM_ID_3
16+
import kotlinx.coroutines.test.StandardTestDispatcher
17+
import kotlinx.coroutines.test.runTest
18+
import org.junit.Test
19+
import org.matrix.rustcomponents.sdk.RoomDirectorySearchEntryUpdate
20+
21+
class RoomDirectorySearchProcessorTest {
22+
private val rustRoom1 = aRustRoomDescription(roomId = A_ROOM_ID.value)
23+
private val rustRoom2 = aRustRoomDescription(roomId = A_ROOM_ID_2.value)
24+
private val rustRoom3 = aRustRoomDescription(roomId = A_ROOM_ID_3.value)
25+
private val mapper = RoomDescriptionMapper()
26+
private val room1 = mapper.map(rustRoom1)
27+
private val room2 = mapper.map(rustRoom2)
28+
private val room3 = mapper.map(rustRoom3)
29+
30+
@Test
31+
fun test() = runTest {
32+
val sut = RoomDirectorySearchProcessor(
33+
coroutineContext = StandardTestDispatcher(testScheduler),
34+
)
35+
sut.roomDescriptionsFlow.test {
36+
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Reset(listOf(rustRoom1))))
37+
assertThat(awaitItem()).isEqualTo(listOf(room1))
38+
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Append(listOf(rustRoom2))))
39+
assertThat(awaitItem()).isEqualTo(listOf(room1, room2))
40+
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.PushFront(rustRoom3)))
41+
assertThat(awaitItem()).isEqualTo(listOf(room3, room1, room2))
42+
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.PopFront))
43+
assertThat(awaitItem()).isEqualTo(listOf(room1, room2))
44+
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.PushBack(rustRoom3)))
45+
assertThat(awaitItem()).isEqualTo(listOf(room1, room2, room3))
46+
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.PopBack))
47+
assertThat(awaitItem()).isEqualTo(listOf(room1, room2))
48+
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Insert(1u, rustRoom3)))
49+
assertThat(awaitItem()).isEqualTo(listOf(room1, room3, room2))
50+
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Remove(1u)))
51+
assertThat(awaitItem()).isEqualTo(listOf(room1, room2))
52+
53+
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Reset(listOf(rustRoom1, rustRoom2))))
54+
assertThat(awaitItem()).isEqualTo(listOf(room1, room2))
55+
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Set(1u, rustRoom3)))
56+
assertThat(awaitItem()).isEqualTo(listOf(room1, room3))
57+
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Truncate(1u)))
58+
assertThat(awaitItem()).isEqualTo(listOf(room1))
59+
60+
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Clear))
61+
assertThat(awaitItem()).isEmpty()
62+
63+
// Check that all the actions are performed
64+
sut.postUpdates(
65+
listOf(
66+
RoomDirectorySearchEntryUpdate.PushBack(rustRoom1),
67+
RoomDirectorySearchEntryUpdate.PushBack(rustRoom2),
68+
RoomDirectorySearchEntryUpdate.PushBack(rustRoom3),
69+
)
70+
)
71+
assertThat(awaitItem()).isEqualTo(listOf(room1, room2, room3))
72+
73+
}
74+
}
75+
}

0 commit comments

Comments
 (0)