BIT-1337 Adding new section for verification codes (#567)

This commit is contained in:
Oleg Semenenko
2024-01-11 15:49:51 -06:00
committed by GitHub
parent f1ea1bfa02
commit d4ec4c2e0e
8 changed files with 264 additions and 10 deletions

View File

@@ -1,6 +1,7 @@
package com.x8bit.bitwarden.ui.vault.feature.vault
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsNotDisplayed
import androidx.compose.ui.test.assertTextEquals
import androidx.compose.ui.test.filterToOne
import androidx.compose.ui.test.hasAnyAncestor
@@ -622,6 +623,61 @@ class VaultScreenTest : BaseComposeTest() {
verify { intentHandler.exitApplication() }
}
@Test
fun `totp section should be visible based on state`() {
mutableStateFlow.update { state ->
state.copy(
viewState = DEFAULT_CONTENT_VIEW_STATE.copy(
totpItemsCount = 2,
),
)
}
composeTestRule
.onNodeWithText("TOTP")
.assertTextEquals("TOTP", "1")
.assertIsDisplayed()
composeTestRule
.onNodeWithText("Verification codes")
.assertTextEquals("Verification codes", "2")
.assertIsDisplayed()
mutableStateFlow.update { state ->
state.copy(
viewState = DEFAULT_CONTENT_VIEW_STATE.copy(
totpItemsCount = 0,
),
)
}
composeTestRule
.onNodeWithText("TOTP")
.assertIsNotDisplayed()
composeTestRule
.onNodeWithText("Verification codes")
.assertIsNotDisplayed()
}
@Test
fun `clicking totp section should emit VerificationCodesClick action`() {
mutableStateFlow.update { state ->
state.copy(
isPremium = true,
viewState = DEFAULT_CONTENT_VIEW_STATE.copy(
totpItemsCount = 2,
),
)
}
composeTestRule
.onNodeWithText("Verification codes")
.performClick()
verify { viewModel.trySendAction(VaultAction.VerificationCodesClick) }
}
@Test
fun `clicking a favorite item should send VaultItemClick with the correct item`() {
val itemText = "Test Item"
@@ -1003,14 +1059,15 @@ private val VAULT_FILTER_DATA = VaultFilterData(
)
private val DEFAULT_STATE: VaultState = VaultState(
appBarTitle = R.string.my_vault.asText(),
avatarColorString = "#aa00aa",
initials = "AU",
accountSummaries = persistentListOf(
ACTIVE_ACCOUNT_SUMMARY,
LOCKED_ACCOUNT_SUMMARY,
),
appBarTitle = R.string.my_vault.asText(),
viewState = VaultState.ViewState.Loading,
isPremium = false,
)
private val DEFAULT_CONTENT_VIEW_STATE: VaultState.ViewState.Content = VaultState.ViewState.Content(
@@ -1023,4 +1080,5 @@ private val DEFAULT_CONTENT_VIEW_STATE: VaultState.ViewState.Content = VaultStat
noFolderItems = emptyList(),
collectionItems = emptyList(),
trashItemsCount = 0,
totpItemsCount = 0,
)

View File

@@ -345,7 +345,10 @@ class VaultViewModelTest : BaseViewModelTest() {
)
val viewModel = createViewModel()
val initialState = createMockVaultState(
viewState = vaultData.toViewState(VaultFilterType.AllVaults),
viewState = vaultData.toViewState(
isPremium = true,
vaultFilterType = VaultFilterType.AllVaults,
),
)
.copy(
appBarTitle = R.string.vaults.asText(),
@@ -363,7 +366,10 @@ class VaultViewModelTest : BaseViewModelTest() {
vaultFilterData = VAULT_FILTER_DATA.copy(
selectedVaultFilterType = VaultFilterType.MyVault,
),
viewState = vaultData.toViewState(VaultFilterType.MyVault),
viewState = vaultData.toViewState(
isPremium = true,
vaultFilterType = VaultFilterType.MyVault,
),
),
viewModel.stateFlow.value,
)
@@ -408,6 +414,7 @@ class VaultViewModelTest : BaseViewModelTest() {
),
noFolderItems = listOf(),
trashItemsCount = 0,
totpItemsCount = 1,
),
),
viewModel.stateFlow.value,
@@ -429,6 +436,7 @@ class VaultViewModelTest : BaseViewModelTest() {
collectionItems = listOf(),
noFolderItems = listOf(),
trashItemsCount = 0,
totpItemsCount = 1,
),
)
val viewModel = createViewModel()
@@ -540,6 +548,7 @@ class VaultViewModelTest : BaseViewModelTest() {
),
noFolderItems = listOf(),
trashItemsCount = 0,
totpItemsCount = 1,
),
),
viewModel.stateFlow.value,
@@ -637,6 +646,7 @@ class VaultViewModelTest : BaseViewModelTest() {
),
noFolderItems = listOf(),
trashItemsCount = 0,
totpItemsCount = 1,
),
dialog = VaultState.DialogState.Error(
title = R.string.an_error_has_occurred.asText(),
@@ -734,6 +744,7 @@ class VaultViewModelTest : BaseViewModelTest() {
),
noFolderItems = listOf(),
trashItemsCount = 0,
totpItemsCount = 1,
),
dialog = VaultState.DialogState.Error(
title = R.string.internet_connection_required_title.asText(),
@@ -806,6 +817,15 @@ class VaultViewModelTest : BaseViewModelTest() {
)
}
@Test
fun `VerificationCodesClick should emit NavigateToVerificationCodeScreen`() = runTest {
val viewModel = createViewModel()
viewModel.eventFlow.test {
viewModel.trySendAction(VaultAction.VerificationCodesClick)
assertEquals(VaultEvent.NavigateToVerificationCodeScreen, awaitItem())
}
}
@Test
fun `AddItemClick should emit NavigateToAddItemScreen`() = runTest {
val viewModel = createViewModel()
@@ -1057,4 +1077,5 @@ private fun createMockVaultState(
viewState = viewState,
dialog = dialog,
isSwitchingAccounts = false,
isPremium = true,
)

View File

@@ -23,7 +23,10 @@ class VaultDataExtensionsTest {
sendViewList = listOf(createMockSendView(number = 1)),
)
val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.AllVaults)
val actual = vaultData.toViewState(
isPremium = true,
vaultFilterType = VaultFilterType.AllVaults,
)
assertEquals(
VaultState.ViewState.Content(
@@ -48,6 +51,7 @@ class VaultDataExtensionsTest {
),
noFolderItems = listOf(),
trashItemsCount = 0,
totpItemsCount = 1,
),
actual,
)
@@ -66,7 +70,10 @@ class VaultDataExtensionsTest {
sendViewList = listOf(createMockSendView(number = 1)),
)
val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.MyVault)
val actual = vaultData.toViewState(
isPremium = true,
vaultFilterType = VaultFilterType.MyVault,
)
assertEquals(
VaultState.ViewState.Content(
@@ -85,6 +92,7 @@ class VaultDataExtensionsTest {
collectionItems = listOf(),
noFolderItems = listOf(),
trashItemsCount = 0,
totpItemsCount = 1,
),
actual,
)
@@ -107,6 +115,7 @@ class VaultDataExtensionsTest {
)
val actual = vaultData.toViewState(
isPremium = true,
vaultFilterType = VaultFilterType.OrganizationVault(
organizationId = "mockOrganizationId-1",
organizationName = "Mock Organization 1",
@@ -130,6 +139,7 @@ class VaultDataExtensionsTest {
),
noFolderItems = listOf(),
trashItemsCount = 0,
totpItemsCount = 1,
),
actual,
)
@@ -144,7 +154,10 @@ class VaultDataExtensionsTest {
sendViewList = emptyList(),
)
val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.AllVaults)
val actual = vaultData.toViewState(
isPremium = true,
vaultFilterType = VaultFilterType.AllVaults,
)
assertEquals(
VaultState.ViewState.NoItems,
@@ -161,11 +174,78 @@ class VaultDataExtensionsTest {
sendViewList = listOf(createMockSendView(number = 1)),
)
val actual = vaultData.toViewState(vaultFilterType = VaultFilterType.AllVaults)
val actual = vaultData.toViewState(
isPremium = true,
vaultFilterType = VaultFilterType.AllVaults,
)
assertEquals(
VaultState.ViewState.NoItems,
actual,
)
}
@Suppress("MaxLineLength")
@Test
fun `toViewState should return 1 for totpItemsCount if user has premium and has one totp item`() {
val vaultData = VaultData(
cipherViewList = listOf(createMockCipherView(number = 1)),
collectionViewList = listOf(),
folderViewList = listOf(),
sendViewList = listOf(),
)
val actual = vaultData.toViewState(
isPremium = true,
vaultFilterType = VaultFilterType.AllVaults,
)
assertEquals(
VaultState.ViewState.Content(
loginItemsCount = 1,
cardItemsCount = 0,
identityItemsCount = 0,
secureNoteItemsCount = 0,
favoriteItems = listOf(),
folderItems = listOf(),
collectionItems = listOf(),
noFolderItems = listOf(),
trashItemsCount = 0,
totpItemsCount = 1,
),
actual,
)
}
@Suppress("MaxLineLength")
@Test
fun `toViewState should return 0 for totpItemsCount if user does not have premium and has any totp items`() {
val vaultData = VaultData(
cipherViewList = listOf(createMockCipherView(number = 1)),
collectionViewList = listOf(),
folderViewList = listOf(),
sendViewList = listOf(),
)
val actual = vaultData.toViewState(
isPremium = false,
vaultFilterType = VaultFilterType.AllVaults,
)
assertEquals(
VaultState.ViewState.Content(
loginItemsCount = 1,
cardItemsCount = 0,
identityItemsCount = 0,
secureNoteItemsCount = 0,
favoriteItems = listOf(),
folderItems = listOf(),
collectionItems = listOf(),
noFolderItems = listOf(),
trashItemsCount = 0,
totpItemsCount = 0,
),
actual,
)
}
}