|
|
@ -18,6 +18,7 @@ package io.element.android.features.logout.impl |
|
|
|
|
|
|
|
|
|
|
|
import app.cash.molecule.RecompositionMode |
|
|
|
import app.cash.molecule.RecompositionMode |
|
|
|
import app.cash.molecule.moleculeFlow |
|
|
|
import app.cash.molecule.moleculeFlow |
|
|
|
|
|
|
|
import app.cash.turbine.ReceiveTurbine |
|
|
|
import app.cash.turbine.test |
|
|
|
import app.cash.turbine.test |
|
|
|
import com.google.common.truth.Truth.assertThat |
|
|
|
import com.google.common.truth.Truth.assertThat |
|
|
|
import io.element.android.libraries.architecture.AsyncAction |
|
|
|
import io.element.android.libraries.architecture.AsyncAction |
|
|
@ -32,7 +33,6 @@ import io.element.android.libraries.matrix.test.A_THROWABLE |
|
|
|
import io.element.android.libraries.matrix.test.FakeMatrixClient |
|
|
|
import io.element.android.libraries.matrix.test.FakeMatrixClient |
|
|
|
import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService |
|
|
|
import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService |
|
|
|
import io.element.android.tests.testutils.WarmUpRule |
|
|
|
import io.element.android.tests.testutils.WarmUpRule |
|
|
|
import io.element.android.tests.testutils.awaitLastSequentialItem |
|
|
|
|
|
|
|
import kotlinx.coroutines.delay |
|
|
|
import kotlinx.coroutines.delay |
|
|
|
import kotlinx.coroutines.flow.flow |
|
|
|
import kotlinx.coroutines.flow.flow |
|
|
|
import kotlinx.coroutines.test.runTest |
|
|
|
import kotlinx.coroutines.test.runTest |
|
|
@ -50,7 +50,7 @@ class LogoutPresenterTest { |
|
|
|
moleculeFlow(RecompositionMode.Immediate) { |
|
|
|
moleculeFlow(RecompositionMode.Immediate) { |
|
|
|
presenter.present() |
|
|
|
presenter.present() |
|
|
|
}.test { |
|
|
|
}.test { |
|
|
|
val initialState = awaitLastSequentialItem() |
|
|
|
val initialState = awaitFirstItem() |
|
|
|
assertThat(initialState.isLastSession).isFalse() |
|
|
|
assertThat(initialState.isLastSession).isFalse() |
|
|
|
assertThat(initialState.backupState).isEqualTo(BackupState.UNKNOWN) |
|
|
|
assertThat(initialState.backupState).isEqualTo(BackupState.UNKNOWN) |
|
|
|
assertThat(initialState.doesBackupExistOnServer).isTrue() |
|
|
|
assertThat(initialState.doesBackupExistOnServer).isTrue() |
|
|
@ -117,7 +117,7 @@ class LogoutPresenterTest { |
|
|
|
moleculeFlow(RecompositionMode.Immediate) { |
|
|
|
moleculeFlow(RecompositionMode.Immediate) { |
|
|
|
presenter.present() |
|
|
|
presenter.present() |
|
|
|
}.test { |
|
|
|
}.test { |
|
|
|
val initialState = awaitLastSequentialItem() |
|
|
|
val initialState = awaitFirstItem() |
|
|
|
initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) |
|
|
|
initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) |
|
|
|
val confirmationState = awaitItem() |
|
|
|
val confirmationState = awaitItem() |
|
|
|
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) |
|
|
|
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) |
|
|
@ -133,7 +133,7 @@ class LogoutPresenterTest { |
|
|
|
moleculeFlow(RecompositionMode.Immediate) { |
|
|
|
moleculeFlow(RecompositionMode.Immediate) { |
|
|
|
presenter.present() |
|
|
|
presenter.present() |
|
|
|
}.test { |
|
|
|
}.test { |
|
|
|
val initialState = awaitLastSequentialItem() |
|
|
|
val initialState = awaitFirstItem() |
|
|
|
initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) |
|
|
|
initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) |
|
|
|
val confirmationState = awaitItem() |
|
|
|
val confirmationState = awaitItem() |
|
|
|
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) |
|
|
|
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) |
|
|
@ -156,15 +156,13 @@ class LogoutPresenterTest { |
|
|
|
moleculeFlow(RecompositionMode.Immediate) { |
|
|
|
moleculeFlow(RecompositionMode.Immediate) { |
|
|
|
presenter.present() |
|
|
|
presenter.present() |
|
|
|
}.test { |
|
|
|
}.test { |
|
|
|
skipItems(1) |
|
|
|
val initialState = awaitFirstItem() |
|
|
|
val initialState = awaitItem() |
|
|
|
|
|
|
|
initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) |
|
|
|
initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) |
|
|
|
val confirmationState = awaitItem() |
|
|
|
val confirmationState = awaitItem() |
|
|
|
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) |
|
|
|
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) |
|
|
|
confirmationState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) |
|
|
|
confirmationState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) |
|
|
|
val loadingState = awaitItem() |
|
|
|
val loadingState = awaitItem() |
|
|
|
assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java) |
|
|
|
assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java) |
|
|
|
skipItems(1) |
|
|
|
|
|
|
|
val errorState = awaitItem() |
|
|
|
val errorState = awaitItem() |
|
|
|
assertThat(errorState.logoutAction).isEqualTo(AsyncAction.Failure(A_THROWABLE)) |
|
|
|
assertThat(errorState.logoutAction).isEqualTo(AsyncAction.Failure(A_THROWABLE)) |
|
|
|
errorState.eventSink.invoke(LogoutEvents.CloseDialogs) |
|
|
|
errorState.eventSink.invoke(LogoutEvents.CloseDialogs) |
|
|
@ -184,15 +182,13 @@ class LogoutPresenterTest { |
|
|
|
moleculeFlow(RecompositionMode.Immediate) { |
|
|
|
moleculeFlow(RecompositionMode.Immediate) { |
|
|
|
presenter.present() |
|
|
|
presenter.present() |
|
|
|
}.test { |
|
|
|
}.test { |
|
|
|
skipItems(1) |
|
|
|
val initialState = awaitFirstItem() |
|
|
|
val initialState = awaitItem() |
|
|
|
|
|
|
|
initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) |
|
|
|
initialState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) |
|
|
|
val confirmationState = awaitItem() |
|
|
|
val confirmationState = awaitItem() |
|
|
|
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) |
|
|
|
assertThat(confirmationState.logoutAction).isEqualTo(AsyncAction.Confirming) |
|
|
|
confirmationState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) |
|
|
|
confirmationState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = false)) |
|
|
|
val loadingState = awaitItem() |
|
|
|
val loadingState = awaitItem() |
|
|
|
assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java) |
|
|
|
assertThat(loadingState.logoutAction).isInstanceOf(AsyncAction.Loading::class.java) |
|
|
|
skipItems(1) |
|
|
|
|
|
|
|
val errorState = awaitItem() |
|
|
|
val errorState = awaitItem() |
|
|
|
assertThat(errorState.logoutAction).isEqualTo(AsyncAction.Failure(A_THROWABLE)) |
|
|
|
assertThat(errorState.logoutAction).isEqualTo(AsyncAction.Failure(A_THROWABLE)) |
|
|
|
errorState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = true)) |
|
|
|
errorState.eventSink.invoke(LogoutEvents.Logout(ignoreSdkError = true)) |
|
|
@ -203,6 +199,11 @@ class LogoutPresenterTest { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private suspend fun <T> ReceiveTurbine<T>.awaitFirstItem(): T { |
|
|
|
|
|
|
|
skipItems(2) |
|
|
|
|
|
|
|
return awaitItem() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private fun createLogoutPresenter( |
|
|
|
private fun createLogoutPresenter( |
|
|
|
matrixClient: MatrixClient = FakeMatrixClient(), |
|
|
|
matrixClient: MatrixClient = FakeMatrixClient(), |
|
|
|
encryptionService: EncryptionService = FakeEncryptionService(), |
|
|
|
encryptionService: EncryptionService = FakeEncryptionService(), |
|
|
|