Makes sure to test loadMore method on TimelinePresenter

This commit is contained in:
ganfra 2023-02-27 20:30:22 +01:00
parent c8ec8da44f
commit 39edc780fe
3 changed files with 32 additions and 12 deletions

View file

@ -55,7 +55,7 @@ class TimelinePresenter @Inject constructor(
} }
val timelineItems = timelineItemsFactory val timelineItems = timelineItemsFactory
.flow() .flow()
.collectAsState(emptyList()) .collectAsState()
val paginationState = timeline val paginationState = timeline
.paginationState() .paginationState()

View file

@ -42,6 +42,8 @@ class TimelinePresenterTest {
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.timelineItems).isEmpty() assertThat(initialState.timelineItems).isEmpty()
val loadedNoTimelineState = awaitItem()
assertThat(loadedNoTimelineState.timelineItems).isEmpty()
} }
} }
@ -58,11 +60,14 @@ class TimelinePresenterTest {
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.paginationState.canBackPaginate).isTrue() assertThat(initialState.paginationState.canBackPaginate).isTrue()
matrixTimeline.updatePaginationState { assertThat(initialState.paginationState.isBackPaginating).isFalse()
copy(canBackPaginate = false) initialState.eventSink.invoke(TimelineEvents.LoadMore)
} val inPaginationState = awaitItem()
val loadedState = awaitItem() assertThat(inPaginationState.paginationState.isBackPaginating).isTrue()
assertThat(loadedState.paginationState.canBackPaginate).isFalse() 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() presenter.present()
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
skipItems(1)
assertThat(initialState.highlightedEventId).isNull() assertThat(initialState.highlightedEventId).isNull()
initialState.eventSink.invoke(TimelineEvents.SetHighlightedEvent(AN_EVENT_ID)) initialState.eventSink.invoke(TimelineEvents.SetHighlightedEvent(AN_EVENT_ID))
val withHighlightedState = awaitItem() val withHighlightedState = awaitItem()

View file

@ -23,28 +23,42 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.emptyFlow
class FakeMatrixTimeline : MatrixTimeline { class FakeMatrixTimeline(
initialTimelineItems: List<MatrixTimelineItem> = emptyList(),
initialPaginationState: MatrixTimeline.PaginationState = MatrixTimeline.PaginationState(canBackPaginate = true, isBackPaginating = false)
) : MatrixTimeline {
private val paginationState = MutableStateFlow( private val paginationState: MutableStateFlow<MatrixTimeline.PaginationState> = MutableStateFlow(initialPaginationState)
MatrixTimeline.PaginationState(canBackPaginate = true, isBackPaginating = false) private val timelineItems: MutableStateFlow<List<MatrixTimelineItem>> = MutableStateFlow(initialTimelineItems)
)
fun updatePaginationState(update: (MatrixTimeline.PaginationState.() -> MatrixTimeline.PaginationState)) { fun updatePaginationState(update: (MatrixTimeline.PaginationState.() -> MatrixTimeline.PaginationState)) {
paginationState.value = update(paginationState.value) paginationState.value = update(paginationState.value)
} }
fun updateTimelineItems(update: (items: List<MatrixTimelineItem>) -> List<MatrixTimelineItem>) {
timelineItems.value = update(timelineItems.value)
}
override fun paginationState(): StateFlow<MatrixTimeline.PaginationState> { override fun paginationState(): StateFlow<MatrixTimeline.PaginationState> {
return paginationState return paginationState
} }
override fun timelineItems(): Flow<List<MatrixTimelineItem>> { override fun timelineItems(): Flow<List<MatrixTimelineItem>> {
return emptyFlow() return timelineItems
} }
override suspend fun paginateBackwards(requestSize: Int, untilNumberOfItems: Int): Result<Unit> { override suspend fun paginateBackwards(requestSize: Int, untilNumberOfItems: Int): Result<Unit> {
updatePaginationState {
copy(isBackPaginating = true)
}
delay(100) delay(100)
updatePaginationState {
copy(isBackPaginating = false)
}
updateTimelineItems { timelineItems ->
timelineItems
}
return Result.success(Unit) return Result.success(Unit)
} }