From 921533e4b291b11a8b2a45c3db285ddebc3a9240 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Fri, 16 Sep 2022 15:03:14 +0200 Subject: [PATCH] Getting the current session verification status to change verify button visibility --- .../v2/overview/SessionOverviewViewModel.kt | 17 +++++++++ ...rrentSessionCrossSigningInfoUseCaseTest.kt | 7 +--- .../devices/v2/IsCurrentSessionUseCaseTest.kt | 9 +---- .../overview/SessionOverviewViewModelTest.kt | 38 +++++++++++++------ ...rrentSessionCrossSigningInfoUseCaseTest.kt | 5 +-- .../im/vector/app/test/fakes/FakeSession.kt | 7 ++++ 6 files changed, 54 insertions(+), 29 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt index 335341ab07..40a78a4fd3 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt @@ -26,9 +26,12 @@ import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.settings.devices.v2.IsCurrentSessionUseCase import im.vector.app.features.settings.devices.v2.verification.CheckIfCurrentSessionCanBeVerifiedUseCase +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel class SessionOverviewViewModel @AssistedInject constructor( @Assisted val initialState: SessionOverviewViewState, @@ -49,6 +52,7 @@ class SessionOverviewViewModel @AssistedInject constructor( copy(isCurrentSession = isCurrentSession(deviceId)) } observeSessionInfo(initialState.deviceId) + observeCurrentSessionInfo() } private fun isCurrentSession(deviceId: String): Boolean { @@ -61,6 +65,19 @@ class SessionOverviewViewModel @AssistedInject constructor( .launchIn(viewModelScope) } + private fun observeCurrentSessionInfo() { + activeSessionHolder.getSafeActiveSession() + ?.sessionParams + ?.deviceId + ?.let { deviceId -> + getDeviceFullInfoUseCase.execute(deviceId) + .map { it.roomEncryptionTrustLevel == RoomEncryptionTrustLevel.Trusted } + .distinctUntilChanged() + .onEach { setState { copy(isCurrentSessionTrusted = it) } } + .launchIn(viewModelScope) + } + } + override fun handle(action: SessionOverviewAction) { when (action) { is SessionOverviewAction.VerifySession -> handleVerifySessionAction() diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCaseTest.kt index e71a11710b..b9ba1b1c0b 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCaseTest.kt @@ -18,11 +18,8 @@ package im.vector.app.features.settings.devices import im.vector.app.features.settings.devices.v2.verification.CurrentSessionCrossSigningInfo import im.vector.app.test.fakes.FakeActiveSessionHolder -import io.mockk.every -import io.mockk.mockk import org.amshove.kluent.shouldBeEqualTo import org.junit.Test -import org.matrix.android.sdk.api.auth.data.SessionParams private const val A_DEVICE_ID = "device-id" @@ -36,9 +33,7 @@ class GetCurrentSessionCrossSigningInfoUseCaseTest { @Test fun `given the active session when getting cross signing info then the result is correct`() { - val sessionParams = mockk() - every { sessionParams.deviceId } returns A_DEVICE_ID - fakeActiveSessionHolder.fakeSession.givenSessionParams(sessionParams) + fakeActiveSessionHolder.fakeSession.givenSessionId(A_DEVICE_ID) val isCrossSigningInitialized = true fakeActiveSessionHolder.fakeSession .fakeCryptoService diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCaseTest.kt index 25cd150b21..09a94ac08b 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCaseTest.kt @@ -17,8 +17,6 @@ package im.vector.app.features.settings.devices.v2 import im.vector.app.test.fakes.FakeActiveSessionHolder -import io.mockk.every -import io.mockk.mockk import io.mockk.verify import org.amshove.kluent.shouldBe import org.junit.Test @@ -73,10 +71,7 @@ class IsCurrentSessionUseCaseTest { result shouldBe false } - private fun givenIdForCurrentSession(deviceId: String): SessionParams { - val sessionParams = mockk() - every { sessionParams.deviceId } returns deviceId - fakeActiveSessionHolder.fakeSession.givenSessionParams(sessionParams) - return sessionParams + private fun givenIdForCurrentSession(sessionId: String): SessionParams { + return fakeActiveSessionHolder.fakeSession.givenSessionId(sessionId) } } diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt index ed7fc766c7..3ba3e616df 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt @@ -31,8 +31,10 @@ import io.mockk.verify import kotlinx.coroutines.flow.flowOf import org.junit.Rule import org.junit.Test +import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel -private const val A_SESSION_ID = "session-id" +private const val A_SESSION_ID_1 = "session-id-1" +private const val A_SESSION_ID_2 = "session-id-2" class SessionOverviewViewModelTest { @@ -40,7 +42,7 @@ class SessionOverviewViewModelTest { val mvRxTestRule = MvRxTestRule(testDispatcher = testDispatcher) private val args = SessionOverviewArgs( - deviceId = A_SESSION_ID + deviceId = A_SESSION_ID_1 ) private val isCurrentSessionUseCase = mockk() private val getDeviceFullInfoUseCase = mockk() @@ -54,16 +56,18 @@ class SessionOverviewViewModelTest { ) @Test - fun `given the viewModel has been initialized then viewState is updated with session info`() { + fun `given the viewModel has been initialized then viewState is updated with session info and current session verification status`() { // Given val deviceFullInfo = mockk() - every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) + every { getDeviceFullInfoUseCase.execute(A_SESSION_ID_1) } returns flowOf(deviceFullInfo) val isCurrentSession = true every { isCurrentSessionUseCase.execute(any()) } returns isCurrentSession + givenCurrentSessionIsTrusted() val expectedState = SessionOverviewViewState( - deviceId = A_SESSION_ID, + deviceId = A_SESSION_ID_1, isCurrentSession = isCurrentSession, - deviceInfo = Success(deviceFullInfo) + deviceInfo = Success(deviceFullInfo), + isCurrentSessionTrusted = true, ) // When @@ -74,8 +78,8 @@ class SessionOverviewViewModelTest { .assertLatestState { state -> state == expectedState } .finish() verify { - isCurrentSessionUseCase.execute(A_SESSION_ID) - getDeviceFullInfoUseCase.execute(A_SESSION_ID) + isCurrentSessionUseCase.execute(A_SESSION_ID_1) + getDeviceFullInfoUseCase.execute(A_SESSION_ID_1) } } @@ -83,10 +87,11 @@ class SessionOverviewViewModelTest { fun `given current session can be verified when handling verify current session action then self verification event is posted`() { // Given val deviceFullInfo = mockk() - every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) + every { getDeviceFullInfoUseCase.execute(A_SESSION_ID_1) } returns flowOf(deviceFullInfo) every { isCurrentSessionUseCase.execute(any()) } returns true val verifySessionAction = SessionOverviewAction.VerifySession coEvery { checkIfCurrentSessionCanBeVerifiedUseCase.execute() } returns true + givenCurrentSessionIsTrusted() // When val viewModel = createViewModel() @@ -106,10 +111,11 @@ class SessionOverviewViewModelTest { fun `given current session cannot be verified when handling verify current session action then reset secrets event is posted`() { // Given val deviceFullInfo = mockk() - every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) + every { getDeviceFullInfoUseCase.execute(A_SESSION_ID_1) } returns flowOf(deviceFullInfo) every { isCurrentSessionUseCase.execute(any()) } returns true val verifySessionAction = SessionOverviewAction.VerifySession coEvery { checkIfCurrentSessionCanBeVerifiedUseCase.execute() } returns false + givenCurrentSessionIsTrusted() // When val viewModel = createViewModel() @@ -129,9 +135,10 @@ class SessionOverviewViewModelTest { fun `given another session when handling verify session action then verify session event is posted`() { // Given val deviceFullInfo = mockk() - every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) + every { getDeviceFullInfoUseCase.execute(A_SESSION_ID_1) } returns flowOf(deviceFullInfo) every { isCurrentSessionUseCase.execute(any()) } returns false - val verifySessionAction = SessionOverviewAction.VerifySession(A_SESSION_ID) + val verifySessionAction = SessionOverviewAction.VerifySession + givenCurrentSessionIsTrusted() // When val viewModel = createViewModel() @@ -143,4 +150,11 @@ class SessionOverviewViewModelTest { .assertEvent { it is SessionOverviewViewEvent.ShowVerifyOtherSession } .finish() } + + private fun givenCurrentSessionIsTrusted() { + fakeActiveSessionHolder.fakeSession.givenSessionId(A_SESSION_ID_2) + val deviceFullInfo = mockk() + every { deviceFullInfo.roomEncryptionTrustLevel } returns RoomEncryptionTrustLevel.Trusted + every { getDeviceFullInfoUseCase.execute(A_SESSION_ID_2) } returns flowOf(deviceFullInfo) + } } diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt index 25d5766774..f566c8f55e 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt @@ -107,11 +107,8 @@ class GetCurrentSessionCrossSigningInfoUseCaseTest { } private fun givenSession(deviceId: String): FakeSession { - val sessionParams = mockk() - every { sessionParams.deviceId } returns deviceId - val fakeSession = fakeActiveSessionHolder.fakeSession - fakeSession.givenSessionParams(sessionParams) + fakeSession.givenSessionId(deviceId) return fakeSession } diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt index 35d23e35e8..4171307922 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt @@ -78,6 +78,13 @@ class FakeSession( every { this@FakeSession.sessionParams } returns sessionParams } + fun givenSessionId(sessionId: String): SessionParams { + val sessionParams = mockk() + every { sessionParams.deviceId } returns sessionId + givenSessionParams(sessionParams) + return sessionParams + } + /** * Do not forget to call mockkStatic("org.matrix.android.sdk.flow.FlowSessionKt") in the setup method of the tests. */