Add numberless account setting screen placeholders.

This commit is contained in:
Greyson Parrelli
2026-08-19 19:05:49 -04:00
committed by Cody Henthorne
parent e935981db3
commit 8954e55e0e
36 changed files with 1799 additions and 1 deletions
@@ -289,6 +289,25 @@ class AccountSettingsScreenTest {
.assertIsNotEnabled()
}
@Test
fun givenNoSignalLogin_whenScreenDisplayed_thenTwoFactorSectionIsAbsent() {
setContent(createState())
composeTestRule.onNodeWithTag(AccountSettingsTestTags.CARD_SIGNAL_LOGIN).assertDoesNotExist()
composeTestRule.onNodeWithTag(AccountSettingsTestTags.ROW_AUTHENTICATOR_APP).assertDoesNotExist()
}
@Test
fun givenASignalLogin_whenIClickAuthenticatorApp_thenIExpectAuthenticatorAppEvent() {
setContent(createState(signalLogin = AccountSettingsState.SignalLogin(keyCount = 2, hasAuthenticatorApp = false)))
composeTestRule.onNodeWithTag(AccountSettingsTestTags.CARD_SIGNAL_LOGIN).assertIsDisplayed()
composeTestRule.onNodeWithTag(AccountSettingsTestTags.ROW_AUTHENTICATOR_APP).performClick()
assertThat(events).contains(AccountSettingsEvent.AuthenticatorAppClicked)
}
private fun setContent(state: AccountSettingsState) {
composeTestRule.setContent {
AccountSettingsScreen(
@@ -311,6 +330,7 @@ class AccountSettingsScreenTest {
userUnregistered: Boolean = false,
clientDeprecated: Boolean = false,
canTransferWhileUnregistered: Boolean = true,
signalLogin: AccountSettingsState.SignalLogin? = null,
dialog: Dialog = Dialog.None
): AccountSettingsState {
return AccountSettingsState(
@@ -321,6 +341,7 @@ class AccountSettingsScreenTest {
userUnregistered = userUnregistered,
clientDeprecated = clientDeprecated,
canTransferWhileUnregistered = canTransferWhileUnregistered,
signalLogin = signalLogin,
dialog = dialog
)
}
@@ -0,0 +1,67 @@
/*
* Copyright 2026 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.appsettings.authenticatorcodeentry
import android.app.Application
import androidx.compose.ui.test.assertIsEnabled
import androidx.compose.ui.test.assertIsNotEnabled
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performTextInput
import assertk.assertThat
import assertk.assertions.contains
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
@RunWith(RobolectricTestRunner::class)
@Config(application = Application::class)
class AuthenticatorCodeEntryScreenTest {
@get:Rule
val composeTestRule = createComposeRule()
private val events = mutableListOf<AuthenticatorCodeEntryEvent>()
@Test
fun givenAPartialCode_whenScreenDisplayed_thenDoneIsDisabled() {
setContent(AuthenticatorCodeEntryState(code = "123"))
composeTestRule.onNodeWithTag(AuthenticatorCodeEntryTestTags.BUTTON_DONE).assertIsNotEnabled()
}
@Test
fun givenAFullCode_whenIClickDone_thenIExpectDoneEvent() {
setContent(AuthenticatorCodeEntryState(code = "123456"))
composeTestRule.onNodeWithTag(AuthenticatorCodeEntryTestTags.BUTTON_DONE)
.assertIsEnabled()
.performClick()
assertThat(events).contains(AuthenticatorCodeEntryEvent.DoneClicked)
}
@Test
fun whenITypeInTheCodeField_thenIExpectCodeChangedEvent() {
setContent(AuthenticatorCodeEntryState())
composeTestRule.onNodeWithTag(AuthenticatorCodeEntryTestTags.CODE_INPUT).performTextInput("123456")
assertThat(events).contains(AuthenticatorCodeEntryEvent.CodeChanged("123456"))
}
private fun setContent(state: AuthenticatorCodeEntryState) {
composeTestRule.setContent {
AuthenticatorCodeEntryScreen(
state = state,
onEvent = { events += it }
)
}
}
}
@@ -0,0 +1,82 @@
/*
* Copyright 2026 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.appsettings.authenticatorsetup
import android.app.Application
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.hasTestTag
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollToNode
import assertk.assertThat
import assertk.assertions.contains
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
@RunWith(RobolectricTestRunner::class)
@Config(application = Application::class)
class AuthenticatorSetupScreenTest {
companion object {
private const val SETUP_KEY = "KVZ7WL3FDDWJZMTOB7PLZPKVRFD4LYSX"
}
@get:Rule
val composeTestRule = createComposeRule()
private val events = mutableListOf<AuthenticatorSetupEvent>()
@Test
fun whenIClickOpen_thenIExpectOpenAuthenticatorAppEvent() {
setContent()
scrollTo(AuthenticatorSetupTestTags.BUTTON_OPEN)
composeTestRule.onNodeWithTag(AuthenticatorSetupTestTags.BUTTON_OPEN).performClick()
assertThat(events).contains(AuthenticatorSetupEvent.OpenAuthenticatorAppClicked)
}
@Test
fun whenIClickCopy_thenIExpectCopyKeyEvent() {
setContent()
scrollTo(AuthenticatorSetupTestTags.BUTTON_COPY)
composeTestRule.onNodeWithTag(AuthenticatorSetupTestTags.BUTTON_COPY).performClick()
assertThat(events).contains(AuthenticatorSetupEvent.CopyKeyClicked)
}
@Test
fun whenIClickContinue_thenIExpectContinueEvent() {
setContent()
composeTestRule.onNodeWithTag(AuthenticatorSetupTestTags.BUTTON_CONTINUE)
.assertIsDisplayed()
.performClick()
assertThat(events).contains(AuthenticatorSetupEvent.ContinueClicked)
}
private fun setContent() {
composeTestRule.setContent {
AuthenticatorSetupScreen(
state = AuthenticatorSetupState(setupKey = SETUP_KEY),
onEvent = { events += it }
)
}
}
private fun scrollTo(testTag: String) {
composeTestRule.onNodeWithTag(AuthenticatorSetupTestTags.SCROLLER)
.performScrollToNode(hasTestTag(testTag))
}
}