Browse Source

Add test on RoomDirectorySearchProcessor

Give the responsibility to the RoomDirectorySearchProcessor to create the `MutableSharedFlow` since it requires a replayCache to work properly.
pull/3501/head
Benoit Marty 4 weeks ago
parent
commit
b67c428793
  1. 5
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchProcessor.kt
  2. 7
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RustRoomDirectoryList.kt
  3. 75
      libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchProcessorTest.kt

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

@ -8,6 +8,7 @@ @@ -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 @@ -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
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RustRoomDirectoryList.kt

@ -7,12 +7,10 @@ @@ -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( @@ -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( @@ -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

75
libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchProcessorTest.kt

@ -0,0 +1,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))
}
}
}
Loading…
Cancel
Save