@ -6,20 +6,25 @@ package org.mozilla.fenix.library.recentlyclosed
import androidx.navigation.NavController
import androidx.navigation.NavController
import androidx.navigation.NavOptions
import androidx.navigation.NavOptions
import io.mockk.Runs
import io.mockk.mockk
import io.mockk.coEvery
import io.mockk.verifyAll
import io.mockk.clearMocks
import io.mockk.clearMocks
import io.mockk.every
import io.mockk.every
import io.mockk.just
import io.mockk.mockk
import io.mockk.verify
import io.mockk.verify
import io.mockk.verifyAll
import io.mockk.coVerify
import kotlinx.coroutines.test.TestCoroutineDispatcher
import io.mockk.just
import io.mockk.Runs
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import mozilla.components.browser.state.action.RecentlyClosedAction
import mozilla.components.browser.state.action.RecentlyClosedAction
import mozilla.components.browser.state.state.recover.RecoverableTab
import mozilla.components.browser.state.state.recover. TabState
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.prompt.ShareData
import mozilla.components.concept.engine.prompt.ShareData
import mozilla.components.feature.recentlyclosed.RecentlyClosedTabsStorage
import mozilla.components.feature.tabs.TabsUseCases
import mozilla.components.feature.tabs.TabsUseCases
import org.junit.After
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Before
import org.junit.Test
import org.junit.Test
@ -35,7 +40,6 @@ import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith ( FenixRobolectricTestRunner :: class )
@RunWith ( FenixRobolectricTestRunner :: class )
class DefaultRecentlyClosedControllerTest {
class DefaultRecentlyClosedControllerTest {
private val dispatcher = TestCoroutineDispatcher ( )
private val navController : NavController = mockk ( relaxed = true )
private val navController : NavController = mockk ( relaxed = true )
private val activity : HomeActivity = mockk ( relaxed = true )
private val activity : HomeActivity = mockk ( relaxed = true )
private val browserStore : BrowserStore = mockk ( relaxed = true )
private val browserStore : BrowserStore = mockk ( relaxed = true )
@ -45,39 +49,34 @@ class DefaultRecentlyClosedControllerTest {
@Before
@Before
fun setUp ( ) {
fun setUp ( ) {
every { tabsUseCases . restore . invoke ( any ( ) , true ) } just Runs
coEvery { tabsUseCases . restore . invoke ( any ( ) , any ( ) , true ) } just Runs
}
@After
fun tearDown ( ) {
dispatcher . cleanupTestCoroutines ( )
}
}
@Test
@Test
fun handleOpen ( ) {
fun handleOpen ( ) {
val item : Recoverable Tab = mockk ( relaxed = true )
val item : TabState = mockk ( relaxed = true )
var actualtab: RecoverableTab ? = null
var tabUrl: String ? = null
var actualBrowsingMode : BrowsingMode ? = null
var actualBrowsingMode : BrowsingMode ? = null
val controller = createController (
val controller = createController (
openToBrowser = { tab , browsingMode ->
openToBrowser = { url , browsingMode ->
actualtab = tab
tabUrl = url
actualBrowsingMode = browsingMode
actualBrowsingMode = browsingMode
}
}
)
)
controller . handleOpen ( item , BrowsingMode . Private )
controller . handleOpen ( item , BrowsingMode . Private )
assertEquals ( item , actual tab)
assertEquals ( item .url , tabUrl )
assertEquals ( actualBrowsingMode , BrowsingMode . Private )
assertEquals ( actualBrowsingMode , BrowsingMode . Private )
ac tu altab = null
tabUr l = null
actualBrowsingMode = null
actualBrowsingMode = null
controller . handleOpen ( item , BrowsingMode . Normal )
controller . handleOpen ( item , BrowsingMode . Normal )
assertEquals ( item , actual tab)
assertEquals ( item .url , tabUrl )
assertEquals ( actualBrowsingMode , BrowsingMode . Normal )
assertEquals ( actualBrowsingMode , BrowsingMode . Normal )
}
}
@ -85,34 +84,34 @@ class DefaultRecentlyClosedControllerTest {
fun `open multiple tabs` ( ) {
fun `open multiple tabs` ( ) {
val tabs = createFakeTabList ( 2 )
val tabs = createFakeTabList ( 2 )
val ac tu alTab s = mutableListOf < RecoverableTab > ( )
val tabUr ls = mutableListOf < String > ( )
val actualBrowsingModes = mutableListOf < BrowsingMode ? > ( )
val actualBrowsingModes = mutableListOf < BrowsingMode ? > ( )
val controller = createController (
val controller = createController (
openToBrowser = { tab , mode ->
openToBrowser = { url , mode ->
actualTabs. add ( tab )
tabUrls. add ( url )
actualBrowsingModes . add ( mode )
actualBrowsingModes . add ( mode )
}
}
)
)
controller . handleOpen ( tabs . toSet ( ) , BrowsingMode . Normal )
controller . handleOpen ( tabs . toSet ( ) , BrowsingMode . Normal )
assertEquals ( 2 , ac tu alTab s. size )
assertEquals ( 2 , tabUr ls. size )
assertEquals ( tabs [ 0 ] , ac tualT abs[ 0 ] )
assertEquals ( tabs [ 0 ] .url , tabUrl s[ 0 ] )
assertEquals ( tabs [ 1 ] , ac tualT abs[ 1 ] )
assertEquals ( tabs [ 1 ] .url , tabUrl s[ 1 ] )
assertEquals ( BrowsingMode . Normal , actualBrowsingModes [ 0 ] )
assertEquals ( BrowsingMode . Normal , actualBrowsingModes [ 0 ] )
assertEquals ( BrowsingMode . Normal , actualBrowsingModes [ 1 ] )
assertEquals ( BrowsingMode . Normal , actualBrowsingModes [ 1 ] )
verifyAll { metrics . track ( Event . RecentlyClosedTabsMenuOpenInNormalTab ) }
verifyAll { metrics . track ( Event . RecentlyClosedTabsMenuOpenInNormalTab ) }
clearMocks ( metrics )
clearMocks ( metrics )
ac tu alTab s. clear ( )
tabUr ls. clear ( )
actualBrowsingModes . clear ( )
actualBrowsingModes . clear ( )
controller . handleOpen ( tabs . toSet ( ) , BrowsingMode . Private )
controller . handleOpen ( tabs . toSet ( ) , BrowsingMode . Private )
assertEquals ( 2 , ac tu alTab s. size )
assertEquals ( 2 , tabUr ls. size )
assertEquals ( tabs [ 0 ] , ac tualT abs[ 0 ] )
assertEquals ( tabs [ 0 ] .url , tabUrl s[ 0 ] )
assertEquals ( tabs [ 1 ] , ac tualT abs[ 1 ] )
assertEquals ( tabs [ 1 ] .url , tabUrl s[ 1 ] )
assertEquals ( BrowsingMode . Private , actualBrowsingModes [ 0 ] )
assertEquals ( BrowsingMode . Private , actualBrowsingModes [ 0 ] )
assertEquals ( BrowsingMode . Private , actualBrowsingModes [ 1 ] )
assertEquals ( BrowsingMode . Private , actualBrowsingModes [ 1 ] )
verifyAll { metrics . track ( Event . RecentlyClosedTabsMenuOpenInPrivateTab ) }
verifyAll { metrics . track ( Event . RecentlyClosedTabsMenuOpenInPrivateTab ) }
@ -164,7 +163,7 @@ class DefaultRecentlyClosedControllerTest {
@Test
@Test
fun handleDelete ( ) {
fun handleDelete ( ) {
val item : Recoverable Tab = mockk ( relaxed = true )
val item : TabState = mockk ( relaxed = true )
createController ( ) . handleDelete ( item )
createController ( ) . handleDelete ( item )
@ -221,14 +220,12 @@ class DefaultRecentlyClosedControllerTest {
}
}
@Test
@Test
fun handleRestore ( ) {
fun handleRestore ( ) = runBlocking {
val item : RecoverableTab = mockk ( relaxed = true )
val item : TabState = mockk ( relaxed = true )
createController ( ) . handleRestore ( item )
dispatcher. advanceUntilIdle ( )
createController ( scope = this ) . handleRestore ( item )
v erify { tabsUseCases . restore . invoke ( item, true ) }
coV erify { tabsUseCases . restore . invoke ( eq( item) , any ( ) , true ) }
verify { metrics . track ( Event . RecentlyClosedTabsOpenTab ) }
verify { metrics . track ( Event . RecentlyClosedTabsOpenTab ) }
}
}
@ -253,24 +250,27 @@ class DefaultRecentlyClosedControllerTest {
}
}
private fun createController (
private fun createController (
openToBrowser : ( RecoverableTab , BrowsingMode ? ) -> Unit = { _ , _ -> }
scope : CoroutineScope = CoroutineScope ( Dispatchers . IO ) ,
openToBrowser : ( String , BrowsingMode ? ) -> Unit = { _ , _ -> } ,
) : RecentlyClosedController {
) : RecentlyClosedController {
return DefaultRecentlyClosedController (
return DefaultRecentlyClosedController (
navController ,
navController ,
browserStore ,
browserStore ,
recentlyClosedStore ,
recentlyClosedStore ,
RecentlyClosedTabsStorage ( testContext , mockk ( ) , mockk ( ) ) ,
tabsUseCases ,
tabsUseCases ,
activity ,
activity ,
metrics ,
metrics ,
scope ,
openToBrowser
openToBrowser
)
)
}
}
private fun createFakeTab ( id : String = " FakeId " , url : String = " www.fake.com " ) : Recoverable Tab =
private fun createFakeTab ( id : String = " FakeId " , url : String = " www.fake.com " ) : TabState =
Recoverable Tab( id , url )
TabState ( id , url )
private fun createFakeTabList ( size : Int ) : List < Recoverable Tab> {
private fun createFakeTabList ( size : Int ) : List < TabState > {
val fakeTabs = mutableListOf < Recoverable Tab> ( )
val fakeTabs = mutableListOf < TabState > ( )
for ( i in 0 until size ) {
for ( i in 0 until size ) {
fakeTabs . add ( createFakeTab ( id = " FakeId $i " ) )
fakeTabs . add ( createFakeTab ( id = " FakeId $i " ) )
}
}