From d3d5c8934f68eb6441ab11291a6404ec631959be Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Sun, 14 Jun 2020 22:41:32 -0700 Subject: [PATCH] Cleanup tests for toolbar controller --- .../fenix/browser/BaseBrowserFragment.kt | 3 +- .../toolbar/BrowserToolbarController.kt | 61 ++-- .../DefaultBrowserToolbarControllerTest.kt | 303 +++++++++--------- 3 files changed, 168 insertions(+), 199 deletions(-) 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 56d42fda5..4dd9bf48f 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -203,7 +203,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session return getSessionById()?.also { session -> val browserToolbarController = DefaultBrowserToolbarController( - activity = requireActivity(), + activity = requireActivity() as HomeActivity, navController = findNavController(), readerModeController = DefaultReaderModeController( readerViewFeature, @@ -224,7 +224,6 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session scope = viewLifecycleOwner.lifecycleScope, tabCollectionStorage = requireComponents.core.tabCollectionStorage, topSiteStorage = requireComponents.core.topSiteStorage, - sharedViewModel = sharedViewModel, onTabCounterClicked = { TabTrayDialogFragment.show(parentFragmentManager) }, diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt index eb3d117b6..b250f53c4 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt @@ -4,7 +4,6 @@ package org.mozilla.fenix.components.toolbar -import android.app.Activity import android.content.Intent import androidx.annotation.VisibleForTesting import androidx.navigation.NavController @@ -40,7 +39,6 @@ import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.navigateSafe import org.mozilla.fenix.ext.sessionsOfType import org.mozilla.fenix.ext.settings -import org.mozilla.fenix.home.SharedViewModel import org.mozilla.fenix.settings.deletebrowsingdata.deleteAndQuit import org.mozilla.fenix.utils.Do @@ -59,9 +57,9 @@ interface BrowserToolbarController { fun handleReaderModePressed(enabled: Boolean) } -@SuppressWarnings("LargeClass", "TooManyFunctions") +@Suppress("LargeClass", "TooManyFunctions") class DefaultBrowserToolbarController( - private val activity: Activity, + private val activity: HomeActivity, private val navController: NavController, private val readerModeController: ReaderModeController, private val sessionManager: SessionManager, @@ -75,7 +73,6 @@ class DefaultBrowserToolbarController( private val scope: CoroutineScope, private val tabCollectionStorage: TabCollectionStorage, private val topSiteStorage: TopSiteStorage, - private val sharedViewModel: SharedViewModel, private val onTabCounterClicked: () -> Unit, private val onCloseTab: (Session) -> Unit ) : BrowserToolbarController { @@ -146,7 +143,7 @@ class DefaultBrowserToolbarController( // When closing the last tab we must show the undo snackbar in the home fragment if (sessionManager.sessionsOfType(it.private).count() == 1) { // The tab tray always returns to normal mode so do that here too - (activity as HomeActivity).browsingModeManager.mode = BrowsingMode.Normal + activity.browsingModeManager.mode = BrowsingMode.Normal navController.navigate(BrowserFragmentDirections.actionGlobalHome(sessionToDelete = it.id)) } else { onCloseTab.invoke(it) @@ -155,20 +152,18 @@ class DefaultBrowserToolbarController( } } is TabCounterMenuItem.NewTab -> { - (activity as HomeActivity).browsingModeManager.mode = - BrowsingMode.fromBoolean(item.isPrivate) + activity.browsingModeManager.mode = BrowsingMode.fromBoolean(item.isPrivate) navController.popBackStack(R.id.homeFragment, false) } } } override fun handleBrowserMenuDismissed(lowPrioHighlightItems: List) { + val settings = activity.settings() lowPrioHighlightItems.forEach { when (it) { - ToolbarMenu.Item.AddToHomeScreen -> activity.settings().installPwaOpened = true - ToolbarMenu.Item.OpenInApp -> activity.settings().openInAppOpened = true - else -> { - } + ToolbarMenu.Item.AddToHomeScreen -> settings.installPwaOpened = true + ToolbarMenu.Item.OpenInApp -> settings.openInAppOpened = true } } } @@ -178,7 +173,7 @@ class DefaultBrowserToolbarController( } @ExperimentalCoroutinesApi - @SuppressWarnings("ComplexMethod", "LongMethod") + @Suppress("ComplexMethod", "LongMethod") override fun handleToolbarItemInteraction(item: ToolbarMenu.Item) { val sessionUseCases = activity.components.useCases.sessionUseCases trackToolbarItemInteraction(item) @@ -203,21 +198,22 @@ class DefaultBrowserToolbarController( currentSession ) ToolbarMenu.Item.AddToTopSites -> { - ioScope.launch { - currentSession?.let { - topSiteStorage.addTopSite(it.title, it.url) - } - MainScope().launch { - FenixSnackbar.make( - view = swipeRefresh, - duration = Snackbar.LENGTH_SHORT, - isDisplayedWithBrowserToolbar = true + scope.launch { + ioScope.launch { + currentSession?.let { + topSiteStorage.addTopSite(it.title, it.url) + } + }.join() + + FenixSnackbar.make( + view = swipeRefresh, + duration = Snackbar.LENGTH_SHORT, + isDisplayedWithBrowserToolbar = true + ) + .setText( + swipeRefresh.context.getString(R.string.snackbar_added_to_top_sites) ) - .setText( - swipeRefresh.context.getString(R.string.snackbar_added_to_top_sites) - ) - .show() - } + .show() } } ToolbarMenu.Item.AddToHomeScreen, ToolbarMenu.Item.InstallToHomeScreen -> { @@ -341,15 +337,7 @@ class DefaultBrowserToolbarController( } } - private fun reportSiteIssue(reportUrl: String, private: Boolean) { - if (private) { - activity.components.useCases.tabsUseCases.addPrivateTab.invoke(reportUrl) - } else { - activity.components.useCases.tabsUseCases.addTab.invoke(reportUrl) - } - } - - @SuppressWarnings("ComplexMethod") + @Suppress("ComplexMethod") private fun trackToolbarItemInteraction(item: ToolbarMenu.Item) { val eventItem = when (item) { ToolbarMenu.Item.Back -> Event.BrowserMenuItemTapped.Item.BACK @@ -386,7 +374,6 @@ class DefaultBrowserToolbarController( } companion object { - const val ANIMATION_DELAY = 50L internal const val TELEMETRY_BROWSER_IDENTIFIER = "browserMenu" } } diff --git a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt index e3c36229a..5e79a46b0 100644 --- a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt @@ -4,27 +4,26 @@ package org.mozilla.fenix.components.toolbar -import android.content.Context import android.content.Intent -import androidx.lifecycle.LifecycleCoroutineScope import androidx.navigation.NavController import androidx.navigation.NavDirections import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import io.mockk.MockKAnnotations import io.mockk.Runs import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.impl.annotations.RelaxedMockK import io.mockk.just import io.mockk.mockk +import io.mockk.mockkObject import io.mockk.mockkStatic import io.mockk.slot +import io.mockk.unmockkStatic import io.mockk.verify import io.mockk.verifyOrder -import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.newSingleThreadContext -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runBlockingTest -import kotlinx.coroutines.test.setMain import mozilla.appservices.places.BookmarkRoot import mozilla.components.browser.session.Session import mozilla.components.browser.session.SessionManager @@ -37,9 +36,11 @@ import mozilla.components.feature.search.SearchUseCases import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.tab.collections.TabCollection import mozilla.components.feature.tabs.TabsUseCases +import mozilla.components.support.test.rule.MainCoroutineRule import org.junit.After import org.junit.Assert.assertEquals import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.HomeActivity @@ -69,26 +70,30 @@ import org.mozilla.fenix.settings.deletebrowsingdata.deleteAndQuit @RunWith(FenixRobolectricTestRunner::class) class DefaultBrowserToolbarControllerTest { - private val mainThreadSurrogate = newSingleThreadContext("UI thread") - private var swipeRefreshLayout: SwipeRefreshLayout = mockk(relaxed = true) - private var activity: HomeActivity = mockk(relaxed = true) - private var analytics: Analytics = mockk(relaxed = true) - private var navController: NavController = mockk(relaxed = true) - private var findInPageLauncher: () -> Unit = mockk(relaxed = true) - private val sessionManager: SessionManager = mockk(relaxed = true) - private val engineView: EngineView = mockk(relaxed = true) - private val currentSession: Session = mockk(relaxed = true) - private val openInFenixIntent: Intent = mockk(relaxed = true) - private val currentSessionAsTab: Tab = mockk(relaxed = true) - private val metrics: MetricController = mockk(relaxed = true) - private val searchUseCases: SearchUseCases = mockk(relaxed = true) - private val sessionUseCases: SessionUseCases = mockk(relaxed = true) - private val scope: LifecycleCoroutineScope = mockk(relaxed = true) - private val browserAnimator: BrowserAnimator = mockk(relaxed = true) - private val snackbar = mockk(relaxed = true) - private val tabCollectionStorage = mockk(relaxed = true) - private val topSiteStorage = mockk(relaxed = true) - private val readerModeController = mockk(relaxed = true) + @get:Rule + val coroutinesTestRule = MainCoroutineRule() + + @MockK private lateinit var swipeRefreshLayout: SwipeRefreshLayout + @RelaxedMockK private lateinit var activity: HomeActivity + @RelaxedMockK private lateinit var analytics: Analytics + @RelaxedMockK private lateinit var navController: NavController + @RelaxedMockK private lateinit var findInPageLauncher: () -> Unit + @RelaxedMockK private lateinit var bookmarkTapped: (Session) -> Unit + @RelaxedMockK private lateinit var onTabCounterClicked: () -> Unit + @RelaxedMockK private lateinit var onCloseTab: (Session) -> Unit + @RelaxedMockK private lateinit var sessionManager: SessionManager + @RelaxedMockK private lateinit var engineView: EngineView + @RelaxedMockK private lateinit var currentSession: Session + @RelaxedMockK private lateinit var openInFenixIntent: Intent + @RelaxedMockK private lateinit var currentSessionAsTab: Tab + @RelaxedMockK private lateinit var metrics: MetricController + @RelaxedMockK private lateinit var searchUseCases: SearchUseCases + @RelaxedMockK private lateinit var sessionUseCases: SessionUseCases + @RelaxedMockK private lateinit var browserAnimator: BrowserAnimator + @RelaxedMockK private lateinit var snackbar: FenixSnackbar + @RelaxedMockK private lateinit var tabCollectionStorage: TabCollectionStorage + @RelaxedMockK private lateinit var topSiteStorage: TopSiteStorage + @RelaxedMockK private lateinit var readerModeController: ReaderModeController private val store: BrowserStore = BrowserStore(initialState = BrowserState( listOf( createTab("https://www.mozilla.org", id = "reader-inactive-tab"), @@ -96,41 +101,22 @@ class DefaultBrowserToolbarControllerTest { )) ) - private lateinit var controller: DefaultBrowserToolbarController - @Before fun setUp() { - Dispatchers.setMain(mainThreadSurrogate) - - controller = DefaultBrowserToolbarController( - activity = activity, - navController = navController, - findInPageLauncher = findInPageLauncher, - engineView = engineView, - browserAnimator = browserAnimator, - customTabSession = null, - openInFenixIntent = openInFenixIntent, - scope = scope, - swipeRefresh = swipeRefreshLayout, - tabCollectionStorage = tabCollectionStorage, - topSiteStorage = topSiteStorage, - bookmarkTapped = mockk(), - readerModeController = readerModeController, - sessionManager = sessionManager, - sharedViewModel = mockk(), - onTabCounterClicked = { }, - onCloseTab = {} - ) + MockKAnnotations.init(this) mockkStatic( "org.mozilla.fenix.ext.SessionKt" ) - every { any().toTab(any()) } returns currentSessionAsTab + every { any().toTab(any()) } returns currentSessionAsTab mockkStatic( "org.mozilla.fenix.settings.deletebrowsingdata.DeleteAndQuitKt" ) - every { deleteAndQuit(any(), any(), snackbar) } just Runs + every { deleteAndQuit(any(), any(), any()) } just Runs + + mockkObject(FenixSnackbar.Companion) + every { FenixSnackbar.make(any(), any(), any(), any()) } returns snackbar every { activity.components.analytics } returns analytics every { analytics.metrics } returns metrics @@ -146,15 +132,16 @@ class DefaultBrowserToolbarControllerTest { @After fun tearDown() { - Dispatchers.resetMain() // reset main dispatcher to the original Main dispatcher - mainThreadSurrogate.close() + unmockkStatic("org.mozilla.fenix.ext.SessionKt") + unmockkStatic("org.mozilla.fenix.settings.deletebrowsingdata.DeleteAndQuitKt") } @Test - fun handleBrowserToolbarPaste() { + fun handleBrowserToolbarPaste() = runBlockingTest { every { currentSession.id } returns "1" val pastedText = "Mozilla" + val controller = createController(scope = this) controller.handleToolbarPaste(pastedText) verify { @@ -167,9 +154,10 @@ class DefaultBrowserToolbarControllerTest { } @Test - fun handleBrowserToolbarPasteAndGoSearch() { + fun handleBrowserToolbarPasteAndGoSearch() = runBlockingTest { val pastedText = "Mozilla" + val controller = createController(scope = this) controller.handleToolbarPasteAndGo(pastedText) verifyOrder { currentSession.searchTerms = "Mozilla" @@ -178,9 +166,10 @@ class DefaultBrowserToolbarControllerTest { } @Test - fun handleBrowserToolbarPasteAndGoUrl() { + fun handleBrowserToolbarPasteAndGoUrl() = runBlockingTest { val pastedText = "https://mozilla.org" + val controller = createController(scope = this) controller.handleToolbarPasteAndGo(pastedText) verifyOrder { currentSession.searchTerms = "" @@ -188,6 +177,14 @@ class DefaultBrowserToolbarControllerTest { } } + @Test + fun handleTabCounterClick() = runBlockingTest { + val controller = createController(scope = this) + controller.handleTabCounterClick() + + verify { onTabCounterClicked() } + } + @Test fun `handle BrowserMenu dismissed with all options available`() = runBlockingTest { val itemList: List = listOf( @@ -197,26 +194,7 @@ class DefaultBrowserToolbarControllerTest { val activity = HomeActivity() - controller = DefaultBrowserToolbarController( - activity = activity, - navController = navController, - findInPageLauncher = findInPageLauncher, - engineView = engineView, - browserAnimator = browserAnimator, - customTabSession = null, - openInFenixIntent = openInFenixIntent, - scope = this, - swipeRefresh = swipeRefreshLayout, - tabCollectionStorage = tabCollectionStorage, - topSiteStorage = topSiteStorage, - bookmarkTapped = mockk(), - readerModeController = mockk(), - sessionManager = mockk(), - sharedViewModel = mockk(), - onTabCounterClicked = { }, - onCloseTab = { } - ) - + val controller = createController(scope = this, activity = activity) controller.handleBrowserMenuDismissed(itemList) assertEquals(true, activity.settings().installPwaOpened) @@ -224,9 +202,10 @@ class DefaultBrowserToolbarControllerTest { } @Test - fun handleToolbarClick() { + fun handleToolbarClick() = runBlockingTest { every { currentSession.id } returns "1" + val controller = createController(scope = this) controller.handleToolbarClick() verify { metrics.track(Event.SearchBarTapped(Event.SearchBarTapped.Source.BROWSER)) } @@ -239,51 +218,56 @@ class DefaultBrowserToolbarControllerTest { } @Test - fun handleToolbarBackPress() { + fun handleToolbarBackPress() = runBlockingTest { val item = ToolbarMenu.Item.Back + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.BACK)) } - verify { sessionUseCases.goBack } + verify { sessionUseCases.goBack(currentSession) } } @Test - fun handleToolbarForwardPress() { + fun handleToolbarForwardPress() = runBlockingTest { val item = ToolbarMenu.Item.Forward + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.FORWARD)) } - verify { sessionUseCases.goForward } + verify { sessionUseCases.goForward(currentSession) } } @Test - fun handleToolbarReloadPress() { + fun handleToolbarReloadPress() = runBlockingTest { val item = ToolbarMenu.Item.Reload every { activity.components.useCases.sessionUseCases } returns sessionUseCases + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.RELOAD)) } - verify { sessionUseCases.reload } + verify { sessionUseCases.reload(currentSession) } } @Test - fun handleToolbarStopPress() { + fun handleToolbarStopPress() = runBlockingTest { val item = ToolbarMenu.Item.Stop + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.STOP)) } - verify { sessionUseCases.stopLoading } + verify { sessionUseCases.stopLoading(currentSession) } } @Test - fun handleToolbarSettingsPress() = runBlocking { + fun handleToolbarSettingsPress() = runBlockingTest { val item = ToolbarMenu.Item.Settings + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.SETTINGS)) } @@ -294,9 +278,21 @@ class DefaultBrowserToolbarControllerTest { } @Test - fun handleToolbarBookmarksPress() { + fun handleToolbarBookmarkPress() = runBlockingTest { + val item = ToolbarMenu.Item.Bookmark + + val controller = createController(scope = this) + controller.handleToolbarItemInteraction(item) + + verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.BOOKMARK)) } + verify { bookmarkTapped(currentSession) } + } + + @Test + fun handleToolbarBookmarksPress() = runBlockingTest { val item = ToolbarMenu.Item.Bookmarks + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.BOOKMARKS)) } @@ -307,9 +303,10 @@ class DefaultBrowserToolbarControllerTest { } @Test - fun handleToolbarHistoryPress() { + fun handleToolbarHistoryPress() = runBlockingTest { val item = ToolbarMenu.Item.History + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.HISTORY)) } @@ -320,13 +317,14 @@ class DefaultBrowserToolbarControllerTest { } @Test - fun handleToolbarRequestDesktopOnPress() { + fun handleToolbarRequestDesktopOnPress() = runBlockingTest { val requestDesktopSiteUseCase: SessionUseCases.RequestDesktopSiteUseCase = mockk(relaxed = true) val item = ToolbarMenu.Item.RequestDesktop(true) every { sessionUseCases.requestDesktopSite } returns requestDesktopSiteUseCase + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.DESKTOP_VIEW_ON)) } @@ -339,13 +337,14 @@ class DefaultBrowserToolbarControllerTest { } @Test - fun handleToolbarRequestDesktopOffPress() { + fun handleToolbarRequestDesktopOffPress() = runBlockingTest { val requestDesktopSiteUseCase: SessionUseCases.RequestDesktopSiteUseCase = mockk(relaxed = true) val item = ToolbarMenu.Item.RequestDesktop(false) every { sessionUseCases.requestDesktopSite } returns requestDesktopSiteUseCase + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.DESKTOP_VIEW_OFF)) } @@ -360,30 +359,15 @@ class DefaultBrowserToolbarControllerTest { @Test fun handleToolbarAddToTopSitesPressed() = runBlockingTest { val item = ToolbarMenu.Item.AddToTopSites + every { + swipeRefreshLayout.context.getString(R.string.snackbar_added_to_top_sites) + } returns "Added to top sites!" - controller = DefaultBrowserToolbarController( - activity = activity, - navController = navController, - findInPageLauncher = findInPageLauncher, - engineView = engineView, - browserAnimator = browserAnimator, - customTabSession = null, - openInFenixIntent = openInFenixIntent, - scope = this, - swipeRefresh = swipeRefreshLayout, - tabCollectionStorage = tabCollectionStorage, - topSiteStorage = topSiteStorage, - bookmarkTapped = mockk(), - readerModeController = mockk(), - sessionManager = sessionManager, - sharedViewModel = mockk(), - onTabCounterClicked = { }, - onCloseTab = { } - ) - controller.ioScope = this - + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) + verify { topSiteStorage.addTopSite(currentSession.title, currentSession.url) } + verify { snackbar.setText("Added to top sites!") } verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.ADD_TO_TOP_SITES)) } } @@ -391,26 +375,29 @@ class DefaultBrowserToolbarControllerTest { fun handleToolbarAddonsManagerPress() = runBlockingTest { val item = ToolbarMenu.Item.AddonsManager + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.ADDONS_MANAGER)) } } @Test - fun handleToolbarAddToHomeScreenPress() { + fun handleToolbarAddToHomeScreenPress() = runBlockingTest { val item = ToolbarMenu.Item.AddToHomeScreen + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.ADD_TO_HOMESCREEN)) } } @Test - fun handleToolbarSharePress() { + fun handleToolbarSharePress() = runBlockingTest { val item = ToolbarMenu.Item.Share every { currentSession.url } returns "https://mozilla.org" + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.SHARE)) } @@ -418,9 +405,10 @@ class DefaultBrowserToolbarControllerTest { } @Test - fun handleToolbarFindInPagePress() { + fun handleToolbarFindInPagePress() = runBlockingTest { val item = ToolbarMenu.Item.FindInPage + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { findInPageLauncher() } @@ -428,12 +416,13 @@ class DefaultBrowserToolbarControllerTest { } @Test - fun handleToolbarSaveToCollectionPressWhenAtLeastOneCollectionExists() { + fun handleToolbarSaveToCollectionPressWhenAtLeastOneCollectionExists() = runBlockingTest { val item = ToolbarMenu.Item.SaveToCollection val cachedTabCollections: List = mockk(relaxed = true) every { activity.components.useCases.sessionUseCases } returns sessionUseCases every { activity.components.core.tabCollectionStorage.cachedTabCollections } returns cachedTabCollections + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { @@ -458,12 +447,13 @@ class DefaultBrowserToolbarControllerTest { } @Test - fun handleToolbarSaveToCollectionPressWhenNoCollectionsExists() { + fun handleToolbarSaveToCollectionPressWhenNoCollectionsExists() = runBlockingTest { val item = ToolbarMenu.Item.SaveToCollection val cachedTabCollectionsEmpty: List = emptyList() every { activity.components.useCases.sessionUseCases } returns sessionUseCases every { activity.components.core.tabCollectionStorage.cachedTabCollections } returns cachedTabCollectionsEmpty + val controller = createController(scope = this) controller.handleToolbarItemInteraction(item) verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.SAVE_TO_COLLECTION)) } @@ -486,26 +476,8 @@ class DefaultBrowserToolbarControllerTest { } @Test - fun handleToolbarOpenInFenixPress() { - controller = DefaultBrowserToolbarController( - activity = activity, - navController = navController, - findInPageLauncher = findInPageLauncher, - engineView = engineView, - browserAnimator = browserAnimator, - customTabSession = currentSession, - openInFenixIntent = openInFenixIntent, - scope = scope, - swipeRefresh = swipeRefreshLayout, - tabCollectionStorage = tabCollectionStorage, - topSiteStorage = topSiteStorage, - bookmarkTapped = mockk(), - readerModeController = mockk(), - sessionManager = sessionManager, - sharedViewModel = mockk(), - onTabCounterClicked = { }, - onCloseTab = { } - ) + fun handleToolbarOpenInFenixPress() = runBlockingTest { + val controller = createController(scope = this, customTabSession = currentSession) val item = ToolbarMenu.Item.OpenInFenix @@ -526,25 +498,7 @@ class DefaultBrowserToolbarControllerTest { val item = ToolbarMenu.Item.Quit val testScope = this - controller = DefaultBrowserToolbarController( - activity = activity, - navController = navController, - findInPageLauncher = findInPageLauncher, - engineView = engineView, - browserAnimator = browserAnimator, - customTabSession = null, - openInFenixIntent = openInFenixIntent, - scope = testScope, - swipeRefresh = swipeRefreshLayout, - tabCollectionStorage = tabCollectionStorage, - topSiteStorage = topSiteStorage, - bookmarkTapped = mockk(), - readerModeController = mockk(), - sessionManager = sessionManager, - sharedViewModel = mockk(), - onTabCounterClicked = { }, - onCloseTab = { } - ) + val controller = createController(scope = testScope) controller.handleToolbarItemInteraction(item) @@ -552,7 +506,7 @@ class DefaultBrowserToolbarControllerTest { } @Test - fun handleToolbarCloseTabPressWithLastPrivateSession() { + fun handleToolbarCloseTabPressWithLastPrivateSession() = runBlockingTest { every { currentSession.id } returns "1" val browsingModeManager = object : BrowsingModeManager { override var mode = BrowsingMode.Private @@ -568,13 +522,14 @@ class DefaultBrowserToolbarControllerTest { every { sessionManager.sessions } returns sessions every { activity.browsingModeManager } returns browsingModeManager + val controller = createController(scope = this) controller.handleTabCounterItemInteraction(item) verify { navController.navigate(BrowserFragmentDirections.actionGlobalHome(sessionToDelete = "1")) } assertEquals(BrowsingMode.Normal, browsingModeManager.mode) } @Test - fun handleToolbarCloseTabPress() { + fun handleToolbarCloseTabPress() = runBlockingTest { val tabsUseCases: TabsUseCases = mockk(relaxed = true) val removeTabUseCase: TabsUseCases.RemoveTabUseCase = mockk(relaxed = true) val item = TabCounterMenuItem.CloseTab @@ -583,31 +538,59 @@ class DefaultBrowserToolbarControllerTest { every { activity.components.useCases.tabsUseCases } returns tabsUseCases every { tabsUseCases.removeTab } returns removeTabUseCase + val controller = createController(scope = this) controller.handleTabCounterItemInteraction(item) verify { removeTabUseCase.invoke(currentSession) } } @Test - fun handleToolbarNewTabPress() { + fun handleToolbarNewTabPress() = runBlockingTest { val browsingModeManager: BrowsingModeManager = DefaultBrowsingModeManager(BrowsingMode.Private) {} val item = TabCounterMenuItem.NewTab(false) every { activity.browsingModeManager } returns browsingModeManager + val controller = createController(scope = this) controller.handleTabCounterItemInteraction(item) assertEquals(BrowsingMode.Normal, activity.browsingModeManager.mode) verify { navController.popBackStack(R.id.homeFragment, false) } } @Test - fun handleToolbarNewPrivateTabPress() { + fun handleToolbarNewPrivateTabPress() = runBlockingTest { val browsingModeManager: BrowsingModeManager = DefaultBrowsingModeManager(BrowsingMode.Normal) {} val item = TabCounterMenuItem.NewTab(true) every { activity.browsingModeManager } returns browsingModeManager + val controller = createController(scope = this) controller.handleTabCounterItemInteraction(item) assertEquals(BrowsingMode.Private, activity.browsingModeManager.mode) verify { navController.popBackStack(R.id.homeFragment, false) } } + + private fun createController( + scope: CoroutineScope, + activity: HomeActivity = this.activity, + customTabSession: Session? = null + ) = DefaultBrowserToolbarController( + activity = activity, + navController = navController, + findInPageLauncher = findInPageLauncher, + engineView = engineView, + browserAnimator = browserAnimator, + customTabSession = customTabSession, + openInFenixIntent = openInFenixIntent, + scope = scope, + swipeRefresh = swipeRefreshLayout, + tabCollectionStorage = tabCollectionStorage, + topSiteStorage = topSiteStorage, + bookmarkTapped = bookmarkTapped, + readerModeController = readerModeController, + sessionManager = sessionManager, + onTabCounterClicked = onTabCounterClicked, + onCloseTab = onCloseTab + ).apply { + ioScope = scope + } }