1
0
Fork 0

Cleanup tests for toolbar controller

master
Tiger Oakes 2020-06-14 22:41:32 -07:00 committed by Emily Kager
parent 9e3e95e351
commit d3d5c8934f
3 changed files with 168 additions and 199 deletions

View File

@ -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)
},

View File

@ -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<ToolbarMenu.Item>) {
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"
}
}

View File

@ -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<FenixSnackbar>(relaxed = true)
private val tabCollectionStorage = mockk<TabCollectionStorage>(relaxed = true)
private val topSiteStorage = mockk<TopSiteStorage>(relaxed = true)
private val readerModeController = mockk<ReaderModeController>(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<Session>().toTab(any<Context>()) } returns currentSessionAsTab
every { any<Session>().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<ToolbarMenu.Item> = 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<TabCollection> = 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<TabCollection> = 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
}
}