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