Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 8cd96d2e authored by Wolf-Martell Montwé's avatar Wolf-Martell Montwé
Browse files

Fix account setup back navigation flow

parent 660f1836
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ class AccountSetupViewModel(
                }
            }

            SetupStep.OUTGOING_CONFIG -> changeToSetupStep(SetupStep.INCOMING_VALIDATION)
            SetupStep.OUTGOING_CONFIG -> changeToSetupStep(SetupStep.INCOMING_CONFIG)
            SetupStep.OUTGOING_VALIDATION -> {
                if (state.value.isAutomaticConfig) {
                    changeToSetupStep(SetupStep.AUTO_CONFIG)
@@ -83,7 +83,11 @@ class AccountSetupViewModel(
                }
            }

            SetupStep.OPTIONS -> changeToSetupStep(SetupStep.OUTGOING_VALIDATION)
            SetupStep.OPTIONS -> if (state.value.isAutomaticConfig) {
                changeToSetupStep(SetupStep.AUTO_CONFIG)
            } else {
                changeToSetupStep(SetupStep.OUTGOING_CONFIG)
            }
        }
    }

+111 −23
Original line number Diff line number Diff line
@@ -7,6 +7,8 @@ import app.k9mail.autodiscovery.api.SmtpServerSettings
import app.k9mail.core.common.net.toHostname
import app.k9mail.core.common.net.toPort
import app.k9mail.core.ui.compose.testing.MainDispatcherRule
import app.k9mail.core.ui.compose.testing.mvi.assertThatAndMviTurbinesConsumed
import app.k9mail.core.ui.compose.testing.mvi.turbinesWithInitialStateCheck
import app.k9mail.feature.account.setup.domain.entity.AccountOptions
import app.k9mail.feature.account.setup.domain.entity.AuthenticationType
import app.k9mail.feature.account.setup.domain.entity.ConnectionSecurity
@@ -227,58 +229,106 @@ class AccountSetupViewModelTest {
            authStateStorage = authStateStorage,
            initialState = initialState,
        )
        val stateTurbine = viewModel.state.testIn(backgroundScope)
        val effectTurbine = viewModel.effect.testIn(backgroundScope)
        val turbines = listOf(stateTurbine, effectTurbine)
        val turbines = turbinesWithInitialStateCheck(viewModel, initialState,)

        // Initial state
        assertThatAndTurbinesConsumed(
            actual = stateTurbine.awaitItem(),
        viewModel.event(AccountSetupContract.Event.OnBack)

        assertThatAndMviTurbinesConsumed(
            actual = turbines.stateTurbine.awaitItem(),
            turbines = turbines,
        ) {
            prop(State::setupStep).isEqualTo(SetupStep.OPTIONS)
            prop(State::setupStep).isEqualTo(SetupStep.OUTGOING_CONFIG)
        }

        viewModel.event(AccountSetupContract.Event.OnBack)

        assertThatAndTurbinesConsumed(
            actual = stateTurbine.awaitItem(),
        assertThatAndMviTurbinesConsumed(
            actual = turbines.stateTurbine.awaitItem(),
            turbines = turbines,
        ) {
            prop(State::setupStep).isEqualTo(SetupStep.OUTGOING_VALIDATION)
            prop(State::setupStep).isEqualTo(SetupStep.INCOMING_CONFIG)
        }

        viewModel.event(AccountSetupContract.Event.OnBack)

        assertThatAndTurbinesConsumed(
            actual = stateTurbine.awaitItem(),
        assertThatAndMviTurbinesConsumed(
            actual = turbines.stateTurbine.awaitItem(),
            turbines = turbines,
        ) {
            prop(State::setupStep).isEqualTo(SetupStep.OUTGOING_CONFIG)
            prop(State::setupStep).isEqualTo(SetupStep.AUTO_CONFIG)
        }

        viewModel.event(AccountSetupContract.Event.OnBack)

        assertThatAndTurbinesConsumed(
            actual = stateTurbine.awaitItem(),
        assertThatAndMviTurbinesConsumed(
            actual = turbines.effectTurbine.awaitItem(),
            turbines = turbines,
        ) {
            prop(State::setupStep).isEqualTo(SetupStep.INCOMING_VALIDATION)
            isEqualTo(Effect.NavigateBack)
        }
    }

    @Test
    fun `should go back from OPTIONS step on back event when isAutomaticConfig enabled`() = runTest {
        val initialState = State(
            setupStep = SetupStep.OPTIONS,
            isAutomaticConfig = true,
        )
        val viewModel = AccountSetupViewModel(
            createAccount = { _, _, _, _, _ -> "accountUuid" },
            autoDiscoveryViewModel = autoDiscoveryViewModel,
            incomingViewModel = FakeAccountIncomingConfigViewModel(),
            incomingValidationViewModel = FakeAccountValidationViewModel(),
            outgoingViewModel = FakeAccountOutgoingConfigViewModel(),
            outgoingValidationViewModel = FakeAccountValidationViewModel(),
            optionsViewModel = FakeAccountOptionsViewModel(),
            authStateStorage = authStateStorage,
            initialState = initialState,
        )
        val turbines = turbinesWithInitialStateCheck(viewModel, initialState)

        viewModel.event(AccountSetupContract.Event.OnBack)

        assertThatAndTurbinesConsumed(
            actual = stateTurbine.awaitItem(),
        assertThatAndMviTurbinesConsumed(
            actual = turbines.stateTurbine.awaitItem(),
            turbines = turbines,
        ) {
            prop(State::setupStep).isEqualTo(SetupStep.INCOMING_CONFIG)
            prop(State::setupStep).isEqualTo(SetupStep.AUTO_CONFIG)
        }

        viewModel.event(AccountSetupContract.Event.OnBack)

        assertThatAndTurbinesConsumed(
            actual = stateTurbine.awaitItem(),
        assertThatAndMviTurbinesConsumed(
            actual = turbines.effectTurbine.awaitItem(),
            turbines = turbines,
        ) {
            isEqualTo(Effect.NavigateBack)
        }
    }

    @Test
    fun `should go back from OUTGOING_VALIDATION step state on back event when isAutomaticConfig enabled`() = runTest {
        val initialState = State(
            setupStep = SetupStep.OUTGOING_VALIDATION,
            isAutomaticConfig = true,
        )
        val viewModel = AccountSetupViewModel(
            createAccount = { _, _, _, _, _ -> "accountUuid" },
            autoDiscoveryViewModel = autoDiscoveryViewModel,
            incomingViewModel = FakeAccountIncomingConfigViewModel(),
            incomingValidationViewModel = FakeAccountValidationViewModel(),
            outgoingViewModel = FakeAccountOutgoingConfigViewModel(),
            outgoingValidationViewModel = FakeAccountValidationViewModel(),
            optionsViewModel = FakeAccountOptionsViewModel(),
            authStateStorage = authStateStorage,
            initialState = initialState,
        )
        val turbines = turbinesWithInitialStateCheck(viewModel, initialState)

        viewModel.event(AccountSetupContract.Event.OnBack)

        assertThatAndMviTurbinesConsumed(
            actual = turbines.stateTurbine.awaitItem(),
            turbines = turbines,
        ) {
            prop(State::setupStep).isEqualTo(SetupStep.AUTO_CONFIG)
@@ -286,8 +336,46 @@ class AccountSetupViewModelTest {

        viewModel.event(AccountSetupContract.Event.OnBack)

        assertThatAndTurbinesConsumed(
            actual = effectTurbine.awaitItem(),
        assertThatAndMviTurbinesConsumed(
            actual = turbines.effectTurbine.awaitItem(),
            turbines = turbines,
        ) {
            isEqualTo(Effect.NavigateBack)
        }
    }

    @Test
    fun `should go back from INCOMING_VALIDATION step state on back event when isAutomaticConfig enabled`() = runTest {
        val initialState = State(
            setupStep = SetupStep.OUTGOING_VALIDATION,
            isAutomaticConfig = true,
        )
        val viewModel = AccountSetupViewModel(
            createAccount = { _, _, _, _, _ -> "accountUuid" },
            autoDiscoveryViewModel = autoDiscoveryViewModel,
            incomingViewModel = FakeAccountIncomingConfigViewModel(),
            incomingValidationViewModel = FakeAccountValidationViewModel(),
            outgoingViewModel = FakeAccountOutgoingConfigViewModel(),
            outgoingValidationViewModel = FakeAccountValidationViewModel(),
            optionsViewModel = FakeAccountOptionsViewModel(),
            authStateStorage = authStateStorage,
            initialState = initialState,
        )
        val turbines = turbinesWithInitialStateCheck(viewModel, initialState)

        viewModel.event(AccountSetupContract.Event.OnBack)

        assertThatAndMviTurbinesConsumed(
            actual = turbines.stateTurbine.awaitItem(),
            turbines = turbines,
        ) {
            prop(State::setupStep).isEqualTo(SetupStep.AUTO_CONFIG)
        }

        viewModel.event(AccountSetupContract.Event.OnBack)

        assertThatAndMviTurbinesConsumed(
            actual = turbines.effectTurbine.awaitItem(),
            turbines = turbines,
        ) {
            isEqualTo(Effect.NavigateBack)