Add consumeItemsUntilPredicate to check how it goes...

This commit is contained in:
ganfra 2023-07-26 13:07:11 +02:00
parent 2c2c23b3a1
commit c6e023b053
2 changed files with 25 additions and 6 deletions

View file

@ -65,6 +65,7 @@ import io.element.android.libraries.mediapickers.test.FakePickerProvider
import io.element.android.libraries.mediaupload.api.MediaSender import io.element.android.libraries.mediaupload.api.MediaSender
import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor
import io.element.android.libraries.textcomposer.MessageComposerMode import io.element.android.libraries.textcomposer.MessageComposerMode
import io.element.android.tests.testutils.consumeItemsUntilPredicate
import io.element.android.tests.testutils.consumeItemsUntilTimeout import io.element.android.tests.testutils.consumeItemsUntilTimeout
import io.element.android.tests.testutils.testCoroutineDispatchers import io.element.android.tests.testutils.testCoroutineDispatchers
import io.mockk.mockk import io.mockk.mockk
@ -490,11 +491,14 @@ class MessagesPresenterTest {
}.test { }.test {
val initialState = consumeItemsUntilTimeout().last() val initialState = consumeItemsUntilTimeout().last()
initialState.eventSink(MessagesEvents.InviteDialogDismissed(InviteDialogAction.Invite)) initialState.eventSink(MessagesEvents.InviteDialogDismissed(InviteDialogAction.Invite))
val remainingStates = consumeItemsUntilTimeout() val loadingState = consumeItemsUntilPredicate { state ->
assertThat(remainingStates.size).isEqualTo(3) state.inviteProgress.isLoading()
assertThat(remainingStates[0].inviteProgress.isLoading()).isFalse() }.last()
assertThat(remainingStates[1].inviteProgress.isLoading()).isTrue() assertThat(loadingState.inviteProgress.isLoading()).isTrue()
assertThat(remainingStates[2].inviteProgress.isFailure()).isTrue() val failureState = consumeItemsUntilPredicate { state ->
state.inviteProgress.isFailure()
}.last()
assertThat(failureState.inviteProgress.isFailure()).isTrue()
} }
} }

View file

@ -24,17 +24,32 @@ import kotlin.time.Duration
import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.milliseconds
/** /**
* Consume all items until timeout is reached waiting for an event. * Consume all items until timeout is reached waiting for an event or we receive terminal event.
* The timeout is applied for each event. * The timeout is applied for each event.
* @return the list of consumed items. * @return the list of consumed items.
*/ */
suspend fun <T : Any> ReceiveTurbine<T>.consumeItemsUntilTimeout(timeout: Duration = 100.milliseconds): List<T> { suspend fun <T : Any> ReceiveTurbine<T>.consumeItemsUntilTimeout(timeout: Duration = 100.milliseconds): List<T> {
return consumeItemsUntilPredicate(timeout) { false }
}
/**
* Consume items until predicate is true, or timeout is reached waiting for an event, or we receive terminal event.
* The timeout is applied for each event.
* @return the list of consumed items.
*/
suspend fun <T : Any> ReceiveTurbine<T>.consumeItemsUntilPredicate(
timeout: Duration = 100.milliseconds,
predicate: (T) -> Boolean,
): List<T> {
val items = ArrayList<T>() val items = ArrayList<T>()
tryOrNull { tryOrNull {
while (true) { while (true) {
when (val event = withTurbineTimeout(timeout) { awaitEvent() }) { when (val event = withTurbineTimeout(timeout) { awaitEvent() }) {
is Event.Item<T> -> { is Event.Item<T> -> {
items.add(event.value) items.add(event.value)
if (predicate(event.value)) {
break
}
} }
else -> break else -> break
} }