Loading feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/AccountSetupViewModel.kt +6 −2 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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) } } } Loading feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/AccountSetupViewModelTest.kt +111 −23 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) Loading @@ -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) Loading Loading
feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/AccountSetupViewModel.kt +6 −2 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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) } } } Loading
feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/AccountSetupViewModelTest.kt +111 −23 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) Loading @@ -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) Loading