[PM-21703] Consolidate Robolectric and Compose test base classes (#5210)

This commit is contained in:
Patrick Honkonen 2025-05-16 13:48:23 -04:00 committed by GitHub
parent 28149532a0
commit f02a3a249b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
78 changed files with 228 additions and 258 deletions

View File

@ -2,13 +2,13 @@ package com.x8bit.bitwarden.data.auth.repository.util
import android.content.Intent
import android.net.Uri
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import io.mockk.every
import io.mockk.mockk
import org.junit.Assert.assertEquals
import org.junit.Test
class CaptchaUtilsTest : BaseComposeTest() {
class CaptchaUtilsTest : BitwardenComposeTest() {
@Test
fun `generateIntentForCaptcha should return valid Uri`() {

View File

@ -2,14 +2,14 @@ package com.x8bit.bitwarden.data.auth.repository.util
import android.content.Intent
import android.net.Uri
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import io.mockk.every
import io.mockk.mockk
import kotlinx.serialization.json.JsonObject
import org.junit.Assert.assertEquals
import org.junit.Test
class WebAuthUtilsTest : BaseComposeTest() {
class WebAuthUtilsTest : BitwardenComposeTest() {
@Test
fun `generateUriForWebAuth should return valid Uri`() {

View File

@ -3,7 +3,7 @@ package com.x8bit.bitwarden.data.platform.base.util
import androidx.compose.ui.graphics.Color
import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme
import com.bitwarden.ui.platform.theme.BitwardenTheme
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.base.util.isLightOverlayRequired
import com.x8bit.bitwarden.ui.platform.base.util.toSafeOverlayColor
import org.junit.Assert.assertEquals
@ -11,7 +11,7 @@ import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
class ColorExtensionsTest : BaseComposeTest() {
class ColorExtensionsTest : BitwardenComposeTest() {
@Suppress("MaxLineLength")
@Test
fun `isLightOverlayRequired for a color with luminance below the light threshold should return true`() {

View File

@ -10,7 +10,7 @@ import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import io.mockk.every
@ -22,7 +22,7 @@ import kotlinx.coroutines.flow.update
import org.junit.Before
import org.junit.Test
class SetupAutofillScreenTest : BaseComposeTest() {
class SetupAutofillScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private val mutableEventFlow = bufferedMutableSharedFlow<SetupAutoFillEvent>()

View File

@ -3,13 +3,13 @@ package com.x8bit.bitwarden.ui.auth.feature.accountsetup
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import io.mockk.mockk
import io.mockk.verify
import org.junit.Before
import org.junit.Test
class SetupCompleteScreenTest : BaseComposeTest() {
class SetupCompleteScreenTest : BitwardenComposeTest() {
private val viewModel = mockk<SetupCompleteViewModel>(relaxed = true)

View File

@ -16,7 +16,7 @@ import androidx.compose.ui.test.performScrollTo
import androidx.compose.ui.test.performTextInput
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.components.toggle.UnlockWithPinState
import com.x8bit.bitwarden.ui.platform.manager.biometrics.BiometricSupportStatus
import com.x8bit.bitwarden.ui.platform.manager.biometrics.BiometricsManager
@ -35,7 +35,7 @@ import org.junit.Test
import org.robolectric.annotation.Config
import javax.crypto.Cipher
class SetupUnlockScreenTest : BaseComposeTest() {
class SetupUnlockScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private val captureBiometricsSuccess = slot<(cipher: Cipher?) -> Unit>()
private val captureBiometricsCancel = slot<() -> Unit>()

View File

@ -5,7 +5,7 @@ import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import io.mockk.every
import io.mockk.just
@ -17,7 +17,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class CheckEmailScreenTest : BaseComposeTest() {
class CheckEmailScreenTest : BitwardenComposeTest() {
private val intentManager = mockk<IntentManager>(relaxed = true) {
every { startDefaultEmailApplication() } just runs
}

View File

@ -25,7 +25,7 @@ import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistra
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.ErrorDialogDismiss
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.PasswordHintChange
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.CompleteRegistrationAction.PasswordInputChange
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import io.mockk.every
import io.mockk.just
import io.mockk.mockk
@ -38,7 +38,7 @@ import org.junit.Before
import org.junit.Test
import org.robolectric.annotation.Config
class CompleteRegistrationScreenTest : BaseComposeTest() {
class CompleteRegistrationScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToPreventAccountLockoutCalled = false

View File

@ -2,10 +2,10 @@ package com.x8bit.bitwarden.ui.auth.feature.completeregistration
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.onNodeWithText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import org.junit.Test
class PasswordStrengthIndicatorTest : BaseComposeTest() {
class PasswordStrengthIndicatorTest : BitwardenComposeTest() {
@Suppress("MaxLineLength")
@Test

View File

@ -27,7 +27,7 @@ import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.Ema
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.PasswordHintChange
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.PasswordInputChange
import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.SubmitClick
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.util.performCustomAccessibilityAction
import io.mockk.every
@ -41,7 +41,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class CreateAccountScreenTest : BaseComposeTest() {
class CreateAccountScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToLoginCalled = false

View File

@ -14,7 +14,7 @@ import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performTextInput
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import io.mockk.every
@ -29,7 +29,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
class EnterpriseSignOnScreenTest : BaseComposeTest() {
class EnterpriseSignOnScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToSetPasswordCalled = false
private var onNavigateToTwoFactorLoginEmailAndOrgIdentifier: Pair<String, String>? = null

View File

@ -15,7 +15,7 @@ import androidx.compose.ui.test.performTextInput
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.auth.feature.environment.EnvironmentState.DialogState
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.platform.manager.keychain.KeyChainManager
import com.x8bit.bitwarden.ui.platform.manager.keychain.model.PrivateKeyAliasSelectionResult
@ -30,7 +30,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class EnvironmentScreenTest : BaseComposeTest() {
class EnvironmentScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private val mutableEventFlow = bufferedMutableSharedFlow<EnvironmentEvent>()
private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)

View File

@ -4,7 +4,7 @@ import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
@ -12,7 +12,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class ExpiredRegistrationLinkScreenTest : BaseComposeTest() {
class ExpiredRegistrationLinkScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToLoginCalled = false

View File

@ -19,7 +19,7 @@ import androidx.compose.ui.test.performTextInput
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.data.repository.model.Environment
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.components.model.AccountSummary
import com.x8bit.bitwarden.ui.util.assertLockOrLogoutDialogIsDisplayed
import com.x8bit.bitwarden.ui.util.assertLogoutConfirmationDialogIsDisplayed
@ -44,7 +44,7 @@ import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
class LandingScreenTest : BaseComposeTest() {
class LandingScreenTest : BitwardenComposeTest() {
private var capturedEmail: String? = null
private var onNavigateToCreateAccountCalled = false
private var onNavigateToLoginCalled = false

View File

@ -15,7 +15,7 @@ import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import androidx.compose.ui.test.performTextInput
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.components.model.AccountSummary
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.util.assertLockOrLogoutDialogIsDisplayed
@ -43,7 +43,7 @@ import kotlinx.coroutines.flow.update
import org.junit.Before
import org.junit.Test
class LoginScreenTest : BaseComposeTest() {
class LoginScreenTest : BitwardenComposeTest() {
private val keyboardController: SoftwareKeyboardController = mockk {
every { hide() } just runs
}

View File

@ -14,7 +14,7 @@ import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.ui.auth.feature.loginwithdevice.model.LoginWithDeviceType
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import com.x8bit.bitwarden.ui.util.isProgressBar
@ -30,7 +30,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class LoginWithDeviceScreenTest : BaseComposeTest() {
class LoginWithDeviceScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToTwoFactorLoginEmail: String? = null

View File

@ -6,7 +6,7 @@ import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
@ -17,7 +17,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class MasterPasswordGeneratorScreenTest : BaseComposeTest() {
class MasterPasswordGeneratorScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToPreventLockoutCalled = false
private var navigateBackWithPasswordCalled = false

View File

@ -5,7 +5,7 @@ import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
@ -14,7 +14,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class MasterPasswordGuidanceScreenTest : BaseComposeTest() {
class MasterPasswordGuidanceScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToGeneratorCalled = false

View File

@ -6,7 +6,7 @@ import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performTextReplacement
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import io.mockk.every
import io.mockk.mockk
@ -16,7 +16,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class MasterPasswordHintScreenTest : BaseComposeTest() {
class MasterPasswordHintScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private val mutableEventFlow = bufferedMutableSharedFlow<MasterPasswordHintEvent>()

View File

@ -3,7 +3,7 @@ package com.x8bit.bitwarden.ui.auth.feature.preventaccountlockout
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.performClick
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
@ -11,7 +11,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class PreventAccountLockoutScreenTest : BaseComposeTest() {
class PreventAccountLockoutScreenTest : BitwardenComposeTest() {
private var onBackHasBeenInvoked = false
private val mutableEventFlow = bufferedMutableSharedFlow<PreventAccountLockoutEvent>()
private val viewModel = mockk<PreventAccountLockoutViewModel>(relaxed = true) {

View File

@ -15,7 +15,7 @@ import androidx.compose.ui.test.performScrollTo
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import io.mockk.every
import io.mockk.just
@ -27,7 +27,7 @@ import kotlinx.coroutines.flow.update
import org.junit.Before
import org.junit.Test
class RemovePasswordScreenTest : BaseComposeTest() {
class RemovePasswordScreenTest : BitwardenComposeTest() {
private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)
val viewModel = mockk<RemovePasswordViewModel>(relaxed = true) {
every { eventFlow } returns bufferedMutableSharedFlow()

View File

@ -20,7 +20,7 @@ import com.x8bit.bitwarden.ui.auth.feature.resetpassword.ResetPasswordEvent
import com.x8bit.bitwarden.ui.auth.feature.resetpassword.ResetPasswordScreen
import com.x8bit.bitwarden.ui.auth.feature.resetpassword.ResetPasswordState
import com.x8bit.bitwarden.ui.auth.feature.resetpassword.ResetPasswordViewModel
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import com.x8bit.bitwarden.ui.util.performCustomAccessibilityAction
import io.mockk.every
@ -32,7 +32,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class ResetPasswordScreenTest : BaseComposeTest() {
class ResetPasswordScreenTest : BitwardenComposeTest() {
private var onNavigateToLearnToPreventLockoutCalled = false
private val mutableEventFlow = bufferedMutableSharedFlow<ResetPasswordEvent>()
private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)

View File

@ -11,7 +11,7 @@ import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performTextInput
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import io.mockk.every
import io.mockk.mockk
@ -21,7 +21,7 @@ import kotlinx.coroutines.flow.update
import org.junit.Before
import org.junit.Test
class SetPasswordScreenTest : BaseComposeTest() {
class SetPasswordScreenTest : BitwardenComposeTest() {
private val mutableEventFlow = bufferedMutableSharedFlow<SetPasswordEvent>()
private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)
val viewModel = mockk<SetPasswordViewModel>(relaxed = true) {

View File

@ -17,7 +17,7 @@ import com.bitwarden.data.repository.model.Environment
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.CloseClick
import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.EmailInputChange
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.util.performCustomAccessibilityAction
import io.mockk.every
@ -31,7 +31,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class StartRegistrationScreenTest : BaseComposeTest() {
class StartRegistrationScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToCompleteRegistrationCalled = false

View File

@ -12,7 +12,7 @@ import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import io.mockk.every
import io.mockk.mockk
@ -23,7 +23,7 @@ import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
class TrustedDeviceScreenTest : BaseComposeTest() {
class TrustedDeviceScreenTest : BitwardenComposeTest() {
private var onNavigateToAdminApprovalEmail: String? = null
private var onNavigateToLoginWithOtherDeviceEmail: String? = null

View File

@ -17,7 +17,7 @@ import androidx.compose.ui.test.performTextInput
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.network.model.TwoFactorAuthMethod
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.platform.manager.nfc.NfcManager
import io.mockk.every
@ -31,7 +31,7 @@ import kotlinx.coroutines.flow.update
import org.junit.Before
import org.junit.Test
class TwoFactorLoginScreenTest : BaseComposeTest() {
class TwoFactorLoginScreenTest : BitwardenComposeTest() {
private val intentManager = mockk<IntentManager>(relaxed = true) {
every { launchUri(any()) } just runs
}

View File

@ -26,7 +26,7 @@ import com.x8bit.bitwarden.data.util.advanceTimeByAndRunCurrent
import com.x8bit.bitwarden.ui.credentials.manager.CredentialProviderCompletionManager
import com.x8bit.bitwarden.ui.credentials.manager.model.AssertFido2CredentialResult
import com.x8bit.bitwarden.ui.credentials.manager.model.GetCredentialsResult
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.components.model.AccountSummary
import com.x8bit.bitwarden.ui.platform.manager.biometrics.BiometricsManager
import com.x8bit.bitwarden.ui.util.assertLockOrLogoutDialogIsDisplayed
@ -56,7 +56,7 @@ import org.junit.Before
import org.junit.Test
import javax.crypto.Cipher
class VaultUnlockScreenTest : BaseComposeTest() {
class VaultUnlockScreenTest : BitwardenComposeTest() {
private val mutableEventFlow = bufferedMutableSharedFlow<VaultUnlockEvent>()
private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)

View File

@ -4,7 +4,7 @@ import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
@ -15,7 +15,7 @@ import org.junit.Test
import org.junit.jupiter.api.Assertions.assertTrue
import org.robolectric.annotation.Config
class WelcomeScreenTest : BaseComposeTest() {
class WelcomeScreenTest : BitwardenComposeTest() {
private var onNavigateToStartRegistrationCalled = false
private var onNavigateToCreateAccountCalled = false
private var onNavigateToLoginCalled = false

View File

@ -1,10 +1,7 @@
package com.x8bit.bitwarden.ui.platform.base
import androidx.activity.OnBackPressedDispatcher
import androidx.activity.compose.LocalOnBackPressedDispatcherOwner
import androidx.compose.runtime.Composable
import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.junit4.createComposeRule
import com.bitwarden.ui.platform.base.BaseComposeTest
import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme
import com.bitwarden.ui.platform.theme.BitwardenTheme
import com.x8bit.bitwarden.data.platform.manager.util.AppResumeStateManager
@ -19,27 +16,8 @@ import com.x8bit.bitwarden.ui.platform.manager.permissions.PermissionsManager
import com.x8bit.bitwarden.ui.platform.manager.review.AppReviewManager
import com.x8bit.bitwarden.ui.platform.model.FeatureFlagsState
import io.mockk.mockk
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import org.junit.Rule
/**
* A base class that can be used for performing Compose-layer testing using Robolectric, Compose
* Testing, and JUnit 4.
*/
abstract class BaseComposeTest : BaseRobolectricTest() {
@OptIn(ExperimentalCoroutinesApi::class)
protected val dispatcher = UnconfinedTestDispatcher()
@OptIn(ExperimentalTestApi::class)
@get:Rule
val composeTestRule = createComposeRule(effectContext = dispatcher)
/**
* instance of [OnBackPressedDispatcher] made available if testing using [setContent].
*/
var backDispatcher: OnBackPressedDispatcher? = null
private set
abstract class BitwardenComposeTest : BaseComposeTest() {
/**
* Helper for testing a basic Composable function that only requires a [Composable]. The
@ -62,8 +40,7 @@ abstract class BaseComposeTest : BaseRobolectricTest() {
permissionsManager: PermissionsManager = mockk(),
test: @Composable () -> Unit,
) {
composeTestRule.setContent {
backDispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher
setTestContent {
LocalManagerProvider(
featureFlagsState = featureFlagsState,
appResumeStateManager = appResumeStateManager,

View File

@ -6,12 +6,12 @@ import androidx.compose.ui.semantics.getOrNull
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.onNodeWithText
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.util.assertLinkAnnotationIsAppliedAndInvokeClickAction
import org.junit.Assert.assertTrue
import org.junit.Test
class StringRestExtensionsTest : BaseComposeTest() {
class StringRestExtensionsTest : BitwardenComposeTest() {
@Suppress("MaxLineLength")
@Test
fun `toAnnotatedString should add Clickable LinkAnnotation to highlighted string`() {

View File

@ -8,7 +8,7 @@ import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.data.platform.manager.model.FlagKey
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
@ -18,7 +18,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class DebugMenuScreenTest : BaseComposeTest() {
class DebugMenuScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private val mutableEventFlow = bufferedMutableSharedFlow<DebugMenuEvent>()
private val mutableStateFlow = MutableStateFlow(

View File

@ -14,7 +14,7 @@ import com.x8bit.bitwarden.ui.auth.feature.setpassword.SetPasswordRoute
import com.x8bit.bitwarden.ui.auth.feature.trusteddevice.TrustedDeviceGraphRoute
import com.x8bit.bitwarden.ui.auth.feature.vaultunlock.VaultUnlockRoute
import com.x8bit.bitwarden.ui.auth.feature.welcome.WelcomeRoute
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.feature.splash.SplashRoute
import com.x8bit.bitwarden.ui.platform.feature.vaultunlocked.VaultUnlockedGraphRoute
import com.x8bit.bitwarden.ui.tools.feature.send.addsend.AddSendRoute
@ -38,7 +38,7 @@ import java.time.Clock
import java.time.Instant
import java.time.ZoneOffset
class RootNavScreenTest : BaseComposeTest() {
class RootNavScreenTest : BitwardenComposeTest() {
private val mockNavHostController = createMockNavHostController()
private val rootNavStateFlow = MutableStateFlow<RootNavState>(RootNavState.Splash)
private val viewModel = mockk<RootNavViewModel> {

View File

@ -21,7 +21,7 @@ import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.bitwarden.vault.CipherType
import com.x8bit.bitwarden.data.platform.manager.util.AppResumeStateManager
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.feature.search.model.AutofillSelectionOption
import com.x8bit.bitwarden.ui.platform.feature.search.util.createMockDisplayItemForCipher
import com.x8bit.bitwarden.ui.platform.feature.search.util.createMockDisplayItemForSend
@ -49,7 +49,7 @@ import org.junit.Before
import org.junit.Test
@Suppress("LargeClass")
class SearchScreenTest : BaseComposeTest() {
class SearchScreenTest : BitwardenComposeTest() {
private val mutableEventFlow = bufferedMutableSharedFlow<SearchEvent>()
private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)
private val viewModel = mockk<SearchViewModel>(relaxed = true) {

View File

@ -5,7 +5,7 @@ import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import io.mockk.every
import io.mockk.just
import io.mockk.mockk
@ -17,7 +17,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class SettingsScreenTest : BaseComposeTest() {
class SettingsScreenTest : BitwardenComposeTest() {
private var haveCalledNavigateToAbout = false
private var haveCalledNavigateToAccountSecurity = false
private var haveCalledNavigateToAppearance = false

View File

@ -15,7 +15,7 @@ import androidx.compose.ui.test.performScrollTo
import androidx.core.net.toUri
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import io.mockk.every
import io.mockk.just
@ -33,7 +33,7 @@ import java.time.Instant
import java.time.Year
import java.time.ZoneOffset
class AboutScreenTest : BaseComposeTest() {
class AboutScreenTest : BitwardenComposeTest() {
private var haveCalledNavigateBack = false
private var haveCalledNavigateToFlightRecorder = false
private var haveCalledNavigateToRecordedLogs = false

View File

@ -23,7 +23,7 @@ import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeout
import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeoutAction
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.components.toggle.UnlockWithPinState
import com.x8bit.bitwarden.ui.platform.manager.biometrics.BiometricSupportStatus
import com.x8bit.bitwarden.ui.platform.manager.biometrics.BiometricsManager
@ -44,7 +44,7 @@ import org.junit.Test
import javax.crypto.Cipher
@Suppress("LargeClass")
class AccountSecurityScreenTest : BaseComposeTest() {
class AccountSecurityScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToDeleteAccountCalled = false

View File

@ -13,7 +13,7 @@ import androidx.compose.ui.test.performScrollTo
import androidx.compose.ui.test.performTextInput
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
@ -23,7 +23,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class DeleteAccountScreenTest : BaseComposeTest() {
class DeleteAccountScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToDeleteAccountConfirmationScreenCalled = false

View File

@ -10,7 +10,7 @@ import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performTextInput
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
@ -20,7 +20,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class DeleteAccountConfirmationScreenTest : BaseComposeTest() {
class DeleteAccountConfirmationScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private val mutableEventFlow = bufferedMutableSharedFlow<DeleteAccountConfirmationEvent>()

View File

@ -10,8 +10,8 @@ import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.exit.ExitManager
import io.mockk.every
import io.mockk.just
@ -24,7 +24,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertTrue
class LoginApprovalScreenTest : BaseComposeTest() {
class LoginApprovalScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false

View File

@ -15,7 +15,7 @@ import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.data.platform.util.isBuildVersionBelow
import com.x8bit.bitwarden.data.platform.util.isFdroid
import com.x8bit.bitwarden.data.util.advanceTimeByAndRunCurrent
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.permissions.FakePermissionManager
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import io.mockk.every
@ -32,7 +32,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertTrue
class PendingRequestsScreenTest : BaseComposeTest() {
class PendingRequestsScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToLoginApprovalCalled = false

View File

@ -12,7 +12,7 @@ import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.feature.settings.appearance.model.AppLanguage
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import io.mockk.every
@ -24,7 +24,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class AppearanceScreenTest : BaseComposeTest() {
class AppearanceScreenTest : BitwardenComposeTest() {
private var haveCalledNavigateBack = false
private val mutableEventFlow = bufferedMutableSharedFlow<AppearanceEvent>()

View File

@ -17,7 +17,7 @@ import androidx.compose.ui.test.performScrollTo
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.data.autofill.model.chrome.ChromeReleaseChannel
import com.x8bit.bitwarden.data.platform.repository.model.UriMatchType
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.feature.settings.autofill.chrome.model.ChromeAutofillSettingsOption
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
@ -33,7 +33,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class AutoFillScreenTest : BaseComposeTest() {
class AutoFillScreenTest : BitwardenComposeTest() {
private var isSystemSettingsRequestSuccess = false
private var onNavigateBackCalled = false

View File

@ -9,8 +9,8 @@ import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import io.mockk.every
import io.mockk.mockk
@ -20,7 +20,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class BlockAutoFillScreenTest : BaseComposeTest() {
class BlockAutoFillScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false

View File

@ -17,7 +17,7 @@ import androidx.compose.ui.test.performTextInput
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthState
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.feature.settings.exportvault.model.ExportVaultFormat
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
@ -30,7 +30,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertTrue
class ExportVaultScreenTest : BaseComposeTest() {
class ExportVaultScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private val mutableEventFlow = bufferedMutableSharedFlow<ExportVaultEvent>()
private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)

View File

@ -11,7 +11,7 @@ import androidx.compose.ui.test.performScrollTo
import androidx.core.net.toUri
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.data.platform.repository.model.FlightRecorderDuration
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import com.x8bit.bitwarden.ui.util.performCustomAccessibilityAction
@ -25,7 +25,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class FlightRecorderScreenTest : BaseComposeTest() {
class FlightRecorderScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private val mutableEventFlow = bufferedMutableSharedFlow<FlightRecorderEvent>()
private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)

View File

@ -18,7 +18,7 @@ import androidx.core.net.toUri
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.feature.settings.flightrecorder.recordedLogs.RecordedLogsAction
import com.x8bit.bitwarden.ui.platform.feature.settings.flightrecorder.recordedLogs.RecordedLogsEvent
import com.x8bit.bitwarden.ui.platform.feature.settings.flightrecorder.recordedLogs.RecordedLogsScreen
@ -39,7 +39,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class RecordedLogsScreenTest : BaseComposeTest() {
class RecordedLogsScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private val mutableEventFlow = bufferedMutableSharedFlow<RecordedLogsEvent>()
private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)

View File

@ -7,8 +7,8 @@ import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.feature.settings.folders.model.FolderDisplayItem
import io.mockk.every
import io.mockk.mockk
@ -20,7 +20,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class FoldersScreenTest : BaseComposeTest() {
class FoldersScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToEditFolderScreenId: String? = null

View File

@ -13,7 +13,7 @@ import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.feature.settings.folders.model.FolderAddEditType
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import io.mockk.every
@ -25,7 +25,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertTrue
class FolderAddEditScreenTest : BaseComposeTest() {
class FolderAddEditScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false

View File

@ -13,7 +13,7 @@ import androidx.compose.ui.test.performScrollTo
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.data.platform.repository.model.ClearClipboardFrequency
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import io.mockk.every
import io.mockk.mockk
@ -24,7 +24,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class OtherScreenTest : BaseComposeTest() {
class OtherScreenTest : BitwardenComposeTest() {
private var haveCalledNavigateBack = false
private val mutableEventFlow = bufferedMutableSharedFlow<OtherEvent>()

View File

@ -11,8 +11,8 @@ import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import androidx.core.net.toUri
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.components.snackbar.BitwardenSnackbarData
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.platform.manager.snackbar.SnackbarRelay
@ -29,7 +29,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class VaultSettingsScreenTest : BaseComposeTest() {
class VaultSettingsScreenTest : BitwardenComposeTest() {
private var onNavigateToImportLoginsCalled = false
private var onNavigateBackCalled = false

View File

@ -6,7 +6,7 @@ import androidx.navigation.navOptions
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.platform.base.createMockNavHostController
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.feature.settings.SettingsGraphRoute
import com.x8bit.bitwarden.ui.tools.feature.generator.GeneratorGraphRoute
import com.x8bit.bitwarden.ui.tools.feature.send.SendGraphRoute
@ -19,7 +19,7 @@ import kotlinx.coroutines.flow.update
import org.junit.Before
import org.junit.Test
class VaultUnlockedNavBarScreenTest : BaseComposeTest() {
class VaultUnlockedNavBarScreenTest : BitwardenComposeTest() {
private val mockNavHostController = createMockNavHostController()
private val mutableEventFlow = bufferedMutableSharedFlow<VaultUnlockedNavBarEvent>()
private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)

View File

@ -31,9 +31,9 @@ import androidx.compose.ui.test.swipeRight
import androidx.compose.ui.text.AnnotatedString
import androidx.core.net.toUri
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.data.platform.manager.util.AppResumeStateManager
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.data.platform.manager.util.AppResumeStateManager
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.tools.feature.generator.model.GeneratorMode
import com.x8bit.bitwarden.ui.util.isCoachMarkToolTip
@ -48,7 +48,7 @@ import org.junit.Test
import org.junit.jupiter.api.Assertions.assertTrue
@Suppress("LargeClass")
class GeneratorScreenTest : BaseComposeTest() {
class GeneratorScreenTest : BitwardenComposeTest() {
private var onNavigateToPasswordHistoryScreenCalled = false
private var onDimNavBarRequest: Boolean? = null

View File

@ -10,8 +10,8 @@ import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.tools.feature.generator.model.GeneratorPasswordHistoryMode
import io.mockk.every
import io.mockk.mockk
@ -22,7 +22,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertTrue
class PasswordHistoryScreenTest : BaseComposeTest() {
class PasswordHistoryScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private val mutableEventFlow = bufferedMutableSharedFlow<PasswordHistoryEvent>()

View File

@ -25,7 +25,7 @@ import androidx.core.net.toUri
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.data.platform.manager.util.AppResumeStateManager
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.tools.feature.send.model.SendItemType
import com.x8bit.bitwarden.ui.tools.feature.send.viewsend.ViewSendRoute
@ -45,7 +45,7 @@ import org.junit.Before
import org.junit.Test
@Suppress("LargeClass")
class SendScreenTest : BaseComposeTest() {
class SendScreenTest : BitwardenComposeTest() {
private var onNavigateToNewSendCalled = false
private var onNavigateToSendFilesListCalled = false

View File

@ -25,7 +25,7 @@ import androidx.compose.ui.test.performSemanticsAction
import androidx.compose.ui.test.performTextInput
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.exit.ExitManager
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.platform.manager.permissions.FakePermissionManager
@ -47,7 +47,7 @@ import org.junit.Test
import java.time.ZonedDateTime
@Suppress("LargeClass")
class AddSendScreenTest : BaseComposeTest() {
class AddSendScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateUpToRootCalled = false

View File

@ -13,7 +13,7 @@ import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.tools.feature.send.model.SendItemType
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
@ -33,7 +33,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class ViewSendScreenTest : BaseComposeTest() {
class ViewSendScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled: Boolean = false
private var onNavigateToEditData: String? = null
private val mutableEventFlow = bufferedMutableSharedFlow<ViewSendEvent>()

View File

@ -46,7 +46,7 @@ import com.x8bit.bitwarden.data.util.advanceTimeByAndRunCurrent
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView
import com.x8bit.bitwarden.ui.credentials.manager.CredentialProviderCompletionManager
import com.x8bit.bitwarden.ui.credentials.manager.model.RegisterFido2CredentialResult
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.biometrics.BiometricsManager
import com.x8bit.bitwarden.ui.platform.manager.exit.ExitManager
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
@ -84,7 +84,7 @@ import org.junit.Before
import org.junit.Test
@Suppress("LargeClass")
class VaultAddEditScreenTest : BaseComposeTest() {
class VaultAddEditScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateQrCodeScanScreenCalled = false

View File

@ -14,7 +14,7 @@ import androidx.compose.ui.test.performClick
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import com.x8bit.bitwarden.ui.util.isProgressBar
@ -31,7 +31,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class AttachmentsScreenTest : BaseComposeTest() {
class AttachmentsScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)

View File

@ -20,7 +20,7 @@ import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.util.advanceTimeByAndRunCurrent
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.platform.manager.snackbar.SnackbarRelay
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
@ -35,7 +35,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class ImportLoginsScreenTest : BaseComposeTest() {
class ImportLoginsScreenTest : BitwardenComposeTest() {
private var navigateBackCalled = false
private val mutableImportLoginsStateFlow = MutableStateFlow(DEFAULT_STATE)

View File

@ -31,7 +31,7 @@ import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.components.model.IconData
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
@ -62,7 +62,7 @@ import org.junit.Test
import java.time.Instant
@Suppress("LargeClass")
class VaultItemScreenTest : BaseComposeTest() {
class VaultItemScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToVaultEditItemArgs: VaultAddEditArgs? = null

View File

@ -30,7 +30,7 @@ import com.x8bit.bitwarden.ui.credentials.manager.CredentialProviderCompletionMa
import com.x8bit.bitwarden.ui.credentials.manager.model.AssertFido2CredentialResult
import com.x8bit.bitwarden.ui.credentials.manager.model.GetCredentialsResult
import com.x8bit.bitwarden.ui.credentials.manager.model.RegisterFido2CredentialResult
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.components.model.AccountSummary
import com.x8bit.bitwarden.ui.platform.components.model.IconData
import com.x8bit.bitwarden.ui.platform.feature.search.model.SearchType
@ -81,7 +81,7 @@ import org.junit.Before
import org.junit.Test
@Suppress("LargeClass")
class VaultItemListingScreenTest : BaseComposeTest() {
class VaultItemListingScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToVaultAddItemScreenCalled = false

View File

@ -16,9 +16,9 @@ import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performTextInput
import androidx.test.core.app.ApplicationProvider
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.platform.manager.permissions.FakePermissionManager
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
@ -34,7 +34,7 @@ import kotlinx.coroutines.flow.update
import org.junit.Before
import org.junit.Test
class ManualCodeEntryScreenTests : BaseComposeTest() {
class ManualCodeEntryScreenTests : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToScanQrCodeCalled = false

View File

@ -15,7 +15,7 @@ import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.util.onNodeWithContentDescriptionAfterScroll
import com.x8bit.bitwarden.ui.vault.feature.movetoorganization.util.createMockOrganizationList
import com.x8bit.bitwarden.ui.vault.model.VaultCollection
@ -28,7 +28,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class VaultMoveToOrganizationScreenTest : BaseComposeTest() {
class VaultMoveToOrganizationScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false

View File

@ -3,7 +3,7 @@ package com.x8bit.bitwarden.ui.vault.feature.qrcodescan
import androidx.camera.core.ImageProxy
import androidx.compose.ui.test.onNodeWithText
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.util.performCustomAccessibilityAction
import com.x8bit.bitwarden.ui.vault.feature.qrcodescan.util.FakeQrCodeAnalyzer
import io.mockk.every
@ -15,7 +15,7 @@ import org.junit.Before
import org.junit.Test
import org.robolectric.annotation.Config
class QrCodeScanScreenTest : BaseComposeTest() {
class QrCodeScanScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToManualCodeEntryScreenCalled = false

View File

@ -25,7 +25,7 @@ import com.bitwarden.data.repository.util.baseIconUrl
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.util.advanceTimeByAndRunCurrent
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.platform.components.model.AccountSummary
import com.x8bit.bitwarden.ui.platform.components.snackbar.BitwardenSnackbarData
import com.x8bit.bitwarden.ui.platform.manager.exit.ExitManager
@ -73,7 +73,7 @@ import org.junit.Before
import org.junit.Test
@Suppress("LargeClass")
class VaultScreenTest : BaseComposeTest() {
class VaultScreenTest : BitwardenComposeTest() {
private var onNavigateToAboutCalled = false
private var onNavigateToImportLoginsCalled = false
private var onNavigateToVaultAddItemScreenCalled = false

View File

@ -18,7 +18,7 @@ import com.bitwarden.data.repository.model.Environment
import com.bitwarden.data.repository.util.baseIconUrl
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.data.platform.manager.util.AppResumeStateManager
import com.x8bit.bitwarden.ui.platform.base.BaseComposeTest
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
import com.x8bit.bitwarden.ui.util.assertNoDialogExists
import com.x8bit.bitwarden.ui.vault.feature.item.VaultItemArgs
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType
@ -33,7 +33,7 @@ import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
class VerificationCodeScreenTest : BaseComposeTest() {
class VerificationCodeScreenTest : BitwardenComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToSearchCalled = false

View File

@ -11,7 +11,7 @@ import androidx.compose.ui.test.performTouchInput
import com.bitwarden.authenticator.ui.authenticator.feature.itemlisting.model.SharedCodesDisplayState
import com.bitwarden.authenticator.ui.authenticator.feature.itemlisting.model.VaultDropdownMenuAction
import com.bitwarden.authenticator.ui.authenticator.feature.itemlisting.model.VerificationCodeDisplayItem
import com.bitwarden.authenticator.ui.platform.base.BaseComposeTest
import com.bitwarden.authenticator.ui.platform.base.AuthenticatorComposeTest
import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager
import com.bitwarden.authenticator.ui.platform.manager.permissions.FakePermissionManager
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
@ -27,7 +27,7 @@ import kotlinx.coroutines.flow.update
import org.junit.Before
import org.junit.Test
class ItemListingScreenTest : BaseComposeTest() {
class ItemListingScreenTest : AuthenticatorComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToSearchCalled = false
@ -49,7 +49,7 @@ class ItemListingScreenTest : BaseComposeTest() {
@Before
fun setup() {
composeTestRule.setContent {
setContent {
ItemListingScreen(
viewModel = viewModel,
intentManager = intentManager,

View File

@ -3,7 +3,7 @@ package com.bitwarden.authenticator.ui.authenticator.feature.manualcodeentry
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import com.bitwarden.authenticator.ui.platform.base.BaseComposeTest
import com.bitwarden.authenticator.ui.platform.base.AuthenticatorComposeTest
import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager
import com.bitwarden.authenticator.ui.platform.manager.permissions.FakePermissionManager
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
@ -17,7 +17,7 @@ import kotlinx.coroutines.flow.update
import org.junit.Before
import org.junit.Test
class ManualCodeEntryScreenTest : BaseComposeTest() {
class ManualCodeEntryScreenTest : AuthenticatorComposeTest() {
private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)
private val mutableEventFlow = bufferedMutableSharedFlow<ManualCodeEntryEvent>()
@ -33,7 +33,7 @@ class ManualCodeEntryScreenTest : BaseComposeTest() {
@Before
fun setup() {
composeTestRule.setContent {
setContent {
ManualCodeEntryScreen(
onNavigateBack = {},
onNavigateToQrCodeScreen = {},

View File

@ -6,7 +6,7 @@ import androidx.compose.ui.test.hasAnyAncestor
import androidx.compose.ui.test.isDialog
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import com.bitwarden.authenticator.ui.platform.base.BaseComposeTest
import com.bitwarden.authenticator.ui.platform.base.AuthenticatorComposeTest
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import io.mockk.every
import io.mockk.just
@ -19,7 +19,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertTrue
class QrCodeScanScreenTest : BaseComposeTest() {
class QrCodeScanScreenTest : AuthenticatorComposeTest() {
private var onNavigateBackCalled = false
private var onNavigateToManualCodeEntryScreenCalled = false
@ -36,7 +36,7 @@ class QrCodeScanScreenTest : BaseComposeTest() {
@Before
fun setup() {
composeTestRule.setContent {
setContent {
QrCodeScanScreen(
viewModel = viewModel,
qrCodeAnalyzer = qrCodeAnalyzer,

View File

@ -4,7 +4,7 @@ import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.bitwarden.authenticator.ui.platform.base.BaseComposeTest
import com.bitwarden.authenticator.ui.platform.base.AuthenticatorComposeTest
import com.bitwarden.authenticator.ui.platform.feature.tutorial.TutorialAction
import com.bitwarden.authenticator.ui.platform.feature.tutorial.TutorialEvent
import com.bitwarden.authenticator.ui.platform.feature.tutorial.TutorialScreen
@ -20,7 +20,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertTrue
class TutorialScreenTest : BaseComposeTest() {
class TutorialScreenTest : AuthenticatorComposeTest() {
private var onTutorialFinishedCalled = false
private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)
private val mutableEventFlow = bufferedMutableSharedFlow<TutorialEvent>()
@ -31,7 +31,7 @@ class TutorialScreenTest : BaseComposeTest() {
@Before
fun setUp() {
composeTestRule.setContent {
setContent {
TutorialScreen(
viewModel = viewModel,
onTutorialFinished = { onTutorialFinishedCalled = true },

View File

@ -0,0 +1,29 @@
package com.bitwarden.authenticator.ui.platform.base
import androidx.compose.runtime.Composable
import com.bitwarden.authenticator.ui.platform.composition.LocalManagerProvider
import com.bitwarden.authenticator.ui.platform.theme.AuthenticatorTheme
import com.bitwarden.ui.platform.base.BaseComposeTest
import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme
/**
* A base class that can be used for performing Compose-layer testing using Robolectric, Compose
* Testing, and JUnit 4.
*/
abstract class AuthenticatorComposeTest : BaseComposeTest() {
/**
* Helper for testing a basic Composable function that only requires a Composable environment
* with the [AuthenticatorTheme].
*/
protected fun setContent(
theme: AppTheme = AppTheme.DEFAULT,
test: @Composable () -> Unit,
) {
setTestContent {
AuthenticatorTheme(theme = theme) {
LocalManagerProvider { test() }
}
}
}
}

View File

@ -1,59 +0,0 @@
package com.bitwarden.authenticator.ui.platform.base
import androidx.activity.OnBackPressedDispatcher
import androidx.activity.compose.BackHandler
import androidx.activity.compose.LocalOnBackPressedDispatcherOwner
import androidx.compose.runtime.Composable
import androidx.compose.ui.test.junit4.createComposeRule
import com.bitwarden.authenticator.ui.platform.theme.AuthenticatorTheme
import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme
import org.junit.Rule
/**
* A base class that can be used for performing Compose-layer testing using Robolectric, Compose
* Testing, and JUnit 4.
*/
abstract class BaseComposeTest : BaseRobolectricTest() {
@get:Rule
val composeTestRule = createComposeRule()
/**
* instance of [OnBackPressedDispatcher] made available if testing using
*
* [setContentWithBackDispatcher] or [runTestWithTheme]
*/
var backDispatcher: OnBackPressedDispatcher? = null
private set
/**
* Helper for testing a basic Composable function that only requires a Composable environment
* with the [BitwardenTheme].
*/
protected fun runTestWithTheme(
theme: AppTheme,
test: @Composable () -> Unit,
) {
composeTestRule.setContent {
AuthenticatorTheme(
theme = theme,
) {
backDispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher
test()
}
}
}
/**
* Helper for testing a basic Composable function that provides access to a
* [OnBackPressedDispatcher].
*
* Use if the [Composable] function being tested uses a [BackHandler]
*/
protected fun setContentWithBackDispatcher(test: @Composable () -> Unit) {
composeTestRule.setContent {
backDispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher
test()
}
}
}

View File

@ -1,21 +0,0 @@
package com.bitwarden.authenticator.ui.platform.base
import dagger.hilt.android.testing.HiltTestApplication
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.robolectric.shadows.ShadowLog
/**
* A base class that can be used for performing tests that use Robolectric and JUnit 4.
*/
@Config(
application = HiltTestApplication::class,
sdk = [Config.NEWEST_SDK],
)
@RunWith(RobolectricTestRunner::class)
abstract class BaseRobolectricTest {
init {
ShadowLog.stream = System.out
}
}

View File

@ -5,7 +5,7 @@ import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.authenticator.ui.platform.base.BaseComposeTest
import com.bitwarden.authenticator.ui.platform.base.AuthenticatorComposeTest
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import io.mockk.every
import io.mockk.mockk
@ -15,7 +15,7 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
class DebugMenuScreenTest : BaseComposeTest() {
class DebugMenuScreenTest : AuthenticatorComposeTest() {
private var onNavigateBackCalled = false
private val mutableEventFlow = bufferedMutableSharedFlow<DebugMenuEvent>()
private val mutableStateFlow = MutableStateFlow(DebugMenuState(featureFlags = emptyMap()))
@ -26,7 +26,7 @@ class DebugMenuScreenTest : BaseComposeTest() {
@Before
fun setup() {
composeTestRule.setContent {
setContent {
DebugMenuScreen(
onNavigateBack = { onNavigateBackCalled = true },
viewModel = viewModel,

View File

@ -12,7 +12,7 @@ import androidx.compose.ui.test.performScrollTo
import androidx.core.net.toUri
import com.bitwarden.authenticator.BuildConfig
import com.bitwarden.authenticator.R
import com.bitwarden.authenticator.ui.platform.base.BaseComposeTest
import com.bitwarden.authenticator.ui.platform.base.AuthenticatorComposeTest
import com.bitwarden.authenticator.ui.platform.feature.settings.appearance.model.AppLanguage
import com.bitwarden.authenticator.ui.platform.feature.settings.data.model.DefaultSaveOption
import com.bitwarden.authenticator.ui.platform.manager.biometrics.BiometricsManager
@ -34,7 +34,7 @@ import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
class SettingsScreenTest : BaseComposeTest() {
class SettingsScreenTest : AuthenticatorComposeTest() {
private var onNavigateToTutorialCalled = false
private var onNaviateToExportCalled = false
@ -56,7 +56,7 @@ class SettingsScreenTest : BaseComposeTest() {
@Before
fun setup() {
composeTestRule.setContent {
setContent {
SettingsScreen(
viewModel = viewModel,
biometricsManager = biometricsManager,

View File

@ -3,6 +3,7 @@ plugins {
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose.compiler)
alias(libs.plugins.kotlin.parcelize)
alias(libs.plugins.ksp)
}
android {
@ -60,13 +61,17 @@ dependencies {
testImplementation(libs.junit.vintage)
testImplementation(libs.mockk.mockk)
testFixturesImplementation(libs.androidx.activity.compose)
testFixturesImplementation(libs.androidx.compose.ui.test)
testFixturesImplementation(libs.androidx.navigation.compose)
testFixturesImplementation(libs.google.hilt.android.testing)
testFixturesImplementation(platform(libs.junit.bom))
testFixturesImplementation(libs.junit.junit5)
testFixturesImplementation(libs.junit.vintage)
testFixturesImplementation(libs.kotlinx.coroutines.test)
testFixturesImplementation(libs.square.turbine)
testFixturesImplementation(libs.mockk.mockk)
testFixturesImplementation(libs.robolectric.robolectric)
testFixturesImplementation(libs.square.turbine)
}
tasks {

View File

@ -0,0 +1,39 @@
package com.bitwarden.ui.platform.base
import androidx.activity.OnBackPressedDispatcher
import androidx.activity.compose.LocalOnBackPressedDispatcherOwner
import androidx.compose.runtime.Composable
import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.junit4.createComposeRule
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import org.junit.Rule
/**
* A base class that can be used for performing Compose-layer testing using Robolectric, Compose
* Testing, and JUnit 4.
*/
abstract class BaseComposeTest : BaseRobolectricTest() {
@OptIn(ExperimentalCoroutinesApi::class)
protected val dispatcher = UnconfinedTestDispatcher()
@OptIn(ExperimentalTestApi::class)
@get:Rule
val composeTestRule = createComposeRule(effectContext = dispatcher)
/**
* instance of [OnBackPressedDispatcher] made available if testing using [setTestContent].
*/
var backDispatcher: OnBackPressedDispatcher? = null
private set
/**
* Helper for testing a basic Composable function that only requires a [Composable].
*/
protected fun setTestContent(content: @Composable () -> Unit) {
composeTestRule.setContent {
backDispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher
content()
}
}
}

View File

@ -1,4 +1,4 @@
package com.x8bit.bitwarden.ui.platform.base
package com.bitwarden.ui.platform.base
import dagger.hilt.android.testing.HiltTestApplication
import org.junit.runner.RunWith