BIT-817: Update storage of Environment on Landing Screen (#203)

This commit is contained in:
Brian Yencho
2023-11-03 11:09:11 -05:00
committed by GitHub
parent b22cc97963
commit 4244032add
6 changed files with 103 additions and 24 deletions

View File

@@ -0,0 +1,22 @@
package com.x8bit.bitwarden.data.platform.repository.util
import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository
import com.x8bit.bitwarden.data.platform.repository.model.Environment
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
/**
* A faked implementation of [EnvironmentRepository] based on in-memory caching.
*/
class FakeEnvironmentRepository : EnvironmentRepository {
override var environment: Environment
get() = mutableEnvironmentStateFlow.value
set(value) {
mutableEnvironmentStateFlow.value = value
}
override val environmentStateFlow: StateFlow<Environment>
get() = mutableEnvironmentStateFlow.asStateFlow()
private val mutableEnvironmentStateFlow = MutableStateFlow<Environment>(Environment.Us)
}

View File

@@ -366,7 +366,7 @@ class LandingScreenTest : BaseComposeTest() {
emailInput = "",
isContinueButtonEnabled = true,
isRememberMeEnabled = false,
selectedEnvironment = Environment.Us,
selectedEnvironmentType = Environment.Type.US,
errorDialogState = BasicDialogState.Hidden,
)
}

View File

@@ -4,6 +4,7 @@ import androidx.lifecycle.SavedStateHandle
import app.cash.turbine.test
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.platform.repository.model.Environment
import com.x8bit.bitwarden.data.platform.repository.util.FakeEnvironmentRepository
import com.x8bit.bitwarden.ui.platform.base.BaseViewModelTest
import com.x8bit.bitwarden.ui.platform.base.util.asText
import com.x8bit.bitwarden.ui.platform.components.BasicDialogState
@@ -14,6 +15,9 @@ import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
class LandingViewModelTest : BaseViewModelTest() {
private val fakeEnvironmentRepository = FakeEnvironmentRepository()
@Test
fun `initial state should be correct when there is no remembered email`() = runTest {
val viewModel = createViewModel()
@@ -146,14 +150,44 @@ class LandingViewModelTest : BaseViewModelTest() {
}
@Test
fun `EnvironmentTypeSelect should update value of selected region`() = runTest {
val inputEnvironment = Environment.Eu
fun `external environment updates should update the selected environment type`() = runTest {
val viewModel = createViewModel()
viewModel.stateFlow.test {
assertEquals(DEFAULT_STATE, awaitItem())
fakeEnvironmentRepository.environment = Environment.Eu
assertEquals(
DEFAULT_STATE.copy(
selectedEnvironmentType = Environment.Type.EU,
),
awaitItem(),
)
}
}
@Test
fun `EnvironmentTypeSelect should update value of selected region for US or EU`() = runTest {
val inputEnvironmentType = Environment.Type.EU
val viewModel = createViewModel()
viewModel.stateFlow.test {
awaitItem()
viewModel.trySendAction(LandingAction.EnvironmentTypeSelect(inputEnvironment.type))
viewModel.trySendAction(LandingAction.EnvironmentTypeSelect(inputEnvironmentType))
assertEquals(
DEFAULT_STATE.copy(selectedEnvironment = Environment.Eu),
DEFAULT_STATE.copy(selectedEnvironmentType = Environment.Type.EU),
awaitItem(),
)
}
}
@Test
fun `EnvironmentTypeSelect should emit NavigateToEnvironment for self-hosted`() = runTest {
val inputEnvironmentType = Environment.Type.SELF_HOSTED
val viewModel = createViewModel()
viewModel.eventFlow.test {
viewModel.trySendAction(LandingAction.EnvironmentTypeSelect(inputEnvironmentType))
assertEquals(
LandingEvent.NavigateToEnvironment,
awaitItem(),
)
}
@@ -163,15 +197,12 @@ class LandingViewModelTest : BaseViewModelTest() {
private fun createViewModel(
rememberedEmail: String? = null,
environment: Environment = Environment.Us,
savedStateHandle: SavedStateHandle = SavedStateHandle(),
): LandingViewModel = LandingViewModel(
authRepository = mockk(relaxed = true) {
every { rememberedEmailAddress } returns rememberedEmail
},
environmentRepository = mockk(relaxed = true) {
every { this@mockk.environment } returns environment
},
environmentRepository = fakeEnvironmentRepository,
savedStateHandle = savedStateHandle,
)
@@ -182,7 +213,7 @@ class LandingViewModelTest : BaseViewModelTest() {
emailInput = "",
isContinueButtonEnabled = false,
isRememberMeEnabled = false,
selectedEnvironment = Environment.Us,
selectedEnvironmentType = Environment.Type.US,
errorDialogState = BasicDialogState.Hidden,
)
}