mirror of
https://github.com/Novaloop-AG/element-x-android.git
synced 2026-11-03 16:10:00 +00:00
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:
+4
-1
@@ -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()
|
||||||
|
|
||||||
|
|||||||
+2
-5
@@ -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
|
||||||
|
|||||||
+75
@@ -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