From 9779cb9cf2644d0da728008f4a90b1143a590793 Mon Sep 17 00:00:00 2001 From: Sean Weiser <125889608+sean-livefront@users.noreply.github.com> Date: Sat, 20 Jan 2024 09:41:50 -0600 Subject: [PATCH] BIT-1286: Check for empty organization ID on SSO login screen (#694) --- .../EnterpriseSignOnViewModel.kt | 14 +++++++++ .../EnterpriseSignOnViewModelTest.kt | 29 +++++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModel.kt index 0287a771ea..c1ba864a20 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModel.kt @@ -2,8 +2,10 @@ package com.x8bit.bitwarden.ui.auth.feature.enterprisesignon import android.os.Parcelable import androidx.lifecycle.SavedStateHandle +import com.x8bit.bitwarden.R 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.flow.update import kotlinx.parcelize.Parcelize @@ -47,6 +49,18 @@ class EnterpriseSignOnViewModel @Inject constructor( private fun handleLogInClicked() { // TODO BIT-816: submit request for single sign on sendEvent(EnterpriseSignOnEvent.ShowToast("Not yet implemented.")) + + if (state.orgIdentifierInput.isBlank()) { + mutableStateFlow.update { + it.copy( + dialogState = EnterpriseSignOnState.DialogState.Error( + R.string.validation_field_required.asText( + R.string.org_identifier.asText(), + ), + ), + ) + } + } } private fun handleOrgIdentifierInputChanged( diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModelTest.kt index 4fcb2187e8..429104b5b8 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModelTest.kt @@ -2,6 +2,7 @@ package com.x8bit.bitwarden.ui.auth.feature.enterprisesignon import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test +import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.base.BaseViewModelTest import com.x8bit.bitwarden.ui.platform.base.util.asText import kotlinx.coroutines.test.runTest @@ -44,11 +45,35 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { } @Test - fun `LogInClick should emit ShowToast`() = runTest { + fun `LogInClick with valid organization should emit ShowToast`() = runTest { + val state = DEFAULT_STATE.copy(orgIdentifierInput = "Test") + val viewModel = createViewModel(state) + viewModel.eventFlow.test { + viewModel.actionChannel.trySend(EnterpriseSignOnAction.LogInClick) + assertEquals(state, viewModel.stateFlow.value) + assertEquals( + EnterpriseSignOnEvent.ShowToast("Not yet implemented."), + 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, viewModel.stateFlow.value) + assertEquals( + DEFAULT_STATE.copy( + dialogState = EnterpriseSignOnState.DialogState.Error( + R.string.validation_field_required.asText( + R.string.org_identifier.asText(), + ), + ), + ), + viewModel.stateFlow.value, + ) assertEquals( EnterpriseSignOnEvent.ShowToast("Not yet implemented."), awaitItem(),