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:
parent
f4d8907f11
commit
b89e4c3ef3
3 changed files with 81 additions and 6 deletions
|
|
@ -8,6 +8,7 @@
|
||||||
package io.element.android.libraries.matrix.impl.roomdirectory
|
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.RoomDescription
|
||||||
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
|
|
@ -17,9 +18,11 @@ import timber.log.Timber
|
||||||
import kotlin.coroutines.CoroutineContext
|
import kotlin.coroutines.CoroutineContext
|
||||||
|
|
||||||
class RoomDirectorySearchProcessor(
|
class RoomDirectorySearchProcessor(
|
||||||
private val roomDescriptions: MutableSharedFlow<List<RoomDescription>>,
|
|
||||||
private val coroutineContext: CoroutineContext,
|
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 roomDescriptionMapper: RoomDescriptionMapper = RoomDescriptionMapper()
|
||||||
private val mutex = Mutex()
|
private val mutex = Mutex()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,10 @@
|
||||||
|
|
||||||
package io.element.android.libraries.matrix.impl.roomdirectory
|
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 io.element.android.libraries.matrix.api.roomdirectory.RoomDirectoryList
|
||||||
import kotlinx.coroutines.CancellationException
|
import kotlinx.coroutines.CancellationException
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.combine
|
import kotlinx.coroutines.flow.combine
|
||||||
import kotlinx.coroutines.flow.flowOn
|
import kotlinx.coroutines.flow.flowOn
|
||||||
|
|
@ -27,8 +25,7 @@ class RustRoomDirectoryList(
|
||||||
private val coroutineContext: CoroutineContext,
|
private val coroutineContext: CoroutineContext,
|
||||||
) : RoomDirectoryList {
|
) : RoomDirectoryList {
|
||||||
private val hasMoreToLoad = MutableStateFlow(true)
|
private val hasMoreToLoad = MutableStateFlow(true)
|
||||||
private val items = MutableSharedFlow<List<RoomDescription>>(replay = 1)
|
private val processor = RoomDirectorySearchProcessor(coroutineContext)
|
||||||
private val processor = RoomDirectorySearchProcessor(items, coroutineContext)
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
launchIn(coroutineScope)
|
launchIn(coroutineScope)
|
||||||
|
|
@ -77,7 +74,7 @@ class RustRoomDirectoryList(
|
||||||
}
|
}
|
||||||
|
|
||||||
override val state: Flow<RoomDirectoryList.State> =
|
override val state: Flow<RoomDirectoryList.State> =
|
||||||
combine(hasMoreToLoad, items) { hasMoreToLoad, items ->
|
combine(hasMoreToLoad, processor.roomDescriptionsFlow) { hasMoreToLoad, items ->
|
||||||
RoomDirectoryList.State(
|
RoomDirectoryList.State(
|
||||||
hasMoreToLoad = hasMoreToLoad,
|
hasMoreToLoad = hasMoreToLoad,
|
||||||
items = items
|
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))
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue