mirror of
https://github.com/Novaloop-AG/element-x-android.git
synced 2026-11-03 16:10:00 +00:00
Merge branch 'develop' into fix/1270-verification-request-timeout
This commit is contained in:
+6
-6
@@ -108,18 +108,18 @@ class IncomingVerificationPresenter(
|
||||
}
|
||||
}
|
||||
|
||||
fun handleEvent(event: IncomingVerificationViewEvents) {
|
||||
fun handleEvent(event: IncomingVerificationViewEvent) {
|
||||
Timber.d("Verification user action: ${event::class.simpleName}")
|
||||
when (event) {
|
||||
IncomingVerificationViewEvents.StartVerification ->
|
||||
IncomingVerificationViewEvent.StartVerification ->
|
||||
stateAndDispatch.dispatchAction(StateMachineEvent.AcceptIncomingRequest)
|
||||
IncomingVerificationViewEvents.IgnoreVerification ->
|
||||
IncomingVerificationViewEvent.IgnoreVerification ->
|
||||
navigator.onFinish()
|
||||
IncomingVerificationViewEvents.ConfirmVerification ->
|
||||
IncomingVerificationViewEvent.ConfirmVerification ->
|
||||
stateAndDispatch.dispatchAction(StateMachineEvent.AcceptChallenge)
|
||||
IncomingVerificationViewEvents.DeclineVerification ->
|
||||
IncomingVerificationViewEvent.DeclineVerification ->
|
||||
stateAndDispatch.dispatchAction(StateMachineEvent.DeclineChallenge)
|
||||
IncomingVerificationViewEvents.GoBack -> {
|
||||
IncomingVerificationViewEvent.GoBack -> {
|
||||
when (val verificationStep = step) {
|
||||
is Step.Initial -> if (verificationStep.isWaiting) {
|
||||
stateAndDispatch.dispatchAction(StateMachineEvent.Cancel)
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ import io.element.android.libraries.matrix.api.verification.VerificationRequest
|
||||
data class IncomingVerificationState(
|
||||
val step: Step,
|
||||
val request: VerificationRequest.Incoming,
|
||||
val eventSink: (IncomingVerificationViewEvents) -> Unit,
|
||||
val eventSink: (IncomingVerificationViewEvent) -> Unit,
|
||||
) {
|
||||
@Stable
|
||||
sealed interface Step {
|
||||
|
||||
+2
-2
@@ -20,7 +20,7 @@ import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||
import io.element.android.libraries.matrix.api.verification.SessionVerificationRequestDetails
|
||||
import io.element.android.libraries.matrix.api.verification.VerificationRequest
|
||||
|
||||
open class IncomingVerificationStateProvider : PreviewParameterProvider<IncomingVerificationState> {
|
||||
open class IncomingVerificationStatePreviewParam : PreviewParameterProvider<IncomingVerificationState> {
|
||||
override val values: Sequence<IncomingVerificationState>
|
||||
get() = sequenceOf(
|
||||
anIncomingVerificationState(),
|
||||
@@ -87,7 +87,7 @@ internal fun anIncomingUserVerificationRequest() = VerificationRequest.Incoming.
|
||||
internal fun anIncomingVerificationState(
|
||||
step: Step = aStepInitial(),
|
||||
verificationRequest: VerificationRequest.Incoming = anIncomingSessionVerificationRequest(),
|
||||
eventSink: (IncomingVerificationViewEvents) -> Unit = {},
|
||||
eventSink: (IncomingVerificationViewEvent) -> Unit = {},
|
||||
) = IncomingVerificationState(
|
||||
step = step,
|
||||
request = verificationRequest,
|
||||
+10
-8
@@ -62,7 +62,7 @@ fun IncomingVerificationView(
|
||||
val step = state.step
|
||||
|
||||
BackHandler {
|
||||
state.eventSink(IncomingVerificationViewEvents.GoBack)
|
||||
state.eventSink(IncomingVerificationViewEvent.GoBack)
|
||||
}
|
||||
HeaderFooterPage(
|
||||
modifier = modifier,
|
||||
@@ -70,7 +70,7 @@ fun IncomingVerificationView(
|
||||
TopAppBar(
|
||||
title = {},
|
||||
navigationIcon = {
|
||||
BackButton(onClick = { state.eventSink(IncomingVerificationViewEvents.GoBack) })
|
||||
BackButton(onClick = { state.eventSink(IncomingVerificationViewEvent.GoBack) })
|
||||
},
|
||||
colors = topAppBarColors(containerColor = Color.Transparent),
|
||||
)
|
||||
@@ -217,13 +217,13 @@ private fun IncomingVerificationBottomMenu(
|
||||
text = stringResource(CommonStrings.action_start_verification),
|
||||
enabled = !step.isWaiting,
|
||||
showProgress = step.isWaiting,
|
||||
onClick = { eventSink(IncomingVerificationViewEvents.StartVerification) },
|
||||
onClick = { eventSink(IncomingVerificationViewEvent.StartVerification) },
|
||||
)
|
||||
TextButton(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
text = stringResource(CommonStrings.action_ignore),
|
||||
enabled = !step.isWaiting,
|
||||
onClick = { eventSink(IncomingVerificationViewEvents.IgnoreVerification) },
|
||||
onClick = { eventSink(IncomingVerificationViewEvent.IgnoreVerification) },
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -235,14 +235,14 @@ private fun IncomingVerificationBottomMenu(
|
||||
enabled = !step.isWaiting,
|
||||
showProgress = step.isWaiting,
|
||||
onClick = {
|
||||
eventSink(IncomingVerificationViewEvents.ConfirmVerification)
|
||||
eventSink(IncomingVerificationViewEvent.ConfirmVerification)
|
||||
},
|
||||
)
|
||||
TextButton(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
text = stringResource(R.string.screen_session_verification_they_dont_match),
|
||||
enabled = !step.isWaiting,
|
||||
onClick = { eventSink(IncomingVerificationViewEvents.DeclineVerification) },
|
||||
onClick = { eventSink(IncomingVerificationViewEvent.DeclineVerification) },
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -254,7 +254,7 @@ private fun IncomingVerificationBottomMenu(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
text = stringResource(CommonStrings.action_done),
|
||||
onClick = {
|
||||
eventSink(IncomingVerificationViewEvents.GoBack)
|
||||
eventSink(IncomingVerificationViewEvent.GoBack)
|
||||
},
|
||||
)
|
||||
}
|
||||
@@ -264,7 +264,9 @@ private fun IncomingVerificationBottomMenu(
|
||||
|
||||
@PreviewsDayNight
|
||||
@Composable
|
||||
internal fun IncomingVerificationViewPreview(@PreviewParameter(IncomingVerificationStateProvider::class) state: IncomingVerificationState) = ElementPreview {
|
||||
internal fun IncomingVerificationViewPreview(@PreviewParameter(
|
||||
IncomingVerificationStatePreviewParam::class
|
||||
) state: IncomingVerificationState) = ElementPreview {
|
||||
IncomingVerificationView(
|
||||
state = state,
|
||||
)
|
||||
|
||||
+6
-6
@@ -8,10 +8,10 @@
|
||||
|
||||
package io.element.android.features.verifysession.impl.incoming
|
||||
|
||||
sealed interface IncomingVerificationViewEvents {
|
||||
data object GoBack : IncomingVerificationViewEvents
|
||||
data object StartVerification : IncomingVerificationViewEvents
|
||||
data object IgnoreVerification : IncomingVerificationViewEvents
|
||||
data object ConfirmVerification : IncomingVerificationViewEvents
|
||||
data object DeclineVerification : IncomingVerificationViewEvents
|
||||
sealed interface IncomingVerificationViewEvent {
|
||||
data object GoBack : IncomingVerificationViewEvent
|
||||
data object StartVerification : IncomingVerificationViewEvent
|
||||
data object IgnoreVerification : IncomingVerificationViewEvent
|
||||
data object ConfirmVerification : IncomingVerificationViewEvent
|
||||
data object DeclineVerification : IncomingVerificationViewEvent
|
||||
}
|
||||
+7
-7
@@ -93,16 +93,16 @@ class OutgoingVerificationPresenter(
|
||||
observeVerificationService()
|
||||
}
|
||||
|
||||
fun handleEvent(event: OutgoingVerificationViewEvents) {
|
||||
fun handleEvent(event: OutgoingVerificationViewEvent) {
|
||||
Timber.d("Verification user action: ${event::class.simpleName}")
|
||||
when (event) {
|
||||
// Just relay the event to the state machine
|
||||
OutgoingVerificationViewEvents.RequestVerification -> StateMachineEvent.RequestVerification(verificationRequest)
|
||||
OutgoingVerificationViewEvents.StartSasVerification -> StateMachineEvent.StartSasVerification
|
||||
OutgoingVerificationViewEvents.ConfirmVerification -> StateMachineEvent.AcceptChallenge
|
||||
OutgoingVerificationViewEvents.DeclineVerification -> StateMachineEvent.DeclineChallenge
|
||||
OutgoingVerificationViewEvents.Cancel -> StateMachineEvent.Cancel
|
||||
OutgoingVerificationViewEvents.Reset -> StateMachineEvent.Reset
|
||||
OutgoingVerificationViewEvent.RequestVerification -> StateMachineEvent.RequestVerification(verificationRequest)
|
||||
OutgoingVerificationViewEvent.StartSasVerification -> StateMachineEvent.StartSasVerification
|
||||
OutgoingVerificationViewEvent.ConfirmVerification -> StateMachineEvent.AcceptChallenge
|
||||
OutgoingVerificationViewEvent.DeclineVerification -> StateMachineEvent.DeclineChallenge
|
||||
OutgoingVerificationViewEvent.Cancel -> StateMachineEvent.Cancel
|
||||
OutgoingVerificationViewEvent.Reset -> StateMachineEvent.Reset
|
||||
}.let { stateMachineEvent ->
|
||||
stateAndDispatch.dispatchAction(stateMachineEvent)
|
||||
}
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ import io.element.android.libraries.matrix.api.verification.VerificationRequest
|
||||
data class OutgoingVerificationState(
|
||||
val step: Step,
|
||||
val request: VerificationRequest.Outgoing,
|
||||
val eventSink: (OutgoingVerificationViewEvents) -> Unit,
|
||||
val eventSink: (OutgoingVerificationViewEvent) -> Unit,
|
||||
) {
|
||||
@Stable
|
||||
sealed interface Step {
|
||||
|
||||
+2
-2
@@ -16,7 +16,7 @@ import io.element.android.libraries.architecture.AsyncData
|
||||
import io.element.android.libraries.matrix.api.core.UserId
|
||||
import io.element.android.libraries.matrix.api.verification.VerificationRequest
|
||||
|
||||
open class OutgoingVerificationStateProvider : PreviewParameterProvider<OutgoingVerificationState> {
|
||||
open class OutgoingVerificationStatePreviewParam : PreviewParameterProvider<OutgoingVerificationState> {
|
||||
override val values: Sequence<OutgoingVerificationState>
|
||||
get() = sequenceOf(
|
||||
anOutgoingVerificationState(
|
||||
@@ -79,7 +79,7 @@ internal fun anOutgoingSessionVerificationRequest() = VerificationRequest.Outgoi
|
||||
internal fun anOutgoingVerificationState(
|
||||
step: Step = Step.Initial,
|
||||
request: VerificationRequest.Outgoing = anOutgoingSessionVerificationRequest(),
|
||||
eventSink: (OutgoingVerificationViewEvents) -> Unit = {},
|
||||
eventSink: (OutgoingVerificationViewEvent) -> Unit = {},
|
||||
) = OutgoingVerificationState(
|
||||
step = step,
|
||||
request = request,
|
||||
+10
-8
@@ -65,13 +65,13 @@ fun OutgoingVerificationView(
|
||||
val step = state.step
|
||||
fun cancelOrResetFlow() {
|
||||
when (step) {
|
||||
is Step.Canceled -> state.eventSink(OutgoingVerificationViewEvents.Reset)
|
||||
is Step.Canceled -> state.eventSink(OutgoingVerificationViewEvent.Reset)
|
||||
Step.Initial -> onBack()
|
||||
Step.Completed -> onFinish()
|
||||
Step.Ready, is Step.AwaitingOtherDeviceResponse -> state.eventSink(OutgoingVerificationViewEvents.Cancel)
|
||||
Step.Ready, is Step.AwaitingOtherDeviceResponse -> state.eventSink(OutgoingVerificationViewEvent.Cancel)
|
||||
is Step.Verifying -> {
|
||||
if (!step.state.isLoading()) {
|
||||
state.eventSink(OutgoingVerificationViewEvents.DeclineVerification)
|
||||
state.eventSink(OutgoingVerificationViewEvent.DeclineVerification)
|
||||
}
|
||||
}
|
||||
else -> Unit
|
||||
@@ -261,7 +261,7 @@ private fun OutgoingVerificationBottomMenu(
|
||||
text = stringResource(CommonStrings.action_start_verification),
|
||||
enabled = !isWaiting,
|
||||
showProgress = isWaiting,
|
||||
onClick = { eventSink(OutgoingVerificationViewEvents.RequestVerification) },
|
||||
onClick = { eventSink(OutgoingVerificationViewEvent.RequestVerification) },
|
||||
)
|
||||
InvisibleButton()
|
||||
}
|
||||
@@ -281,7 +281,7 @@ private fun OutgoingVerificationBottomMenu(
|
||||
Button(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
text = stringResource(CommonStrings.action_start),
|
||||
onClick = { eventSink(OutgoingVerificationViewEvents.StartSasVerification) },
|
||||
onClick = { eventSink(OutgoingVerificationViewEvent.StartSasVerification) },
|
||||
)
|
||||
TextButton(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
@@ -299,7 +299,7 @@ private fun OutgoingVerificationBottomMenu(
|
||||
enabled = !isVerifying,
|
||||
showProgress = isVerifying,
|
||||
onClick = {
|
||||
eventSink(OutgoingVerificationViewEvents.ConfirmVerification)
|
||||
eventSink(OutgoingVerificationViewEvent.ConfirmVerification)
|
||||
},
|
||||
)
|
||||
TextButton(
|
||||
@@ -307,7 +307,7 @@ private fun OutgoingVerificationBottomMenu(
|
||||
text = stringResource(R.string.screen_session_verification_they_dont_match),
|
||||
enabled = !isVerifying,
|
||||
onClick = {
|
||||
eventSink(OutgoingVerificationViewEvents.DeclineVerification)
|
||||
eventSink(OutgoingVerificationViewEvent.DeclineVerification)
|
||||
},
|
||||
)
|
||||
}
|
||||
@@ -328,7 +328,9 @@ private fun OutgoingVerificationBottomMenu(
|
||||
|
||||
@PreviewsDayNight
|
||||
@Composable
|
||||
internal fun OutgoingVerificationViewPreview(@PreviewParameter(OutgoingVerificationStateProvider::class) state: OutgoingVerificationState) = ElementPreview {
|
||||
internal fun OutgoingVerificationViewPreview(@PreviewParameter(
|
||||
OutgoingVerificationStatePreviewParam::class
|
||||
) state: OutgoingVerificationState) = ElementPreview {
|
||||
OutgoingVerificationView(
|
||||
state = state,
|
||||
onLearnMoreClick = {},
|
||||
|
||||
+7
-7
@@ -8,11 +8,11 @@
|
||||
|
||||
package io.element.android.features.verifysession.impl.outgoing
|
||||
|
||||
sealed interface OutgoingVerificationViewEvents {
|
||||
data object RequestVerification : OutgoingVerificationViewEvents
|
||||
data object StartSasVerification : OutgoingVerificationViewEvents
|
||||
data object ConfirmVerification : OutgoingVerificationViewEvents
|
||||
data object DeclineVerification : OutgoingVerificationViewEvents
|
||||
data object Cancel : OutgoingVerificationViewEvents
|
||||
data object Reset : OutgoingVerificationViewEvents
|
||||
sealed interface OutgoingVerificationViewEvent {
|
||||
data object RequestVerification : OutgoingVerificationViewEvent
|
||||
data object StartSasVerification : OutgoingVerificationViewEvent
|
||||
data object ConfirmVerification : OutgoingVerificationViewEvent
|
||||
data object DeclineVerification : OutgoingVerificationViewEvent
|
||||
data object Cancel : OutgoingVerificationViewEvent
|
||||
data object Reset : OutgoingVerificationViewEvent
|
||||
}
|
||||
+7
-7
@@ -72,7 +72,7 @@ class IncomingVerificationPresenterTest {
|
||||
acknowledgeVerificationRequestLambda.assertions().isCalledOnce().with(value(anIncomingSessionVerificationRequest))
|
||||
acceptVerificationRequestLambda.assertions().isNeverCalled()
|
||||
// User accept the incoming verification
|
||||
initialState.eventSink(IncomingVerificationViewEvents.StartVerification)
|
||||
initialState.eventSink(IncomingVerificationViewEvent.StartVerification)
|
||||
skipItems(1)
|
||||
val initialWaitingState = awaitItem()
|
||||
assertThat((initialWaitingState.step as IncomingVerificationState.Step.Initial).isWaiting).isTrue()
|
||||
@@ -96,7 +96,7 @@ class IncomingVerificationPresenterTest {
|
||||
)
|
||||
)
|
||||
// User claims that the emoji matches
|
||||
emojiState.eventSink(IncomingVerificationViewEvents.ConfirmVerification)
|
||||
emojiState.eventSink(IncomingVerificationViewEvent.ConfirmVerification)
|
||||
val emojiWaitingItem = awaitItem()
|
||||
assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue()
|
||||
advanceUntilIdle()
|
||||
@@ -141,7 +141,7 @@ class IncomingVerificationPresenterTest {
|
||||
acknowledgeVerificationRequestLambda.assertions().isCalledOnce().with(value(anIncomingSessionVerificationRequest))
|
||||
acceptVerificationRequestLambda.assertions().isNeverCalled()
|
||||
// User accept the incoming verification
|
||||
initialState.eventSink(IncomingVerificationViewEvents.StartVerification)
|
||||
initialState.eventSink(IncomingVerificationViewEvent.StartVerification)
|
||||
skipItems(1)
|
||||
val initialWaitingState = awaitItem()
|
||||
assertThat((initialWaitingState.step as IncomingVerificationState.Step.Initial).isWaiting).isTrue()
|
||||
@@ -159,7 +159,7 @@ class IncomingVerificationPresenterTest {
|
||||
)
|
||||
val emojiState = awaitItem()
|
||||
// User claims that the emojis do not match
|
||||
emojiState.eventSink(IncomingVerificationViewEvents.DeclineVerification)
|
||||
emojiState.eventSink(IncomingVerificationViewEvent.DeclineVerification)
|
||||
val emojiWaitingItem = awaitItem()
|
||||
assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue()
|
||||
advanceUntilIdle()
|
||||
@@ -241,7 +241,7 @@ class IncomingVerificationPresenterTest {
|
||||
acknowledgeVerificationRequestLambda.assertions().isCalledOnce().with(value(anIncomingSessionVerificationRequest))
|
||||
acceptVerificationRequestLambda.assertions().isNeverCalled()
|
||||
// User accept the incoming verification
|
||||
initialState.eventSink(IncomingVerificationViewEvents.StartVerification)
|
||||
initialState.eventSink(IncomingVerificationViewEvent.StartVerification)
|
||||
skipItems(1)
|
||||
val initialWaitingState = awaitItem()
|
||||
assertThat((initialWaitingState.step as IncomingVerificationState.Step.Initial).isWaiting).isTrue()
|
||||
@@ -259,7 +259,7 @@ class IncomingVerificationPresenterTest {
|
||||
)
|
||||
val emojiState = awaitItem()
|
||||
// User goes back
|
||||
emojiState.eventSink(IncomingVerificationViewEvents.GoBack)
|
||||
emojiState.eventSink(IncomingVerificationViewEvent.GoBack)
|
||||
val emojiWaitingItem = awaitItem()
|
||||
assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue()
|
||||
advanceUntilIdle()
|
||||
@@ -289,7 +289,7 @@ class IncomingVerificationPresenterTest {
|
||||
navigator = IncomingVerificationNavigator(navigatorLambda),
|
||||
).test {
|
||||
val initialState = awaitItem()
|
||||
initialState.eventSink(IncomingVerificationViewEvents.IgnoreVerification)
|
||||
initialState.eventSink(IncomingVerificationViewEvent.IgnoreVerification)
|
||||
skipItems(1)
|
||||
navigatorLambda.assertions().isCalledOnce()
|
||||
}
|
||||
|
||||
+24
-24
@@ -27,7 +27,7 @@ class IncomingVerificationViewTest : RobolectricTest() {
|
||||
// region step Initial
|
||||
@Test
|
||||
fun `back key pressed - ignore the verification`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
|
||||
setIncomingVerificationView(
|
||||
anIncomingVerificationState(
|
||||
step = aStepInitial(),
|
||||
@@ -35,12 +35,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
pressBackKey()
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `ignore incoming verification emits the expected event`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
|
||||
setIncomingVerificationView(
|
||||
anIncomingVerificationState(
|
||||
step = aStepInitial(),
|
||||
@@ -48,12 +48,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
clickOn(CommonStrings.action_ignore)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvents.IgnoreVerification)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvent.IgnoreVerification)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `start incoming verification emits the expected event`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
|
||||
setIncomingVerificationView(
|
||||
anIncomingVerificationState(
|
||||
step = aStepInitial(),
|
||||
@@ -61,12 +61,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
clickOn(CommonStrings.action_start_verification)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvents.StartVerification)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvent.StartVerification)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `back key pressed - when awaiting response cancels the verification`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
|
||||
setIncomingVerificationView(
|
||||
anIncomingVerificationState(
|
||||
step = aStepInitial(
|
||||
@@ -76,14 +76,14 @@ class IncomingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
pressBackKey()
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
|
||||
}
|
||||
// endregion step Initial
|
||||
|
||||
// region step Verifying
|
||||
@Test
|
||||
fun `back key pressed - when ready to verify cancels the verification`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
|
||||
setIncomingVerificationView(
|
||||
anIncomingVerificationState(
|
||||
step = IncomingVerificationState.Step.Verifying(
|
||||
@@ -94,12 +94,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
pressBackKey()
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `back key pressed - when verifying and loading emits the expected event`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
|
||||
setIncomingVerificationView(
|
||||
anIncomingVerificationState(
|
||||
step = IncomingVerificationState.Step.Verifying(
|
||||
@@ -110,12 +110,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
pressBackKey()
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `clicking on they do not match emits the expected event`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
|
||||
setIncomingVerificationView(
|
||||
anIncomingVerificationState(
|
||||
step = IncomingVerificationState.Step.Verifying(
|
||||
@@ -126,12 +126,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
clickOn(R.string.screen_session_verification_they_dont_match)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvents.DeclineVerification)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvent.DeclineVerification)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `clicking on they match emits the expected event`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
|
||||
setIncomingVerificationView(
|
||||
anIncomingVerificationState(
|
||||
step = IncomingVerificationState.Step.Verifying(
|
||||
@@ -142,14 +142,14 @@ class IncomingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
clickOn(R.string.screen_session_verification_they_match)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvents.ConfirmVerification)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvent.ConfirmVerification)
|
||||
}
|
||||
// endregion
|
||||
|
||||
// region step Failure
|
||||
@Test
|
||||
fun `back key pressed - when failure resets the flow`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
|
||||
setIncomingVerificationView(
|
||||
anIncomingVerificationState(
|
||||
step = IncomingVerificationState.Step.Failure,
|
||||
@@ -157,12 +157,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
pressBackKey()
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `click on done - when failure resets the flow`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
|
||||
setIncomingVerificationView(
|
||||
anIncomingVerificationState(
|
||||
step = IncomingVerificationState.Step.Failure,
|
||||
@@ -170,7 +170,7 @@ class IncomingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
clickOn(CommonStrings.action_done)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
|
||||
}
|
||||
|
||||
// endregion
|
||||
@@ -178,7 +178,7 @@ class IncomingVerificationViewTest : RobolectricTest() {
|
||||
// region step Completed
|
||||
@Test
|
||||
fun `back key pressed - on Completed step emits the expected event`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
|
||||
setIncomingVerificationView(
|
||||
anIncomingVerificationState(
|
||||
step = IncomingVerificationState.Step.Completed,
|
||||
@@ -186,12 +186,12 @@ class IncomingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
pressBackKey()
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `when flow is completed and the user clicks on the done button, the expected event is emitted`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<IncomingVerificationViewEvent>()
|
||||
setIncomingVerificationView(
|
||||
anIncomingVerificationState(
|
||||
step = IncomingVerificationState.Step.Completed,
|
||||
@@ -199,7 +199,7 @@ class IncomingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
clickOn(CommonStrings.action_done)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvents.GoBack)
|
||||
eventsRecorder.assertSingle(IncomingVerificationViewEvent.GoBack)
|
||||
}
|
||||
// endregion
|
||||
|
||||
|
||||
+12
-12
@@ -104,7 +104,7 @@ class OutgoingVerificationPresenterTest {
|
||||
val initialState = awaitItem()
|
||||
assertThat(initialState.step).isEqualTo(Step.Initial)
|
||||
val eventSink = initialState.eventSink
|
||||
eventSink(OutgoingVerificationViewEvents.Cancel)
|
||||
eventSink(OutgoingVerificationViewEvent.Cancel)
|
||||
|
||||
assertThat(awaitItem().step).isEqualTo(Step.Exit)
|
||||
}
|
||||
@@ -120,7 +120,7 @@ class OutgoingVerificationPresenterTest {
|
||||
val presenter = createOutgoingVerificationPresenter(service)
|
||||
presenter.test {
|
||||
val state = requestVerificationAndAwaitVerifyingState(service)
|
||||
state.eventSink(OutgoingVerificationViewEvents.ConfirmVerification)
|
||||
state.eventSink(OutgoingVerificationViewEvent.ConfirmVerification)
|
||||
// Cancelling
|
||||
assertThat(awaitItem().step).isInstanceOf(Step.Verifying::class.java)
|
||||
service.emitVerificationFlowState(VerificationFlowState.DidFail)
|
||||
@@ -136,7 +136,7 @@ class OutgoingVerificationPresenterTest {
|
||||
)
|
||||
val presenter = createOutgoingVerificationPresenter(service)
|
||||
presenter.test {
|
||||
awaitItem().eventSink(OutgoingVerificationViewEvents.RequestVerification)
|
||||
awaitItem().eventSink(OutgoingVerificationViewEvent.RequestVerification)
|
||||
service.emitVerificationFlowState(VerificationFlowState.DidFail)
|
||||
assertThat(awaitItem().step).isInstanceOf(Step.AwaitingOtherDeviceResponse::class.java)
|
||||
assertThat(awaitItem().step).isEqualTo(Step.Canceled)
|
||||
@@ -173,7 +173,7 @@ class OutgoingVerificationPresenterTest {
|
||||
val presenter = createOutgoingVerificationPresenter(service)
|
||||
presenter.test {
|
||||
val state = requestVerificationAndAwaitVerifyingState(service)
|
||||
state.eventSink(OutgoingVerificationViewEvents.Cancel)
|
||||
state.eventSink(OutgoingVerificationViewEvent.Cancel)
|
||||
assertThat(awaitItem().step).isEqualTo(Step.Canceled)
|
||||
}
|
||||
}
|
||||
@@ -203,7 +203,7 @@ class OutgoingVerificationPresenterTest {
|
||||
val state = requestVerificationAndAwaitVerifyingState(service)
|
||||
service.emitVerificationFlowState(VerificationFlowState.DidCancel)
|
||||
assertThat(awaitItem().step).isEqualTo(Step.Canceled)
|
||||
state.eventSink(OutgoingVerificationViewEvents.Reset)
|
||||
state.eventSink(OutgoingVerificationViewEvent.Reset)
|
||||
// Went back to initial state
|
||||
assertThat(awaitItem().step).isEqualTo(Step.Initial)
|
||||
cancelAndIgnoreRemainingEvents()
|
||||
@@ -226,7 +226,7 @@ class OutgoingVerificationPresenterTest {
|
||||
service,
|
||||
SessionVerificationData.Emojis(emojis)
|
||||
)
|
||||
state.eventSink(OutgoingVerificationViewEvents.ConfirmVerification)
|
||||
state.eventSink(OutgoingVerificationViewEvent.ConfirmVerification)
|
||||
assertThat(awaitItem().step).isEqualTo(
|
||||
Step.Verifying(
|
||||
SessionVerificationData.Emojis(emojis),
|
||||
@@ -257,7 +257,7 @@ class OutgoingVerificationPresenterTest {
|
||||
)
|
||||
presenter.test {
|
||||
val state = requestVerificationAndAwaitVerifyingState(service)
|
||||
state.eventSink(OutgoingVerificationViewEvents.ConfirmVerification)
|
||||
state.eventSink(OutgoingVerificationViewEvent.ConfirmVerification)
|
||||
assertThat(awaitItem().step).isInstanceOf(Step.Verifying::class.java)
|
||||
service.emitVerificationFlowState(VerificationFlowState.DidFinish)
|
||||
assertThat(awaitItem().step).isEqualTo(Step.Completed)
|
||||
@@ -283,7 +283,7 @@ class OutgoingVerificationPresenterTest {
|
||||
)
|
||||
presenter.test {
|
||||
val state = requestVerificationAndAwaitVerifyingState(service)
|
||||
state.eventSink(OutgoingVerificationViewEvents.ConfirmVerification)
|
||||
state.eventSink(OutgoingVerificationViewEvent.ConfirmVerification)
|
||||
assertThat(awaitItem().step).isInstanceOf(Step.Verifying::class.java)
|
||||
service.emitVerificationFlowState(VerificationFlowState.DidFinish)
|
||||
assertThat(awaitItem().step).isEqualTo(Step.Completed)
|
||||
@@ -308,7 +308,7 @@ class OutgoingVerificationPresenterTest {
|
||||
)
|
||||
presenter.test {
|
||||
val state = requestVerificationAndAwaitVerifyingState(service)
|
||||
state.eventSink(OutgoingVerificationViewEvents.ConfirmVerification)
|
||||
state.eventSink(OutgoingVerificationViewEvent.ConfirmVerification)
|
||||
assertThat(awaitItem().step).isInstanceOf(Step.Verifying::class.java)
|
||||
service.emitVerificationFlowState(VerificationFlowState.DidFinish)
|
||||
// The recovery state never leaves UNKNOWN, so the 10 seconds timeout fires and the flow completes anyway
|
||||
@@ -328,7 +328,7 @@ class OutgoingVerificationPresenterTest {
|
||||
val presenter = createOutgoingVerificationPresenter(service)
|
||||
presenter.test {
|
||||
val state = requestVerificationAndAwaitVerifyingState(service)
|
||||
state.eventSink(OutgoingVerificationViewEvents.DeclineVerification)
|
||||
state.eventSink(OutgoingVerificationViewEvent.DeclineVerification)
|
||||
assertThat(awaitItem().step).isEqualTo(
|
||||
Step.Verifying(
|
||||
SessionVerificationData.Emojis(emptyList()),
|
||||
@@ -384,7 +384,7 @@ class OutgoingVerificationPresenterTest {
|
||||
): OutgoingVerificationState {
|
||||
var state = awaitItem()
|
||||
assertThat(state.step).isEqualTo(Step.Initial)
|
||||
state.eventSink(OutgoingVerificationViewEvents.RequestVerification)
|
||||
state.eventSink(OutgoingVerificationViewEvent.RequestVerification)
|
||||
testScope.advanceTimeBy(1.minutes)
|
||||
// Await for other device response:
|
||||
fakeService.emitVerificationFlowState(VerificationFlowState.DidAcceptVerificationRequest)
|
||||
@@ -393,7 +393,7 @@ class OutgoingVerificationPresenterTest {
|
||||
// Await for the state to be Ready
|
||||
state = awaitItem()
|
||||
assertThat(state.step).isEqualTo(Step.Ready)
|
||||
state.eventSink(OutgoingVerificationViewEvents.StartSasVerification)
|
||||
state.eventSink(OutgoingVerificationViewEvent.StartSasVerification)
|
||||
testScope.advanceUntilIdle()
|
||||
// Await for other device response (again):
|
||||
fakeService.emitVerificationFlowState(VerificationFlowState.DidStartSasVerification)
|
||||
|
||||
+14
-14
@@ -29,7 +29,7 @@ import org.junit.Test
|
||||
class OutgoingVerificationViewTest : RobolectricTest() {
|
||||
@Test
|
||||
fun `back key pressed - when canceled resets the flow`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvent>()
|
||||
setOutgoingVerificationView(
|
||||
anOutgoingVerificationState(
|
||||
step = OutgoingVerificationState.Step.Canceled,
|
||||
@@ -37,12 +37,12 @@ class OutgoingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
pressBackKey()
|
||||
eventsRecorder.assertSingle(OutgoingVerificationViewEvents.Reset)
|
||||
eventsRecorder.assertSingle(OutgoingVerificationViewEvent.Reset)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `back key pressed - when awaiting response cancels the verification`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvent>()
|
||||
setOutgoingVerificationView(
|
||||
anOutgoingVerificationState(
|
||||
step = OutgoingVerificationState.Step.AwaitingOtherDeviceResponse,
|
||||
@@ -50,12 +50,12 @@ class OutgoingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
pressBackKey()
|
||||
eventsRecorder.assertSingle(OutgoingVerificationViewEvents.Cancel)
|
||||
eventsRecorder.assertSingle(OutgoingVerificationViewEvent.Cancel)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `back key pressed - when ready to verify cancels the verification`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvent>()
|
||||
setOutgoingVerificationView(
|
||||
anOutgoingVerificationState(
|
||||
step = OutgoingVerificationState.Step.Ready,
|
||||
@@ -63,12 +63,12 @@ class OutgoingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
pressBackKey()
|
||||
eventsRecorder.assertSingle(OutgoingVerificationViewEvents.Cancel)
|
||||
eventsRecorder.assertSingle(OutgoingVerificationViewEvent.Cancel)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `back key pressed - when verifying and not loading declines the verification`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvent>()
|
||||
setOutgoingVerificationView(
|
||||
anOutgoingVerificationState(
|
||||
step = OutgoingVerificationState.Step.Verifying(
|
||||
@@ -79,12 +79,12 @@ class OutgoingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
pressBackKey()
|
||||
eventsRecorder.assertSingle(OutgoingVerificationViewEvents.DeclineVerification)
|
||||
eventsRecorder.assertSingle(OutgoingVerificationViewEvent.DeclineVerification)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `back key pressed - when verifying and loading does nothing`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvent>()
|
||||
setOutgoingVerificationView(
|
||||
anOutgoingVerificationState(
|
||||
step = OutgoingVerificationState.Step.Verifying(
|
||||
@@ -113,7 +113,7 @@ class OutgoingVerificationViewTest : RobolectricTest() {
|
||||
|
||||
@Test
|
||||
fun `when flow is completed and the user clicks on the done button, the expected callback is invoked`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvents>(expectEvents = false)
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvent>(expectEvents = false)
|
||||
ensureCalledOnce { callback ->
|
||||
setOutgoingVerificationView(
|
||||
anOutgoingVerificationState(
|
||||
@@ -128,7 +128,7 @@ class OutgoingVerificationViewTest : RobolectricTest() {
|
||||
|
||||
@Test
|
||||
fun `clicking on they match emits the expected event`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvent>()
|
||||
setOutgoingVerificationView(
|
||||
anOutgoingVerificationState(
|
||||
step = OutgoingVerificationState.Step.Verifying(
|
||||
@@ -139,12 +139,12 @@ class OutgoingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
clickOn(R.string.screen_session_verification_they_match)
|
||||
eventsRecorder.assertSingle(OutgoingVerificationViewEvents.ConfirmVerification)
|
||||
eventsRecorder.assertSingle(OutgoingVerificationViewEvent.ConfirmVerification)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `clicking on they do not match emits the expected event`() = runAndroidComposeUiTest {
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvents>()
|
||||
val eventsRecorder = EventsRecorder<OutgoingVerificationViewEvent>()
|
||||
setOutgoingVerificationView(
|
||||
anOutgoingVerificationState(
|
||||
step = OutgoingVerificationState.Step.Verifying(
|
||||
@@ -155,7 +155,7 @@ class OutgoingVerificationViewTest : RobolectricTest() {
|
||||
),
|
||||
)
|
||||
clickOn(R.string.screen_session_verification_they_dont_match)
|
||||
eventsRecorder.assertSingle(OutgoingVerificationViewEvents.DeclineVerification)
|
||||
eventsRecorder.assertSingle(OutgoingVerificationViewEvent.DeclineVerification)
|
||||
}
|
||||
|
||||
private fun AndroidComposeUiTest<ComponentActivity>.setOutgoingVerificationView(
|
||||
|
||||
Reference in New Issue
Block a user