Browse Source

Fix quality issues.

pull/3554/head
Benoit Marty 3 weeks ago
parent
commit
7628d480a8
  1. 2
      libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeRustEventTimelineItem.kt
  2. 3
      libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeRustTimeline.kt
  3. 146
      libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineItemsSubscriberTest.kt

2
libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeRustEventTimelineItem.kt

@ -32,7 +32,7 @@ class FakeRustEventTimelineItem(
override fun isLocal(): Boolean = false override fun isLocal(): Boolean = false
override fun isOwn(): Boolean = false override fun isOwn(): Boolean = false
override fun isRemote(): Boolean = false override fun isRemote(): Boolean = false
override fun localSendState(): EventSendState? = null override fun localSendState(): EventSendState? = null
override fun reactions(): List<Reaction> = emptyList() override fun reactions(): List<Reaction> = emptyList()
override fun readReceipts(): Map<String, Receipt> = emptyMap() override fun readReceipts(): Map<String, Receipt> = emptyMap()
override fun sender(): String = A_USER_ID.value override fun sender(): String = A_USER_ID.value

3
libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeRustTimeline.kt

@ -13,8 +13,7 @@ import org.matrix.rustcomponents.sdk.Timeline
import org.matrix.rustcomponents.sdk.TimelineDiff import org.matrix.rustcomponents.sdk.TimelineDiff
import org.matrix.rustcomponents.sdk.TimelineListener import org.matrix.rustcomponents.sdk.TimelineListener
class FakeRustTimeline( class FakeRustTimeline : Timeline(NoPointer) {
) : Timeline(NoPointer) {
private var listener: TimelineListener? = null private var listener: TimelineListener? = null
override suspend fun addListener(listener: TimelineListener): TaskHandle { override suspend fun addListener(listener: TimelineListener): TaskHandle {
this.listener = listener this.listener = listener

146
libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineItemsSubscriberTest.kt

@ -33,89 +33,97 @@ import uniffi.matrix_sdk_ui.EventItemOrigin
@OptIn(ExperimentalCoroutinesApi::class) @OptIn(ExperimentalCoroutinesApi::class)
class TimelineItemsSubscriberTest { class TimelineItemsSubscriberTest {
@Test @Test
fun `when timeline emits an empty list of items, the flow must emits an empty list`() = runCancellableScopeTestWithTestScope { testScope, cancellableScope -> fun `when timeline emits an empty list of items, the flow must emits an empty list`() {
val timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> = runCancellableScopeTestWithTestScope { testScope, cancellableScope ->
MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE) val timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> =
val timeline = FakeRustTimeline() MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE)
val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber( val timeline = FakeRustTimeline()
coroutineScope = cancellableScope, val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber(
timeline = timeline, coroutineScope = cancellableScope,
timelineItems = timelineItems, timeline = timeline,
) timelineItems = timelineItems,
timelineItems.test { )
timelineItemsSubscriber.subscribeIfNeeded() timelineItems.test {
// Wait for the listener to be set. timelineItemsSubscriber.subscribeIfNeeded()
testScope.runCurrent() // Wait for the listener to be set.
timeline.emitDiff(listOf(FakeRustTimelineDiff(item = null, change = TimelineChange.RESET))) testScope.runCurrent()
val final = awaitItem() timeline.emitDiff(listOf(FakeRustTimelineDiff(item = null, change = TimelineChange.RESET)))
assertThat(final).isEmpty() val final = awaitItem()
timelineItemsSubscriber.unsubscribeIfNeeded() assertThat(final).isEmpty()
timelineItemsSubscriber.unsubscribeIfNeeded()
}
} }
} }
@Test @Test
fun `when timeline emits a non empty list of items, the flow must emits a non empty list`() = runCancellableScopeTestWithTestScope { testScope, cancellableScope -> fun `when timeline emits a non empty list of items, the flow must emits a non empty list`() {
val timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> = runCancellableScopeTestWithTestScope { testScope, cancellableScope ->
MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE) val timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> =
val timeline = FakeRustTimeline() MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE)
val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber( val timeline = FakeRustTimeline()
coroutineScope = cancellableScope, val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber(
timeline = timeline, coroutineScope = cancellableScope,
timelineItems = timelineItems, timeline = timeline,
) timelineItems = timelineItems,
timelineItems.test { )
timelineItemsSubscriber.subscribeIfNeeded() timelineItems.test {
// Wait for the listener to be set. timelineItemsSubscriber.subscribeIfNeeded()
testScope.runCurrent() // Wait for the listener to be set.
timeline.emitDiff(listOf(FakeRustTimelineDiff(item = FakeRustTimelineItem(), change = TimelineChange.RESET))) testScope.runCurrent()
val final = awaitItem() timeline.emitDiff(listOf(FakeRustTimelineDiff(item = FakeRustTimelineItem(), change = TimelineChange.RESET)))
assertThat(final).isNotEmpty() val final = awaitItem()
timelineItemsSubscriber.unsubscribeIfNeeded() assertThat(final).isNotEmpty()
timelineItemsSubscriber.unsubscribeIfNeeded()
}
} }
} }
@Test @Test
fun `when timeline emits an item with SYNC origin, the callback onNewSyncedEvent is invoked`() = runCancellableScopeTestWithTestScope { testScope, cancellableScope -> fun `when timeline emits an item with SYNC origin, the callback onNewSyncedEvent is invoked`() {
val timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> = runCancellableScopeTestWithTestScope { testScope, cancellableScope ->
MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE) val timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> =
val timeline = FakeRustTimeline() MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE)
val onNewSyncedEventRecorder = lambdaRecorder<Unit> { } val timeline = FakeRustTimeline()
val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber( val onNewSyncedEventRecorder = lambdaRecorder<Unit> { }
coroutineScope = cancellableScope, val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber(
timeline = timeline, coroutineScope = cancellableScope,
timelineItems = timelineItems, timeline = timeline,
onNewSyncedEvent = onNewSyncedEventRecorder, timelineItems = timelineItems,
) onNewSyncedEvent = onNewSyncedEventRecorder,
timelineItems.test { )
timelineItemsSubscriber.subscribeIfNeeded() timelineItems.test {
// Wait for the listener to be set. timelineItemsSubscriber.subscribeIfNeeded()
testScope.runCurrent() // Wait for the listener to be set.
timeline.emitDiff( testScope.runCurrent()
listOf( timeline.emitDiff(
FakeRustTimelineDiff( listOf(
item = FakeRustTimelineItem( FakeRustTimelineDiff(
asEventResult = FakeRustEventTimelineItem(origin = EventItemOrigin.SYNC) item = FakeRustTimelineItem(
), asEventResult = FakeRustEventTimelineItem(origin = EventItemOrigin.SYNC)
change = TimelineChange.RESET, ),
change = TimelineChange.RESET,
)
) )
) )
) val final = awaitItem()
val final = awaitItem() assertThat(final).isNotEmpty()
assertThat(final).isNotEmpty() timelineItemsSubscriber.unsubscribeIfNeeded()
timelineItemsSubscriber.unsubscribeIfNeeded() }
onNewSyncedEventRecorder.assertions().isCalledOnce()
} }
onNewSyncedEventRecorder.assertions().isCalledOnce()
} }
@Test @Test
fun `multiple subscriptions does not have side effect`() = runCancellableScopeTestWithTestScope { testScope, cancellableScope -> fun `multiple subscriptions does not have side effect`() {
val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber( runCancellableScopeTestWithTestScope { testScope, cancellableScope ->
coroutineScope = cancellableScope, val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber(
) coroutineScope = cancellableScope,
timelineItemsSubscriber.subscribeIfNeeded() )
timelineItemsSubscriber.subscribeIfNeeded() timelineItemsSubscriber.subscribeIfNeeded()
timelineItemsSubscriber.unsubscribeIfNeeded() timelineItemsSubscriber.subscribeIfNeeded()
timelineItemsSubscriber.unsubscribeIfNeeded() timelineItemsSubscriber.unsubscribeIfNeeded()
timelineItemsSubscriber.unsubscribeIfNeeded()
}
} }
private fun TestScope.createTimelineItemsSubscriber( private fun TestScope.createTimelineItemsSubscriber(

Loading…
Cancel
Save