@ -45,6 +45,7 @@ import org.junit.Before
import org.junit.Rule
import org.junit.Rule
import org.junit.Test
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runner.RunWith
import org.mozilla.fenix.FeatureFlags
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.NavGraphDirections
import org.mozilla.fenix.NavGraphDirections
import org.mozilla.fenix.R
import org.mozilla.fenix.R
@ -64,6 +65,7 @@ import org.mozilla.fenix.utils.Settings
@OptIn ( ExperimentalCoroutinesApi :: class )
@OptIn ( ExperimentalCoroutinesApi :: class )
@RunWith ( FenixRobolectricTestRunner :: class )
@RunWith ( FenixRobolectricTestRunner :: class )
@Suppress ( " ForbiddenComment " )
class DefaultBrowserToolbarMenuControllerTest {
class DefaultBrowserToolbarMenuControllerTest {
@get : Rule
@get : Rule
@ -124,8 +126,121 @@ class DefaultBrowserToolbarMenuControllerTest {
unmockkObject ( FenixSnackbar . Companion )
unmockkObject ( FenixSnackbar . Companion )
}
}
// TODO: These can be removed for https://github.com/mozilla-mobile/fenix/issues/17870
// todo === Start ===
@Test
@Test
fun handleToolbarBackPress ( ) = runBlockingTest {
fun handleToolbarBookmarkPressWithReaderModeInactive ( ) = runBlockingTest {
if ( ! FeatureFlags . toolbarMenuFeature ) {
val item = ToolbarMenu . Item . Bookmark
val title = " Mozilla "
val readerUrl = " moz-extension://1234 "
val readerTab = createTab (
url = readerUrl ,
readerState = ReaderState ( active = false , activeUrl = " https://1234.org " ) ,
title = title
)
browserStore =
BrowserStore ( BrowserState ( tabs = listOf ( readerTab ) , selectedTabId = readerTab . id ) )
every { currentSession . id } returns readerTab . id
every { currentSession . title } returns title
every { currentSession . url } returns " https://mozilla.org "
val controller = createController ( scope = this )
controller . handleToolbarItemInteraction ( item )
verify { metrics . track ( Event . BrowserMenuItemTapped ( Event . BrowserMenuItemTapped . Item . BOOKMARK ) ) }
verify { bookmarkTapped ( " https://mozilla.org " , title ) }
}
}
@Test
fun `IF reader mode is active WHEN bookmark menu item is pressed THEN menu item is handled` ( ) = runBlockingTest {
if ( ! FeatureFlags . toolbarMenuFeature ) {
val item = ToolbarMenu . Item . Bookmark
val title = " Mozilla "
val readerUrl = " moz-extension://1234 "
val readerTab = createTab (
url = readerUrl ,
readerState = ReaderState ( active = true , activeUrl = " https://mozilla.org " ) ,
title = title
)
browserStore =
BrowserStore ( BrowserState ( tabs = listOf ( readerTab ) , selectedTabId = readerTab . id ) )
every { currentSession . id } returns readerTab . id
every { currentSession . title } returns title
every { currentSession . url } returns readerUrl
val controller = createController ( scope = this )
controller . handleToolbarItemInteraction ( item )
verify { metrics . track ( Event . BrowserMenuItemTapped ( Event . BrowserMenuItemTapped . Item . BOOKMARK ) ) }
verify { bookmarkTapped ( " https://mozilla.org " , title ) }
}
}
@Test
fun `WHEN open in Fenix menu item is pressed THEN menu item is handled correctly` ( ) = runBlockingTest {
if ( ! FeatureFlags . toolbarMenuFeature ) {
val controller = createController ( scope = this , customTabSession = currentSession )
val item = ToolbarMenu . Item . OpenInFenix
every { currentSession . customTabConfig } returns mockk ( )
every { activity . startActivity ( any ( ) ) } just Runs
controller . handleToolbarItemInteraction ( item )
verify { sessionFeature . release ( ) }
verify { currentSession . customTabConfig = null }
verify { sessionManager . select ( currentSession ) }
verify { activity . startActivity ( openInFenixIntent ) }
verify { activity . finishAndRemoveTask ( ) }
}
}
@Test
fun `WHEN quit menu item is pressed THEN menu item is handled correctly` ( ) = runBlockingTest {
if ( ! FeatureFlags . toolbarMenuFeature ) {
val item = ToolbarMenu . Item . Quit
val testScope = this
val controller = createController ( scope = testScope )
controller . handleToolbarItemInteraction ( item )
verify { deleteAndQuit ( activity , testScope , null ) }
}
}
@Test
fun handleToolbarOpenInAppPress ( ) = runBlockingTest {
if ( ! FeatureFlags . toolbarMenuFeature ) {
val item = ToolbarMenu . Item . OpenInApp
val controller = createController ( scope = this )
controller . handleToolbarItemInteraction ( item )
verify { settings . openInAppOpened = true }
}
}
@Test
fun `WHEN reader mode menu item is pressed THEN handle appearance change` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . ReaderModeAppearance
val controller = createController ( scope = this )
controller . handleToolbarItemInteraction ( item )
verify { readerModeController . showControls ( ) }
verify { metrics . track ( Event . ReaderModeAppearanceOpened ) }
}
// todo === End ===
@Test
fun `WHEN backwards nav menu item is pressed THEN the session navigates back with active session` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . Back ( false )
val item = ToolbarMenu . Item . Back ( false )
val controller = createController ( scope = this )
val controller = createController ( scope = this )
@ -136,7 +251,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarBackLongPress ( ) = runBlockingTest {
fun `WHEN backwards nav menu item is long pressed THEN the session navigates back with no active session` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . Back ( true )
val item = ToolbarMenu . Item . Back ( true )
val controller = createController ( scope = this )
val controller = createController ( scope = this )
@ -149,7 +264,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarForwardPress ( ) = runBlockingTest {
fun `WHEN forward nav menu item is pressed THEN the session navigates forward to active session` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . Forward ( false )
val item = ToolbarMenu . Item . Forward ( false )
val controller = createController ( scope = this )
val controller = createController ( scope = this )
@ -160,7 +275,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarForwardLongPress ( ) = runBlockingTest {
fun `WHEN forward nav menu item is long pressed THEN the browser navigates forward with no active session` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . Forward ( true )
val item = ToolbarMenu . Item . Forward ( true )
val controller = createController ( scope = this )
val controller = createController ( scope = this )
@ -173,7 +288,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarReloadPress ( ) = runBlockingTest {
fun `WHEN reload nav menu item is pressed THEN the session reloads from cache` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . Reload ( false )
val item = ToolbarMenu . Item . Reload ( false )
val controller = createController ( scope = this )
val controller = createController ( scope = this )
@ -184,7 +299,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarReloadLongPress ( ) = runBlockingTest {
fun `WHEN reload nav menu item is long pressed THEN the session reloads with no cache` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . Reload ( true )
val item = ToolbarMenu . Item . Reload ( true )
val controller = createController ( scope = this )
val controller = createController ( scope = this )
@ -200,7 +315,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarStopPress ( ) = runBlockingTest {
fun `WHEN stop nav menu item is pressed THEN the session stops loading` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . Stop
val item = ToolbarMenu . Item . Stop
val controller = createController ( scope = this )
val controller = createController ( scope = this )
@ -211,7 +326,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarSettingsPress ( ) = runBlockingTest {
fun `WHEN settings menu item is pressed THEN menu item is handled` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . Settings
val item = ToolbarMenu . Item . Settings
val controller = createController ( scope = this )
val controller = createController ( scope = this )
@ -224,52 +339,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarBookmarkPressWithReaderModeInactive ( ) = runBlockingTest {
fun `WHEN bookmark menu item is pressed THEN navigate to bookmarks page` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . Bookmark
val title = " Mozilla "
val readerUrl = " moz-extension://1234 "
val readerTab = createTab (
url = readerUrl ,
readerState = ReaderState ( active = false , activeUrl = " https://1234.org " ) ,
title = title
)
browserStore =
BrowserStore ( BrowserState ( tabs = listOf ( readerTab ) , selectedTabId = readerTab . id ) )
every { currentSession . id } returns readerTab . id
every { currentSession . title } returns title
every { currentSession . url } returns " https://mozilla.org "
val controller = createController ( scope = this )
controller . handleToolbarItemInteraction ( item )
verify { metrics . track ( Event . BrowserMenuItemTapped ( Event . BrowserMenuItemTapped . Item . BOOKMARK ) ) }
verify { bookmarkTapped ( " https://mozilla.org " , title ) }
}
@Test
fun handleToolbarBookmarkPressWithReaderModeActive ( ) = runBlockingTest {
val item = ToolbarMenu . Item . Bookmark
val title = " Mozilla "
val readerUrl = " moz-extension://1234 "
val readerTab = createTab (
url = readerUrl ,
readerState = ReaderState ( active = true , activeUrl = " https://mozilla.org " ) ,
title = title
)
browserStore = BrowserStore ( BrowserState ( tabs = listOf ( readerTab ) , selectedTabId = readerTab . id ) )
every { currentSession . id } returns readerTab . id
every { currentSession . title } returns title
every { currentSession . url } returns readerUrl
val controller = createController ( scope = this )
controller . handleToolbarItemInteraction ( item )
verify { metrics . track ( Event . BrowserMenuItemTapped ( Event . BrowserMenuItemTapped . Item . BOOKMARK ) ) }
verify { bookmarkTapped ( " https://mozilla.org " , title ) }
}
@Test
fun handleToolbarBookmarksPress ( ) = runBlockingTest {
val item = ToolbarMenu . Item . Bookmarks
val item = ToolbarMenu . Item . Bookmarks
val controller = createController ( scope = this )
val controller = createController ( scope = this )
@ -282,7 +352,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarHistoryPress ( ) = runBlockingTest {
fun `WHEN history menu item is pressed THEN navigate to history page` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . History
val item = ToolbarMenu . Item . History
val controller = createController ( scope = this )
val controller = createController ( scope = this )
@ -295,7 +365,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarRequestDesktopOnPress ( ) = runBlockingTest {
fun `WHEN request desktop menu item is toggled On THEN desktop site is requested for the session` ( ) = runBlockingTest {
val requestDesktopSiteUseCase : SessionUseCases . RequestDesktopSiteUseCase =
val requestDesktopSiteUseCase : SessionUseCases . RequestDesktopSiteUseCase =
mockk ( relaxed = true )
mockk ( relaxed = true )
val item = ToolbarMenu . Item . RequestDesktop ( true )
val item = ToolbarMenu . Item . RequestDesktop ( true )
@ -315,7 +385,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarRequestDesktopOffPress ( ) = runBlockingTest {
fun `WHEN request desktop menu item is toggled Off THEN mobile site is requested for the session` ( ) = runBlockingTest {
val requestDesktopSiteUseCase : SessionUseCases . RequestDesktopSiteUseCase =
val requestDesktopSiteUseCase : SessionUseCases . RequestDesktopSiteUseCase =
mockk ( relaxed = true )
mockk ( relaxed = true )
val item = ToolbarMenu . Item . RequestDesktop ( false )
val item = ToolbarMenu . Item . RequestDesktop ( false )
@ -335,7 +405,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarAddToTopSitesPressed ( ) = runBlockingTest {
fun `WHEN Add To Top Sites menu item is pressed THEN add site AND show snackbar` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . AddToTopSites
val item = ToolbarMenu . Item . AddToTopSites
val addPinnedSiteUseCase : TopSitesUseCases . AddPinnedSiteUseCase = mockk ( relaxed = true )
val addPinnedSiteUseCase : TopSitesUseCases . AddPinnedSiteUseCase = mockk ( relaxed = true )
@ -353,7 +423,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarAddonsManagerPress ( ) = runBlockingTest {
fun `WHEN addon extensions menu item is pressed THEN navigate to addons manager` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . AddonsManager
val item = ToolbarMenu . Item . AddonsManager
val controller = createController ( scope = this )
val controller = createController ( scope = this )
@ -363,7 +433,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarAddToHomeScreenPress ( ) = runBlockingTest {
fun `WHEN Add To Home Screen menu item is pressed THEN add site` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . AddToHomeScreen
val item = ToolbarMenu . Item . AddToHomeScreen
val controller = createController ( scope = this )
val controller = createController ( scope = this )
@ -373,7 +443,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarSharePressWithReaderModeInactive ( ) = runBlockingTest {
fun `IF reader mode is inactive WHEN share menu item is pressed THEN navigate to share screen` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . Share
val item = ToolbarMenu . Item . Share
val title = " Mozilla "
val title = " Mozilla "
val readerUrl = " moz-extension://1234 "
val readerUrl = " moz-extension://1234 "
@ -404,7 +474,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarSharePressWithReaderModeActive ( ) = runBlockingTest {
fun `IF reader mode is active WHEN share menu item is pressed THEN navigate to share screen` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . Share
val item = ToolbarMenu . Item . Share
val title = " Mozilla "
val title = " Mozilla "
val readerUrl = " moz-extension://1234 "
val readerUrl = " moz-extension://1234 "
@ -435,7 +505,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarFindInPagePress ( ) = runBlockingTest {
fun `WHEN Find In Page menu item is pressed THEN launch finder` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . FindInPage
val item = ToolbarMenu . Item . FindInPage
val controller = createController ( scope = this )
val controller = createController ( scope = this )
@ -446,7 +516,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarSaveToCollectionPressWhenAtLeastOneCollectionExists ( ) = runBlockingTest {
fun `IF one or more collection exists WHEN Save To Collection menu item is pressed THEN navigate to save collection page` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . SaveToCollection
val item = ToolbarMenu . Item . SaveToCollection
val cachedTabCollections : List < TabCollection > = mockk ( relaxed = true )
val cachedTabCollections : List < TabCollection > = mockk ( relaxed = true )
every { tabCollectionStorage . cachedTabCollections } returns cachedTabCollections
every { tabCollectionStorage . cachedTabCollections } returns cachedTabCollections
@ -474,7 +544,7 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarSaveToCollectionPressWhenNoCollectionsExists ( ) = runBlockingTest {
fun `IF no collection exists WHEN Save To Collection menu item is pressed THEN navigate to create collection page` ( ) = runBlockingTest {
val item = ToolbarMenu . Item . SaveToCollection
val item = ToolbarMenu . Item . SaveToCollection
val cachedTabCollectionsEmpty : List < TabCollection > = emptyList ( )
val cachedTabCollectionsEmpty : List < TabCollection > = emptyList ( )
every { tabCollectionStorage . cachedTabCollections } returns cachedTabCollectionsEmpty
every { tabCollectionStorage . cachedTabCollections } returns cachedTabCollectionsEmpty
@ -499,56 +569,22 @@ class DefaultBrowserToolbarMenuControllerTest {
}
}
@Test
@Test
fun handleToolbarOpenInFenixPress ( ) = runBlockingTest {
fun `WHEN New Tab menu item is pressed THEN navigate to a new tab home` ( ) = runBlockingTest {
val controller = createController ( scope = this , customTabSession = currentSession )
val item = ToolbarMenu . Item . NewTab
val item = ToolbarMenu . Item . OpenInFenix
every { currentSession . customTabConfig } returns mockk ( )
every { activity . startActivity ( any ( ) ) } just Runs
controller . handleToolbarItemInteraction ( item )
verify { sessionFeature . release ( ) }
verify { currentSession . customTabConfig = null }
verify { sessionManager . select ( currentSession ) }
verify { activity . startActivity ( openInFenixIntent ) }
verify { activity . finishAndRemoveTask ( ) }
}
@Test
fun handleToolbarQuitPress ( ) = runBlockingTest {
val item = ToolbarMenu . Item . Quit
val testScope = this
val controller = createController ( scope = testScope )
controller . handleToolbarItemInteraction ( item )
verify { deleteAndQuit ( activity , testScope , null ) }
}
@Test
fun handleToolbarReaderModeAppearancePress ( ) = runBlockingTest {
val item = ToolbarMenu . Item . ReaderModeAppearance
val controller = createController ( scope = this )
val controller = createController ( scope = this )
controller . handleToolbarItemInteraction ( item )
controller . handleToolbarItemInteraction ( item )
verify { readerModeController . showControls ( ) }
verify {
verify { metrics . track ( Event . ReaderModeAppearanceOpened ) }
navController . navigate (
}
directionsEq (
NavGraphDirections . actionGlobalHome (
@Test
focusOnAddressBar = true
fun handleToolbarOpenInAppPress ( ) = runBlockingTest {
)
val item = ToolbarMenu . Item . OpenInApp
)
)
val controller = createController ( scope = this )
}
controller . handleToolbarItemInteraction ( item )
verify { settings . openInAppOpened = true }
}
}
private fun createController (
private fun createController (