From b67c4287935c1d78f58a5f941e5693bf80a817d0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 19 Sep 2024 16:00:57 +0200 Subject: [PATCH] Add test on RoomDirectorySearchProcessor Give the responsibility to the RoomDirectorySearchProcessor to create the `MutableSharedFlow` since it requires a replayCache to work properly. --- .../RoomDirectorySearchProcessor.kt | 5 +- .../roomdirectory/RustRoomDirectoryList.kt | 7 +- .../RoomDirectorySearchProcessorTest.kt | 75 +++++++++++++++++++ 3 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchProcessorTest.kt diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchProcessor.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchProcessor.kt index 6ae3103448..d3253176a3 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchProcessor.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchProcessor.kt @@ -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>, private val coroutineContext: CoroutineContext, ) { + private val roomDescriptions: MutableSharedFlow> = MutableSharedFlow(replay = 1) + val roomDescriptionsFlow: Flow> = roomDescriptions + private val roomDescriptionMapper: RoomDescriptionMapper = RoomDescriptionMapper() private val mutex = Mutex() diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RustRoomDirectoryList.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RustRoomDirectoryList.kt index 2d627c9358..7219e9c3ed 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RustRoomDirectoryList.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RustRoomDirectoryList.kt @@ -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>(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 = - combine(hasMoreToLoad, items) { hasMoreToLoad, items -> + combine(hasMoreToLoad, processor.roomDescriptionsFlow) { hasMoreToLoad, items -> RoomDirectoryList.State( hasMoreToLoad = hasMoreToLoad, items = items diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchProcessorTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchProcessorTest.kt new file mode 100644 index 0000000000..be61bd77f2 --- /dev/null +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomdirectory/RoomDirectorySearchProcessorTest.kt @@ -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)) + + } + } +}