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.test.FakeMediaPreProcessor
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.testCoroutineDispatchers
import io.mockk.mockk
@@ -490,11 +491,14 @@ class MessagesPresenterTest {
}.test {
val initialState = consumeItemsUntilTimeout().last()
initialState.eventSink(MessagesEvents.InviteDialogDismissed(InviteDialogAction.Invite))
val remainingStates = consumeItemsUntilTimeout()
assertThat(remainingStates.size).isEqualTo(3)
assertThat(remainingStates[0].inviteProgress.isLoading()).isFalse()
assertThat(remainingStates[1].inviteProgress.isLoading()).isTrue()
assertThat(remainingStates[2].inviteProgress.isFailure()).isTrue()
val loadingState = consumeItemsUntilPredicate { state ->
state.inviteProgress.isLoading()
}.last()
assertThat(loadingState.inviteProgress.isLoading()).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
/**
* 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.
* @return the list of consumed items.
*/
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>()
tryOrNull {
while (true) {
when (val event = withTurbineTimeout(timeout) { awaitEvent() }) {
is Event.Item<T> -> {
items.add(event.value)
if (predicate(event.value)) {
break
}
}
else -> break
}