Fix quality issues.
This commit is contained in:
parent
b7c6369ebf
commit
7628d480a8
3 changed files with 79 additions and 72 deletions
|
|
@ -32,7 +32,7 @@ class FakeRustEventTimelineItem(
|
|||
override fun isLocal(): Boolean = false
|
||||
override fun isOwn(): 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 readReceipts(): Map<String, Receipt> = emptyMap()
|
||||
override fun sender(): String = A_USER_ID.value
|
||||
|
|
|
|||
|
|
@ -13,8 +13,7 @@ import org.matrix.rustcomponents.sdk.Timeline
|
|||
import org.matrix.rustcomponents.sdk.TimelineDiff
|
||||
import org.matrix.rustcomponents.sdk.TimelineListener
|
||||
|
||||
class FakeRustTimeline(
|
||||
) : Timeline(NoPointer) {
|
||||
class FakeRustTimeline : Timeline(NoPointer) {
|
||||
private var listener: TimelineListener? = null
|
||||
override suspend fun addListener(listener: TimelineListener): TaskHandle {
|
||||
this.listener = listener
|
||||
|
|
|
|||
|
|
@ -33,89 +33,97 @@ import uniffi.matrix_sdk_ui.EventItemOrigin
|
|||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
class TimelineItemsSubscriberTest {
|
||||
@Test
|
||||
fun `when timeline emits an empty list of items, the flow must emits an empty list`() = runCancellableScopeTestWithTestScope { testScope, cancellableScope ->
|
||||
val timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> =
|
||||
MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE)
|
||||
val timeline = FakeRustTimeline()
|
||||
val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber(
|
||||
coroutineScope = cancellableScope,
|
||||
timeline = timeline,
|
||||
timelineItems = timelineItems,
|
||||
)
|
||||
timelineItems.test {
|
||||
timelineItemsSubscriber.subscribeIfNeeded()
|
||||
// Wait for the listener to be set.
|
||||
testScope.runCurrent()
|
||||
timeline.emitDiff(listOf(FakeRustTimelineDiff(item = null, change = TimelineChange.RESET)))
|
||||
val final = awaitItem()
|
||||
assertThat(final).isEmpty()
|
||||
timelineItemsSubscriber.unsubscribeIfNeeded()
|
||||
fun `when timeline emits an empty list of items, the flow must emits an empty list`() {
|
||||
runCancellableScopeTestWithTestScope { testScope, cancellableScope ->
|
||||
val timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> =
|
||||
MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE)
|
||||
val timeline = FakeRustTimeline()
|
||||
val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber(
|
||||
coroutineScope = cancellableScope,
|
||||
timeline = timeline,
|
||||
timelineItems = timelineItems,
|
||||
)
|
||||
timelineItems.test {
|
||||
timelineItemsSubscriber.subscribeIfNeeded()
|
||||
// Wait for the listener to be set.
|
||||
testScope.runCurrent()
|
||||
timeline.emitDiff(listOf(FakeRustTimelineDiff(item = null, change = TimelineChange.RESET)))
|
||||
val final = awaitItem()
|
||||
assertThat(final).isEmpty()
|
||||
timelineItemsSubscriber.unsubscribeIfNeeded()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `when timeline emits a non empty list of items, the flow must emits a non empty list`() = runCancellableScopeTestWithTestScope { testScope, cancellableScope ->
|
||||
val timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> =
|
||||
MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE)
|
||||
val timeline = FakeRustTimeline()
|
||||
val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber(
|
||||
coroutineScope = cancellableScope,
|
||||
timeline = timeline,
|
||||
timelineItems = timelineItems,
|
||||
)
|
||||
timelineItems.test {
|
||||
timelineItemsSubscriber.subscribeIfNeeded()
|
||||
// Wait for the listener to be set.
|
||||
testScope.runCurrent()
|
||||
timeline.emitDiff(listOf(FakeRustTimelineDiff(item = FakeRustTimelineItem(), change = TimelineChange.RESET)))
|
||||
val final = awaitItem()
|
||||
assertThat(final).isNotEmpty()
|
||||
timelineItemsSubscriber.unsubscribeIfNeeded()
|
||||
fun `when timeline emits a non empty list of items, the flow must emits a non empty list`() {
|
||||
runCancellableScopeTestWithTestScope { testScope, cancellableScope ->
|
||||
val timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> =
|
||||
MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE)
|
||||
val timeline = FakeRustTimeline()
|
||||
val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber(
|
||||
coroutineScope = cancellableScope,
|
||||
timeline = timeline,
|
||||
timelineItems = timelineItems,
|
||||
)
|
||||
timelineItems.test {
|
||||
timelineItemsSubscriber.subscribeIfNeeded()
|
||||
// Wait for the listener to be set.
|
||||
testScope.runCurrent()
|
||||
timeline.emitDiff(listOf(FakeRustTimelineDiff(item = FakeRustTimelineItem(), change = TimelineChange.RESET)))
|
||||
val final = awaitItem()
|
||||
assertThat(final).isNotEmpty()
|
||||
timelineItemsSubscriber.unsubscribeIfNeeded()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `when timeline emits an item with SYNC origin, the callback onNewSyncedEvent is invoked`() = runCancellableScopeTestWithTestScope { testScope, cancellableScope ->
|
||||
val timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> =
|
||||
MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE)
|
||||
val timeline = FakeRustTimeline()
|
||||
val onNewSyncedEventRecorder = lambdaRecorder<Unit> { }
|
||||
val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber(
|
||||
coroutineScope = cancellableScope,
|
||||
timeline = timeline,
|
||||
timelineItems = timelineItems,
|
||||
onNewSyncedEvent = onNewSyncedEventRecorder,
|
||||
)
|
||||
timelineItems.test {
|
||||
timelineItemsSubscriber.subscribeIfNeeded()
|
||||
// Wait for the listener to be set.
|
||||
testScope.runCurrent()
|
||||
timeline.emitDiff(
|
||||
listOf(
|
||||
FakeRustTimelineDiff(
|
||||
item = FakeRustTimelineItem(
|
||||
asEventResult = FakeRustEventTimelineItem(origin = EventItemOrigin.SYNC)
|
||||
),
|
||||
change = TimelineChange.RESET,
|
||||
fun `when timeline emits an item with SYNC origin, the callback onNewSyncedEvent is invoked`() {
|
||||
runCancellableScopeTestWithTestScope { testScope, cancellableScope ->
|
||||
val timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> =
|
||||
MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE)
|
||||
val timeline = FakeRustTimeline()
|
||||
val onNewSyncedEventRecorder = lambdaRecorder<Unit> { }
|
||||
val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber(
|
||||
coroutineScope = cancellableScope,
|
||||
timeline = timeline,
|
||||
timelineItems = timelineItems,
|
||||
onNewSyncedEvent = onNewSyncedEventRecorder,
|
||||
)
|
||||
timelineItems.test {
|
||||
timelineItemsSubscriber.subscribeIfNeeded()
|
||||
// Wait for the listener to be set.
|
||||
testScope.runCurrent()
|
||||
timeline.emitDiff(
|
||||
listOf(
|
||||
FakeRustTimelineDiff(
|
||||
item = FakeRustTimelineItem(
|
||||
asEventResult = FakeRustEventTimelineItem(origin = EventItemOrigin.SYNC)
|
||||
),
|
||||
change = TimelineChange.RESET,
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
val final = awaitItem()
|
||||
assertThat(final).isNotEmpty()
|
||||
timelineItemsSubscriber.unsubscribeIfNeeded()
|
||||
val final = awaitItem()
|
||||
assertThat(final).isNotEmpty()
|
||||
timelineItemsSubscriber.unsubscribeIfNeeded()
|
||||
}
|
||||
onNewSyncedEventRecorder.assertions().isCalledOnce()
|
||||
}
|
||||
onNewSyncedEventRecorder.assertions().isCalledOnce()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `multiple subscriptions does not have side effect`() = runCancellableScopeTestWithTestScope { testScope, cancellableScope ->
|
||||
val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber(
|
||||
coroutineScope = cancellableScope,
|
||||
)
|
||||
timelineItemsSubscriber.subscribeIfNeeded()
|
||||
timelineItemsSubscriber.subscribeIfNeeded()
|
||||
timelineItemsSubscriber.unsubscribeIfNeeded()
|
||||
timelineItemsSubscriber.unsubscribeIfNeeded()
|
||||
fun `multiple subscriptions does not have side effect`() {
|
||||
runCancellableScopeTestWithTestScope { testScope, cancellableScope ->
|
||||
val timelineItemsSubscriber = testScope.createTimelineItemsSubscriber(
|
||||
coroutineScope = cancellableScope,
|
||||
)
|
||||
timelineItemsSubscriber.subscribeIfNeeded()
|
||||
timelineItemsSubscriber.subscribeIfNeeded()
|
||||
timelineItemsSubscriber.unsubscribeIfNeeded()
|
||||
timelineItemsSubscriber.unsubscribeIfNeeded()
|
||||
}
|
||||
}
|
||||
|
||||
private fun TestScope.createTimelineItemsSubscriber(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue