|
|
@ -8,37 +8,33 @@ import android.content.Context
|
|
|
|
import android.content.res.Configuration
|
|
|
|
import android.content.res.Configuration
|
|
|
|
import android.view.LayoutInflater
|
|
|
|
import android.view.LayoutInflater
|
|
|
|
import android.view.View
|
|
|
|
import android.view.View
|
|
|
|
import android.widget.Button
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import android.widget.ImageButton
|
|
|
|
|
|
|
|
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
|
|
|
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
|
|
|
|
|
|
|
import androidx.core.view.isVisible
|
|
|
|
import androidx.lifecycle.LifecycleCoroutineScope
|
|
|
|
import androidx.lifecycle.LifecycleCoroutineScope
|
|
|
|
import androidx.lifecycle.LifecycleOwner
|
|
|
|
import androidx.lifecycle.LifecycleOwner
|
|
|
|
import androidx.lifecycle.lifecycleScope
|
|
|
|
import androidx.lifecycle.lifecycleScope
|
|
|
|
import androidx.navigation.NavController
|
|
|
|
import androidx.navigation.NavController
|
|
|
|
import androidx.navigation.fragment.findNavController
|
|
|
|
import androidx.navigation.fragment.findNavController
|
|
|
|
|
|
|
|
import androidx.viewbinding.ViewBindings
|
|
|
|
import androidx.viewpager2.widget.ViewPager2
|
|
|
|
import androidx.viewpager2.widget.ViewPager2
|
|
|
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
|
|
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
|
|
|
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
|
|
|
|
|
|
|
import com.google.android.material.tabs.TabLayout
|
|
|
|
import com.google.android.material.tabs.TabLayout
|
|
|
|
import io.mockk.Runs
|
|
|
|
import io.mockk.Runs
|
|
|
|
import io.mockk.every
|
|
|
|
import io.mockk.every
|
|
|
|
import io.mockk.just
|
|
|
|
import io.mockk.just
|
|
|
|
import io.mockk.mockk
|
|
|
|
import io.mockk.mockk
|
|
|
|
import io.mockk.mockkStatic
|
|
|
|
import io.mockk.mockkStatic
|
|
|
|
import io.mockk.slot
|
|
|
|
|
|
|
|
import io.mockk.spyk
|
|
|
|
import io.mockk.spyk
|
|
|
|
import io.mockk.unmockkStatic
|
|
|
|
import io.mockk.unmockkStatic
|
|
|
|
import io.mockk.verify
|
|
|
|
import io.mockk.verify
|
|
|
|
import kotlinx.android.synthetic.main.component_tabstray2.*
|
|
|
|
|
|
|
|
import kotlinx.android.synthetic.main.component_tabstray2.view.*
|
|
|
|
|
|
|
|
import kotlinx.android.synthetic.main.component_tabstray_fab.*
|
|
|
|
|
|
|
|
import kotlinx.android.synthetic.main.fragment_tab_tray_dialog.*
|
|
|
|
|
|
|
|
import kotlinx.coroutines.CoroutineScope
|
|
|
|
import kotlinx.coroutines.CoroutineScope
|
|
|
|
import mozilla.components.browser.menu.BrowserMenu
|
|
|
|
import mozilla.components.browser.menu.BrowserMenu
|
|
|
|
import mozilla.components.browser.state.store.BrowserStore
|
|
|
|
import mozilla.components.browser.state.store.BrowserStore
|
|
|
|
import mozilla.components.support.test.robolectric.testContext
|
|
|
|
import mozilla.components.support.test.robolectric.testContext
|
|
|
|
import org.junit.Assert
|
|
|
|
import org.junit.Assert
|
|
|
|
import org.junit.Assert.assertEquals
|
|
|
|
import org.junit.Assert.assertEquals
|
|
|
|
|
|
|
|
import org.junit.Assert.assertFalse
|
|
|
|
import org.junit.Assert.assertSame
|
|
|
|
import org.junit.Assert.assertSame
|
|
|
|
import org.junit.Before
|
|
|
|
import org.junit.Before
|
|
|
|
import org.junit.Test
|
|
|
|
import org.junit.Test
|
|
|
@ -47,6 +43,9 @@ import org.mozilla.fenix.NavGraphDirections
|
|
|
|
import org.mozilla.fenix.R
|
|
|
|
import org.mozilla.fenix.R
|
|
|
|
import org.mozilla.fenix.components.metrics.Event
|
|
|
|
import org.mozilla.fenix.components.metrics.Event
|
|
|
|
import org.mozilla.fenix.components.metrics.MetricController
|
|
|
|
import org.mozilla.fenix.components.metrics.MetricController
|
|
|
|
|
|
|
|
import org.mozilla.fenix.databinding.ComponentTabstray2Binding
|
|
|
|
|
|
|
|
import org.mozilla.fenix.databinding.ComponentTabstrayFabBinding
|
|
|
|
|
|
|
|
import org.mozilla.fenix.databinding.FragmentTabTrayDialogBinding
|
|
|
|
import org.mozilla.fenix.ext.components
|
|
|
|
import org.mozilla.fenix.ext.components
|
|
|
|
import org.mozilla.fenix.ext.settings
|
|
|
|
import org.mozilla.fenix.ext.settings
|
|
|
|
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
|
|
|
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
|
|
@ -58,15 +57,25 @@ import org.mozilla.fenix.utils.allowUndo
|
|
|
|
@RunWith(FenixRobolectricTestRunner::class)
|
|
|
|
@RunWith(FenixRobolectricTestRunner::class)
|
|
|
|
class TabsTrayFragmentTest {
|
|
|
|
class TabsTrayFragmentTest {
|
|
|
|
private lateinit var context: Context
|
|
|
|
private lateinit var context: Context
|
|
|
|
private lateinit var view: View
|
|
|
|
private lateinit var view: ViewGroup
|
|
|
|
private lateinit var fragment: TabsTrayFragment
|
|
|
|
private lateinit var fragment: TabsTrayFragment
|
|
|
|
|
|
|
|
private lateinit var tabsTrayBinding: ComponentTabstray2Binding
|
|
|
|
|
|
|
|
private lateinit var tabsTrayDialogBinding: FragmentTabTrayDialogBinding
|
|
|
|
|
|
|
|
private lateinit var fabButtonBinding: ComponentTabstrayFabBinding
|
|
|
|
|
|
|
|
|
|
|
|
@Before
|
|
|
|
@Before
|
|
|
|
fun setup() {
|
|
|
|
fun setup() {
|
|
|
|
context = mockk(relaxed = true)
|
|
|
|
context = mockk(relaxed = true)
|
|
|
|
view = mockk(relaxed = true)
|
|
|
|
view = mockk(relaxed = true)
|
|
|
|
|
|
|
|
val inflater = LayoutInflater.from(testContext)
|
|
|
|
|
|
|
|
tabsTrayDialogBinding = FragmentTabTrayDialogBinding.inflate(inflater)
|
|
|
|
|
|
|
|
tabsTrayBinding = ComponentTabstray2Binding.inflate(inflater)
|
|
|
|
|
|
|
|
fabButtonBinding = ComponentTabstrayFabBinding.inflate(inflater)
|
|
|
|
|
|
|
|
|
|
|
|
fragment = spyk(TabsTrayFragment())
|
|
|
|
fragment = spyk(TabsTrayFragment())
|
|
|
|
|
|
|
|
fragment._tabsTrayBinding = tabsTrayBinding
|
|
|
|
|
|
|
|
fragment._tabsTrayDialogBinding = tabsTrayDialogBinding
|
|
|
|
|
|
|
|
fragment._fabButtonBinding = fabButtonBinding
|
|
|
|
every { fragment.context } returns context
|
|
|
|
every { fragment.context } returns context
|
|
|
|
every { fragment.view } returns view
|
|
|
|
every { fragment.view } returns view
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -78,10 +87,7 @@ class TabsTrayFragmentTest {
|
|
|
|
mockkStatic("androidx.lifecycle.LifecycleOwnerKt")
|
|
|
|
mockkStatic("androidx.lifecycle.LifecycleOwnerKt")
|
|
|
|
val lifecycleScope: LifecycleCoroutineScope = mockk(relaxed = true)
|
|
|
|
val lifecycleScope: LifecycleCoroutineScope = mockk(relaxed = true)
|
|
|
|
every { any<LifecycleOwner>().lifecycleScope } returns lifecycleScope
|
|
|
|
every { any<LifecycleOwner>().lifecycleScope } returns lifecycleScope
|
|
|
|
val newTabButton: ExtendedFloatingActionButton = mockk {
|
|
|
|
fabButtonBinding.newTabButton.isVisible = true
|
|
|
|
every { visibility } returns View.VISIBLE
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
every { fragment.new_tab_button } returns newTabButton
|
|
|
|
|
|
|
|
every { fragment.context } returns testContext // needed for getString()
|
|
|
|
every { fragment.context } returns testContext // needed for getString()
|
|
|
|
every { any<CoroutineScope>().allowUndo(any(), any(), any(), any(), any(), any(), any(), any()) } just Runs
|
|
|
|
every { any<CoroutineScope>().allowUndo(any(), any(), any(), any(), any(), any(), any(), any()) } just Runs
|
|
|
|
|
|
|
|
|
|
|
@ -89,12 +95,12 @@ class TabsTrayFragmentTest {
|
|
|
|
|
|
|
|
|
|
|
|
verify {
|
|
|
|
verify {
|
|
|
|
lifecycleScope.allowUndo(
|
|
|
|
lifecycleScope.allowUndo(
|
|
|
|
fragment.view!!,
|
|
|
|
view,
|
|
|
|
testContext.getString(R.string.snackbar_private_tab_closed),
|
|
|
|
testContext.getString(R.string.snackbar_private_tab_closed),
|
|
|
|
testContext.getString(R.string.snackbar_deleted_undo),
|
|
|
|
testContext.getString(R.string.snackbar_deleted_undo),
|
|
|
|
any(),
|
|
|
|
any(),
|
|
|
|
any(),
|
|
|
|
any(),
|
|
|
|
newTabButton,
|
|
|
|
fabButtonBinding.newTabButton,
|
|
|
|
TabsTrayFragment.ELEVATION,
|
|
|
|
TabsTrayFragment.ELEVATION,
|
|
|
|
false
|
|
|
|
false
|
|
|
|
)
|
|
|
|
)
|
|
|
@ -112,10 +118,6 @@ class TabsTrayFragmentTest {
|
|
|
|
mockkStatic("androidx.lifecycle.LifecycleOwnerKt")
|
|
|
|
mockkStatic("androidx.lifecycle.LifecycleOwnerKt")
|
|
|
|
val lifecycleScope: LifecycleCoroutineScope = mockk(relaxed = true)
|
|
|
|
val lifecycleScope: LifecycleCoroutineScope = mockk(relaxed = true)
|
|
|
|
every { any<LifecycleOwner>().lifecycleScope } returns lifecycleScope
|
|
|
|
every { any<LifecycleOwner>().lifecycleScope } returns lifecycleScope
|
|
|
|
val newTabButton: ExtendedFloatingActionButton = mockk {
|
|
|
|
|
|
|
|
every { visibility } returns View.GONE
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
every { fragment.new_tab_button } returns newTabButton
|
|
|
|
|
|
|
|
every { fragment.context } returns testContext // needed for getString()
|
|
|
|
every { fragment.context } returns testContext // needed for getString()
|
|
|
|
every { any<CoroutineScope>().allowUndo(any(), any(), any(), any(), any(), any(), any(), any()) } just Runs
|
|
|
|
every { any<CoroutineScope>().allowUndo(any(), any(), any(), any(), any(), any(), any(), any()) } just Runs
|
|
|
|
|
|
|
|
|
|
|
@ -123,7 +125,7 @@ class TabsTrayFragmentTest {
|
|
|
|
|
|
|
|
|
|
|
|
verify {
|
|
|
|
verify {
|
|
|
|
lifecycleScope.allowUndo(
|
|
|
|
lifecycleScope.allowUndo(
|
|
|
|
fragment.view!!,
|
|
|
|
view,
|
|
|
|
testContext.getString(R.string.snackbar_private_tab_closed),
|
|
|
|
testContext.getString(R.string.snackbar_private_tab_closed),
|
|
|
|
testContext.getString(R.string.snackbar_deleted_undo),
|
|
|
|
testContext.getString(R.string.snackbar_deleted_undo),
|
|
|
|
any(),
|
|
|
|
any(),
|
|
|
@ -146,10 +148,7 @@ class TabsTrayFragmentTest {
|
|
|
|
mockkStatic("androidx.lifecycle.LifecycleOwnerKt")
|
|
|
|
mockkStatic("androidx.lifecycle.LifecycleOwnerKt")
|
|
|
|
val lifecycleScope: LifecycleCoroutineScope = mockk(relaxed = true)
|
|
|
|
val lifecycleScope: LifecycleCoroutineScope = mockk(relaxed = true)
|
|
|
|
every { any<LifecycleOwner>().lifecycleScope } returns lifecycleScope
|
|
|
|
every { any<LifecycleOwner>().lifecycleScope } returns lifecycleScope
|
|
|
|
val newTabButton: ExtendedFloatingActionButton = mockk {
|
|
|
|
fabButtonBinding.newTabButton.isVisible = true
|
|
|
|
every { visibility } returns View.VISIBLE
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
every { fragment.new_tab_button } returns newTabButton
|
|
|
|
|
|
|
|
every { fragment.context } returns testContext // needed for getString()
|
|
|
|
every { fragment.context } returns testContext // needed for getString()
|
|
|
|
every { any<CoroutineScope>().allowUndo(any(), any(), any(), any(), any(), any(), any(), any()) } just Runs
|
|
|
|
every { any<CoroutineScope>().allowUndo(any(), any(), any(), any(), any(), any(), any(), any()) } just Runs
|
|
|
|
|
|
|
|
|
|
|
@ -157,12 +156,12 @@ class TabsTrayFragmentTest {
|
|
|
|
|
|
|
|
|
|
|
|
verify {
|
|
|
|
verify {
|
|
|
|
lifecycleScope.allowUndo(
|
|
|
|
lifecycleScope.allowUndo(
|
|
|
|
fragment.view!!,
|
|
|
|
view,
|
|
|
|
testContext.getString(R.string.snackbar_tab_closed),
|
|
|
|
testContext.getString(R.string.snackbar_tab_closed),
|
|
|
|
testContext.getString(R.string.snackbar_deleted_undo),
|
|
|
|
testContext.getString(R.string.snackbar_deleted_undo),
|
|
|
|
any(),
|
|
|
|
any(),
|
|
|
|
any(),
|
|
|
|
any(),
|
|
|
|
newTabButton,
|
|
|
|
fabButtonBinding.newTabButton,
|
|
|
|
TabsTrayFragment.ELEVATION,
|
|
|
|
TabsTrayFragment.ELEVATION,
|
|
|
|
false
|
|
|
|
false
|
|
|
|
)
|
|
|
|
)
|
|
|
@ -180,10 +179,6 @@ class TabsTrayFragmentTest {
|
|
|
|
mockkStatic("androidx.lifecycle.LifecycleOwnerKt")
|
|
|
|
mockkStatic("androidx.lifecycle.LifecycleOwnerKt")
|
|
|
|
val lifecycleScope: LifecycleCoroutineScope = mockk(relaxed = true)
|
|
|
|
val lifecycleScope: LifecycleCoroutineScope = mockk(relaxed = true)
|
|
|
|
every { any<LifecycleOwner>().lifecycleScope } returns lifecycleScope
|
|
|
|
every { any<LifecycleOwner>().lifecycleScope } returns lifecycleScope
|
|
|
|
val newTabButton: ExtendedFloatingActionButton = mockk {
|
|
|
|
|
|
|
|
every { visibility } returns View.GONE
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
every { fragment.new_tab_button } returns newTabButton
|
|
|
|
|
|
|
|
every { fragment.context } returns testContext // needed for getString()
|
|
|
|
every { fragment.context } returns testContext // needed for getString()
|
|
|
|
every { any<CoroutineScope>().allowUndo(any(), any(), any(), any(), any(), any(), any(), any()) } just Runs
|
|
|
|
every { any<CoroutineScope>().allowUndo(any(), any(), any(), any(), any(), any(), any(), any()) } just Runs
|
|
|
|
|
|
|
|
|
|
|
@ -191,7 +186,7 @@ class TabsTrayFragmentTest {
|
|
|
|
|
|
|
|
|
|
|
|
verify {
|
|
|
|
verify {
|
|
|
|
lifecycleScope.allowUndo(
|
|
|
|
lifecycleScope.allowUndo(
|
|
|
|
fragment.view!!,
|
|
|
|
view,
|
|
|
|
testContext.getString(R.string.snackbar_tab_closed),
|
|
|
|
testContext.getString(R.string.snackbar_tab_closed),
|
|
|
|
testContext.getString(R.string.snackbar_deleted_undo),
|
|
|
|
testContext.getString(R.string.snackbar_deleted_undo),
|
|
|
|
any(),
|
|
|
|
any(),
|
|
|
@ -209,28 +204,25 @@ class TabsTrayFragmentTest {
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
|
fun `WHEN setupPager is called THEN it sets the tray adapter and disables user initiated scrolling`() {
|
|
|
|
fun `WHEN setupPager is called THEN it sets the tray adapter and disables user initiated scrolling`() {
|
|
|
|
val tray: ViewPager2 = mockk(relaxed = true)
|
|
|
|
|
|
|
|
val store: TabsTrayStore = mockk()
|
|
|
|
val store: TabsTrayStore = mockk()
|
|
|
|
val trayInteractor: TabsTrayInteractor = mockk()
|
|
|
|
val trayInteractor: TabsTrayInteractor = mockk()
|
|
|
|
val browserInteractor: BrowserTrayInteractor = mockk()
|
|
|
|
val browserInteractor: BrowserTrayInteractor = mockk()
|
|
|
|
val navigationInteractor: NavigationInteractor = mockk()
|
|
|
|
val navigationInteractor: NavigationInteractor = mockk()
|
|
|
|
val browserStore: BrowserStore = mockk()
|
|
|
|
val browserStore: BrowserStore = mockk()
|
|
|
|
every { fragment.tabsTray } returns tray
|
|
|
|
|
|
|
|
every { context.components.core.store } returns browserStore
|
|
|
|
every { context.components.core.store } returns browserStore
|
|
|
|
val adapterSlot = slot<TrayPagerAdapter>()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment.setupPager(
|
|
|
|
fragment.setupPager(
|
|
|
|
context, store, trayInteractor, browserInteractor, navigationInteractor
|
|
|
|
context, store, trayInteractor, browserInteractor, navigationInteractor
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
verify { tray.adapter = capture(adapterSlot) }
|
|
|
|
val adapter = (tabsTrayBinding.tabsTray.adapter as TrayPagerAdapter)
|
|
|
|
assertSame(context, adapterSlot.captured.context)
|
|
|
|
assertSame(context, adapter.context)
|
|
|
|
assertSame(store, adapterSlot.captured.store)
|
|
|
|
assertSame(store, adapter.store)
|
|
|
|
assertSame(trayInteractor, adapterSlot.captured.interactor)
|
|
|
|
assertSame(trayInteractor, adapter.interactor)
|
|
|
|
assertSame(browserInteractor, adapterSlot.captured.browserInteractor)
|
|
|
|
assertSame(browserInteractor, adapter.browserInteractor)
|
|
|
|
assertSame(navigationInteractor, adapterSlot.captured.navInteractor)
|
|
|
|
assertSame(navigationInteractor, adapter.navInteractor)
|
|
|
|
assertSame(browserStore, adapterSlot.captured.browserStore)
|
|
|
|
assertSame(browserStore, adapter.browserStore)
|
|
|
|
verify { tray.isUserInputEnabled = false }
|
|
|
|
assertFalse(tabsTrayBinding.tabsTray.isUserInputEnabled)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
@ -238,13 +230,10 @@ class TabsTrayFragmentTest {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
mockkStatic("org.mozilla.fenix.tabstray.ext.BrowserMenuKt")
|
|
|
|
mockkStatic("org.mozilla.fenix.tabstray.ext.BrowserMenuKt")
|
|
|
|
val navigationInteractor: NavigationInteractor = mockk()
|
|
|
|
val navigationInteractor: NavigationInteractor = mockk()
|
|
|
|
val threeDotMenu = ImageButton(testContext)
|
|
|
|
|
|
|
|
every { view.tab_tray_overflow } returns threeDotMenu
|
|
|
|
|
|
|
|
val metrics: MetricController = mockk(relaxed = true)
|
|
|
|
val metrics: MetricController = mockk(relaxed = true)
|
|
|
|
every { context.components.analytics.metrics } returns metrics
|
|
|
|
every { context.components.analytics.metrics } returns metrics
|
|
|
|
every { context.components.core.store } returns mockk()
|
|
|
|
every { context.components.core.store } returns mockk()
|
|
|
|
every { fragment.tabsTrayStore } returns mockk()
|
|
|
|
every { fragment.tabsTrayStore } returns mockk()
|
|
|
|
every { fragment.tab_layout } returns mockk<TabLayout>()
|
|
|
|
|
|
|
|
val menu: BrowserMenu = mockk {
|
|
|
|
val menu: BrowserMenu = mockk {
|
|
|
|
every { showWithTheme(any()) } just Runs
|
|
|
|
every { showWithTheme(any()) } just Runs
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -253,12 +242,12 @@ class TabsTrayFragmentTest {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
every { fragment.getTrayMenu(any(), any(), any(), any(), any()) } returns menuBuilder
|
|
|
|
every { fragment.getTrayMenu(any(), any(), any(), any(), any()) } returns menuBuilder
|
|
|
|
|
|
|
|
|
|
|
|
fragment.setupMenu(view, navigationInteractor)
|
|
|
|
fragment.setupMenu(navigationInteractor)
|
|
|
|
threeDotMenu.performClick()
|
|
|
|
tabsTrayBinding.tabTrayOverflow.performClick()
|
|
|
|
|
|
|
|
|
|
|
|
verify { metrics.track(Event.TabsTrayMenuOpened) }
|
|
|
|
verify { metrics.track(Event.TabsTrayMenuOpened) }
|
|
|
|
verify { menuBuilder.build() }
|
|
|
|
verify { menuBuilder.build() }
|
|
|
|
verify { menu.showWithTheme(threeDotMenu) }
|
|
|
|
verify { menu.showWithTheme(tabsTrayBinding.tabTrayOverflow) }
|
|
|
|
} finally {
|
|
|
|
} finally {
|
|
|
|
unmockkStatic("org.mozilla.fenix.tabstray.ext.BrowserMenuKt")
|
|
|
|
unmockkStatic("org.mozilla.fenix.tabstray.ext.BrowserMenuKt")
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -284,16 +273,12 @@ class TabsTrayFragmentTest {
|
|
|
|
fun `WHEN setupBackgroundDismissalListener is called THEN it sets a click listener for tray's tabLayout and handle`() {
|
|
|
|
fun `WHEN setupBackgroundDismissalListener is called THEN it sets a click listener for tray's tabLayout and handle`() {
|
|
|
|
var clickCount = 0
|
|
|
|
var clickCount = 0
|
|
|
|
val callback: (View) -> Unit = { clickCount++ }
|
|
|
|
val callback: (View) -> Unit = { clickCount++ }
|
|
|
|
val tabLayout = CoordinatorLayout(testContext)
|
|
|
|
|
|
|
|
val handle = Button(testContext)
|
|
|
|
|
|
|
|
every { fragment.tabLayout } returns tabLayout
|
|
|
|
|
|
|
|
every { fragment.handle } returns handle
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fragment.setupBackgroundDismissalListener(callback)
|
|
|
|
fragment.setupBackgroundDismissalListener(callback)
|
|
|
|
|
|
|
|
|
|
|
|
tabLayout.performClick()
|
|
|
|
tabsTrayDialogBinding.tabLayout.performClick()
|
|
|
|
assertEquals(1, clickCount)
|
|
|
|
assertEquals(1, clickCount)
|
|
|
|
handle.performClick()
|
|
|
|
tabsTrayBinding.handle.performClick()
|
|
|
|
assertEquals(2, clickCount)
|
|
|
|
assertEquals(2, clickCount)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -337,14 +322,20 @@ class TabsTrayFragmentTest {
|
|
|
|
val tabLayout: TabLayout = mockk {
|
|
|
|
val tabLayout: TabLayout = mockk {
|
|
|
|
every { getTabAt(any()) } returns tab
|
|
|
|
every { getTabAt(any()) } returns tab
|
|
|
|
}
|
|
|
|
}
|
|
|
|
every { fragment.tab_layout } returns tabLayout
|
|
|
|
|
|
|
|
every { fragment.tabsTray } returns tabsTray
|
|
|
|
mockkStatic(ViewBindings::class) {
|
|
|
|
|
|
|
|
every { ViewBindings.findChildViewById<View>(tabsTrayBinding.root, tabsTrayBinding.tabsTray.id) } returns tabsTray
|
|
|
|
|
|
|
|
every { ViewBindings.findChildViewById<View>(tabsTrayBinding.root, tabsTrayBinding.tabLayout.id) } returns tabLayout
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tabsTrayBinding = ComponentTabstray2Binding.bind(tabsTrayBinding.root)
|
|
|
|
|
|
|
|
fragment._tabsTrayBinding = tabsTrayBinding
|
|
|
|
|
|
|
|
|
|
|
|
fragment.selectTabPosition(2, true)
|
|
|
|
fragment.selectTabPosition(2, true)
|
|
|
|
|
|
|
|
|
|
|
|
verify { tabsTray.setCurrentItem(2, true) }
|
|
|
|
verify { tabsTray.setCurrentItem(2, true) }
|
|
|
|
verify { tab.select() }
|
|
|
|
verify { tab.select() }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
|
fun `WHEN dismissTabsTray is called THEN it dismisses the tray`() {
|
|
|
|
fun `WHEN dismissTabsTray is called THEN it dismisses the tray`() {
|
|
|
@ -371,9 +362,10 @@ class TabsTrayFragmentTest {
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
|
fun `WHEN the tabs tray is declared in XML THEN certain options are set for the behavior`() {
|
|
|
|
fun `WHEN the tabs tray is declared in XML THEN certain options are set for the behavior`() {
|
|
|
|
val view: View = LayoutInflater.from(testContext)
|
|
|
|
tabsTrayBinding = ComponentTabstray2Binding.inflate(
|
|
|
|
.inflate(R.layout.component_tabstray2, CoordinatorLayout(testContext), true)
|
|
|
|
LayoutInflater.from(testContext), CoordinatorLayout(testContext), true
|
|
|
|
val behavior = BottomSheetBehavior.from(view.tab_wrapper)
|
|
|
|
)
|
|
|
|
|
|
|
|
val behavior = BottomSheetBehavior.from(tabsTrayBinding.tabWrapper)
|
|
|
|
|
|
|
|
|
|
|
|
Assert.assertFalse(behavior.isFitToContents)
|
|
|
|
Assert.assertFalse(behavior.isFitToContents)
|
|
|
|
Assert.assertFalse(behavior.skipCollapsed)
|
|
|
|
Assert.assertFalse(behavior.skipCollapsed)
|
|
|
@ -382,55 +374,31 @@ class TabsTrayFragmentTest {
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
|
fun `GIVEN a grid TabView WHEN onConfigurationChanged is called THEN the adapter structure is updated`() {
|
|
|
|
fun `GIVEN a grid TabView WHEN onConfigurationChanged is called THEN the adapter structure is updated`() {
|
|
|
|
val tray: ViewPager2 = mockk(relaxed = true)
|
|
|
|
|
|
|
|
val store: TabsTrayStore = mockk()
|
|
|
|
|
|
|
|
val trayInteractor: TabsTrayInteractor = mockk()
|
|
|
|
|
|
|
|
val browserInteractor: BrowserTrayInteractor = mockk()
|
|
|
|
|
|
|
|
val navigationInteractor: NavigationInteractor = mockk()
|
|
|
|
|
|
|
|
val browserStore: BrowserStore = mockk()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
every { fragment.tabsTray } returns tray
|
|
|
|
|
|
|
|
every { context.components.core.store } returns browserStore
|
|
|
|
|
|
|
|
every { context.settings().gridTabView } returns true
|
|
|
|
every { context.settings().gridTabView } returns true
|
|
|
|
|
|
|
|
val adapter = mockk<TrayPagerAdapter>(relaxed = true)
|
|
|
|
fragment.setupPager(
|
|
|
|
tabsTrayBinding.tabsTray.adapter = adapter
|
|
|
|
context, store, trayInteractor, browserInteractor, navigationInteractor
|
|
|
|
fragment._tabsTrayBinding = tabsTrayBinding
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val trayBehaviorManager: TabSheetBehaviorManager = mockk(relaxed = true)
|
|
|
|
val trayBehaviorManager: TabSheetBehaviorManager = mockk(relaxed = true)
|
|
|
|
fragment.trayBehaviorManager = trayBehaviorManager
|
|
|
|
fragment.trayBehaviorManager = trayBehaviorManager
|
|
|
|
|
|
|
|
|
|
|
|
val newConfiguration = Configuration()
|
|
|
|
val newConfiguration = Configuration()
|
|
|
|
|
|
|
|
|
|
|
|
fragment.onConfigurationChanged(newConfiguration)
|
|
|
|
fragment.onConfigurationChanged(newConfiguration)
|
|
|
|
|
|
|
|
|
|
|
|
verify { tray.adapter?.notifyDataSetChanged() }
|
|
|
|
verify { adapter.notifyDataSetChanged() }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
|
fun `GIVEN a list TabView WHEN onConfigurationChanged is called THEN the adapter structure is NOT updated`() {
|
|
|
|
fun `GIVEN a list TabView WHEN onConfigurationChanged is called THEN the adapter structure is NOT updated`() {
|
|
|
|
val tray: ViewPager2 = mockk(relaxed = true)
|
|
|
|
|
|
|
|
val store: TabsTrayStore = mockk()
|
|
|
|
|
|
|
|
val trayInteractor: TabsTrayInteractor = mockk()
|
|
|
|
|
|
|
|
val browserInteractor: BrowserTrayInteractor = mockk()
|
|
|
|
|
|
|
|
val navigationInteractor: NavigationInteractor = mockk()
|
|
|
|
|
|
|
|
val browserStore: BrowserStore = mockk()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
every { fragment.tabsTray } returns tray
|
|
|
|
|
|
|
|
every { context.components.core.store } returns browserStore
|
|
|
|
|
|
|
|
every { context.settings().gridTabView } returns false
|
|
|
|
every { context.settings().gridTabView } returns false
|
|
|
|
|
|
|
|
val adapter = mockk<TrayPagerAdapter>(relaxed = true)
|
|
|
|
fragment.setupPager(
|
|
|
|
tabsTrayBinding.tabsTray.adapter = adapter
|
|
|
|
context, store, trayInteractor, browserInteractor, navigationInteractor
|
|
|
|
fragment._tabsTrayBinding = tabsTrayBinding
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val trayBehaviorManager: TabSheetBehaviorManager = mockk(relaxed = true)
|
|
|
|
val trayBehaviorManager: TabSheetBehaviorManager = mockk(relaxed = true)
|
|
|
|
fragment.trayBehaviorManager = trayBehaviorManager
|
|
|
|
fragment.trayBehaviorManager = trayBehaviorManager
|
|
|
|
|
|
|
|
|
|
|
|
val newConfiguration = Configuration()
|
|
|
|
val newConfiguration = Configuration()
|
|
|
|
|
|
|
|
|
|
|
|
fragment.onConfigurationChanged(newConfiguration)
|
|
|
|
fragment.onConfigurationChanged(newConfiguration)
|
|
|
|
|
|
|
|
|
|
|
|
verify(exactly = 0) { tray.adapter?.notifyDataSetChanged() }
|
|
|
|
verify(exactly = 0) { adapter.notifyDataSetChanged() }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|