Move to organization navigation (#620)

This commit is contained in:
Ramsey Smith
2024-01-15 11:58:20 -07:00
committed by GitHub
parent c6173d0a47
commit d51fa8f1ec
9 changed files with 423 additions and 2 deletions

View File

@@ -51,6 +51,7 @@ class VaultItemScreenTest : BaseComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToVaultEditItemId: String? = null
private var onNavigateToMoveToOrganizationItemId: String? = null
private val intentHandler = mockk<IntentHandler>()
@@ -68,6 +69,7 @@ class VaultItemScreenTest : BaseComposeTest() {
viewModel = viewModel,
onNavigateBack = { onNavigateBackCalled = true },
onNavigateToVaultAddEditItem = { onNavigateToVaultEditItemId = it },
onNavigateToMoveToOrganization = { onNavigateToMoveToOrganizationItemId = it },
intentHandler = intentHandler,
)
}
@@ -81,6 +83,13 @@ class VaultItemScreenTest : BaseComposeTest() {
assertEquals(id, onNavigateToVaultEditItemId)
}
@Test
fun `NavigateToMoveToOrganization event should invoke onNavigateToMoveToOrganization`() {
val id = "id1234"
mutableEventFlow.tryEmit(VaultItemEvent.NavigateToMoveToOrganization(itemId = id))
assertEquals(id, onNavigateToMoveToOrganizationItemId)
}
@Test
fun `on close click should send CloseClick`() {
composeTestRule.onNodeWithContentDescription(label = "Close").performClick()

View File

@@ -0,0 +1,61 @@
package com.x8bit.bitwarden.ui.vault.feature.movetoorganization
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.performClick
import com.x8bit.bitwarden.data.platform.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class VaultMoveToOrganizationScreenTest : BaseComposeTest() {
private var onNavigateBackCalled = false
private val mutableEventFlow = bufferedMutableSharedFlow<VaultMoveToOrganizationEvent>()
private val mutableStateFlow = MutableStateFlow(createVaultMoveToOrganizationState())
private val viewModel = mockk<VaultMoveToOrganizationViewModel>(relaxed = true) {
every { eventFlow } returns mutableEventFlow
every { stateFlow } returns mutableStateFlow
}
@Before
fun setup() {
composeTestRule.setContent {
VaultMoveToOrganizationScreen(
onNavigateBack = { onNavigateBackCalled = true },
viewModel = viewModel,
)
}
}
@Test
fun `on NavigateBack event should invoke onNavigateBack`() {
mutableEventFlow.tryEmit(VaultMoveToOrganizationEvent.NavigateBack)
assertTrue(onNavigateBackCalled)
}
@Test
fun `clicking close button should send BackClick action`() {
composeTestRule
.onNodeWithContentDescription(label = "Close")
.performClick()
verify {
viewModel.trySendAction(
VaultMoveToOrganizationAction.BackClick,
)
}
}
}
private fun createVaultMoveToOrganizationState(): VaultMoveToOrganizationState =
VaultMoveToOrganizationState(
vaultItemId = "mockId",
viewState = VaultMoveToOrganizationState.ViewState.Content,
)

View File

@@ -0,0 +1,77 @@
package com.x8bit.bitwarden.ui.vault.feature.movetoorganization
import androidx.lifecycle.SavedStateHandle
import app.cash.turbine.test
import com.x8bit.bitwarden.ui.platform.base.BaseViewModelTest
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
class VaultMoveToOrganizationViewModelTest : BaseViewModelTest() {
private val initialState = createVaultMoveToOrganizationState()
private val initialSavedStateHandle = createSavedStateHandleWithState(
state = initialState,
)
@Test
fun `initial state should be correct when state is null`() = runTest {
val viewModel = createViewModel(
savedStateHandle = createSavedStateHandleWithState(
state = null,
),
)
assertEquals(
initialState.copy(viewState = VaultMoveToOrganizationState.ViewState.Loading),
viewModel.stateFlow.value,
)
}
@Test
fun `initial state should be correct`() = runTest {
val initState = createVaultMoveToOrganizationState()
val viewModel = createViewModel(
savedStateHandle = createSavedStateHandleWithState(
state = initState,
),
)
assertEquals(initState, viewModel.stateFlow.value)
}
@Test
fun `CloseClick should emit NavigateBack`() = runTest {
val viewModel = createViewModel(
savedStateHandle = initialSavedStateHandle,
)
viewModel.eventFlow.test {
viewModel.actionChannel.trySend(VaultMoveToOrganizationAction.BackClick)
assertEquals(VaultMoveToOrganizationEvent.NavigateBack, awaitItem())
}
}
private fun createViewModel(
savedStateHandle: SavedStateHandle = initialSavedStateHandle,
): VaultMoveToOrganizationViewModel =
VaultMoveToOrganizationViewModel(
savedStateHandle = savedStateHandle,
)
private fun createSavedStateHandleWithState(
state: VaultMoveToOrganizationState? = null,
vaultItemId: String = "mockId",
) = SavedStateHandle().apply {
set("state", state)
set("vault_move_to_organization_id", vaultItemId)
}
@Suppress("MaxLineLength")
private fun createVaultMoveToOrganizationState(
viewState: VaultMoveToOrganizationState.ViewState = VaultMoveToOrganizationState.ViewState.Content,
vaultItemId: String = "mockId",
): VaultMoveToOrganizationState =
VaultMoveToOrganizationState(
vaultItemId = vaultItemId,
viewState = viewState,
)
}