From 8a773141a4a9bfc91d768646d8267b3db66c6490 Mon Sep 17 00:00:00 2001 From: David Perez Date: Thu, 13 Mar 2025 14:20:14 -0500 Subject: [PATCH] Simplify RootNavScreenTest (#4860) --- .../feature/rootnav/RootNavScreenTest.kt | 123 ++++++++---------- 1 file changed, 55 insertions(+), 68 deletions(-) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreenTest.kt index c0a4ac9983..b3700256b3 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreenTest.kt @@ -11,6 +11,7 @@ import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.test.runTest import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue +import org.junit.Before import org.junit.Test import java.time.Clock import java.time.Instant @@ -18,6 +19,11 @@ import java.time.ZoneOffset class RootNavScreenTest : BaseComposeTest() { private val fakeNavHostController = FakeNavHostController() + private val rootNavStateFlow = MutableStateFlow(RootNavState.Splash) + private val viewModel = mockk { + every { eventFlow } returns emptyFlow() + every { stateFlow } returns rootNavStateFlow + } private val expectedNavOptions = navOptions { // When changing root navigation state, pop everything else off the back stack: @@ -29,31 +35,10 @@ class RootNavScreenTest : BaseComposeTest() { restoreState = false } - @Test - fun `initial route should be splash`() { - val viewModel = mockk(relaxed = true) { - every { eventFlow } returns emptyFlow() - every { stateFlow } returns MutableStateFlow(RootNavState.Splash) - } - setContent { - RootNavScreen( - viewModel = viewModel, - navController = fakeNavHostController, - ) - } - composeTestRule.runOnIdle { - fakeNavHostController.assertCurrentRoute("splash") - } - } + private var isSplashScreenRemoved: Boolean = false - @Test - fun `when root nav destination changes, navigation should follow`() = runTest { - val rootNavStateFlow = MutableStateFlow(RootNavState.Splash) - val viewModel = mockk(relaxed = true) { - every { eventFlow } returns emptyFlow() - every { stateFlow } returns rootNavStateFlow - } - var isSplashScreenRemoved = false + @Before + fun setup() { setContent { RootNavScreen( viewModel = viewModel, @@ -61,6 +46,17 @@ class RootNavScreenTest : BaseComposeTest() { onSplashScreenRemoved = { isSplashScreenRemoved = true }, ) } + } + + @Test + fun `initial route should be splash`() { + composeTestRule.runOnIdle { + fakeNavHostController.assertCurrentRoute("splash") + } + } + + @Test + fun `when root nav destination changes, navigation should follow`() = runTest { composeTestRule.runOnIdle { fakeNavHostController.assertCurrentRoute("splash") } @@ -170,10 +166,9 @@ class RootNavScreenTest : BaseComposeTest() { } // Make sure navigating to vault unlocked for autofill save works as expected: - rootNavStateFlow.value = - RootNavState.VaultUnlockedForAutofillSave( - autofillSaveItem = mockk(), - ) + rootNavStateFlow.value = RootNavState.VaultUnlockedForAutofillSave( + autofillSaveItem = mockk(), + ) composeTestRule.runOnIdle { fakeNavHostController.assertLastNavigation( route = "vault_add_edit_item/add", @@ -182,11 +177,10 @@ class RootNavScreenTest : BaseComposeTest() { } // Make sure navigating to vault unlocked for autofill works as expected: - rootNavStateFlow.value = - RootNavState.VaultUnlockedForAutofillSelection( - activeUserId = "userId", - type = AutofillSelectionData.Type.LOGIN, - ) + rootNavStateFlow.value = RootNavState.VaultUnlockedForAutofillSelection( + activeUserId = "userId", + type = AutofillSelectionData.Type.LOGIN, + ) composeTestRule.runOnIdle { fakeNavHostController.assertLastNavigation( route = "vault_item_listing_as_root/login", @@ -195,11 +189,10 @@ class RootNavScreenTest : BaseComposeTest() { } // Make sure navigating to vault unlocked for Fido2Save works as expected: - rootNavStateFlow.value = - RootNavState.VaultUnlockedForFido2Save( - activeUserId = "activeUserId", - fido2CreateCredentialRequest = mockk(), - ) + rootNavStateFlow.value = RootNavState.VaultUnlockedForFido2Save( + activeUserId = "activeUserId", + fido2CreateCredentialRequest = mockk(), + ) composeTestRule.runOnIdle { fakeNavHostController.assertLastNavigation( route = "vault_item_listing_as_root/login", @@ -208,36 +201,31 @@ class RootNavScreenTest : BaseComposeTest() { } // Make sure navigating to vault unlocked for Fido2Assertion works as expected: - rootNavStateFlow.value = - RootNavState.VaultUnlockedForFido2Assertion( - activeUserId = "activeUserId", - fido2CredentialAssertionRequest = mockk(), + rootNavStateFlow.value = RootNavState.VaultUnlockedForFido2Assertion( + activeUserId = "activeUserId", + fido2CredentialAssertionRequest = mockk(), + ) + composeTestRule.runOnIdle { + fakeNavHostController.assertLastNavigation( + route = "vault_item_listing_as_root/login", + navOptions = expectedNavOptions, ) - composeTestRule - .runOnIdle { - fakeNavHostController.assertLastNavigation( - route = "vault_item_listing_as_root/login", - navOptions = expectedNavOptions, - ) - } + } // Make sure navigating to vault unlocked for Fido2GetCredentials works as expected: - rootNavStateFlow.value = - RootNavState.VaultUnlockedForFido2GetCredentials( - activeUserId = "activeUserId", - fido2GetCredentialsRequest = mockk(), + rootNavStateFlow.value = RootNavState.VaultUnlockedForFido2GetCredentials( + activeUserId = "activeUserId", + fido2GetCredentialsRequest = mockk(), + ) + composeTestRule.runOnIdle { + fakeNavHostController.assertLastNavigation( + route = "vault_item_listing_as_root/login", + navOptions = expectedNavOptions, ) - composeTestRule - .runOnIdle { - fakeNavHostController.assertLastNavigation( - route = "vault_item_listing_as_root/login", - navOptions = expectedNavOptions, - ) - } + } // Make sure navigating to account lock setup works as expected: - rootNavStateFlow.value = - RootNavState.OnboardingAccountLockSetup + rootNavStateFlow.value = RootNavState.OnboardingAccountLockSetup composeTestRule.runOnIdle { fakeNavHostController.assertLastNavigation( route = "setup_unlock_as_root/true", @@ -246,8 +234,7 @@ class RootNavScreenTest : BaseComposeTest() { } // Make sure navigating to account autofill setup works as expected: - rootNavStateFlow.value = - RootNavState.OnboardingAutoFillSetup + rootNavStateFlow.value = RootNavState.OnboardingAutoFillSetup composeTestRule.runOnIdle { fakeNavHostController.assertLastNavigation( route = "setup_auto_fill_as_root/true", @@ -256,8 +243,7 @@ class RootNavScreenTest : BaseComposeTest() { } // Make sure navigating to account setup complete works as expected: - rootNavStateFlow.value = - RootNavState.OnboardingStepsComplete + rootNavStateFlow.value = RootNavState.OnboardingStepsComplete composeTestRule.runOnIdle { fakeNavHostController.assertLastNavigation( route = "setup_complete", @@ -266,8 +252,9 @@ class RootNavScreenTest : BaseComposeTest() { } // Make sure navigating to new device two factor works as expected: - rootNavStateFlow.value = - RootNavState.NewDeviceTwoFactorNotice(email = "example@bitwarden.com") + rootNavStateFlow.value = RootNavState.NewDeviceTwoFactorNotice( + email = "example@bitwarden.com", + ) composeTestRule.runOnIdle { fakeNavHostController.assertLastNavigation( route = "new_device_notice/example@bitwarden.com",