Avoid consumeItemsUntilPredicate and try the deterministic way.
This commit is contained in:
parent
2c2a2abd10
commit
ce2033bd43
1 changed files with 29 additions and 34 deletions
|
|
@ -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.features.lockscreen.impl.unlock.keypad.PinKeypadModel
|
||||||
import io.element.android.libraries.architecture.AsyncData
|
import io.element.android.libraries.architecture.AsyncData
|
||||||
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
||||||
import io.element.android.tests.testutils.consumeItemsUntilPredicate
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
@ -53,24 +52,23 @@ class PinUnlockPresenterTest {
|
||||||
assertThat(state.signOutAction).isInstanceOf(AsyncData.Uninitialized::class.java)
|
assertThat(state.signOutAction).isInstanceOf(AsyncData.Uninitialized::class.java)
|
||||||
assertThat(state.remainingAttempts).isInstanceOf(AsyncData.Uninitialized::class.java)
|
assertThat(state.remainingAttempts).isInstanceOf(AsyncData.Uninitialized::class.java)
|
||||||
}
|
}
|
||||||
consumeItemsUntilPredicate {
|
awaitItem().also { state ->
|
||||||
it.pinEntry is AsyncData.Success && it.remainingAttempts is AsyncData.Success
|
assertThat(state.pinEntry).isInstanceOf(AsyncData.Success::class.java)
|
||||||
}.last().also { state ->
|
assertThat(state.remainingAttempts).isInstanceOf(AsyncData.Success::class.java)
|
||||||
state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('1')))
|
state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('1')))
|
||||||
state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('2')))
|
state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('2')))
|
||||||
}
|
}
|
||||||
consumeItemsUntilPredicate { state ->
|
skipItems(1)
|
||||||
state.pinEntry.equalsTo(halfCompletePin)
|
awaitItem().also { state ->
|
||||||
}.last().also { state ->
|
state.pinEntry.assertText(halfCompletePin)
|
||||||
state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('3')))
|
state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('3')))
|
||||||
state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Back))
|
state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Back))
|
||||||
state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Empty))
|
state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Empty))
|
||||||
state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('3')))
|
state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('3')))
|
||||||
state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('5')))
|
state.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('5')))
|
||||||
}
|
}
|
||||||
consumeItemsUntilPredicate { state ->
|
skipItems(4)
|
||||||
state.pinEntry.equalsTo(completePin) && state.isUnlocked
|
awaitItem().also { state ->
|
||||||
}.last().also { state ->
|
|
||||||
state.pinEntry.assertText(completePin)
|
state.pinEntry.assertText(completePin)
|
||||||
assertThat(state.isUnlocked).isTrue()
|
assertThat(state.isUnlocked).isTrue()
|
||||||
}
|
}
|
||||||
|
|
@ -83,9 +81,11 @@ class PinUnlockPresenterTest {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
presenter.present()
|
presenter.present()
|
||||||
}.test {
|
}.test {
|
||||||
val initialState = consumeItemsUntilPredicate {
|
skipItems(1)
|
||||||
it.pinEntry is AsyncData.Success && it.remainingAttempts is AsyncData.Success
|
val initialState = awaitItem().also { state ->
|
||||||
}.last()
|
assertThat(state.pinEntry).isInstanceOf(AsyncData.Success::class.java)
|
||||||
|
assertThat(state.remainingAttempts).isInstanceOf(AsyncData.Success::class.java)
|
||||||
|
}
|
||||||
val numberOfAttempts = initialState.remainingAttempts.dataOrNull() ?: 0
|
val numberOfAttempts = initialState.remainingAttempts.dataOrNull() ?: 0
|
||||||
repeat(numberOfAttempts) {
|
repeat(numberOfAttempts) {
|
||||||
initialState.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('1')))
|
initialState.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('1')))
|
||||||
|
|
@ -93,9 +93,8 @@ class PinUnlockPresenterTest {
|
||||||
initialState.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('3')))
|
initialState.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('3')))
|
||||||
initialState.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('4')))
|
initialState.eventSink(PinUnlockEvents.OnPinKeypadPressed(PinKeypadModel.Number('4')))
|
||||||
}
|
}
|
||||||
consumeItemsUntilPredicate { state ->
|
skipItems(4 * numberOfAttempts + 2)
|
||||||
state.remainingAttempts.dataOrNull() == 0
|
awaitItem().also { state ->
|
||||||
}.last().also { state ->
|
|
||||||
assertThat(state.remainingAttempts.dataOrNull()).isEqualTo(0)
|
assertThat(state.remainingAttempts.dataOrNull()).isEqualTo(0)
|
||||||
assertThat(state.showSignOutPrompt).isTrue()
|
assertThat(state.showSignOutPrompt).isTrue()
|
||||||
assertThat(state.isSignOutPromptCancellable).isFalse()
|
assertThat(state.isSignOutPromptCancellable).isFalse()
|
||||||
|
|
@ -109,28 +108,28 @@ class PinUnlockPresenterTest {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
presenter.present()
|
presenter.present()
|
||||||
}.test {
|
}.test {
|
||||||
consumeItemsUntilPredicate {
|
skipItems(1)
|
||||||
it.pinEntry is AsyncData.Success && it.remainingAttempts is AsyncData.Success
|
awaitItem().also { state ->
|
||||||
}.last().also { state ->
|
assertThat(state.pinEntry).isInstanceOf(AsyncData.Success::class.java)
|
||||||
|
assertThat(state.remainingAttempts).isInstanceOf(AsyncData.Success::class.java)
|
||||||
state.eventSink(PinUnlockEvents.OnForgetPin)
|
state.eventSink(PinUnlockEvents.OnForgetPin)
|
||||||
}
|
}
|
||||||
consumeItemsUntilPredicate { state ->
|
awaitItem().also { state ->
|
||||||
state.showSignOutPrompt && state.isSignOutPromptCancellable
|
assertThat(state.showSignOutPrompt).isTrue()
|
||||||
}.last().also { state ->
|
assertThat(state.isSignOutPromptCancellable).isTrue()
|
||||||
state.eventSink(PinUnlockEvents.ClearSignOutPrompt)
|
state.eventSink(PinUnlockEvents.ClearSignOutPrompt)
|
||||||
}
|
}
|
||||||
consumeItemsUntilPredicate { state ->
|
awaitItem().also { state ->
|
||||||
!state.showSignOutPrompt
|
assertThat(state.showSignOutPrompt).isFalse()
|
||||||
}.last().also { state ->
|
|
||||||
state.eventSink(PinUnlockEvents.OnForgetPin)
|
state.eventSink(PinUnlockEvents.OnForgetPin)
|
||||||
}
|
}
|
||||||
consumeItemsUntilPredicate { state ->
|
awaitItem().also { state ->
|
||||||
state.showSignOutPrompt
|
assertThat(state.showSignOutPrompt).isTrue()
|
||||||
}.last().also { state ->
|
|
||||||
state.eventSink(PinUnlockEvents.SignOut)
|
state.eventSink(PinUnlockEvents.SignOut)
|
||||||
}
|
}
|
||||||
consumeItemsUntilPredicate { state ->
|
skipItems(2)
|
||||||
state.signOutAction is AsyncData.Success
|
awaitItem().also { state ->
|
||||||
|
assertThat(state.signOutAction).isInstanceOf(AsyncData.Success::class.java)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -139,10 +138,6 @@ class PinUnlockPresenterTest {
|
||||||
dataOrNull()?.assertText(text)
|
dataOrNull()?.assertText(text)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun AsyncData<PinEntry>.equalsTo(text: String): Boolean {
|
|
||||||
return dataOrNull()?.toText() == text
|
|
||||||
}
|
|
||||||
|
|
||||||
private suspend fun createPinUnlockPresenter(
|
private suspend fun createPinUnlockPresenter(
|
||||||
scope: CoroutineScope,
|
scope: CoroutineScope,
|
||||||
biometricUnlockManager: BiometricUnlockManager = FakeBiometricUnlockManager(),
|
biometricUnlockManager: BiometricUnlockManager = FakeBiometricUnlockManager(),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue