From 2be4beafd598462dcd89d85dd9c6e41b8af645fe Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 27 Feb 2024 20:31:09 +0100 Subject: [PATCH] PinUnlock tests: do not use awaitLastSequentialItem... --- .../impl/unlock/PinUnlockPresenterTest.kt | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenterTest.kt b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenterTest.kt index c81f4f773d..898e44a885 100644 --- a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenterTest.kt +++ b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/PinUnlockPresenterTest.kt @@ -30,7 +30,6 @@ import io.element.android.features.lockscreen.impl.pin.model.assertText import io.element.android.features.lockscreen.impl.unlock.keypad.PinKeypadModel import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.matrix.test.FakeMatrixClient -import io.element.android.tests.testutils.awaitLastSequentialItem import io.element.android.tests.testutils.consumeItemsUntilPredicate import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.test.runTest @@ -60,15 +59,18 @@ class PinUnlockPresenterTest { state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('1'))) state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('2'))) } - awaitLastSequentialItem().also { state -> - state.pinEntry.assertText(halfCompletePin) + consumeItemsUntilPredicate { state -> + state.pinEntry.equalsTo(halfCompletePin) + }.last().also { state -> state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('3'))) state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Back)) state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Empty)) state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('3'))) state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('5'))) } - awaitLastSequentialItem().also { state -> + consumeItemsUntilPredicate { state -> + state.pinEntry.equalsTo(completePin) && state.isUnlocked + }.last().also { state -> state.pinEntry.assertText(completePin) assertThat(state.isUnlocked).isTrue() } @@ -91,7 +93,9 @@ class PinUnlockPresenterTest { initialState.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('3'))) initialState.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('4'))) } - awaitLastSequentialItem().also { state -> + consumeItemsUntilPredicate { state -> + state.remainingAttempts.dataOrNull() == 0 + }.last().also { state -> assertThat(state.remainingAttempts.dataOrNull()).isEqualTo(0) assertThat(state.showSignOutPrompt).isTrue() assertThat(state.isSignOutPromptCancellable).isFalse() @@ -110,17 +114,19 @@ class PinUnlockPresenterTest { }.last().also { state -> state.eventSink(PinUnlockEvents.OnForgetPin) } - awaitLastSequentialItem().also { state -> - assertThat(state.showSignOutPrompt).isTrue() - assertThat(state.isSignOutPromptCancellable).isTrue() + consumeItemsUntilPredicate { state -> + state.showSignOutPrompt && state.isSignOutPromptCancellable + }.last().also { state -> state.eventSink(PinUnlockEvents.ClearSignOutPrompt) } - awaitLastSequentialItem().also { state -> - assertThat(state.showSignOutPrompt).isFalse() + consumeItemsUntilPredicate { state -> + !state.showSignOutPrompt + }.last().also { state -> state.eventSink(PinUnlockEvents.OnForgetPin) } - awaitLastSequentialItem().also { state -> - assertThat(state.showSignOutPrompt).isTrue() + consumeItemsUntilPredicate { state -> + state.showSignOutPrompt + }.last().also { state -> state.eventSink(PinUnlockEvents.SignOut) } consumeItemsUntilPredicate { state -> @@ -133,6 +139,10 @@ class PinUnlockPresenterTest { dataOrNull()?.assertText(text) } + private fun AsyncData.equalsTo(text: String): Boolean { + return dataOrNull()?.toText() == text + } + private suspend fun createPinUnlockPresenter( scope: CoroutineScope, biometricUnlockManager: BiometricUnlockManager = FakeBiometricUnlockManager(),