Merge pull request #6726 from element-hq/feature/bma/renameVerificationMethod

Rename verification methods
This commit is contained in:
Benoit Marty 2026-05-06 17:50:11 +02:00 committed by GitHub
commit db1b124025
6 changed files with 58 additions and 49 deletions

View file

@ -46,7 +46,7 @@ class OutgoingVerificationStateMachine(
inState<State.RequestingVerification> { inState<State.RequestingVerification> {
onEnterEffect { event -> onEnterEffect { event ->
when (event.verificationRequest) { when (event.verificationRequest) {
is VerificationRequest.Outgoing.CurrentSession -> sessionVerificationService.requestCurrentSessionVerification() is VerificationRequest.Outgoing.CurrentSession -> sessionVerificationService.requestDeviceVerification()
is VerificationRequest.Outgoing.User -> sessionVerificationService.requestUserVerification(event.verificationRequest.userId) is VerificationRequest.Outgoing.User -> sessionVerificationService.requestUserVerification(event.verificationRequest.userId)
} }
} }
@ -56,7 +56,7 @@ class OutgoingVerificationStateMachine(
} }
inState<State.StartingSasVerification> { inState<State.StartingSasVerification> {
onEnterEffect { onEnterEffect {
sessionVerificationService.startVerification() sessionVerificationService.startSasVerification()
} }
} }
inState<State.VerificationRequestAccepted> { inState<State.VerificationRequestAccepted> {

View file

@ -99,6 +99,7 @@ class IncomingVerificationPresenterTest {
emojiState.eventSink(IncomingVerificationViewEvents.ConfirmVerification) emojiState.eventSink(IncomingVerificationViewEvents.ConfirmVerification)
val emojiWaitingItem = awaitItem() val emojiWaitingItem = awaitItem()
assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue() assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue()
advanceUntilIdle()
approveVerificationLambda.assertions().isCalledOnce() approveVerificationLambda.assertions().isCalledOnce()
// Remote confirm that the emojis match // Remote confirm that the emojis match
fakeSessionVerificationService.emitVerificationFlowState( fakeSessionVerificationService.emitVerificationFlowState(
@ -161,6 +162,7 @@ class IncomingVerificationPresenterTest {
emojiState.eventSink(IncomingVerificationViewEvents.DeclineVerification) emojiState.eventSink(IncomingVerificationViewEvents.DeclineVerification)
val emojiWaitingItem = awaitItem() val emojiWaitingItem = awaitItem()
assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue() assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue()
advanceUntilIdle()
declineVerificationLambda.assertions().isCalledOnce() declineVerificationLambda.assertions().isCalledOnce()
// Remote confirm that there is a failure // Remote confirm that there is a failure
fakeSessionVerificationService.emitVerificationFlowState( fakeSessionVerificationService.emitVerificationFlowState(
@ -260,6 +262,7 @@ class IncomingVerificationPresenterTest {
emojiState.eventSink(IncomingVerificationViewEvents.GoBack) emojiState.eventSink(IncomingVerificationViewEvents.GoBack)
val emojiWaitingItem = awaitItem() val emojiWaitingItem = awaitItem()
assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue() assertThat((emojiWaitingItem.step as IncomingVerificationState.Step.Verifying).isWaiting).isTrue()
advanceUntilIdle()
declineVerificationLambda.assertions().isCalledOnce() declineVerificationLambda.assertions().isCalledOnce()
// Remote confirm that there is a failure // Remote confirm that there is a failure
fakeSessionVerificationService.emitVerificationFlowState( fakeSessionVerificationService.emitVerificationFlowState(

View file

@ -6,6 +6,8 @@
* Please see LICENSE files in the repository root for full details. * Please see LICENSE files in the repository root for full details.
*/ */
@file:Suppress("UnusedImports")
package io.element.android.features.verifysession.impl.outgoing package io.element.android.features.verifysession.impl.outgoing
import app.cash.turbine.ReceiveTurbine import app.cash.turbine.ReceiveTurbine
@ -27,6 +29,8 @@ import io.element.android.tests.testutils.lambda.lambdaError
import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.lambda.lambdaRecorder
import io.element.android.tests.testutils.test import io.element.android.tests.testutils.test
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.advanceUntilIdle
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
@ -50,11 +54,11 @@ class OutgoingVerificationPresenterTest {
@Test @Test
fun `present - Handles requestVerification for session verification`() = runTest { fun `present - Handles requestVerification for session verification`() = runTest {
val requestSessionVerificationRecorder = lambdaRecorder<Unit> {} val requestDeviceVerificationRecorder = lambdaRecorder<Unit> {}
val startVerificationRecorder = lambdaRecorder<Unit> {} val startSasVerificationRecorder = lambdaRecorder<Unit> {}
val service = unverifiedSessionService( val service = unverifiedSessionService(
requestSessionVerificationLambda = requestSessionVerificationRecorder, requestDeviceVerificationLambda = requestDeviceVerificationRecorder,
startVerificationLambda = startVerificationRecorder, startSasVerificationLambda = startSasVerificationRecorder,
) )
val presenter = createOutgoingVerificationPresenter( val presenter = createOutgoingVerificationPresenter(
service = service, service = service,
@ -63,18 +67,18 @@ class OutgoingVerificationPresenterTest {
presenter.test { presenter.test {
requestVerificationAndAwaitVerifyingState(service) requestVerificationAndAwaitVerifyingState(service)
requestSessionVerificationRecorder.assertions().isCalledOnce() requestDeviceVerificationRecorder.assertions().isCalledOnce()
startVerificationRecorder.assertions().isCalledOnce() startSasVerificationRecorder.assertions().isCalledOnce()
} }
} }
@Test @Test
fun `present - Handles requestVerification for user verification`() = runTest { fun `present - Handles requestVerification for user verification`() = runTest {
val requestUserVerificationRecorder = lambdaRecorder<UserId, Unit> {} val requestUserVerificationRecorder = lambdaRecorder<UserId, Unit> {}
val startVerificationRecorder = lambdaRecorder<Unit> {} val startSasVerificationRecorder = lambdaRecorder<Unit> {}
val service = unverifiedSessionService( val service = unverifiedSessionService(
requestUserVerificationLambda = requestUserVerificationRecorder, requestUserVerificationLambda = requestUserVerificationRecorder,
startVerificationLambda = startVerificationRecorder, startSasVerificationLambda = startSasVerificationRecorder,
) )
val presenter = createOutgoingVerificationPresenter( val presenter = createOutgoingVerificationPresenter(
service = service, service = service,
@ -84,7 +88,7 @@ class OutgoingVerificationPresenterTest {
requestVerificationAndAwaitVerifyingState(service) requestVerificationAndAwaitVerifyingState(service)
requestUserVerificationRecorder.assertions().isCalledOnce() requestUserVerificationRecorder.assertions().isCalledOnce()
startVerificationRecorder.assertions().isCalledOnce() startSasVerificationRecorder.assertions().isCalledOnce()
} }
} }
@ -106,8 +110,8 @@ class OutgoingVerificationPresenterTest {
@Test @Test
fun `present - A failure when verifying cancels it`() = runTest { fun `present - A failure when verifying cancels it`() = runTest {
val service = unverifiedSessionService( val service = unverifiedSessionService(
requestSessionVerificationLambda = { }, requestDeviceVerificationLambda = { },
startVerificationLambda = { }, startSasVerificationLambda = { },
approveVerificationLambda = { }, approveVerificationLambda = { },
) )
val presenter = createOutgoingVerificationPresenter(service) val presenter = createOutgoingVerificationPresenter(service)
@ -125,7 +129,7 @@ class OutgoingVerificationPresenterTest {
@Test @Test
fun `present - A fail when requesting verification resets the state to the canceled one`() = runTest { fun `present - A fail when requesting verification resets the state to the canceled one`() = runTest {
val service = unverifiedSessionService( val service = unverifiedSessionService(
requestSessionVerificationLambda = { }, requestDeviceVerificationLambda = { },
) )
val presenter = createOutgoingVerificationPresenter(service) val presenter = createOutgoingVerificationPresenter(service)
presenter.test { presenter.test {
@ -139,8 +143,8 @@ class OutgoingVerificationPresenterTest {
@Test @Test
fun `present - Canceling the flow once it's verifying cancels it`() = runTest { fun `present - Canceling the flow once it's verifying cancels it`() = runTest {
val service = unverifiedSessionService( val service = unverifiedSessionService(
requestSessionVerificationLambda = { }, requestDeviceVerificationLambda = { },
startVerificationLambda = { }, startSasVerificationLambda = { },
cancelVerificationLambda = { }, cancelVerificationLambda = { },
) )
val presenter = createOutgoingVerificationPresenter(service) val presenter = createOutgoingVerificationPresenter(service)
@ -154,8 +158,8 @@ class OutgoingVerificationPresenterTest {
@Test @Test
fun `present - When verifying, if we receive another challenge we ignore it`() = runTest { fun `present - When verifying, if we receive another challenge we ignore it`() = runTest {
val service = unverifiedSessionService( val service = unverifiedSessionService(
requestSessionVerificationLambda = { }, requestDeviceVerificationLambda = { },
startVerificationLambda = { }, startSasVerificationLambda = { },
) )
val presenter = createOutgoingVerificationPresenter(service) val presenter = createOutgoingVerificationPresenter(service)
presenter.test { presenter.test {
@ -168,8 +172,8 @@ class OutgoingVerificationPresenterTest {
@Test @Test
fun `present - Go back after cancellation returns to initial state`() = runTest { fun `present - Go back after cancellation returns to initial state`() = runTest {
val service = unverifiedSessionService( val service = unverifiedSessionService(
requestSessionVerificationLambda = { }, requestDeviceVerificationLambda = { },
startVerificationLambda = { }, startSasVerificationLambda = { },
) )
val presenter = createOutgoingVerificationPresenter(service) val presenter = createOutgoingVerificationPresenter(service)
presenter.test { presenter.test {
@ -189,8 +193,8 @@ class OutgoingVerificationPresenterTest {
VerificationEmoji(number = 30) VerificationEmoji(number = 30)
) )
val service = unverifiedSessionService( val service = unverifiedSessionService(
requestSessionVerificationLambda = { }, requestDeviceVerificationLambda = { },
startVerificationLambda = { }, startSasVerificationLambda = { },
approveVerificationLambda = { }, approveVerificationLambda = { },
) )
val presenter = createOutgoingVerificationPresenter(service) val presenter = createOutgoingVerificationPresenter(service)
@ -215,8 +219,8 @@ class OutgoingVerificationPresenterTest {
@Test @Test
fun `present - When verification is declined, the flow is canceled`() = runTest { fun `present - When verification is declined, the flow is canceled`() = runTest {
val service = unverifiedSessionService( val service = unverifiedSessionService(
requestSessionVerificationLambda = { }, requestDeviceVerificationLambda = { },
startVerificationLambda = { }, startSasVerificationLambda = { },
declineVerificationLambda = { }, declineVerificationLambda = { },
) )
val presenter = createOutgoingVerificationPresenter(service) val presenter = createOutgoingVerificationPresenter(service)
@ -271,6 +275,7 @@ class OutgoingVerificationPresenterTest {
} }
} }
context(testScope: TestScope)
private suspend fun ReceiveTurbine<OutgoingVerificationState>.requestVerificationAndAwaitVerifyingState( private suspend fun ReceiveTurbine<OutgoingVerificationState>.requestVerificationAndAwaitVerifyingState(
fakeService: FakeSessionVerificationService, fakeService: FakeSessionVerificationService,
sessionVerificationData: SessionVerificationData = SessionVerificationData.Emojis(emptyList()), sessionVerificationData: SessionVerificationData = SessionVerificationData.Emojis(emptyList()),
@ -278,6 +283,7 @@ class OutgoingVerificationPresenterTest {
var state = awaitItem() var state = awaitItem()
assertThat(state.step).isEqualTo(Step.Initial) assertThat(state.step).isEqualTo(Step.Initial)
state.eventSink(OutgoingVerificationViewEvents.RequestVerification) state.eventSink(OutgoingVerificationViewEvents.RequestVerification)
testScope.advanceUntilIdle()
// Await for other device response: // Await for other device response:
fakeService.emitVerificationFlowState(VerificationFlowState.DidAcceptVerificationRequest) fakeService.emitVerificationFlowState(VerificationFlowState.DidAcceptVerificationRequest)
state = awaitItem() state = awaitItem()
@ -286,6 +292,7 @@ class OutgoingVerificationPresenterTest {
state = awaitItem() state = awaitItem()
assertThat(state.step).isEqualTo(Step.Ready) assertThat(state.step).isEqualTo(Step.Ready)
state.eventSink(OutgoingVerificationViewEvents.StartSasVerification) state.eventSink(OutgoingVerificationViewEvents.StartSasVerification)
testScope.advanceUntilIdle()
// Await for other device response (again): // Await for other device response (again):
fakeService.emitVerificationFlowState(VerificationFlowState.DidStartSasVerification) fakeService.emitVerificationFlowState(VerificationFlowState.DidStartSasVerification)
state = awaitItem() state = awaitItem()
@ -297,30 +304,29 @@ class OutgoingVerificationPresenterTest {
return state return state
} }
private suspend fun unverifiedSessionService( private fun unverifiedSessionService(
requestSessionVerificationLambda: () -> Unit = { lambdaError() }, requestDeviceVerificationLambda: () -> Unit = { lambdaError() },
requestUserVerificationLambda: (UserId) -> Unit = { lambdaError() }, requestUserVerificationLambda: (UserId) -> Unit = { lambdaError() },
cancelVerificationLambda: () -> Unit = { lambdaError() }, cancelVerificationLambda: () -> Unit = { lambdaError() },
approveVerificationLambda: () -> Unit = { lambdaError() }, approveVerificationLambda: () -> Unit = { lambdaError() },
declineVerificationLambda: () -> Unit = { lambdaError() }, declineVerificationLambda: () -> Unit = { lambdaError() },
startVerificationLambda: () -> Unit = { lambdaError() }, startSasVerificationLambda: () -> Unit = { lambdaError() },
resetLambda: (Boolean) -> Unit = { }, resetLambda: (Boolean) -> Unit = { },
acknowledgeVerificationRequestLambda: (VerificationRequest.Incoming) -> Unit = { lambdaError() }, acknowledgeVerificationRequestLambda: (VerificationRequest.Incoming) -> Unit = { lambdaError() },
acceptVerificationRequestLambda: () -> Unit = { lambdaError() }, acceptVerificationRequestLambda: () -> Unit = { lambdaError() },
): FakeSessionVerificationService { ): FakeSessionVerificationService {
return FakeSessionVerificationService( return FakeSessionVerificationService(
requestCurrentSessionVerificationLambda = requestSessionVerificationLambda, initialSessionVerifiedStatus = SessionVerifiedStatus.NotVerified,
requestDeviceVerificationLambda = requestDeviceVerificationLambda,
requestUserVerificationLambda = requestUserVerificationLambda, requestUserVerificationLambda = requestUserVerificationLambda,
cancelVerificationLambda = cancelVerificationLambda, cancelVerificationLambda = cancelVerificationLambda,
approveVerificationLambda = approveVerificationLambda, approveVerificationLambda = approveVerificationLambda,
declineVerificationLambda = declineVerificationLambda, declineVerificationLambda = declineVerificationLambda,
startVerificationLambda = startVerificationLambda, startSasVerificationLambda = startSasVerificationLambda,
resetLambda = resetLambda, resetLambda = resetLambda,
acknowledgeVerificationRequestLambda = acknowledgeVerificationRequestLambda, acknowledgeVerificationRequestLambda = acknowledgeVerificationRequestLambda,
acceptVerificationRequestLambda = acceptVerificationRequestLambda, acceptVerificationRequestLambda = acceptVerificationRequestLambda,
).apply { )
emitVerifiedStatus(SessionVerifiedStatus.NotVerified)
}
} }
} }

View file

@ -33,7 +33,7 @@ interface SessionVerificationService {
/** /**
* Request verification of the current session. * Request verification of the current session.
*/ */
suspend fun requestCurrentSessionVerification() suspend fun requestDeviceVerification()
/** /**
* Request verification of the user with the given [userId]. * Request verification of the user with the given [userId].
@ -56,9 +56,9 @@ interface SessionVerificationService {
suspend fun declineVerification() suspend fun declineVerification()
/** /**
* Starts the verification of the unverified session from another device. * Transition the current verification request into a SAS verification flow.
*/ */
suspend fun startVerification() suspend fun startSasVerification()
/** /**
* Returns the verification service state to the initial step. * Returns the verification service state to the initial step.

View file

@ -124,7 +124,7 @@ class RustSessionVerificationService(
this.listener = listener this.listener = listener
} }
override suspend fun requestCurrentSessionVerification() = tryOrFail { override suspend fun requestDeviceVerification() = tryOrFail {
ensureEncryptionIsInitialized() ensureEncryptionIsInitialized()
verificationController.requestDeviceVerification() verificationController.requestDeviceVerification()
currentVerificationRequest = VerificationRequest.Outgoing.CurrentSession currentVerificationRequest = VerificationRequest.Outgoing.CurrentSession
@ -146,7 +146,7 @@ class RustSessionVerificationService(
override suspend fun declineVerification() = tryOrFail { verificationController.declineVerification() } override suspend fun declineVerification() = tryOrFail { verificationController.declineVerification() }
override suspend fun startVerification() = tryOrFail { override suspend fun startSasVerification() = tryOrFail {
verificationController.startSasVerification() verificationController.startSasVerification()
} }

View file

@ -22,12 +22,12 @@ import kotlinx.coroutines.flow.StateFlow
class FakeSessionVerificationService( class FakeSessionVerificationService(
initialSessionVerifiedStatus: SessionVerifiedStatus = SessionVerifiedStatus.Unknown, initialSessionVerifiedStatus: SessionVerifiedStatus = SessionVerifiedStatus.Unknown,
private val requestCurrentSessionVerificationLambda: () -> Unit = { lambdaError() }, private val requestDeviceVerificationLambda: () -> Unit = { lambdaError() },
private val requestUserVerificationLambda: (UserId) -> Unit = { lambdaError() }, private val requestUserVerificationLambda: (UserId) -> Unit = { lambdaError() },
private val cancelVerificationLambda: () -> Unit = { lambdaError() }, private val cancelVerificationLambda: () -> Unit = { lambdaError() },
private val approveVerificationLambda: () -> Unit = { lambdaError() }, private val approveVerificationLambda: () -> Unit = { lambdaError() },
private val declineVerificationLambda: () -> Unit = { lambdaError() }, private val declineVerificationLambda: () -> Unit = { lambdaError() },
private val startVerificationLambda: () -> Unit = { lambdaError() }, private val startSasVerificationLambda: () -> Unit = { lambdaError() },
private val resetLambda: (Boolean) -> Unit = { lambdaError() }, private val resetLambda: (Boolean) -> Unit = { lambdaError() },
private val acknowledgeVerificationRequestLambda: (VerificationRequest.Incoming) -> Unit = { lambdaError() }, private val acknowledgeVerificationRequestLambda: (VerificationRequest.Incoming) -> Unit = { lambdaError() },
private val acceptVerificationRequestLambda: () -> Unit = { lambdaError() }, private val acceptVerificationRequestLambda: () -> Unit = { lambdaError() },
@ -40,31 +40,31 @@ class FakeSessionVerificationService(
override val sessionVerifiedStatus: StateFlow<SessionVerifiedStatus> = _sessionVerifiedStatus override val sessionVerifiedStatus: StateFlow<SessionVerifiedStatus> = _sessionVerifiedStatus
override val needsSessionVerification: Flow<Boolean> = _needsSessionVerification override val needsSessionVerification: Flow<Boolean> = _needsSessionVerification
override suspend fun requestCurrentSessionVerification() { override suspend fun requestDeviceVerification() = simulateLongTask {
requestCurrentSessionVerificationLambda() requestDeviceVerificationLambda()
} }
override suspend fun requestUserVerification(userId: UserId) { override suspend fun requestUserVerification(userId: UserId) = simulateLongTask {
requestUserVerificationLambda(userId) requestUserVerificationLambda(userId)
} }
override suspend fun cancelVerification() { override suspend fun cancelVerification() = simulateLongTask {
cancelVerificationLambda() cancelVerificationLambda()
} }
override suspend fun approveVerification() { override suspend fun approveVerification() = simulateLongTask {
approveVerificationLambda() approveVerificationLambda()
} }
override suspend fun declineVerification() { override suspend fun declineVerification() = simulateLongTask {
declineVerificationLambda() declineVerificationLambda()
} }
override suspend fun startVerification() { override suspend fun startSasVerification() = simulateLongTask {
startVerificationLambda() startSasVerificationLambda()
} }
override suspend fun reset(cancelAnyPendingVerificationAttempt: Boolean) { override suspend fun reset(cancelAnyPendingVerificationAttempt: Boolean) = simulateLongTask {
resetLambda(cancelAnyPendingVerificationAttempt) resetLambda(cancelAnyPendingVerificationAttempt)
} }
@ -75,7 +75,7 @@ class FakeSessionVerificationService(
this.listener = listener this.listener = listener
} }
override suspend fun acknowledgeVerificationRequest(verificationRequest: VerificationRequest.Incoming) { override suspend fun acknowledgeVerificationRequest(verificationRequest: VerificationRequest.Incoming) = simulateLongTask {
acknowledgeVerificationRequestLambda(verificationRequest) acknowledgeVerificationRequestLambda(verificationRequest)
} }