[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
78 changed files with 228 additions and 258 deletions

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,