@ -7,10 +7,12 @@ package org.mozilla.fenix.library.recentlyclosed
import androidx.navigation.NavController
import androidx.navigation.NavOptions
import io.mockk.Runs
import io.mockk.clearMocks
import io.mockk.every
import io.mockk.just
import io.mockk.mockk
import io.mockk.verify
import io.mockk.verifyAll
import kotlinx.coroutines.test.TestCoroutineDispatcher
import mozilla.components.browser.state.action.RecentlyClosedAction
import mozilla.components.browser.state.state.recover.RecoverableTab
@ -25,6 +27,8 @@ import org.junit.runner.RunWith
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.ext.directionsEq
import org.mozilla.fenix.ext.optionsEq
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@ -37,6 +41,7 @@ class DefaultRecentlyClosedControllerTest {
private val browserStore : BrowserStore = mockk ( relaxed = true )
private val recentlyClosedStore : RecentlyClosedFragmentStore = mockk ( relaxed = true )
private val tabsUseCases : TabsUseCases = mockk ( relaxed = true )
private val metrics : MetricController = mockk ( relaxed = true )
@Before
fun setUp ( ) {
@ -97,6 +102,8 @@ class DefaultRecentlyClosedControllerTest {
assertEquals ( tabs [ 1 ] , actualTabs [ 1 ] )
assertEquals ( BrowsingMode . Normal , actualBrowsingModes [ 0 ] )
assertEquals ( BrowsingMode . Normal , actualBrowsingModes [ 1 ] )
verifyAll { metrics . track ( Event . RecentlyClosedTabsMenuOpenInNormalTab ) }
clearMocks ( metrics )
actualTabs . clear ( )
actualBrowsingModes . clear ( )
@ -108,24 +115,51 @@ class DefaultRecentlyClosedControllerTest {
assertEquals ( tabs [ 1 ] , actualTabs [ 1 ] )
assertEquals ( BrowsingMode . Private , actualBrowsingModes [ 0 ] )
assertEquals ( BrowsingMode . Private , actualBrowsingModes [ 1 ] )
verifyAll { metrics . track ( Event . RecentlyClosedTabsMenuOpenInPrivateTab ) }
}
@Test
fun `handle select tab`( ) {
fun `handle select ing first tab`( ) {
val selectedTab = createFakeTab ( )
every { recentlyClosedStore . state . selectedTabs } returns emptySet ( )
createController ( ) . handleSelect ( selectedTab )
verify { recentlyClosedStore . dispatch ( RecentlyClosedFragmentAction . Select ( selectedTab ) ) }
verify { metrics . track ( Event . RecentlyClosedTabsEnterMultiselect ) }
}
@Test
fun `handle deselect tab` ( ) {
fun `handle selecting a successive tab` ( ) {
val selectedTab = createFakeTab ( )
every { recentlyClosedStore . state . selectedTabs } returns setOf ( mockk ( ) )
createController ( ) . handleSelect ( selectedTab )
verify { recentlyClosedStore . dispatch ( RecentlyClosedFragmentAction . Select ( selectedTab ) ) }
verify ( exactly = 0 ) { metrics . track ( Event . RecentlyClosedTabsEnterMultiselect ) }
}
@Test
fun `handle deselect last tab` ( ) {
val deselectedTab = createFakeTab ( )
every { recentlyClosedStore . state . selectedTabs } returns setOf ( deselectedTab )
createController ( ) . handleDeselect ( deselectedTab )
verify { recentlyClosedStore . dispatch ( RecentlyClosedFragmentAction . Deselect ( deselectedTab ) ) }
verify { metrics . track ( Event . RecentlyClosedTabsExitMultiselect ) }
}
@Test
fun `handle deselect a tab from others still selected` ( ) {
val deselectedTab = createFakeTab ( )
every { recentlyClosedStore . state . selectedTabs } returns setOf ( deselectedTab , mockk ( ) )
createController ( ) . handleDeselect ( deselectedTab )
verify { recentlyClosedStore . dispatch ( RecentlyClosedFragmentAction . Deselect ( deselectedTab ) ) }
verify ( exactly = 0 ) { metrics . track ( Event . RecentlyClosedTabsExitMultiselect ) }
}
@Test
@ -137,6 +171,7 @@ class DefaultRecentlyClosedControllerTest {
verify {
browserStore . dispatch ( RecentlyClosedAction . RemoveClosedTabAction ( item ) )
}
verify { metrics . track ( Event . RecentlyClosedTabsDeleteTab ) }
}
@Test
@ -149,6 +184,7 @@ class DefaultRecentlyClosedControllerTest {
browserStore . dispatch ( RecentlyClosedAction . RemoveClosedTabAction ( tabs [ 0 ] ) )
browserStore . dispatch ( RecentlyClosedAction . RemoveClosedTabAction ( tabs [ 1 ] ) )
}
verify { metrics . track ( Event . RecentlyClosedTabsMenuDelete ) }
}
@Test
@ -163,6 +199,7 @@ class DefaultRecentlyClosedControllerTest {
optionsEq ( NavOptions . Builder ( ) . setPopUpTo ( R . id . historyFragment , true ) . build ( ) )
)
}
verify { metrics . track ( Event . RecentlyClosedTabsShowFullHistory ) }
}
@Test
@ -180,6 +217,7 @@ class DefaultRecentlyClosedControllerTest {
directionsEq ( RecentlyClosedFragmentDirections . actionGlobalShareFragment ( data ) )
)
}
verify { metrics . track ( Event . RecentlyClosedTabsMenuShare ) }
}
@Test
@ -191,6 +229,7 @@ class DefaultRecentlyClosedControllerTest {
dispatcher . advanceUntilIdle ( )
verify { tabsUseCases . restore . invoke ( item , true ) }
verify { metrics . track ( Event . RecentlyClosedTabsOpenTab ) }
}
@Test
@ -200,6 +239,17 @@ class DefaultRecentlyClosedControllerTest {
createController ( ) . handleBackPressed ( )
verify { recentlyClosedStore . dispatch ( RecentlyClosedFragmentAction . DeselectAll ) }
verifyAll { metrics . track ( Event . RecentlyClosedTabsExitMultiselect ) }
}
@Test
fun `report closing the fragment when back is pressed` ( ) {
every { recentlyClosedStore . state . selectedTabs } returns emptySet ( )
createController ( ) . handleBackPressed ( )
verify ( exactly = 0 ) { recentlyClosedStore . dispatch ( RecentlyClosedFragmentAction . DeselectAll ) }
verifyAll { metrics . track ( Event . RecentlyClosedTabsClosed ) }
}
private fun createController (
@ -211,6 +261,7 @@ class DefaultRecentlyClosedControllerTest {
recentlyClosedStore ,
tabsUseCases ,
activity ,
metrics ,
openToBrowser
)
}