BIT-1286: Enable loading dialog when logging in via SSO (#696)

This commit is contained in:
Sean Weiser 2024-01-20 12:12:08 -06:00 committed by Álison Fernandes
parent 49b4c23466
commit 1a53178137
2 changed files with 63 additions and 27 deletions

View file

@ -2,13 +2,16 @@ package com.x8bit.bitwarden.ui.auth.feature.enterprisesignon
import android.os.Parcelable
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.platform.manager.NetworkConnectionManager
import com.x8bit.bitwarden.ui.platform.base.BaseViewModel
import com.x8bit.bitwarden.ui.platform.base.util.Text
import com.x8bit.bitwarden.ui.platform.base.util.asText
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.parcelize.Parcelize
import javax.inject.Inject
@ -74,6 +77,22 @@ class EnterpriseSignOnViewModel @Inject constructor(
),
)
}
return
}
viewModelScope.launch {
mutableStateFlow.update {
it.copy(
dialogState = EnterpriseSignOnState.DialogState.Loading(
R.string.logging_in.asText(),
),
)
}
// TODO The delay and hide are temporary until the actual SSO flow is implemented (see
// BIT-816)
@Suppress("MagicNumber")
delay(2000)
mutableStateFlow.update { it.copy(dialogState = null) }
}
}

View file

@ -45,42 +45,59 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() {
}
}
@Suppress("MaxLineLength")
@Test
fun `LogInClick with valid organization should emit ShowToast`() = runTest {
val state = DEFAULT_STATE.copy(orgIdentifierInput = "Test")
val viewModel = createViewModel(state)
viewModel.eventFlow.test {
fun `LogInClick with valid organization should emit ShowToast, show a loading dialog, and then hide the dialog`() =
runTest {
val state = DEFAULT_STATE.copy(orgIdentifierInput = "Test")
val viewModel = createViewModel(state)
viewModel.actionChannel.trySend(EnterpriseSignOnAction.LogInClick)
assertEquals(state, viewModel.stateFlow.value)
assertEquals(
EnterpriseSignOnEvent.ShowToast("Not yet implemented."),
awaitItem(),
)
viewModel.eventFlow.test {
assertEquals(
EnterpriseSignOnEvent.ShowToast("Not yet implemented."),
awaitItem(),
)
}
viewModel.stateFlow.test {
assertEquals(
state.copy(
dialogState = EnterpriseSignOnState.DialogState.Loading(
R.string.logging_in.asText(),
),
),
awaitItem(),
)
assertEquals(
state.copy(dialogState = null),
awaitItem(),
)
}
}
}
@Suppress("MaxLineLength")
@Test
fun `LogInClick with invalid organization should emit ShowToast and show error dialog`() = runTest {
val viewModel = createViewModel()
viewModel.eventFlow.test {
viewModel.actionChannel.trySend(EnterpriseSignOnAction.LogInClick)
assertEquals(
DEFAULT_STATE.copy(
dialogState = EnterpriseSignOnState.DialogState.Error(
message = R.string.validation_field_required.asText(
R.string.org_identifier.asText(),
fun `LogInClick with invalid organization should emit ShowToast and show error dialog`() =
runTest {
val viewModel = createViewModel()
viewModel.eventFlow.test {
viewModel.actionChannel.trySend(EnterpriseSignOnAction.LogInClick)
assertEquals(
DEFAULT_STATE.copy(
dialogState = EnterpriseSignOnState.DialogState.Error(
message = R.string.validation_field_required.asText(
R.string.org_identifier.asText(),
),
),
),
),
viewModel.stateFlow.value,
)
assertEquals(
EnterpriseSignOnEvent.ShowToast("Not yet implemented."),
awaitItem(),
)
viewModel.stateFlow.value,
)
assertEquals(
EnterpriseSignOnEvent.ShowToast("Not yet implemented."),
awaitItem(),
)
}
}
}
@Suppress("MaxLineLength")
@Test