Add tests.
This commit is contained in:
parent
1f7e281cfc
commit
5b07a0acb1
3 changed files with 129 additions and 106 deletions
|
|
@ -5,12 +5,11 @@
|
||||||
* Please see LICENSE files in the repository root for full details.
|
* Please see LICENSE files in the repository root for full details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@file:OptIn(ExperimentalCoroutinesApi::class)
|
||||||
|
|
||||||
package io.element.android.appnav.loggedin
|
package io.element.android.appnav.loggedin
|
||||||
|
|
||||||
import app.cash.molecule.RecompositionMode
|
|
||||||
import app.cash.molecule.moleculeFlow
|
|
||||||
import app.cash.turbine.ReceiveTurbine
|
import app.cash.turbine.ReceiveTurbine
|
||||||
import app.cash.turbine.test
|
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import im.vector.app.features.analytics.plan.CryptoSessionStateChange
|
import im.vector.app.features.analytics.plan.CryptoSessionStateChange
|
||||||
import im.vector.app.features.analytics.plan.UserProperties
|
import im.vector.app.features.analytics.plan.UserProperties
|
||||||
|
|
@ -19,6 +18,7 @@ import io.element.android.libraries.matrix.api.MatrixClient
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.core.SessionId
|
||||||
import io.element.android.libraries.matrix.api.encryption.EncryptionService
|
import io.element.android.libraries.matrix.api.encryption.EncryptionService
|
||||||
import io.element.android.libraries.matrix.api.encryption.RecoveryState
|
import io.element.android.libraries.matrix.api.encryption.RecoveryState
|
||||||
|
import io.element.android.libraries.matrix.api.oidc.AccountManagementAction
|
||||||
import io.element.android.libraries.matrix.api.roomlist.RoomListService
|
import io.element.android.libraries.matrix.api.roomlist.RoomListService
|
||||||
import io.element.android.libraries.matrix.api.sync.SlidingSyncVersion
|
import io.element.android.libraries.matrix.api.sync.SlidingSyncVersion
|
||||||
import io.element.android.libraries.matrix.api.sync.SyncState
|
import io.element.android.libraries.matrix.api.sync.SyncState
|
||||||
|
|
@ -45,8 +45,8 @@ import io.element.android.tests.testutils.lambda.any
|
||||||
import io.element.android.tests.testutils.lambda.lambdaError
|
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.lambda.value
|
import io.element.android.tests.testutils.lambda.value
|
||||||
|
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.advanceUntilIdle
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import org.junit.Rule
|
import org.junit.Rule
|
||||||
|
|
@ -58,10 +58,7 @@ class LoggedInPresenterTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - initial state`() = runTest {
|
fun `present - initial state`() = runTest {
|
||||||
val presenter = createLoggedInPresenter()
|
createLoggedInPresenter().test {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
|
||||||
presenter.present()
|
|
||||||
}.test {
|
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
assertThat(initialState.showSyncSpinner).isFalse()
|
assertThat(initialState.showSyncSpinner).isFalse()
|
||||||
assertThat(initialState.pusherRegistrationState.isUninitialized()).isTrue()
|
assertThat(initialState.pusherRegistrationState.isUninitialized()).isTrue()
|
||||||
|
|
@ -69,13 +66,32 @@ class LoggedInPresenterTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `present - ensure that account urls are preloaded`() = runTest {
|
||||||
|
val accountManagementUrlResult = lambdaRecorder<AccountManagementAction?, Result<String?>> { Result.success("aUrl") }
|
||||||
|
val matrixClient = FakeMatrixClient(
|
||||||
|
accountManagementUrlResult = accountManagementUrlResult,
|
||||||
|
)
|
||||||
|
createLoggedInPresenter(
|
||||||
|
matrixClient = matrixClient,
|
||||||
|
).test {
|
||||||
|
awaitItem()
|
||||||
|
advanceUntilIdle()
|
||||||
|
accountManagementUrlResult.assertions().isCalledExactly(2)
|
||||||
|
.withSequence(
|
||||||
|
listOf(value(AccountManagementAction.Profile)),
|
||||||
|
listOf(value(AccountManagementAction.SessionsList)),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - show sync spinner`() = runTest {
|
fun `present - show sync spinner`() = runTest {
|
||||||
val roomListService = FakeRoomListService()
|
val roomListService = FakeRoomListService()
|
||||||
val presenter = createLoggedInPresenter(roomListService, SyncState.Running)
|
createLoggedInPresenter(
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
syncState = SyncState.Running,
|
||||||
presenter.present()
|
matrixClient = FakeMatrixClient(roomListService = roomListService),
|
||||||
}.test {
|
).test {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
assertThat(initialState.showSyncSpinner).isFalse()
|
assertThat(initialState.showSyncSpinner).isFalse()
|
||||||
roomListService.postSyncIndicator(RoomListService.SyncIndicator.Show)
|
roomListService.postSyncIndicator(RoomListService.SyncIndicator.Show)
|
||||||
|
|
@ -92,18 +108,18 @@ class LoggedInPresenterTest {
|
||||||
val verificationService = FakeSessionVerificationService()
|
val verificationService = FakeSessionVerificationService()
|
||||||
val encryptionService = FakeEncryptionService()
|
val encryptionService = FakeEncryptionService()
|
||||||
val buildMeta = aBuildMeta()
|
val buildMeta = aBuildMeta()
|
||||||
val presenter = LoggedInPresenter(
|
LoggedInPresenter(
|
||||||
matrixClient = FakeMatrixClient(roomListService = roomListService, encryptionService = encryptionService),
|
matrixClient = FakeMatrixClient(
|
||||||
|
roomListService = roomListService,
|
||||||
|
encryptionService = encryptionService,
|
||||||
|
),
|
||||||
syncService = FakeSyncService(initialSyncState = SyncState.Running),
|
syncService = FakeSyncService(initialSyncState = SyncState.Running),
|
||||||
pushService = FakePushService(),
|
pushService = FakePushService(),
|
||||||
sessionVerificationService = verificationService,
|
sessionVerificationService = verificationService,
|
||||||
analyticsService = analyticsService,
|
analyticsService = analyticsService,
|
||||||
encryptionService = encryptionService,
|
encryptionService = encryptionService,
|
||||||
buildMeta = buildMeta,
|
buildMeta = buildMeta,
|
||||||
)
|
).test {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
|
||||||
presenter.present()
|
|
||||||
}.test {
|
|
||||||
encryptionService.emitRecoveryState(RecoveryState.UNKNOWN)
|
encryptionService.emitRecoveryState(RecoveryState.UNKNOWN)
|
||||||
encryptionService.emitRecoveryState(RecoveryState.INCOMPLETE)
|
encryptionService.emitRecoveryState(RecoveryState.INCOMPLETE)
|
||||||
verificationService.emitVerifiedStatus(SessionVerifiedStatus.Verified)
|
verificationService.emitVerifiedStatus(SessionVerifiedStatus.Verified)
|
||||||
|
|
@ -129,13 +145,10 @@ class LoggedInPresenterTest {
|
||||||
val verificationService = FakeSessionVerificationService(
|
val verificationService = FakeSessionVerificationService(
|
||||||
initialSessionVerifiedStatus = SessionVerifiedStatus.NotVerified
|
initialSessionVerifiedStatus = SessionVerifiedStatus.NotVerified
|
||||||
)
|
)
|
||||||
val presenter = createLoggedInPresenter(
|
createLoggedInPresenter(
|
||||||
pushService = pushService,
|
pushService = pushService,
|
||||||
sessionVerificationService = verificationService,
|
sessionVerificationService = verificationService,
|
||||||
)
|
).test {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
|
||||||
presenter.present()
|
|
||||||
}.test {
|
|
||||||
val finalState = awaitFirstItem()
|
val finalState = awaitFirstItem()
|
||||||
assertThat(finalState.pusherRegistrationState.errorOrNull())
|
assertThat(finalState.pusherRegistrationState.errorOrNull())
|
||||||
.isInstanceOf(PusherRegistrationFailure.AccountNotVerified::class.java)
|
.isInstanceOf(PusherRegistrationFailure.AccountNotVerified::class.java)
|
||||||
|
|
@ -155,13 +168,13 @@ class LoggedInPresenterTest {
|
||||||
val pushService = createFakePushService(
|
val pushService = createFakePushService(
|
||||||
registerWithLambda = lambda,
|
registerWithLambda = lambda,
|
||||||
)
|
)
|
||||||
val presenter = createLoggedInPresenter(
|
createLoggedInPresenter(
|
||||||
pushService = pushService,
|
pushService = pushService,
|
||||||
sessionVerificationService = sessionVerificationService,
|
sessionVerificationService = sessionVerificationService,
|
||||||
)
|
matrixClient = FakeMatrixClient(
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
accountManagementUrlResult = { Result.success(null) },
|
||||||
presenter.present()
|
),
|
||||||
}.test {
|
).test {
|
||||||
val finalState = awaitFirstItem()
|
val finalState = awaitFirstItem()
|
||||||
assertThat(finalState.pusherRegistrationState.isSuccess()).isTrue()
|
assertThat(finalState.pusherRegistrationState.isSuccess()).isTrue()
|
||||||
lambda.assertions()
|
lambda.assertions()
|
||||||
|
|
@ -188,13 +201,13 @@ class LoggedInPresenterTest {
|
||||||
val pushService = createFakePushService(
|
val pushService = createFakePushService(
|
||||||
registerWithLambda = lambda,
|
registerWithLambda = lambda,
|
||||||
)
|
)
|
||||||
val presenter = createLoggedInPresenter(
|
createLoggedInPresenter(
|
||||||
pushService = pushService,
|
pushService = pushService,
|
||||||
sessionVerificationService = sessionVerificationService,
|
sessionVerificationService = sessionVerificationService,
|
||||||
)
|
matrixClient = FakeMatrixClient(
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
accountManagementUrlResult = { Result.success(null) },
|
||||||
presenter.present()
|
),
|
||||||
}.test {
|
).test {
|
||||||
val finalState = awaitFirstItem()
|
val finalState = awaitFirstItem()
|
||||||
assertThat(finalState.pusherRegistrationState.isFailure()).isTrue()
|
assertThat(finalState.pusherRegistrationState.isFailure()).isTrue()
|
||||||
lambda.assertions()
|
lambda.assertions()
|
||||||
|
|
@ -233,13 +246,13 @@ class LoggedInPresenterTest {
|
||||||
currentPushProvider = { pushProvider },
|
currentPushProvider = { pushProvider },
|
||||||
registerWithLambda = lambda,
|
registerWithLambda = lambda,
|
||||||
)
|
)
|
||||||
val presenter = createLoggedInPresenter(
|
createLoggedInPresenter(
|
||||||
pushService = pushService,
|
pushService = pushService,
|
||||||
sessionVerificationService = sessionVerificationService,
|
sessionVerificationService = sessionVerificationService,
|
||||||
)
|
matrixClient = FakeMatrixClient(
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
accountManagementUrlResult = { Result.success(null) },
|
||||||
presenter.present()
|
),
|
||||||
}.test {
|
).test {
|
||||||
val finalState = awaitFirstItem()
|
val finalState = awaitFirstItem()
|
||||||
assertThat(finalState.pusherRegistrationState.isSuccess()).isTrue()
|
assertThat(finalState.pusherRegistrationState.isSuccess()).isTrue()
|
||||||
lambda.assertions()
|
lambda.assertions()
|
||||||
|
|
@ -277,13 +290,13 @@ class LoggedInPresenterTest {
|
||||||
currentPushProvider = { pushProvider },
|
currentPushProvider = { pushProvider },
|
||||||
registerWithLambda = lambda,
|
registerWithLambda = lambda,
|
||||||
)
|
)
|
||||||
val presenter = createLoggedInPresenter(
|
createLoggedInPresenter(
|
||||||
pushService = pushService,
|
pushService = pushService,
|
||||||
sessionVerificationService = sessionVerificationService,
|
sessionVerificationService = sessionVerificationService,
|
||||||
)
|
matrixClient = FakeMatrixClient(
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
accountManagementUrlResult = { Result.success(null) },
|
||||||
presenter.present()
|
),
|
||||||
}.test {
|
).test {
|
||||||
val finalState = awaitFirstItem()
|
val finalState = awaitFirstItem()
|
||||||
assertThat(finalState.pusherRegistrationState.isSuccess()).isTrue()
|
assertThat(finalState.pusherRegistrationState.isSuccess()).isTrue()
|
||||||
lambda.assertions()
|
lambda.assertions()
|
||||||
|
|
@ -317,13 +330,10 @@ class LoggedInPresenterTest {
|
||||||
currentPushProvider = { pushProvider },
|
currentPushProvider = { pushProvider },
|
||||||
registerWithLambda = lambda,
|
registerWithLambda = lambda,
|
||||||
)
|
)
|
||||||
val presenter = createLoggedInPresenter(
|
createLoggedInPresenter(
|
||||||
pushService = pushService,
|
pushService = pushService,
|
||||||
sessionVerificationService = sessionVerificationService,
|
sessionVerificationService = sessionVerificationService,
|
||||||
)
|
).test {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
|
||||||
presenter.present()
|
|
||||||
}.test {
|
|
||||||
val finalState = awaitFirstItem()
|
val finalState = awaitFirstItem()
|
||||||
assertThat(finalState.pusherRegistrationState.errorOrNull())
|
assertThat(finalState.pusherRegistrationState.errorOrNull())
|
||||||
.isInstanceOf(PusherRegistrationFailure.NoDistributorsAvailable::class.java)
|
.isInstanceOf(PusherRegistrationFailure.NoDistributorsAvailable::class.java)
|
||||||
|
|
@ -345,13 +355,10 @@ class LoggedInPresenterTest {
|
||||||
registerWithLambda = lambda,
|
registerWithLambda = lambda,
|
||||||
setIgnoreRegistrationErrorLambda = setIgnoreRegistrationErrorLambda,
|
setIgnoreRegistrationErrorLambda = setIgnoreRegistrationErrorLambda,
|
||||||
)
|
)
|
||||||
val presenter = createLoggedInPresenter(
|
createLoggedInPresenter(
|
||||||
pushService = pushService,
|
pushService = pushService,
|
||||||
sessionVerificationService = sessionVerificationService,
|
sessionVerificationService = sessionVerificationService,
|
||||||
)
|
).test {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
|
||||||
presenter.present()
|
|
||||||
}.test {
|
|
||||||
val finalState = awaitFirstItem()
|
val finalState = awaitFirstItem()
|
||||||
assertThat(finalState.pusherRegistrationState.errorOrNull())
|
assertThat(finalState.pusherRegistrationState.errorOrNull())
|
||||||
.isInstanceOf(PusherRegistrationFailure.NoProvidersAvailable::class.java)
|
.isInstanceOf(PusherRegistrationFailure.NoProvidersAvailable::class.java)
|
||||||
|
|
@ -394,13 +401,10 @@ class LoggedInPresenterTest {
|
||||||
registerWithLambda = lambda,
|
registerWithLambda = lambda,
|
||||||
selectPushProviderLambda = selectPushProviderLambda,
|
selectPushProviderLambda = selectPushProviderLambda,
|
||||||
)
|
)
|
||||||
val presenter = createLoggedInPresenter(
|
createLoggedInPresenter(
|
||||||
pushService = pushService,
|
pushService = pushService,
|
||||||
sessionVerificationService = sessionVerificationService,
|
sessionVerificationService = sessionVerificationService,
|
||||||
)
|
).test {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
|
||||||
presenter.present()
|
|
||||||
}.test {
|
|
||||||
val finalState = awaitFirstItem()
|
val finalState = awaitFirstItem()
|
||||||
assertThat(finalState.pusherRegistrationState.errorOrNull())
|
assertThat(finalState.pusherRegistrationState.errorOrNull())
|
||||||
.isInstanceOf(PusherRegistrationFailure.NoDistributorsAvailable::class.java)
|
.isInstanceOf(PusherRegistrationFailure.NoDistributorsAvailable::class.java)
|
||||||
|
|
@ -445,13 +449,13 @@ class LoggedInPresenterTest {
|
||||||
pushProvider1 = pushProvider1,
|
pushProvider1 = pushProvider1,
|
||||||
registerWithLambda = lambda,
|
registerWithLambda = lambda,
|
||||||
)
|
)
|
||||||
val presenter = createLoggedInPresenter(
|
createLoggedInPresenter(
|
||||||
pushService = pushService,
|
pushService = pushService,
|
||||||
sessionVerificationService = sessionVerificationService,
|
sessionVerificationService = sessionVerificationService,
|
||||||
)
|
matrixClient = FakeMatrixClient(
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
accountManagementUrlResult = { Result.success(null) },
|
||||||
presenter.present()
|
),
|
||||||
}.test {
|
).test {
|
||||||
val finalState = awaitFirstItem()
|
val finalState = awaitFirstItem()
|
||||||
assertThat(finalState.pusherRegistrationState.isSuccess()).isTrue()
|
assertThat(finalState.pusherRegistrationState.isSuccess()).isTrue()
|
||||||
lambda.assertions().isCalledOnce()
|
lambda.assertions().isCalledOnce()
|
||||||
|
|
@ -505,10 +509,9 @@ class LoggedInPresenterTest {
|
||||||
currentSlidingSyncVersionLambda = { Result.success(SlidingSyncVersion.Proxy) },
|
currentSlidingSyncVersionLambda = { Result.success(SlidingSyncVersion.Proxy) },
|
||||||
availableSlidingSyncVersionsLambda = { Result.success(listOf(SlidingSyncVersion.Native)) },
|
availableSlidingSyncVersionsLambda = { Result.success(listOf(SlidingSyncVersion.Native)) },
|
||||||
)
|
)
|
||||||
val presenter = createLoggedInPresenter(matrixClient = matrixClient)
|
createLoggedInPresenter(
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
matrixClient = matrixClient,
|
||||||
presenter.present()
|
).test {
|
||||||
}.test {
|
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
assertThat(initialState.forceNativeSlidingSyncMigration).isFalse()
|
assertThat(initialState.forceNativeSlidingSyncMigration).isFalse()
|
||||||
|
|
||||||
|
|
@ -526,13 +529,14 @@ class LoggedInPresenterTest {
|
||||||
assertThat(ignoreSdkError).isTrue()
|
assertThat(ignoreSdkError).isTrue()
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
val matrixClient = FakeMatrixClient().apply {
|
val matrixClient = FakeMatrixClient(
|
||||||
|
accountManagementUrlResult = { Result.success(null) },
|
||||||
|
).apply {
|
||||||
this.logoutLambda = logoutLambda
|
this.logoutLambda = logoutLambda
|
||||||
}
|
}
|
||||||
val presenter = createLoggedInPresenter(matrixClient = matrixClient)
|
createLoggedInPresenter(
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
matrixClient = matrixClient,
|
||||||
presenter.present()
|
).test {
|
||||||
}.test {
|
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
|
|
||||||
initialState.eventSink(LoggedInEvents.LogoutAndMigrateToNativeSlidingSync)
|
initialState.eventSink(LoggedInEvents.LogoutAndMigrateToNativeSlidingSync)
|
||||||
|
|
@ -548,14 +552,15 @@ class LoggedInPresenterTest {
|
||||||
return awaitItem()
|
return awaitItem()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun TestScope.createLoggedInPresenter(
|
private fun createLoggedInPresenter(
|
||||||
roomListService: RoomListService = FakeRoomListService(),
|
|
||||||
syncState: SyncState = SyncState.Running,
|
syncState: SyncState = SyncState.Running,
|
||||||
analyticsService: AnalyticsService = FakeAnalyticsService(),
|
analyticsService: AnalyticsService = FakeAnalyticsService(),
|
||||||
sessionVerificationService: SessionVerificationService = FakeSessionVerificationService(),
|
sessionVerificationService: SessionVerificationService = FakeSessionVerificationService(),
|
||||||
encryptionService: EncryptionService = FakeEncryptionService(),
|
encryptionService: EncryptionService = FakeEncryptionService(),
|
||||||
pushService: PushService = FakePushService(),
|
pushService: PushService = FakePushService(),
|
||||||
matrixClient: MatrixClient = FakeMatrixClient(roomListService = roomListService),
|
matrixClient: MatrixClient = FakeMatrixClient(
|
||||||
|
accountManagementUrlResult = { Result.success(null) },
|
||||||
|
),
|
||||||
buildMeta: BuildMeta = aBuildMeta(),
|
buildMeta: BuildMeta = aBuildMeta(),
|
||||||
): LoggedInPresenter {
|
): LoggedInPresenter {
|
||||||
return LoggedInPresenter(
|
return LoggedInPresenter(
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,11 @@
|
||||||
* Please see LICENSE files in the repository root for full details.
|
* Please see LICENSE files in the repository root for full details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@file:OptIn(ExperimentalCoroutinesApi::class)
|
||||||
|
|
||||||
package io.element.android.features.preferences.impl.root
|
package io.element.android.features.preferences.impl.root
|
||||||
|
|
||||||
import app.cash.molecule.RecompositionMode
|
|
||||||
import app.cash.molecule.moleculeFlow
|
|
||||||
import app.cash.turbine.ReceiveTurbine
|
import app.cash.turbine.ReceiveTurbine
|
||||||
import app.cash.turbine.test
|
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import io.element.android.features.logout.api.direct.aDirectLogoutState
|
import io.element.android.features.logout.api.direct.aDirectLogoutState
|
||||||
import io.element.android.features.preferences.impl.utils.ShowDeveloperSettingsProvider
|
import io.element.android.features.preferences.impl.utils.ShowDeveloperSettingsProvider
|
||||||
|
|
@ -18,6 +17,7 @@ import io.element.android.libraries.core.meta.BuildType
|
||||||
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
|
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
|
||||||
import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
|
import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
|
||||||
import io.element.android.libraries.indicator.impl.DefaultIndicatorService
|
import io.element.android.libraries.indicator.impl.DefaultIndicatorService
|
||||||
|
import io.element.android.libraries.matrix.api.oidc.AccountManagementAction
|
||||||
import io.element.android.libraries.matrix.api.user.MatrixUser
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
import io.element.android.libraries.matrix.test.AN_AVATAR_URL
|
import io.element.android.libraries.matrix.test.AN_AVATAR_URL
|
||||||
import io.element.android.libraries.matrix.test.A_USER_NAME
|
import io.element.android.libraries.matrix.test.A_USER_NAME
|
||||||
|
|
@ -27,6 +27,10 @@ import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService
|
||||||
import io.element.android.libraries.matrix.test.verification.FakeSessionVerificationService
|
import io.element.android.libraries.matrix.test.verification.FakeSessionVerificationService
|
||||||
import io.element.android.services.analytics.test.FakeAnalyticsService
|
import io.element.android.services.analytics.test.FakeAnalyticsService
|
||||||
import io.element.android.tests.testutils.WarmUpRule
|
import io.element.android.tests.testutils.WarmUpRule
|
||||||
|
import io.element.android.tests.testutils.lambda.lambdaRecorder
|
||||||
|
import io.element.android.tests.testutils.lambda.value
|
||||||
|
import io.element.android.tests.testutils.test
|
||||||
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||||
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
|
||||||
|
|
@ -37,11 +41,16 @@ class PreferencesRootPresenterTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - initial state`() = runTest {
|
fun `present - initial state`() = runTest {
|
||||||
val matrixClient = FakeMatrixClient(canDeactivateAccountResult = { true })
|
val accountManagementUrlResult = lambdaRecorder<AccountManagementAction?, Result<String?>> { action ->
|
||||||
val presenter = createPresenter(matrixClient = matrixClient)
|
Result.success("$action url")
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
}
|
||||||
presenter.present()
|
val matrixClient = FakeMatrixClient(
|
||||||
}.test {
|
canDeactivateAccountResult = { true },
|
||||||
|
accountManagementUrlResult = accountManagementUrlResult,
|
||||||
|
)
|
||||||
|
createPresenter(
|
||||||
|
matrixClient = matrixClient,
|
||||||
|
).test {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
assertThat(initialState.myUser).isEqualTo(
|
assertThat(initialState.myUser).isEqualTo(
|
||||||
MatrixUser(
|
MatrixUser(
|
||||||
|
|
@ -71,19 +80,26 @@ class PreferencesRootPresenterTest {
|
||||||
assertThat(loadedState.canDeactivateAccount).isTrue()
|
assertThat(loadedState.canDeactivateAccount).isTrue()
|
||||||
assertThat(loadedState.directLogoutState).isEqualTo(aDirectLogoutState())
|
assertThat(loadedState.directLogoutState).isEqualTo(aDirectLogoutState())
|
||||||
assertThat(loadedState.snackbarMessage).isNull()
|
assertThat(loadedState.snackbarMessage).isNull()
|
||||||
|
skipItems(1)
|
||||||
|
val finalState = awaitItem()
|
||||||
|
accountManagementUrlResult.assertions().isCalledExactly(2)
|
||||||
|
.withSequence(
|
||||||
|
listOf(value(AccountManagementAction.Profile)),
|
||||||
|
listOf(value(AccountManagementAction.SessionsList)),
|
||||||
|
)
|
||||||
|
assertThat(finalState.accountManagementUrl).isEqualTo("Profile url")
|
||||||
|
assertThat(finalState.devicesManagementUrl).isEqualTo("SessionsList url")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - can deactivate account is false if the Matrix client say so`() = runTest {
|
fun `present - can deactivate account is false if the Matrix client say so`() = runTest {
|
||||||
val presenter = createPresenter(
|
createPresenter(
|
||||||
matrixClient = FakeMatrixClient(
|
matrixClient = FakeMatrixClient(
|
||||||
canDeactivateAccountResult = { false }
|
canDeactivateAccountResult = { false },
|
||||||
)
|
accountManagementUrlResult = { Result.success(null) },
|
||||||
)
|
),
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
).test {
|
||||||
presenter.present()
|
|
||||||
}.test {
|
|
||||||
val loadedState = awaitFirstItem()
|
val loadedState = awaitFirstItem()
|
||||||
assertThat(loadedState.canDeactivateAccount).isFalse()
|
assertThat(loadedState.canDeactivateAccount).isFalse()
|
||||||
}
|
}
|
||||||
|
|
@ -91,12 +107,13 @@ class PreferencesRootPresenterTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - developer settings is hidden by default in release builds`() = runTest {
|
fun `present - developer settings is hidden by default in release builds`() = runTest {
|
||||||
val presenter = createPresenter(
|
createPresenter(
|
||||||
|
matrixClient = FakeMatrixClient(
|
||||||
|
canDeactivateAccountResult = { true },
|
||||||
|
accountManagementUrlResult = { Result.success(null) },
|
||||||
|
),
|
||||||
showDeveloperSettingsProvider = ShowDeveloperSettingsProvider(aBuildMeta(BuildType.RELEASE))
|
showDeveloperSettingsProvider = ShowDeveloperSettingsProvider(aBuildMeta(BuildType.RELEASE))
|
||||||
)
|
).test {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
|
||||||
presenter.present()
|
|
||||||
}.test {
|
|
||||||
val loadedState = awaitFirstItem()
|
val loadedState = awaitFirstItem()
|
||||||
assertThat(loadedState.showDeveloperSettings).isFalse()
|
assertThat(loadedState.showDeveloperSettings).isFalse()
|
||||||
}
|
}
|
||||||
|
|
@ -104,12 +121,13 @@ class PreferencesRootPresenterTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - developer settings can be enabled in release builds`() = runTest {
|
fun `present - developer settings can be enabled in release builds`() = runTest {
|
||||||
val presenter = createPresenter(
|
createPresenter(
|
||||||
|
matrixClient = FakeMatrixClient(
|
||||||
|
canDeactivateAccountResult = { true },
|
||||||
|
accountManagementUrlResult = { Result.success(null) },
|
||||||
|
),
|
||||||
showDeveloperSettingsProvider = ShowDeveloperSettingsProvider(aBuildMeta(BuildType.RELEASE))
|
showDeveloperSettingsProvider = ShowDeveloperSettingsProvider(aBuildMeta(BuildType.RELEASE))
|
||||||
)
|
).test {
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
|
||||||
presenter.present()
|
|
||||||
}.test {
|
|
||||||
val loadedState = awaitFirstItem()
|
val loadedState = awaitFirstItem()
|
||||||
repeat(times = ShowDeveloperSettingsProvider.DEVELOPER_SETTINGS_COUNTER) {
|
repeat(times = ShowDeveloperSettingsProvider.DEVELOPER_SETTINGS_COUNTER) {
|
||||||
assertThat(loadedState.showDeveloperSettings).isFalse()
|
assertThat(loadedState.showDeveloperSettings).isFalse()
|
||||||
|
|
@ -125,7 +143,7 @@ class PreferencesRootPresenterTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createPresenter(
|
private fun createPresenter(
|
||||||
matrixClient: FakeMatrixClient = FakeMatrixClient(canDeactivateAccountResult = { true }),
|
matrixClient: FakeMatrixClient = FakeMatrixClient(),
|
||||||
sessionVerificationService: FakeSessionVerificationService = FakeSessionVerificationService(),
|
sessionVerificationService: FakeSessionVerificationService = FakeSessionVerificationService(),
|
||||||
showDeveloperSettingsProvider: ShowDeveloperSettingsProvider = ShowDeveloperSettingsProvider(aBuildMeta(BuildType.DEBUG)),
|
showDeveloperSettingsProvider: ShowDeveloperSettingsProvider = ShowDeveloperSettingsProvider(aBuildMeta(BuildType.DEBUG)),
|
||||||
) = PreferencesRootPresenter(
|
) = PreferencesRootPresenter(
|
||||||
|
|
|
||||||
|
|
@ -72,11 +72,11 @@ class FakeMatrixClient(
|
||||||
private val syncService: FakeSyncService = FakeSyncService(),
|
private val syncService: FakeSyncService = FakeSyncService(),
|
||||||
private val encryptionService: FakeEncryptionService = FakeEncryptionService(),
|
private val encryptionService: FakeEncryptionService = FakeEncryptionService(),
|
||||||
private val roomDirectoryService: RoomDirectoryService = FakeRoomDirectoryService(),
|
private val roomDirectoryService: RoomDirectoryService = FakeRoomDirectoryService(),
|
||||||
private val accountManagementUrlString: Result<String?> = Result.success(null),
|
private val accountManagementUrlResult: (AccountManagementAction?) -> Result<String?> = { lambdaError() },
|
||||||
private val resolveRoomAliasResult: (RoomAlias) -> Result<Optional<ResolvedRoomAlias>> = {
|
private val resolveRoomAliasResult: (RoomAlias) -> Result<Optional<ResolvedRoomAlias>> = {
|
||||||
Result.success(
|
Result.success(
|
||||||
Optional.of(ResolvedRoomAlias(A_ROOM_ID, emptyList()))
|
Optional.of(ResolvedRoomAlias(A_ROOM_ID, emptyList()))
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
private val getRoomPreviewResult: (RoomIdOrAlias, List<String>) -> Result<RoomPreview> = { _, _ -> Result.failure(AN_EXCEPTION) },
|
private val getRoomPreviewResult: (RoomIdOrAlias, List<String>) -> Result<RoomPreview> = { _, _ -> Result.failure(AN_EXCEPTION) },
|
||||||
private val clearCacheLambda: () -> Unit = { lambdaError() },
|
private val clearCacheLambda: () -> Unit = { lambdaError() },
|
||||||
|
|
@ -192,8 +192,8 @@ class FakeMatrixClient(
|
||||||
return Result.success(result)
|
return Result.success(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun getAccountManagementUrl(action: AccountManagementAction?): Result<String?> {
|
override suspend fun getAccountManagementUrl(action: AccountManagementAction?): Result<String?> = simulateLongTask {
|
||||||
return accountManagementUrlString
|
accountManagementUrlResult(action)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun uploadMedia(
|
override suspend fun uploadMedia(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue