Add test on RoomDirectorySearchProcessor
Give the responsibility to the RoomDirectorySearchProcessor to create the `MutableSharedFlow` since it requires a replayCache to work properly.
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
package io.element.android.libraries.matrix.impl.roomdirectory
|
||||
|
||||
import io.element.android.libraries.matrix.api.roomdirectory.RoomDescription
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.sync.Mutex
|
||||
import kotlinx.coroutines.sync.withLock
|
||||
@@ -17,9 +18,11 @@ import timber.log.Timber
|
||||
import kotlin.coroutines.CoroutineContext
|
||||
|
||||
class RoomDirectorySearchProcessor(
|
||||
private val roomDescriptions: MutableSharedFlow<List<RoomDescription>>,
|
||||
private val coroutineContext: CoroutineContext,
|
||||
) {
|
||||
private val roomDescriptions: MutableSharedFlow<List<RoomDescription>> = MutableSharedFlow(replay = 1)
|
||||
val roomDescriptionsFlow: Flow<List<RoomDescription>> = roomDescriptions
|
||||
|
||||
private val roomDescriptionMapper: RoomDescriptionMapper = RoomDescriptionMapper()
|
||||
private val mutex = Mutex()
|
||||
|
||||
|
||||
@@ -7,12 +7,10 @@
|
||||
|
||||
package io.element.android.libraries.matrix.impl.roomdirectory
|
||||
|
||||
import io.element.android.libraries.matrix.api.roomdirectory.RoomDescription
|
||||
import io.element.android.libraries.matrix.api.roomdirectory.RoomDirectoryList
|
||||
import kotlinx.coroutines.CancellationException
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.combine
|
||||
import kotlinx.coroutines.flow.flowOn
|
||||
@@ -27,8 +25,7 @@ class RustRoomDirectoryList(
|
||||
private val coroutineContext: CoroutineContext,
|
||||
) : RoomDirectoryList {
|
||||
private val hasMoreToLoad = MutableStateFlow(true)
|
||||
private val items = MutableSharedFlow<List<RoomDescription>>(replay = 1)
|
||||
private val processor = RoomDirectorySearchProcessor(items, coroutineContext)
|
||||
private val processor = RoomDirectorySearchProcessor(coroutineContext)
|
||||
|
||||
init {
|
||||
launchIn(coroutineScope)
|
||||
@@ -77,7 +74,7 @@ class RustRoomDirectoryList(
|
||||
}
|
||||
|
||||
override val state: Flow<RoomDirectoryList.State> =
|
||||
combine(hasMoreToLoad, items) { hasMoreToLoad, items ->
|
||||
combine(hasMoreToLoad, processor.roomDescriptionsFlow) { hasMoreToLoad, items ->
|
||||
RoomDirectoryList.State(
|
||||
hasMoreToLoad = hasMoreToLoad,
|
||||
items = items
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright 2024 New Vector Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
* Please see LICENSE in the repository root for full details.
|
||||
*/
|
||||
|
||||
package io.element.android.libraries.matrix.impl.roomdirectory
|
||||
|
||||
import app.cash.turbine.test
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import io.element.android.libraries.matrix.impl.fixtures.factories.aRustRoomDescription
|
||||
import io.element.android.libraries.matrix.test.A_ROOM_ID
|
||||
import io.element.android.libraries.matrix.test.A_ROOM_ID_2
|
||||
import io.element.android.libraries.matrix.test.A_ROOM_ID_3
|
||||
import kotlinx.coroutines.test.StandardTestDispatcher
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.junit.Test
|
||||
import org.matrix.rustcomponents.sdk.RoomDirectorySearchEntryUpdate
|
||||
|
||||
class RoomDirectorySearchProcessorTest {
|
||||
private val rustRoom1 = aRustRoomDescription(roomId = A_ROOM_ID.value)
|
||||
private val rustRoom2 = aRustRoomDescription(roomId = A_ROOM_ID_2.value)
|
||||
private val rustRoom3 = aRustRoomDescription(roomId = A_ROOM_ID_3.value)
|
||||
private val mapper = RoomDescriptionMapper()
|
||||
private val room1 = mapper.map(rustRoom1)
|
||||
private val room2 = mapper.map(rustRoom2)
|
||||
private val room3 = mapper.map(rustRoom3)
|
||||
|
||||
@Test
|
||||
fun test() = runTest {
|
||||
val sut = RoomDirectorySearchProcessor(
|
||||
coroutineContext = StandardTestDispatcher(testScheduler),
|
||||
)
|
||||
sut.roomDescriptionsFlow.test {
|
||||
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Reset(listOf(rustRoom1))))
|
||||
assertThat(awaitItem()).isEqualTo(listOf(room1))
|
||||
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Append(listOf(rustRoom2))))
|
||||
assertThat(awaitItem()).isEqualTo(listOf(room1, room2))
|
||||
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.PushFront(rustRoom3)))
|
||||
assertThat(awaitItem()).isEqualTo(listOf(room3, room1, room2))
|
||||
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.PopFront))
|
||||
assertThat(awaitItem()).isEqualTo(listOf(room1, room2))
|
||||
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.PushBack(rustRoom3)))
|
||||
assertThat(awaitItem()).isEqualTo(listOf(room1, room2, room3))
|
||||
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.PopBack))
|
||||
assertThat(awaitItem()).isEqualTo(listOf(room1, room2))
|
||||
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Insert(1u, rustRoom3)))
|
||||
assertThat(awaitItem()).isEqualTo(listOf(room1, room3, room2))
|
||||
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Remove(1u)))
|
||||
assertThat(awaitItem()).isEqualTo(listOf(room1, room2))
|
||||
|
||||
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Reset(listOf(rustRoom1, rustRoom2))))
|
||||
assertThat(awaitItem()).isEqualTo(listOf(room1, room2))
|
||||
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Set(1u, rustRoom3)))
|
||||
assertThat(awaitItem()).isEqualTo(listOf(room1, room3))
|
||||
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Truncate(1u)))
|
||||
assertThat(awaitItem()).isEqualTo(listOf(room1))
|
||||
|
||||
sut.postUpdates(listOf(RoomDirectorySearchEntryUpdate.Clear))
|
||||
assertThat(awaitItem()).isEmpty()
|
||||
|
||||
// Check that all the actions are performed
|
||||
sut.postUpdates(
|
||||
listOf(
|
||||
RoomDirectorySearchEntryUpdate.PushBack(rustRoom1),
|
||||
RoomDirectorySearchEntryUpdate.PushBack(rustRoom2),
|
||||
RoomDirectorySearchEntryUpdate.PushBack(rustRoom3),
|
||||
)
|
||||
)
|
||||
assertThat(awaitItem()).isEqualTo(listOf(room1, room2, room3))
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user