From 39edc780fea7bfbabe003769f090bc80a7f3557f Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 27 Feb 2023 20:30:22 +0100 Subject: [PATCH] Makes sure to test loadMore method on TimelinePresenter --- .../messages/timeline/TimelinePresenter.kt | 2 +- .../timeline/TimelinePresenterTest.kt | 16 ++++++++---- .../matrixtest/timeline/FakeMatrixTimeline.kt | 26 ++++++++++++++----- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelinePresenter.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelinePresenter.kt index b2cda24ff2..514ec34d78 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelinePresenter.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelinePresenter.kt @@ -55,7 +55,7 @@ class TimelinePresenter @Inject constructor( } val timelineItems = timelineItemsFactory .flow() - .collectAsState(emptyList()) + .collectAsState() val paginationState = timeline .paginationState() diff --git a/features/messages/src/test/kotlin/io/element/android/features/messages/timeline/TimelinePresenterTest.kt b/features/messages/src/test/kotlin/io/element/android/features/messages/timeline/TimelinePresenterTest.kt index 12b5b649ed..bc1f90395d 100644 --- a/features/messages/src/test/kotlin/io/element/android/features/messages/timeline/TimelinePresenterTest.kt +++ b/features/messages/src/test/kotlin/io/element/android/features/messages/timeline/TimelinePresenterTest.kt @@ -42,6 +42,8 @@ class TimelinePresenterTest { }.test { val initialState = awaitItem() assertThat(initialState.timelineItems).isEmpty() + val loadedNoTimelineState = awaitItem() + assertThat(loadedNoTimelineState.timelineItems).isEmpty() } } @@ -58,11 +60,14 @@ class TimelinePresenterTest { }.test { val initialState = awaitItem() assertThat(initialState.paginationState.canBackPaginate).isTrue() - matrixTimeline.updatePaginationState { - copy(canBackPaginate = false) - } - val loadedState = awaitItem() - assertThat(loadedState.paginationState.canBackPaginate).isFalse() + assertThat(initialState.paginationState.isBackPaginating).isFalse() + initialState.eventSink.invoke(TimelineEvents.LoadMore) + val inPaginationState = awaitItem() + assertThat(inPaginationState.paginationState.isBackPaginating).isTrue() + assertThat(inPaginationState.paginationState.canBackPaginate).isTrue() + val postPaginationState = awaitItem() + assertThat(postPaginationState.paginationState.canBackPaginate).isTrue() + assertThat(postPaginationState.paginationState.isBackPaginating).isFalse() } } @@ -78,6 +83,7 @@ class TimelinePresenterTest { presenter.present() }.test { val initialState = awaitItem() + skipItems(1) assertThat(initialState.highlightedEventId).isNull() initialState.eventSink.invoke(TimelineEvents.SetHighlightedEvent(AN_EVENT_ID)) val withHighlightedState = awaitItem() diff --git a/libraries/matrixtest/src/main/kotlin/io/element/android/libraries/matrixtest/timeline/FakeMatrixTimeline.kt b/libraries/matrixtest/src/main/kotlin/io/element/android/libraries/matrixtest/timeline/FakeMatrixTimeline.kt index bdf4c6dc16..9f8e2aa8ba 100644 --- a/libraries/matrixtest/src/main/kotlin/io/element/android/libraries/matrixtest/timeline/FakeMatrixTimeline.kt +++ b/libraries/matrixtest/src/main/kotlin/io/element/android/libraries/matrixtest/timeline/FakeMatrixTimeline.kt @@ -23,28 +23,42 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.emptyFlow -class FakeMatrixTimeline : MatrixTimeline { +class FakeMatrixTimeline( + initialTimelineItems: List = emptyList(), + initialPaginationState: MatrixTimeline.PaginationState = MatrixTimeline.PaginationState(canBackPaginate = true, isBackPaginating = false) +) : MatrixTimeline { - private val paginationState = MutableStateFlow( - MatrixTimeline.PaginationState(canBackPaginate = true, isBackPaginating = false) - ) + private val paginationState: MutableStateFlow = MutableStateFlow(initialPaginationState) + private val timelineItems: MutableStateFlow> = MutableStateFlow(initialTimelineItems) fun updatePaginationState(update: (MatrixTimeline.PaginationState.() -> MatrixTimeline.PaginationState)) { paginationState.value = update(paginationState.value) } + fun updateTimelineItems(update: (items: List) -> List) { + timelineItems.value = update(timelineItems.value) + } + override fun paginationState(): StateFlow { return paginationState } override fun timelineItems(): Flow> { - return emptyFlow() + return timelineItems } override suspend fun paginateBackwards(requestSize: Int, untilNumberOfItems: Int): Result { + updatePaginationState { + copy(isBackPaginating = true) + } delay(100) + updatePaginationState { + copy(isBackPaginating = false) + } + updateTimelineItems { timelineItems -> + timelineItems + } return Result.success(Unit) }