Skip to content

Commit 3b41d4a

Browse files
committed
Add tests on RustSpaceRoomList
1 parent ba372c0 commit 3b41d4a

File tree

2 files changed

+176
-0
lines changed

2 files changed

+176
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Copyright 2025 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
5+
* Please see LICENSE files in the repository root for full details.
6+
*/
7+
8+
package io.element.android.libraries.matrix.impl.fixtures.fakes
9+
10+
import io.element.android.tests.testutils.lambda.lambdaError
11+
import io.element.android.tests.testutils.simulateLongTask
12+
import org.matrix.rustcomponents.sdk.NoPointer
13+
import org.matrix.rustcomponents.sdk.SpaceListUpdate
14+
import org.matrix.rustcomponents.sdk.SpaceRoom
15+
import org.matrix.rustcomponents.sdk.SpaceRoomList
16+
import org.matrix.rustcomponents.sdk.SpaceRoomListEntriesListener
17+
import org.matrix.rustcomponents.sdk.SpaceRoomListPaginationStateListener
18+
import org.matrix.rustcomponents.sdk.TaskHandle
19+
import uniffi.matrix_sdk_ui.SpaceRoomListPaginationState
20+
21+
class FakeFfiSpaceRoomList(
22+
private val paginateResult: () -> Unit = { lambdaError() },
23+
private val paginationStateResult: () -> SpaceRoomListPaginationState = { lambdaError() },
24+
private val roomsResult: () -> List<SpaceRoom> = { lambdaError() },
25+
) : SpaceRoomList(NoPointer) {
26+
private var spaceRoomListPaginationStateListener: SpaceRoomListPaginationStateListener? = null
27+
private var spaceRoomListEntriesListener: SpaceRoomListEntriesListener? = null
28+
29+
override suspend fun paginate() = simulateLongTask {
30+
paginateResult()
31+
}
32+
33+
override fun paginationState(): SpaceRoomListPaginationState {
34+
return paginationStateResult()
35+
}
36+
37+
override fun rooms(): List<SpaceRoom> {
38+
return roomsResult()
39+
}
40+
41+
override fun subscribeToPaginationStateUpdates(listener: SpaceRoomListPaginationStateListener): TaskHandle {
42+
spaceRoomListPaginationStateListener = listener
43+
return FakeFfiTaskHandle()
44+
}
45+
46+
fun triggerPaginationStateUpdate(state: SpaceRoomListPaginationState) {
47+
spaceRoomListPaginationStateListener?.onUpdate(state)
48+
}
49+
50+
override fun subscribeToRoomUpdate(listener: SpaceRoomListEntriesListener): TaskHandle {
51+
spaceRoomListEntriesListener = listener
52+
return FakeFfiTaskHandle()
53+
}
54+
55+
fun triggerRoomListUpdate(rooms: List<SpaceListUpdate>) {
56+
spaceRoomListEntriesListener?.onUpdate(rooms)
57+
}
58+
}
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
/*
2+
* Copyright 2025 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
5+
* Please see LICENSE files in the repository root for full details.
6+
*/
7+
8+
@file:OptIn(ExperimentalCoroutinesApi::class)
9+
10+
package io.element.android.libraries.matrix.impl.spaces
11+
12+
import app.cash.turbine.test
13+
import com.google.common.truth.Truth.assertThat
14+
import io.element.android.libraries.matrix.api.core.RoomId
15+
import io.element.android.libraries.matrix.api.spaces.SpaceRoomList
16+
import io.element.android.libraries.matrix.impl.fixtures.factories.aRustSpaceRoom
17+
import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiSpaceRoomList
18+
import io.element.android.libraries.matrix.test.A_ROOM_ID
19+
import io.element.android.libraries.matrix.test.A_ROOM_ID_2
20+
import io.element.android.libraries.previewutils.room.aSpaceRoom
21+
import io.element.android.tests.testutils.lambda.lambdaRecorder
22+
import kotlinx.coroutines.ExperimentalCoroutinesApi
23+
import kotlinx.coroutines.test.TestScope
24+
import kotlinx.coroutines.test.runCurrent
25+
import kotlinx.coroutines.test.runTest
26+
import org.junit.Test
27+
import org.matrix.rustcomponents.sdk.SpaceListUpdate
28+
import uniffi.matrix_sdk_ui.SpaceRoomListPaginationState
29+
import org.matrix.rustcomponents.sdk.SpaceRoomList as InnerSpaceRoomList
30+
31+
class RustSpaceRoomListTest {
32+
@Test
33+
fun `paginationStatusFlow emits values`() = runTest {
34+
val innerSpaceRoomList = FakeFfiSpaceRoomList(
35+
paginationStateResult = { SpaceRoomListPaginationState.Idle(false) }
36+
)
37+
val sut = createRustSpaceRoomList(
38+
innerSpaceRoomList = innerSpaceRoomList,
39+
)
40+
sut.paginationStatusFlow.test {
41+
// First value is the initial one
42+
assertThat(awaitItem()).isEqualTo(SpaceRoomList.PaginationStatus.Idle(hasMoreToLoad = false))
43+
// First value after the subscription occurs
44+
assertThat(awaitItem()).isEqualTo(SpaceRoomList.PaginationStatus.Idle(hasMoreToLoad = true))
45+
innerSpaceRoomList.triggerPaginationStateUpdate(SpaceRoomListPaginationState.Loading)
46+
assertThat(awaitItem()).isEqualTo(SpaceRoomList.PaginationStatus.Loading)
47+
innerSpaceRoomList.triggerPaginationStateUpdate(SpaceRoomListPaginationState.Idle(true))
48+
assertThat(awaitItem()).isEqualTo(SpaceRoomList.PaginationStatus.Idle(hasMoreToLoad = false))
49+
innerSpaceRoomList.triggerPaginationStateUpdate(SpaceRoomListPaginationState.Idle(false))
50+
assertThat(awaitItem()).isEqualTo(SpaceRoomList.PaginationStatus.Idle(hasMoreToLoad = true))
51+
}
52+
}
53+
54+
@Test
55+
fun `spaceRoomsFlow emits values`() = runTest {
56+
val innerSpaceRoomList = FakeFfiSpaceRoomList(
57+
paginationStateResult = { SpaceRoomListPaginationState.Idle(false) }
58+
)
59+
val sut = createRustSpaceRoomList(
60+
innerSpaceRoomList = innerSpaceRoomList,
61+
)
62+
sut.spaceRoomsFlow.test {
63+
// Give time for the subscription to be set
64+
runCurrent()
65+
innerSpaceRoomList.triggerRoomListUpdate(
66+
listOf(
67+
SpaceListUpdate.PushBack(aRustSpaceRoom(roomId = A_ROOM_ID_2))
68+
)
69+
)
70+
val rooms = awaitItem()
71+
assertThat(rooms).hasSize(1)
72+
assertThat(rooms[0].roomId).isEqualTo(A_ROOM_ID_2)
73+
}
74+
}
75+
76+
@Test
77+
fun `paginate invokes paginate on the inner class`() = runTest {
78+
val paginateResult = lambdaRecorder<Unit> { }
79+
val innerSpaceRoomList = FakeFfiSpaceRoomList(
80+
paginateResult = paginateResult,
81+
)
82+
val sut = createRustSpaceRoomList(
83+
innerSpaceRoomList = innerSpaceRoomList,
84+
)
85+
sut.paginate()
86+
paginateResult.assertions().isCalledOnce()
87+
}
88+
89+
@Test
90+
fun `currentSpaceFlow reads value from the SpaceRoomCache`() = runTest {
91+
val spaceRoomCache = SpaceRoomCache()
92+
val sut = createRustSpaceRoomList(
93+
spaceRoomCache = spaceRoomCache,
94+
)
95+
sut.currentSpaceFlow().test {
96+
assertThat(awaitItem()).isNull()
97+
val spaceRoom = aSpaceRoom(roomId = A_ROOM_ID)
98+
spaceRoomCache.update(listOf(spaceRoom))
99+
assertThat(awaitItem()).isEqualTo(spaceRoom)
100+
}
101+
}
102+
103+
private fun TestScope.createRustSpaceRoomList(
104+
roomId: RoomId = A_ROOM_ID,
105+
innerSpaceRoomList: InnerSpaceRoomList = FakeFfiSpaceRoomList(),
106+
innerProvider: suspend () -> InnerSpaceRoomList = { innerSpaceRoomList },
107+
spaceRoomMapper: SpaceRoomMapper = SpaceRoomMapper(),
108+
spaceRoomCache: SpaceRoomCache = SpaceRoomCache(),
109+
): RustSpaceRoomList {
110+
return RustSpaceRoomList(
111+
roomId = roomId,
112+
innerProvider = innerProvider,
113+
sessionCoroutineScope = backgroundScope,
114+
spaceRoomMapper = spaceRoomMapper,
115+
spaceRoomCache = spaceRoomCache,
116+
)
117+
}
118+
}

0 commit comments

Comments
 (0)