From de7d93e37d3b3fee3bb4519cf3f28ba96f92d76d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 19 Sep 2024 16:41:19 +0200 Subject: [PATCH] Add test on RustRoomListService --- .../matrix/impl/room/RoomSyncSubscriber.kt | 4 +- .../impl/roomlist/RustRoomListService.kt | 2 +- .../fixtures/fakes/FakeRustRoomListService.kt | 18 ++++++ .../impl/roomlist/RustRoomListServiceTest.kt | 61 +++++++++++++++++++ 4 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListServiceTest.kt diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSyncSubscriber.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSyncSubscriber.kt index 792c6cb33d..9ad27a7914 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSyncSubscriber.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomSyncSubscriber.kt @@ -15,14 +15,14 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext import org.matrix.rustcomponents.sdk.RequiredState -import org.matrix.rustcomponents.sdk.RoomListServiceInterface +import org.matrix.rustcomponents.sdk.RoomListService import org.matrix.rustcomponents.sdk.RoomSubscription import timber.log.Timber private const val DEFAULT_TIMELINE_LIMIT = 20u class RoomSyncSubscriber( - private val roomListService: RoomListServiceInterface, + private val roomListService: RoomListService, private val dispatchers: CoroutineDispatchers, ) { private val subscribedRoomIds = mutableSetOf() diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListService.kt index ee0be05e4b..f8f2629f36 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListService.kt @@ -31,10 +31,10 @@ private const val DEFAULT_PAGE_SIZE = 20 internal class RustRoomListService( private val innerRoomListService: InnerRustRoomListService, - private val sessionCoroutineScope: CoroutineScope, private val sessionDispatcher: CoroutineDispatcher, private val roomListFactory: RoomListFactory, private val roomSyncSubscriber: RoomSyncSubscriber, + sessionCoroutineScope: CoroutineScope, ) : RoomListService { override fun createRoomList( pageSize: Int, diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeRustRoomListService.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeRustRoomListService.kt index 8d7015f97f..69ef9a4781 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeRustRoomListService.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeRustRoomListService.kt @@ -10,9 +10,27 @@ package io.element.android.libraries.matrix.impl.fixtures.fakes import org.matrix.rustcomponents.sdk.NoPointer import org.matrix.rustcomponents.sdk.RoomList import org.matrix.rustcomponents.sdk.RoomListService +import org.matrix.rustcomponents.sdk.RoomListServiceSyncIndicator +import org.matrix.rustcomponents.sdk.RoomListServiceSyncIndicatorListener +import org.matrix.rustcomponents.sdk.TaskHandle class FakeRustRoomListService : RoomListService(NoPointer) { + override suspend fun allRooms(): RoomList { return FakeRustRoomList() } + + private var listener: RoomListServiceSyncIndicatorListener? = null + override fun syncIndicator( + delayBeforeShowingInMs: UInt, + delayBeforeHidingInMs: UInt, + listener: RoomListServiceSyncIndicatorListener, + ): TaskHandle { + this.listener = listener + return FakeRustTaskHandle() + } + + fun emitRoomListServiceSyncIndicator(syncIndicator: RoomListServiceSyncIndicator) { + listener?.onUpdate(syncIndicator) + } } diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListServiceTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListServiceTest.kt new file mode 100644 index 0000000000..b8af0c2e65 --- /dev/null +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListServiceTest.kt @@ -0,0 +1,61 @@ +/* + * 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.roomlist + +import app.cash.turbine.test +import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.matrix.api.roomlist.RoomListService +import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeRustRoomListService +import io.element.android.libraries.matrix.impl.room.RoomSyncSubscriber +import io.element.android.tests.testutils.runCancellableScopeTestWithTestScope +import io.element.android.tests.testutils.testCoroutineDispatchers +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent +import org.junit.Test +import org.matrix.rustcomponents.sdk.RoomListServiceSyncIndicator +import org.matrix.rustcomponents.sdk.RoomListService as RustRoomListService + +@OptIn(ExperimentalCoroutinesApi::class) +class RustRoomListServiceTest { + @Test + fun `syncIndicator should emit the expected values`() = runCancellableScopeTestWithTestScope { testScope, cancellableScope -> + val roomListService = FakeRustRoomListService() + val sut = testScope.createRustRoomListService( + sessionCoroutineScope = cancellableScope, + roomListService = roomListService, + ) + // Give time for mxCallback to setup + testScope.runCurrent() + sut.syncIndicator.test { + assertThat(awaitItem()).isEqualTo(RoomListService.SyncIndicator.Hide) + roomListService.emitRoomListServiceSyncIndicator(RoomListServiceSyncIndicator.SHOW) + assertThat(awaitItem()).isEqualTo(RoomListService.SyncIndicator.Show) + roomListService.emitRoomListServiceSyncIndicator(RoomListServiceSyncIndicator.HIDE) + assertThat(awaitItem()).isEqualTo(RoomListService.SyncIndicator.Hide) + } + } +} + +private fun TestScope.createRustRoomListService( + sessionCoroutineScope: CoroutineScope, + roomListService: RustRoomListService = FakeRustRoomListService(), +) = RustRoomListService( + innerRoomListService = roomListService, + sessionDispatcher = StandardTestDispatcher(testScheduler), + roomListFactory = RoomListFactory( + innerRoomListService = roomListService, + sessionCoroutineScope = sessionCoroutineScope, + ), + roomSyncSubscriber = RoomSyncSubscriber( + roomListService = roomListService, + dispatchers = testCoroutineDispatchers(), + ), + sessionCoroutineScope = sessionCoroutineScope, +)