Navigate directly to generator when edited item's password or username fields are empty (#785)

This commit is contained in:
Joshua Queen 2024-01-25 14:25:01 -05:00 committed by Álison Fernandes
parent 465cce42f0
commit 2f2f5703a7
2 changed files with 71 additions and 4 deletions

View file

@ -346,7 +346,13 @@ private fun UsernameRow(
iconPainter = painterResource(id = R.drawable.ic_generator), iconPainter = painterResource(id = R.drawable.ic_generator),
contentDescription = stringResource(id = R.string.generate_username), contentDescription = stringResource(id = R.string.generate_username),
), ),
onClick = { shouldShowDialog = true }, onClick = {
if (loginState.username.isEmpty()) {
loginItemTypeHandlers.onOpenUsernameGeneratorClick()
} else {
shouldShowDialog = true
}
},
) )
}, },
modifier = Modifier.padding(horizontal = 16.dp), modifier = Modifier.padding(horizontal = 16.dp),
@ -375,6 +381,7 @@ private fun UsernameRow(
} }
} }
@Suppress("LongMethod")
@Composable @Composable
private fun PasswordRow( private fun PasswordRow(
loginState: VaultAddEditState.ViewState.Content.ItemType.Login, loginState: VaultAddEditState.ViewState.Content.ItemType.Login,
@ -403,7 +410,13 @@ private fun PasswordRow(
iconPainter = painterResource(id = R.drawable.ic_generator), iconPainter = painterResource(id = R.drawable.ic_generator),
contentDescription = stringResource(id = R.string.generate_password), contentDescription = stringResource(id = R.string.generate_password),
), ),
onClick = { shouldShowDialog = true }, onClick = {
if (loginState.password.isEmpty()) {
loginItemTypeHandlers.onOpenPasswordGeneratorClick()
} else {
shouldShowDialog = true
}
},
) )
if (shouldShowDialog) { if (shouldShowDialog) {

View file

@ -408,7 +408,11 @@ class VaultAddEditScreenTest : BaseComposeTest() {
@Suppress("MaxLineLength") @Suppress("MaxLineLength")
@Test @Test
fun `in ItemType_Login state clicking Username generator action should open dialog that triggers OpenUsernameGeneratorClick`() { fun `in ItemType_Login state clicking Username text field generator action with non empty username should open dialog that triggers OpenUsernameGeneratorClick`() {
mutableStateFlow.update { currentState ->
updateLoginType(currentState) { copy(username = "username") }
}
composeTestRule.assertNoDialogExists() composeTestRule.assertNoDialogExists()
composeTestRule composeTestRule
@ -429,6 +433,28 @@ class VaultAddEditScreenTest : BaseComposeTest() {
} }
} }
@Suppress("MaxLineLength")
@Test
fun `in ItemType_Login state clicking Username generator icon with empty username field should trigger OpenPasswordGeneratorClick`() {
mutableStateFlow.update { currentState ->
updateLoginType(currentState) { copy(username = "") }
}
composeTestRule.assertNoDialogExists()
composeTestRule
.onNodeWithContentDescriptionAfterScroll(label = "Generate username")
.performClick()
composeTestRule.assertNoDialogExists()
verify {
viewModel.trySendAction(
VaultAddEditAction.ItemType.LoginType.OpenUsernameGeneratorClick,
)
}
}
@Suppress("MaxLineLength") @Suppress("MaxLineLength")
@Test @Test
fun `in ItemType_Login state clicking Password checker action should trigger PasswordCheckerClick`() { fun `in ItemType_Login state clicking Password checker action should trigger PasswordCheckerClick`() {
@ -449,7 +475,11 @@ class VaultAddEditScreenTest : BaseComposeTest() {
@Suppress("MaxLineLength") @Suppress("MaxLineLength")
@Test @Test
fun `in ItemType_Login state click Password text field generator action should open dialog that triggers OpenPasswordGeneratorClick`() { fun `in ItemType_Login state clicking Password text field generator action with non empty password field should open dialog that triggers OpenPasswordGeneratorClick`() {
mutableStateFlow.update { currentState ->
updateLoginType(currentState) { copy(password = "password") }
}
composeTestRule.assertNoDialogExists() composeTestRule.assertNoDialogExists()
composeTestRule composeTestRule
@ -472,6 +502,30 @@ class VaultAddEditScreenTest : BaseComposeTest() {
} }
} }
@Suppress("MaxLineLength")
@Test
fun `in ItemType_Login state clicking Password generator icon with empty password field should trigger OpenPasswordGeneratorClick`() {
mutableStateFlow.update { currentState ->
updateLoginType(currentState) { copy(password = "") }
}
composeTestRule.assertNoDialogExists()
composeTestRule
.onNodeWithTextAfterScroll(text = "Password")
.onSiblings()
.onLast()
.performClick()
composeTestRule.assertNoDialogExists()
verify {
viewModel.trySendAction(
VaultAddEditAction.ItemType.LoginType.OpenPasswordGeneratorClick,
)
}
}
@Test @Test
fun `in ItemType_Login state changing Password text field should trigger PasswordTextChange`() { fun `in ItemType_Login state changing Password text field should trigger PasswordTextChange`() {
composeTestRule composeTestRule