From de1fa74ac13cfb2b381e824e1c858244d3b0a264 Mon Sep 17 00:00:00 2001 From: mcarare Date: Fri, 20 Nov 2020 16:40:12 +0200 Subject: [PATCH] For #16353: Add unit tests for onboarding finishing conditions. --- .../fenix/browser/BaseBrowserFragment.kt | 4 +- .../fenix/browser/BrowserFragmentTest.kt | 79 +++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index 56a6b2a02c..9727a86840 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -176,7 +176,9 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, protected var webAppToolbarShouldBeVisible = true private val sharedViewModel: SharedViewModel by activityViewModels() - private val onboarding by lazy { FenixOnboarding(requireContext()) } + + @VisibleForTesting + internal val onboarding by lazy { FenixOnboarding(requireContext()) } @CallSuper override fun onCreateView( diff --git a/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt b/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt index 29ddf88da0..8c7ea51932 100644 --- a/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt +++ b/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt @@ -21,6 +21,7 @@ import mozilla.components.browser.state.action.RestoreCompleteAction import mozilla.components.browser.state.action.TabListAction import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.state.LoadRequestState +import mozilla.components.browser.state.state.SessionState import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.state.state.createTab import mozilla.components.browser.state.store.BrowserStore @@ -38,6 +39,7 @@ import org.mozilla.fenix.components.toolbar.BrowserToolbarView import org.mozilla.fenix.ext.application import org.mozilla.fenix.ext.components import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import org.mozilla.fenix.onboarding.FenixOnboarding @ExperimentalCoroutinesApi @RunWith(FenixRobolectricTestRunner::class) @@ -52,6 +54,7 @@ class BrowserFragmentTest { private lateinit var context: Context private lateinit var lifecycleOwner: MockedLifecycleOwner private lateinit var navController: NavController + private lateinit var onboarding: FenixOnboarding private val testDispatcher = TestCoroutineDispatcher() @@ -68,6 +71,7 @@ class BrowserFragmentTest { view = mockk(relaxed = true) lifecycleOwner = MockedLifecycleOwner(Lifecycle.State.STARTED) navController = mockk(relaxed = true) + onboarding = mockk(relaxed = true) browserFragment = spyk(BrowserFragment()) every { browserFragment.view } returns view @@ -75,6 +79,8 @@ class BrowserFragmentTest { every { browserFragment.browserToolbarView } returns mockk(relaxed = true) every { browserFragment.activity } returns homeActivity every { browserFragment.lifecycle } returns lifecycleOwner.lifecycle + every { browserFragment.onboarding } returns onboarding + every { browserFragment.requireContext() } returns context every { browserFragment.initializeUI(any()) } returns mockk() every { browserFragment.fullScreenChanged(any()) } returns Unit @@ -205,6 +211,79 @@ class BrowserFragmentTest { verify(exactly = 1) { navController.popBackStack(R.id.homeFragment, false) } } + @Test + fun `GIVEN the onboarding is finished WHEN visiting any link THEN the onboarding is not dismissed `() { + every { onboarding.userHasBeenOnboarded() } returns true + + browserFragment.observeTabSource(store) + + val newSelectedTab = createTab("any-tab.org") + addAndSelectTab(newSelectedTab) + + verify(exactly = 0) { onboarding.finish() } + } + + @Test + fun `GIVEN the onboarding is not finished WHEN visiting a link THEN the onboarding is dismissed `() { + every { onboarding.userHasBeenOnboarded() } returns false + + browserFragment.observeTabSource(store) + + val newSelectedTab = createTab("any-tab.org") + addAndSelectTab(newSelectedTab) + + verify(exactly = 1) { onboarding.finish() } + } + + @Test + fun `GIVEN the onboarding is not finished WHEN visiting an onboarding link THEN the onboarding is not dismissed `() { + every { onboarding.userHasBeenOnboarded() } returns false + + browserFragment.observeTabSource(store) + + val newSelectedTab = createTab(BaseBrowserFragment.onboardingLinksList[0]) + addAndSelectTab(newSelectedTab) + + verify(exactly = 0) { onboarding.finish() } + } + + @Test + fun `GIVEN the onboarding is not finished WHEN opening a page from another app THEN the onboarding is not dismissed `() { + every { onboarding.userHasBeenOnboarded() } returns false + + browserFragment.observeTabSource(store) + + val newSelectedTab1: TabSessionState = mockk(relaxed = true) + val newSelectedTab2: TabSessionState = mockk(relaxed = true) + val newSelectedTab3: TabSessionState = mockk(relaxed = true) + + every { newSelectedTab1.source } returns SessionState.Source.ACTION_SEARCH + every { newSelectedTab2.source } returns SessionState.Source.ACTION_SEND + every { newSelectedTab3.source } returns SessionState.Source.ACTION_VIEW + + addAndSelectTab(newSelectedTab1) + verify(exactly = 0) { onboarding.finish() } + + addAndSelectTab(newSelectedTab2) + verify(exactly = 0) { onboarding.finish() } + + addAndSelectTab(newSelectedTab3) + verify(exactly = 0) { onboarding.finish() } + } + + @Test + fun `GIVEN the onboarding is not finished WHEN visiting an link after redirect THEN the onboarding is not dismissed `() { + every { onboarding.userHasBeenOnboarded() } returns false + + val newSelectedTab: TabSessionState = mockk(relaxed = true) + every { newSelectedTab.content.loadRequest?.triggeredByRedirect } returns true + + browserFragment.observeTabSource(store) + addAndSelectTab(newSelectedTab) + + verify(exactly = 0) { onboarding.finish() } + } + private fun addAndSelectTab(tab: TabSessionState) { store.dispatch(TabListAction.AddTabAction(tab)).joinBlocking() store.dispatch(TabListAction.SelectTabAction(tab.id)).joinBlocking()