Improve test coverage of PinnedMessagesBannerState

This commit is contained in:
Benoit Marty 2025-07-02 13:29:22 +02:00 committed by Benoit Marty
parent 2d0c039c68
commit fa6c804447
4 changed files with 23 additions and 25 deletions

View file

@ -391,7 +391,7 @@ private fun MessagesViewContent(
Box { Box {
val scrollBehavior = PinnedMessagesBannerViewDefaults.rememberScrollBehavior( val scrollBehavior = PinnedMessagesBannerViewDefaults.rememberScrollBehavior(
pinnedMessagesCount = state.pinnedMessagesBannerState.pinnedMessagesCount(), pinnedMessagesCount = (state.pinnedMessagesBannerState as? PinnedMessagesBannerState.Visible)?.pinnedMessagesCount() ?: 0,
) )
TimelineView( TimelineView(
state = state.timelineState, state = state.timelineState,

View file

@ -10,14 +10,30 @@ package io.element.android.features.messages.impl.pinned.banner
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import io.element.android.libraries.designsystem.text.toAnnotatedString import io.element.android.libraries.designsystem.text.toAnnotatedString
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
@Immutable @Immutable
sealed interface PinnedMessagesBannerState { sealed interface PinnedMessagesBannerState {
data object Hidden : PinnedMessagesBannerState data object Hidden : PinnedMessagesBannerState
sealed interface Visible : PinnedMessagesBannerState sealed interface Visible : PinnedMessagesBannerState {
fun pinnedMessagesCount() = when (this) {
is Loading -> expectedPinnedMessagesCount
is Loaded -> loadedPinnedMessagesCount
}
fun currentPinnedMessageIndex() = when (this) {
is Loading -> expectedPinnedMessagesCount - 1
is Loaded -> currentPinnedMessageIndex
}
@Composable
fun formattedMessage() = when (this) {
is Loading -> stringResource(id = CommonStrings.screen_room_pinned_banner_loading_description).toAnnotatedString()
is Loaded -> currentPinnedMessage.formatted
}
}
data class Loading(val expectedPinnedMessagesCount: Int) : Visible data class Loading(val expectedPinnedMessagesCount: Int) : Visible
data class Loaded( data class Loaded(
val currentPinnedMessage: PinnedMessagesBannerItem, val currentPinnedMessage: PinnedMessagesBannerItem,
@ -25,23 +41,4 @@ sealed interface PinnedMessagesBannerState {
val loadedPinnedMessagesCount: Int, val loadedPinnedMessagesCount: Int,
val eventSink: (PinnedMessagesBannerEvents) -> Unit val eventSink: (PinnedMessagesBannerEvents) -> Unit
) : Visible ) : Visible
fun pinnedMessagesCount() = when (this) {
is Hidden -> 0
is Loading -> expectedPinnedMessagesCount
is Loaded -> loadedPinnedMessagesCount
}
fun currentPinnedMessageIndex() = when (this) {
is Hidden -> 0
is Loading -> expectedPinnedMessagesCount - 1
is Loaded -> currentPinnedMessageIndex
}
@Composable
fun formattedMessage() = when (this) {
is Hidden -> AnnotatedString("")
is Loading -> stringResource(id = CommonStrings.screen_room_pinned_banner_loading_description).toAnnotatedString()
is Loaded -> currentPinnedMessage.formatted
}
} }

View file

@ -78,7 +78,7 @@ fun PinnedMessagesBannerView(
@Composable @Composable
private fun PinnedMessagesBannerRow( private fun PinnedMessagesBannerRow(
state: PinnedMessagesBannerState, state: PinnedMessagesBannerState.Visible,
onClick: (EventId) -> Unit, onClick: (EventId) -> Unit,
onViewAllClick: () -> Unit, onViewAllClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,

View file

@ -62,7 +62,7 @@ class PinnedMessagesBannerPresenterTest {
val presenter = createPinnedMessagesBannerPresenter(room = room) val presenter = createPinnedMessagesBannerPresenter(room = room)
presenter.test { presenter.test {
skipItems(2) skipItems(2)
val loadingState = awaitItem() val loadingState = awaitItem() as PinnedMessagesBannerState.Loading
assertThat(loadingState).isEqualTo(PinnedMessagesBannerState.Loading(1)) assertThat(loadingState).isEqualTo(PinnedMessagesBannerState.Loading(1))
assertThat(loadingState.pinnedMessagesCount()).isEqualTo(1) assertThat(loadingState.pinnedMessagesCount()).isEqualTo(1)
assertThat(loadingState.currentPinnedMessageIndex()).isEqualTo(0) assertThat(loadingState.currentPinnedMessageIndex()).isEqualTo(0)
@ -167,7 +167,8 @@ class PinnedMessagesBannerPresenterTest {
val presenter = createPinnedMessagesBannerPresenter(room = room) val presenter = createPinnedMessagesBannerPresenter(room = room)
presenter.test { presenter.test {
skipItems(2) skipItems(2)
awaitItem().also { loadingState -> awaitItem().also { state ->
val loadingState = state as PinnedMessagesBannerState.Loading
assertThat(loadingState).isEqualTo(PinnedMessagesBannerState.Loading(1)) assertThat(loadingState).isEqualTo(PinnedMessagesBannerState.Loading(1))
assertThat(loadingState.pinnedMessagesCount()).isEqualTo(1) assertThat(loadingState.pinnedMessagesCount()).isEqualTo(1)
assertThat(loadingState.currentPinnedMessageIndex()).isEqualTo(0) assertThat(loadingState.currentPinnedMessageIndex()).isEqualTo(0)