For #22569: Remove allopen plugin and Mockable annotations

This commit is contained in:
Grisha Kruglov 2021-11-26 00:58:02 -08:00 committed by mergify[bot]
parent b41542dc5e
commit 8de4c0b4db
69 changed files with 288 additions and 233 deletions

View File

@ -237,18 +237,6 @@ android {
}
// -------------------------------------------------------------------------------------------------
// Set up kotlin-allopen plugin for writing tests
// -------------------------------------------------------------------------------------------------
boolean hasTest = gradle.startParameter.taskNames.find { it.contains("test") || it.contains("Test") } != null
if (hasTest) {
apply plugin: 'kotlin-allopen'
allOpen {
annotation("org.mozilla.fenix.utils.OpenClass")
}
}
android.applicationVariants.all { variant ->
// -------------------------------------------------------------------------------------------------

View File

@ -379,8 +379,9 @@ abstract class BaseBrowserFragment :
)
_browserToolbarView = BrowserToolbarView(
context = context,
container = binding.browserLayout,
toolbarPosition = context.settings().toolbarPosition,
settings = context.settings(),
interactor = browserToolbarInteractor,
customTabSession = customTabSessionId?.let { store.state.findCustomTab(it) },
lifecycleOwner = viewLifecycleOwner

View File

@ -26,7 +26,6 @@ import org.mozilla.fenix.experiments.NimbusFeatures
import org.mozilla.fenix.experiments.createNimbus
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.perf.lazyMonitored
import org.mozilla.fenix.utils.Mockable
import org.mozilla.geckoview.BuildConfig.MOZ_APP_BUILDID
import org.mozilla.geckoview.BuildConfig.MOZ_APP_VENDOR
import org.mozilla.geckoview.BuildConfig.MOZ_APP_VERSION
@ -35,7 +34,6 @@ import org.mozilla.geckoview.BuildConfig.MOZ_UPDATE_CHANNEL
/**
* Component group for all functionality related to analytics e.g. crash reporting and telemetry.
*/
@Mockable
class Analytics(
private val context: Context
) {

View File

@ -45,14 +45,12 @@ import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.perf.lazyMonitored
import org.mozilla.fenix.sync.SyncedTabsIntegration
import org.mozilla.fenix.utils.Mockable
import org.mozilla.fenix.utils.Settings
/**
* Component group for background services. These are the components that need to be accessed from within a
* background worker.
*/
@Mockable
@Suppress("LongParameterList")
class BackgroundServices(
private val context: Context,

View File

@ -35,7 +35,6 @@ import org.mozilla.fenix.perf.StartupStateProvider
import org.mozilla.fenix.perf.StrictModeManager
import org.mozilla.fenix.perf.lazyMonitored
import org.mozilla.fenix.utils.ClipboardHandler
import org.mozilla.fenix.utils.Mockable
import org.mozilla.fenix.utils.Settings
import org.mozilla.fenix.wifi.WifiConnectionMonitor
import java.util.concurrent.TimeUnit
@ -49,7 +48,6 @@ private const val AMO_COLLECTION_MAX_CACHE_AGE = 2 * 24 * 60L // Two days in min
* Note: these aren't just "components" from "android-components": they're any "component" that
* can be considered a building block of our app.
*/
@Mockable
class Components(private val context: Context) {
val backgroundServices by lazyMonitored {
BackgroundServices(

View File

@ -83,7 +83,6 @@ import org.mozilla.fenix.perf.lazyMonitored
import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.settings.advanced.getSelectedLocale
import org.mozilla.fenix.telemetry.TelemetryMiddleware
import org.mozilla.fenix.utils.Mockable
import org.mozilla.fenix.utils.getUndoDelay
import org.mozilla.geckoview.GeckoRuntime
import java.util.concurrent.TimeUnit
@ -91,7 +90,6 @@ import java.util.concurrent.TimeUnit
/**
* Component group for all core browser functionality.
*/
@Mockable
@Suppress("LargeClass")
class Core(
private val context: Context,

View File

@ -22,9 +22,7 @@ import org.mozilla.fenix.R
import org.mozilla.fenix.databinding.FenixSnackbarBinding
import org.mozilla.fenix.ext.increaseTapArea
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.utils.Mockable
@Mockable
class FenixSnackbar private constructor(
parent: ViewGroup,
private val binding: FenixSnackbarBinding,

View File

@ -17,7 +17,6 @@ import mozilla.components.feature.findinpage.FindInPageFeature
import mozilla.components.feature.findinpage.view.FindInPageView
import mozilla.components.support.base.feature.LifecycleAwareFeature
import org.mozilla.fenix.components.FindInPageIntegration.ToolbarInfo
import org.mozilla.fenix.utils.Mockable
/**
* BrowserFragment delegate to handle all layout updates needed to show or hide the find in page bar.
@ -28,7 +27,6 @@ import org.mozilla.fenix.utils.Mockable
* to suit the find in page bar.
* @param toolbarInfo [ToolbarInfo] used to configure the [BrowserToolbar] while the find in page bar is shown.
*/
@Mockable
class FindInPageIntegration(
private val store: BrowserStore,
private val sessionId: String? = null,

View File

@ -22,12 +22,10 @@ import mozilla.components.support.migration.state.MigrationStore
import org.mozilla.fenix.customtabs.FennecWebAppIntentProcessor
import org.mozilla.fenix.home.intent.FennecBookmarkShortcutsIntentProcessor
import org.mozilla.fenix.perf.lazyMonitored
import org.mozilla.fenix.utils.Mockable
/**
* Component group for miscellaneous components.
*/
@Mockable
@Suppress("LongParameterList")
class IntentProcessors(
private val context: Context,

View File

@ -12,10 +12,8 @@ import kotlinx.coroutines.withContext
import mozilla.components.concept.engine.permission.SitePermissions
import mozilla.components.concept.engine.permission.SitePermissionsStorage
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.utils.Mockable
import kotlin.coroutines.CoroutineContext
@Mockable
class PermissionStorage(
private val context: Context,
@VisibleForTesting internal val dispatcher: CoroutineContext = Dispatchers.IO,

View File

@ -16,12 +16,10 @@ import org.mozilla.fenix.R
import org.mozilla.fenix.ext.getPreferenceKey
import org.mozilla.fenix.perf.lazyMonitored
import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.utils.Mockable
/**
* Component group which encapsulates foreground-friendly services.
*/
@Mockable
class Services(
private val context: Context,
private val accountManager: FxaAccountManager

View File

@ -23,9 +23,7 @@ import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.toShortUrl
import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder
import org.mozilla.fenix.perf.StrictModeManager
import org.mozilla.fenix.utils.Mockable
@Mockable
class TabCollectionStorage(
private val context: Context,
strictMode: StrictModeManager,

View File

@ -25,13 +25,11 @@ import mozilla.components.feature.top.sites.TopSitesUseCases
import mozilla.components.support.locale.LocaleUseCases
import org.mozilla.fenix.components.bookmarks.BookmarksUseCase
import org.mozilla.fenix.perf.lazyMonitored
import org.mozilla.fenix.utils.Mockable
/**
* Component group for all use cases. Use cases are provided by feature
* modules and can be triggered by UI interactions.
*/
@Mockable
@Suppress("LongParameterList")
class UseCases(
private val context: Context,

View File

@ -4,6 +4,7 @@
package org.mozilla.fenix.components.toolbar
import android.content.Context
import android.graphics.Color
import android.view.HapticFeedbackConstants
import android.view.LayoutInflater
@ -28,30 +29,29 @@ import org.mozilla.fenix.customtabs.CustomTabToolbarIntegration
import org.mozilla.fenix.customtabs.CustomTabToolbarMenu
import org.mozilla.fenix.ext.bookmarkStorage
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.theme.ThemeManager
import org.mozilla.fenix.utils.Settings
import org.mozilla.fenix.utils.ToolbarPopupWindow
import java.lang.ref.WeakReference
import mozilla.components.browser.toolbar.behavior.ToolbarPosition as MozacToolbarPosition
@SuppressWarnings("LargeClass")
class BrowserToolbarView(
private val container: ViewGroup,
private val toolbarPosition: ToolbarPosition,
context: Context,
container: ViewGroup,
private val settings: Settings,
private val interactor: BrowserToolbarInteractor,
private val customTabSession: CustomTabSessionState?,
private val lifecycleOwner: LifecycleOwner
) {
private val settings = container.context.settings()
@LayoutRes
private val toolbarLayout = when (settings.toolbarPosition) {
ToolbarPosition.BOTTOM -> R.layout.component_bottom_browser_toolbar
ToolbarPosition.TOP -> R.layout.component_browser_top_toolbar
}
private val layout = LayoutInflater.from(container.context)
private val layout = LayoutInflater.from(context)
.inflate(toolbarLayout, container, true)
@VisibleForTesting
@ -78,7 +78,7 @@ class BrowserToolbarView(
true
}
with(container.context) {
with(context) {
val isPinningSupported = components.useCases.webAppUseCases.isPinningSupported()
view.apply {
@ -94,22 +94,22 @@ class BrowserToolbarView(
false
}
display.progressGravity = when (toolbarPosition) {
display.progressGravity = when (settings.toolbarPosition) {
ToolbarPosition.BOTTOM -> DisplayToolbar.Gravity.TOP
ToolbarPosition.TOP -> DisplayToolbar.Gravity.BOTTOM
}
val primaryTextColor = ContextCompat.getColor(
container.context,
ThemeManager.resolveAttribute(R.attr.primaryText, container.context)
context,
ThemeManager.resolveAttribute(R.attr.primaryText, context)
)
val secondaryTextColor = ContextCompat.getColor(
container.context,
ThemeManager.resolveAttribute(R.attr.secondaryText, container.context)
context,
ThemeManager.resolveAttribute(R.attr.secondaryText, context)
)
val separatorColor = ContextCompat.getColor(
container.context,
ThemeManager.resolveAttribute(R.attr.toolbarDivider, container.context)
context,
ThemeManager.resolveAttribute(R.attr.toolbarDivider, context)
)
display.urlFormatter = { url -> URLStringUtils.toDisplayUrl(url) }
@ -137,7 +137,7 @@ class BrowserToolbarView(
context = this,
store = components.core.store,
sessionId = customTabSession?.id,
shouldReverseItems = toolbarPosition == ToolbarPosition.TOP,
shouldReverseItems = settings.toolbarPosition == ToolbarPosition.TOP,
onItemTapped = {
it.performHapticIfNeeded(view)
interactor.onBrowserToolbarMenuItemTapped(it)

View File

@ -21,7 +21,6 @@ import mozilla.components.support.ktx.android.os.resetAfter
import org.mozilla.fenix.Config
import org.mozilla.fenix.components.Components
import org.mozilla.fenix.utils.ManufacturerCodes
import org.mozilla.fenix.utils.Mockable
import java.util.concurrent.Executors
import java.util.concurrent.atomic.AtomicLong
@ -33,8 +32,7 @@ private val mainLooper = Looper.getMainLooper()
/**
* Manages strict mode settings for the application.
*/
@Mockable
class StrictModeManager(
open class StrictModeManager(
config: Config,
// Ideally, we'd pass in a more specific value but there is a circular dependency: StrictMode
@ -112,7 +110,7 @@ class StrictModeManager(
*
* @return the value returned by [functionBlock].
*/
fun <R> resetAfter(policy: StrictMode.ThreadPolicy, functionBlock: () -> R): R {
open fun <R> resetAfter(policy: StrictMode.ThreadPolicy, functionBlock: () -> R): R {
fun instrumentedFunctionBlock(): R {
val startProfilerTime = components.core.engine.profiler?.getProfilerTime()

View File

@ -190,6 +190,7 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
toolbarView = ToolbarView(
requireContext(),
requireContext().settings(),
interactor,
historyStorageProvider(),
isPrivate,

View File

@ -19,8 +19,8 @@ import mozilla.components.support.ktx.android.content.getColorFromAttr
import mozilla.components.support.ktx.android.content.res.resolveAttribute
import mozilla.components.support.ktx.android.view.hideKeyboard
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.search.SearchFragmentState
import org.mozilla.fenix.utils.Settings
/**
* Interface for the Toolbar Interactor. This interface is implemented by objects that want
@ -53,6 +53,7 @@ interface ToolbarInteractor {
@Suppress("LongParameterList")
class ToolbarView(
private val context: Context,
settings: Settings,
private val interactor: ToolbarInteractor,
private val historyStorage: HistoryStorage?,
private val isPrivate: Boolean,
@ -115,7 +116,7 @@ class ToolbarView(
val engineForSpeculativeConnects = if (!isPrivate) engine else null
if (context.settings().shouldAutocompleteInAwesomebar) {
if (settings.shouldAutocompleteInAwesomebar) {
ToolbarAutocompleteFeature(
view,
engineForSpeculativeConnects

View File

@ -1,20 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.utils
// Annotations for testing.
/**
* Annotate a class with [OpenClass] to open a class for mocking purposes while keeping it final in release builds
*/
@Target(AnnotationTarget.ANNOTATION_CLASS)
annotation class OpenClass
/**
* Annotate a class with [Mockable] to make it extensible in debug builds
*/
@OpenClass
@Target(AnnotationTarget.CLASS)
annotation class Mockable

View File

@ -22,6 +22,8 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.AppRequestInterceptor.Companion.HIGH_RISK_ERROR_PAGES
import org.mozilla.fenix.AppRequestInterceptor.Companion.LOW_AND_MEDIUM_RISK_ERROR_PAGES
import org.mozilla.fenix.components.Services
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.isOnline
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@ -64,6 +66,7 @@ class AppRequestInterceptorTest {
@Test
fun `GIVEN request to install add-on WHEN on a different domain THEN no add-on installation is started`() {
every { testContext.components.services } returns Services(testContext, mockk(relaxed = true))
val result = interceptor.onLoadRequest(
engineSession = mockk(),
uri = "https://addons.mozilla.org/android/downloads/file/12345678/test.xpi",
@ -81,6 +84,7 @@ class AppRequestInterceptorTest {
@Test
fun `GIVEN invalid request to install add-on WHEN on same domain and triggered by user THEN no add-on installation is started`() {
every { testContext.components.services } returns Services(testContext, mockk(relaxed = true))
val result = interceptor.onLoadRequest(
engineSession = mockk(),
uri = "https://addons.mozilla.org/android/downloads/file/12345678/test.invalid",
@ -98,6 +102,7 @@ class AppRequestInterceptorTest {
@Test
fun `GIVEN request to install add-on WHEN not triggered by user THEN no add-on installation is started`() {
every { testContext.components.services } returns Services(testContext, mockk(relaxed = true))
val result = interceptor.onLoadRequest(
engineSession = mockk(),
uri = "https://addons.mozilla.org/android/downloads/file/12345678/test.xpi",
@ -115,6 +120,7 @@ class AppRequestInterceptorTest {
@Test
fun `GIVEN any request WHEN on same domain and triggered by user THEN no add-on installation is started`() {
every { testContext.components.services } returns Services(testContext, mockk(relaxed = true))
val result = interceptor.onLoadRequest(
engineSession = mockk(),
uri = "https://blog.mozilla.org/blog/2020/10/20/mozilla-reaction-to-u-s-v-google/",
@ -132,6 +138,7 @@ class AppRequestInterceptorTest {
@Test
fun `onErrorRequest results in correct error page for low risk level error`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
setOf(
ErrorType.UNKNOWN,
ErrorType.ERROR_NET_INTERRUPT,
@ -165,6 +172,7 @@ class AppRequestInterceptorTest {
@Test
fun `onErrorRequest results in correct error page for medium risk level error`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
setOf(
ErrorType.ERROR_SECURITY_BAD_CERT,
ErrorType.ERROR_SECURITY_SSL,
@ -182,6 +190,7 @@ class AppRequestInterceptorTest {
@Test
fun `onErrorRequest results in correct error page for high risk level error`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
setOf(
ErrorType.ERROR_SAFEBROWSING_HARMFUL_URI,
ErrorType.ERROR_SAFEBROWSING_MALWARE_URI,

View File

@ -30,6 +30,7 @@ import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.helpers.perf.TestStrictModeManager
import org.mozilla.fenix.utils.Settings
@RunWith(FenixRobolectricTestRunner::class)
@ -60,6 +61,7 @@ class HomeActivityTest {
@Test
fun `getModeFromIntentOrLastKnown returns mode from settings when intent does not set`() {
every { testContext.settings() } returns Settings(testContext)
every { activity.applicationContext } returns testContext
testContext.settings().lastKnownMode = BrowsingMode.Private
@ -68,6 +70,7 @@ class HomeActivityTest {
@Test
fun `getModeFromIntentOrLastKnown returns mode from intent when set`() {
every { testContext.settings() } returns Settings(testContext)
testContext.settings().lastKnownMode = BrowsingMode.Normal
val intent = Intent()
@ -139,6 +142,7 @@ class HomeActivityTest {
@Test
fun `GIVEN the user has been away for a long time WHEN the user opens the app THEN do start on home`() {
every { testContext.components.strictMode } returns TestStrictModeManager()
val settings: Settings = mockk()
val startingIntent = Intent().apply {
action = Intent.ACTION_MAIN
@ -153,6 +157,7 @@ class HomeActivityTest {
@Test
fun `GIVEN the user has been away for a long time WHEN opening a link THEN do not start on home`() {
every { testContext.components.strictMode } returns TestStrictModeManager()
val settings: Settings = mockk()
val startingIntent = Intent().apply {
action = Intent.ACTION_VIEW

View File

@ -16,7 +16,6 @@ import io.mockk.unmockkStatic
import io.mockk.verify
import kotlinx.coroutines.test.runBlockingTest
import mozilla.components.feature.intent.processing.IntentProcessor
import mozilla.components.support.test.robolectric.testContext
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
@ -28,6 +27,7 @@ import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.helpers.perf.TestStrictModeManager
import org.mozilla.fenix.shortcut.NewTabShortcutIntentProcessor
import org.mozilla.fenix.utils.Settings
import org.robolectric.Robolectric
@ -201,10 +201,7 @@ class IntentReceiverActivityTest {
every { activity.settings() } returns settings
every { activity.components.analytics } returns mockk(relaxed = true)
every { activity.components.intentProcessors } returns intentProcessors
// For some reason, activity.components doesn't return application.components, which is the
// globally defined TestComponents, so we redirect it.
every { activity.components.strictMode } returns testContext.components.strictMode
every { activity.components.strictMode } returns TestStrictModeManager()
}
private inline fun <reified T : IntentProcessor> mockIntentProcessor(): T {

View File

@ -26,20 +26,24 @@ import mozilla.components.ui.widgets.VerticalSwipeRefreshLayout
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.utils.Settings
@RunWith(FenixRobolectricTestRunner::class)
class BaseBrowserFragmentTest {
private lateinit var fragment: TestBaseBrowserFragment
private lateinit var swipeRefreshLayout: VerticalSwipeRefreshLayout
private lateinit var engineView: EngineView
private lateinit var settings: Settings
@Before
fun setup() {
fragment = spyk(TestBaseBrowserFragment())
swipeRefreshLayout = mockk(relaxed = true)
engineView = mockk(relaxed = true)
settings = mockk(relaxed = true)
every { testContext.components.settings } returns settings
every { fragment.isAdded } returns true
every { fragment.activity } returns mockk()
every { fragment.requireContext() } returns testContext
@ -50,8 +54,8 @@ class BaseBrowserFragmentTest {
@Test
fun `initializeEngineView should setDynamicToolbarMaxHeight to 0 if top toolbar is forced for a11y`() {
every { testContext.settings().shouldUseBottomToolbar } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns true
every { settings.shouldUseBottomToolbar } returns false
every { settings.shouldUseFixedTopToolbar } returns true
fragment.initializeEngineView(13)
@ -60,8 +64,8 @@ class BaseBrowserFragmentTest {
@Test
fun `initializeEngineView should setDynamicToolbarMaxHeight to 0 if bottom toolbar is forced for a11y`() {
every { testContext.settings().shouldUseBottomToolbar } returns true
every { testContext.settings().shouldUseFixedTopToolbar } returns true
every { settings.shouldUseBottomToolbar } returns true
every { settings.shouldUseFixedTopToolbar } returns true
fragment.initializeEngineView(13)
@ -70,8 +74,8 @@ class BaseBrowserFragmentTest {
@Test
fun `initializeEngineView should setDynamicToolbarMaxHeight to toolbar height if dynamic toolbar is enabled`() {
every { testContext.settings().shouldUseFixedTopToolbar } returns false
every { testContext.settings().isDynamicToolbarEnabled } returns true
every { settings.shouldUseFixedTopToolbar } returns false
every { settings.isDynamicToolbarEnabled } returns true
fragment.initializeEngineView(13)
@ -80,8 +84,8 @@ class BaseBrowserFragmentTest {
@Test
fun `initializeEngineView should setDynamicToolbarMaxHeight to 0 if dynamic toolbar is disabled`() {
every { testContext.settings().shouldUseFixedTopToolbar } returns false
every { testContext.settings().isDynamicToolbarEnabled } returns false
every { settings.shouldUseFixedTopToolbar } returns false
every { settings.isDynamicToolbarEnabled } returns false
fragment.initializeEngineView(13)
@ -90,8 +94,8 @@ class BaseBrowserFragmentTest {
@Test
fun `initializeEngineView should set EngineViewBrowserToolbarBehavior when dynamic toolbar is enabled`() {
every { testContext.settings().shouldUseFixedTopToolbar } returns false
every { testContext.settings().isDynamicToolbarEnabled } returns true
every { settings.shouldUseFixedTopToolbar } returns false
every { settings.isDynamicToolbarEnabled } returns true
val params: CoordinatorLayout.LayoutParams = mockk(relaxed = true)
every { params.behavior } returns mockk(relaxed = true)
every { swipeRefreshLayout.layoutParams } returns params
@ -106,8 +110,8 @@ class BaseBrowserFragmentTest {
@Test
fun `initializeEngineView should set toolbar height as EngineView parent's bottom margin when using bottom toolbar`() {
every { testContext.settings().isDynamicToolbarEnabled } returns false
every { testContext.settings().shouldUseBottomToolbar } returns true
every { settings.isDynamicToolbarEnabled } returns false
every { settings.shouldUseBottomToolbar } returns true
fragment.initializeEngineView(13)
@ -116,8 +120,8 @@ class BaseBrowserFragmentTest {
@Test
fun `initializeEngineView should set toolbar height as EngineView parent's bottom margin if top toolbar is forced for a11y`() {
every { testContext.settings().shouldUseBottomToolbar } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns true
every { settings.shouldUseBottomToolbar } returns false
every { settings.shouldUseFixedTopToolbar } returns true
fragment.initializeEngineView(13)
@ -126,8 +130,8 @@ class BaseBrowserFragmentTest {
@Test
fun `initializeEngineView should set toolbar height as EngineView parent's bottom margin if bottom toolbar is forced for a11y`() {
every { testContext.settings().shouldUseBottomToolbar } returns true
every { testContext.settings().shouldUseFixedTopToolbar } returns true
every { settings.shouldUseBottomToolbar } returns true
every { settings.shouldUseFixedTopToolbar } returns true
fragment.initializeEngineView(13)

View File

@ -5,18 +5,22 @@
package org.mozilla.fenix.browser.infobanner
import androidx.coordinatorlayout.widget.CoordinatorLayout
import io.mockk.every
import io.mockk.mockk
import io.mockk.spyk
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class)
class DynamicInfoBannerTest {
@Test
fun `showBanner should set DynamicInfoBannerBehavior as behavior if scrollWithTopToolbar`() {
every { testContext.components.settings } returns mockk(relaxed = true)
val banner = spyk(
DynamicInfoBanner(
testContext, CoordinatorLayout(testContext), true, "", ""
@ -30,6 +34,7 @@ class DynamicInfoBannerTest {
@Test
fun `showBanner should not set a behavior if not scrollWithTopToolbar`() {
every { testContext.components.settings } returns mockk(relaxed = true)
val banner = spyk(
DynamicInfoBanner(
testContext, CoordinatorLayout(testContext), false, "", ""

View File

@ -6,10 +6,11 @@ package org.mozilla.fenix.collections
import io.mockk.MockKAnnotations
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.mockk
import kotlinx.coroutines.CompletableDeferred
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.createTab
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.test.robolectric.createAddedTestFragment
import mozilla.components.support.test.robolectric.testContext
@ -18,8 +19,10 @@ import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.components.TabCollectionStorage
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.helpers.perf.TestStrictModeManager
private const val URL_MOZILLA = "www.mozilla.org"
private const val SESSION_ID_MOZILLA = "0"
@ -29,7 +32,7 @@ private const val SESSION_ID_BCC = "1"
@RunWith(FenixRobolectricTestRunner::class)
class CollectionCreationFragmentTest {
@MockK(relaxed = true) private lateinit var publicSuffixList: PublicSuffixList
private val publicSuffixList = mockk<PublicSuffixList>(relaxed = true)
private val sessionMozilla = createTab(URL_MOZILLA, id = SESSION_ID_MOZILLA)
private val sessionBcc = createTab(URL_BCC, id = SESSION_ID_BCC)
@ -42,13 +45,16 @@ class CollectionCreationFragmentTest {
MockKAnnotations.init(this)
every { publicSuffixList.stripPublicSuffix(URL_MOZILLA) } returns CompletableDeferred(URL_MOZILLA)
every { publicSuffixList.stripPublicSuffix(URL_BCC) } returns CompletableDeferred(URL_BCC)
every { testContext.components.publicSuffixList } returns publicSuffixList
}
@Test
fun `creation dialog shows and can be dismissed`() {
val store = testContext.components.core.store
every { store.state } returns state
every { testContext.components.analytics } returns mockk(relaxed = true)
every { testContext.components.core.store } returns BrowserStore(state)
every { testContext.components.core.tabCollectionStorage } returns TabCollectionStorage(
testContext, TestStrictModeManager()
)
val fragment = createAddedTestFragment {
CollectionCreationFragment().apply {
arguments = CollectionCreationFragmentArgs(

View File

@ -12,6 +12,7 @@ import io.mockk.every
import io.mockk.just
import io.mockk.mockk
import io.mockk.verify
import mozilla.components.browser.icons.BrowserIcons
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
@ -20,6 +21,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.databinding.CollectionTabListRowBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.home.Tab
@ -59,6 +61,7 @@ class CollectionCreationTabListAdapterTest {
@Test
fun `creates and binds viewholder`() {
every { testContext.components.core.icons } returns BrowserIcons(testContext, mockk(relaxed = true))
adapter.updateData(
tabs = listOf(mozillaTab),
selectedTabs = emptySet(),
@ -87,6 +90,7 @@ class CollectionCreationTabListAdapterTest {
@Test
fun `creates and binds viewholder for selected tab`() {
every { testContext.components.core.icons } returns BrowserIcons(testContext, mockk(relaxed = true))
every { interactor.addTabToSelection(mozillaTab) } just Runs
adapter.updateData(

View File

@ -12,12 +12,14 @@ import io.mockk.just
import io.mockk.mockk
import io.mockk.verify
import mozilla.components.feature.tab.collections.TabCollection
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.databinding.CollectionsListItemBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class)
@ -51,6 +53,7 @@ class SaveCollectionListAdapterTest {
@Test
fun `creates and binds viewholder`() {
every { testContext.components.publicSuffixList } returns PublicSuffixList(testContext)
val collection = mockk<TabCollection> {
every { id } returns 0L
every { title } returns "Collection"

View File

@ -13,6 +13,7 @@ import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.HomeActivity
@ -22,6 +23,10 @@ import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class)
class IntentProcessorTypeTest {
@Before
fun setup() {
every { testContext.components.intentProcessors } returns mockk(relaxed = true)
}
@Test
fun `should open intent with flag launched from history`() {
@ -72,6 +77,7 @@ class IntentProcessorTypeTest {
@Test
fun `get type for private custom tab intent processor`() {
every { testContext.components.intentProcessors } returns mockk(relaxed = true)
val processor = testContext.components.intentProcessors.privateCustomTabIntentProcessor
val type = testContext.components.intentProcessors.getType(processor)

View File

@ -1,39 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.components
import android.content.Context
import io.mockk.mockk
import org.mozilla.fenix.helpers.perf.TestStrictModeManager
import org.mozilla.fenix.utils.ClipboardHandler
import org.mozilla.fenix.utils.Settings
class TestComponents(private val context: Context) : Components(context) {
override val backgroundServices by lazy {
mockk<BackgroundServices>(relaxed = true)
}
override val services by lazy { Services(context, backgroundServices.accountManager) }
override val core by lazy { TestCore(context, analytics.crashReporter) }
@Suppress("Deprecation")
override val useCases by lazy {
UseCases(
context,
core.engine,
core.store,
core.webAppShortcutManager,
core.topSitesStorage,
core.bookmarksStorage,
core.historyStorage
)
}
override val intentProcessors by lazy { mockk<IntentProcessors>(relaxed = true) }
override val analytics by lazy { Analytics(context) }
override val clipboardHandler by lazy { ClipboardHandler(context) }
override val settings by lazy { mockk<Settings>(relaxed = true) }
override val strictMode by lazy { TestStrictModeManager() }
}

View File

@ -1,37 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.components
import android.content.Context
import io.mockk.every
import io.mockk.mockk
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.browser.storage.sync.PlacesBookmarksStorage
import mozilla.components.browser.storage.sync.PlacesHistoryStorage
import mozilla.components.browser.thumbnails.storage.ThumbnailStorage
import mozilla.components.concept.base.crash.CrashReporting
import mozilla.components.concept.engine.Engine
import mozilla.components.concept.engine.Settings
import mozilla.components.concept.fetch.Client
import mozilla.components.feature.pwa.WebAppShortcutManager
import mozilla.components.feature.top.sites.DefaultTopSitesStorage
class TestCore(context: Context, crashReporter: CrashReporting) : Core(
context,
crashReporter,
mockk()
) {
override val engine = mockk<Engine>(relaxed = true) {
every { this@mockk getProperty "settings" } returns mockk<Settings>(relaxed = true)
}
override val store = mockk<BrowserStore>()
override val client = mockk<Client>()
override val webAppShortcutManager = mockk<WebAppShortcutManager>()
override val thumbnailStorage = mockk<ThumbnailStorage>()
override val topSitesStorage = mockk<DefaultTopSitesStorage>()
override val bookmarksStorage = mockk<PlacesBookmarksStorage>()
override val historyStorage = mockk<PlacesHistoryStorage>()
}

View File

@ -16,11 +16,13 @@ import org.junit.Test
import org.junit.runner.RunWith
import mozilla.components.browser.toolbar.BrowserToolbar
import mozilla.components.browser.toolbar.behavior.BrowserToolbarBehavior
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Before
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.utils.Settings
import mozilla.components.browser.toolbar.behavior.ToolbarPosition as MozacToolbarPosition
@RunWith(FenixRobolectricTestRunner::class)
@ -28,17 +30,23 @@ class BrowserToolbarViewTest {
private lateinit var toolbarView: BrowserToolbarView
private lateinit var toolbar: BrowserToolbar
private lateinit var behavior: BrowserToolbarBehavior
private lateinit var settings: Settings
@Before
fun `setup`() {
fun setup() {
toolbar = BrowserToolbar(testContext)
toolbar.layoutParams = CoordinatorLayout.LayoutParams(100, 100)
behavior = spyk(BrowserToolbarBehavior(testContext, null, MozacToolbarPosition.BOTTOM))
(toolbar.layoutParams as CoordinatorLayout.LayoutParams).behavior = behavior
settings = mockk(relaxed = true)
every { testContext.components.useCases } returns mockk(relaxed = true)
every { testContext.components.core } returns mockk(relaxed = true)
every { testContext.components.publicSuffixList } returns PublicSuffixList(testContext)
toolbarView = BrowserToolbarView(
context = testContext,
settings = settings,
container = CoordinatorLayout(testContext),
toolbarPosition = ToolbarPosition.BOTTOM,
interactor = mockk(),
customTabSession = mockk(relaxed = true),
lifecycleOwner = mockk()
@ -50,10 +58,10 @@ class BrowserToolbarViewTest {
@Test
fun `setToolbarBehavior(false) should setDynamicToolbarBehavior if no a11y, bottom toolbar is dynamic and the tab is not for a PWA or TWA`() {
val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns true
every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { settings.isDynamicToolbarEnabled } returns true
every { toolbarViewSpy.isPwaTabOrTwaTab } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns false
every { settings.shouldUseFixedTopToolbar } returns false
toolbarViewSpy.setToolbarBehavior(false)
@ -63,10 +71,10 @@ class BrowserToolbarViewTest {
@Test
fun `setToolbarBehavior(false) should expandToolbarAndMakeItFixed if bottom toolbar is not set as dynamic`() {
val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns false
every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { settings.isDynamicToolbarEnabled } returns false
every { toolbarViewSpy.isPwaTabOrTwaTab } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns false
every { settings.shouldUseFixedTopToolbar } returns false
toolbarViewSpy.setToolbarBehavior(false)
@ -76,10 +84,10 @@ class BrowserToolbarViewTest {
@Test
fun `setToolbarBehavior(false) should expandToolbarAndMakeItFixed if bottom toolbar is dynamic but the tab is for a PWA or TWA`() {
val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns true
every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { settings.isDynamicToolbarEnabled } returns true
every { toolbarViewSpy.isPwaTabOrTwaTab } returns true
every { testContext.settings().shouldUseFixedTopToolbar } returns false
every { settings.shouldUseFixedTopToolbar } returns false
toolbarViewSpy.setToolbarBehavior(false)
@ -89,10 +97,10 @@ class BrowserToolbarViewTest {
@Test
fun `setToolbarBehavior(false) should expandToolbarAndMakeItFixed if bottom toolbar is dynamic tab is not for a PWA or TWA but a11y is enabled`() {
val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns true
every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { settings.isDynamicToolbarEnabled } returns true
every { toolbarViewSpy.isPwaTabOrTwaTab } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns true
every { settings.shouldUseFixedTopToolbar } returns true
toolbarViewSpy.setToolbarBehavior(false)
@ -104,10 +112,10 @@ class BrowserToolbarViewTest {
// All intrinsic checks are met but the method was called with `shouldDisableScroll` = true
val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns true
every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { settings.isDynamicToolbarEnabled } returns true
every { toolbarViewSpy.isPwaTabOrTwaTab } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns false
every { settings.shouldUseFixedTopToolbar } returns false
toolbarViewSpy.setToolbarBehavior(false)
@ -117,10 +125,10 @@ class BrowserToolbarViewTest {
@Test
fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed if bottom toolbar is not set as dynamic`() {
val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns false
every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { settings.isDynamicToolbarEnabled } returns false
every { toolbarViewSpy.isPwaTabOrTwaTab } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns false
every { settings.shouldUseFixedTopToolbar } returns false
toolbarViewSpy.setToolbarBehavior(false)
@ -130,10 +138,10 @@ class BrowserToolbarViewTest {
@Test
fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed if bottom toolbar is dynamic but the tab is for a PWA or TWA`() {
val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns true
every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { settings.isDynamicToolbarEnabled } returns true
every { toolbarViewSpy.isPwaTabOrTwaTab } returns true
every { testContext.settings().shouldUseFixedTopToolbar } returns false
every { settings.shouldUseFixedTopToolbar } returns false
toolbarViewSpy.setToolbarBehavior(false)
@ -143,10 +151,10 @@ class BrowserToolbarViewTest {
@Test
fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed if bottom toolbar is dynamic, the tab is for a PWA or TWA and a11 is enabled`() {
val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns true
every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { settings.isDynamicToolbarEnabled } returns true
every { toolbarViewSpy.isPwaTabOrTwaTab } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns true
every { settings.shouldUseFixedTopToolbar } returns true
toolbarViewSpy.setToolbarBehavior(false)
@ -156,8 +164,8 @@ class BrowserToolbarViewTest {
@Test
fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed for top toolbar if shouldUseFixedTopToolbar`() {
val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.TOP
every { testContext.settings().shouldUseFixedTopToolbar } returns true
every { settings.toolbarPosition } returns ToolbarPosition.TOP
every { settings.shouldUseFixedTopToolbar } returns true
toolbarViewSpy.setToolbarBehavior(true)
@ -167,8 +175,8 @@ class BrowserToolbarViewTest {
@Test
fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed for top toolbar if it is not dynamic`() {
val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.TOP
every { testContext.settings().isDynamicToolbarEnabled } returns false
every { settings.toolbarPosition } returns ToolbarPosition.TOP
every { settings.isDynamicToolbarEnabled } returns false
toolbarViewSpy.setToolbarBehavior(true)
@ -178,7 +186,7 @@ class BrowserToolbarViewTest {
@Test
fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed for top toolbar if shouldDisableScroll`() {
val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.TOP
every { settings.toolbarPosition } returns ToolbarPosition.TOP
toolbarViewSpy.setToolbarBehavior(true)
@ -188,9 +196,9 @@ class BrowserToolbarViewTest {
@Test
fun `setToolbarBehavior(false) should setDynamicToolbarBehavior for top toolbar`() {
val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.TOP
every { testContext.settings().shouldUseFixedTopToolbar } returns true
every { testContext.settings().isDynamicToolbarEnabled } returns true
every { settings.toolbarPosition } returns ToolbarPosition.TOP
every { settings.shouldUseFixedTopToolbar } returns true
every { settings.isDynamicToolbarEnabled } returns true
toolbarViewSpy.setToolbarBehavior(true)

View File

@ -9,6 +9,7 @@ import android.widget.FrameLayout
import androidx.appcompat.view.ContextThemeWrapper
import io.mockk.every
import io.mockk.mockk
import mozilla.components.browser.icons.BrowserIcons
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
@ -21,6 +22,7 @@ import org.mozilla.fenix.exceptions.ExceptionsAdapter
import org.mozilla.fenix.exceptions.viewholders.ExceptionsDeleteButtonViewHolder
import org.mozilla.fenix.exceptions.viewholders.ExceptionsHeaderViewHolder
import org.mozilla.fenix.exceptions.viewholders.ExceptionsListItemViewHolder
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class)
@ -39,6 +41,7 @@ class LoginExceptionsAdapterTest {
@Test
fun `creates correct view holder type`() {
every { testContext.components.core.icons } returns BrowserIcons(testContext, mockk(relaxed = true))
val parent = FrameLayout(context)
adapter.updateData(listOf(mockk(), mockk()))
assertEquals(4, adapter.itemCount)

View File

@ -9,6 +9,7 @@ import android.widget.FrameLayout
import androidx.appcompat.view.ContextThemeWrapper
import io.mockk.every
import io.mockk.mockk
import mozilla.components.browser.icons.BrowserIcons
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
@ -21,6 +22,7 @@ import org.mozilla.fenix.exceptions.ExceptionsAdapter
import org.mozilla.fenix.exceptions.viewholders.ExceptionsDeleteButtonViewHolder
import org.mozilla.fenix.exceptions.viewholders.ExceptionsHeaderViewHolder
import org.mozilla.fenix.exceptions.viewholders.ExceptionsListItemViewHolder
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class)
@ -39,6 +41,7 @@ class TrackingProtectionExceptionsAdapterTest {
@Test
fun `creates correct view holder type`() {
every { testContext.components.core.icons } returns BrowserIcons(testContext, mockk(relaxed = true))
val parent = FrameLayout(context)
adapter.updateData(listOf(mockk(), mockk()))
assertEquals(4, adapter.itemCount)

View File

@ -91,6 +91,7 @@ class ContextTest {
@Test
fun `GIVEN context WHEN getting metrics controller THEN send back metrics`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
val expectedMetricsValue = ApplicationProvider.getApplicationContext<FenixApplication>().components.analytics.metrics
assertEquals(expectedMetricsValue, testContext.metrics)
}

View File

@ -4,6 +4,7 @@
package org.mozilla.fenix.ext
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
@ -19,7 +20,7 @@ const val IDN = "台灣"
@RunWith(FenixRobolectricTestRunner::class)
class StringTest {
private val publicSuffixList = testContext.components.publicSuffixList
private val publicSuffixList = PublicSuffixList(testContext)
@Test
fun `Url To Trimmed Host`() {

View File

@ -4,9 +4,10 @@
package org.mozilla.fenix.helpers
import io.mockk.mockk
import org.mozilla.fenix.FenixApplication
import org.mozilla.fenix.R
import org.mozilla.fenix.components.TestComponents
import org.mozilla.fenix.components.Components
/**
* An override of our application for use in Robolectric-based unit tests. We're forced to override
@ -20,7 +21,7 @@ class FenixRobolectricTestApplication : FenixApplication() {
setApplicationTheme()
}
override val components = TestComponents(this)
override val components = mockk<Components>()
override fun initializeGlean() = Unit

View File

@ -15,13 +15,16 @@ import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.SearchState
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.feature.search.ext.createSearchEngine
import mozilla.components.support.test.robolectric.testContext
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.BrowserDirection
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.helpers.perf.TestStrictModeManager
import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_PROCESSING
@RunWith(FenixRobolectricTestRunner::class)
@ -84,6 +87,7 @@ class SpeechProcessingIntentProcessorTest {
@Test
fun `reads the speech processing extra`() {
every { testContext.components.strictMode } returns TestStrictModeManager()
val intent = Intent().apply {
putExtra(HomeActivity.OPEN_TO_BROWSER_AND_LOAD, true)
putExtra(SPEECH_PROCESSING, "hello world")

View File

@ -17,6 +17,7 @@ import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.home.HomeFragmentState
import org.mozilla.fenix.home.recentbookmarks.RecentBookmark
@ -89,6 +90,7 @@ class SessionControlViewTest {
@Test
fun `GIVENs updates WHEN sections recentTabs, recentBookmarks, historyMetadata or pocketArticles are available THEN show the dialog`() {
every { testContext.components.settings } returns mockk(relaxed = true)
val interactor = mockk<SessionControlInteractor>(relaxed = true)
val view = RecyclerView(testContext)
val controller = SessionControlView(
@ -110,6 +112,7 @@ class SessionControlViewTest {
@Test
fun `GIVENs updates WHEN sections recentTabs, recentBookmarks, historyMetadata or pocketArticles are NOT available THEN DO NOT show the dialog`() {
every { testContext.components.settings } returns mockk(relaxed = true)
val interactor = mockk<SessionControlInteractor>(relaxed = true)
val view = RecyclerView(testContext)
val controller = SessionControlView(

View File

@ -5,6 +5,7 @@
package org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding
import android.view.LayoutInflater
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import mozilla.components.support.test.robolectric.testContext
@ -12,6 +13,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.databinding.OnboardingFinishBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.home.sessioncontrol.OnboardingInteractor
@ -29,6 +31,7 @@ class OnboardingFinishViewHolderTest {
@Test
fun `call interactor on click`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
OnboardingFinishViewHolder(binding.root, interactor)
binding.finishButton.performClick()

View File

@ -21,6 +21,7 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.R
import org.mozilla.fenix.databinding.OnboardingManualSigninBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.home.HomeFragmentDirections
@ -59,6 +60,7 @@ class OnboardingManualSignInViewHolderTest {
@Test
fun `navigate on click`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
OnboardingManualSignInViewHolder(binding.root)
binding.fxaSignInButton.performClick()

View File

@ -6,6 +6,7 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding
import android.view.LayoutInflater
import androidx.appcompat.view.ContextThemeWrapper
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import mozilla.components.support.test.robolectric.testContext
@ -14,6 +15,7 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.R
import org.mozilla.fenix.databinding.OnboardingPrivacyNoticeBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.home.sessioncontrol.OnboardingInteractor
@ -32,6 +34,7 @@ class OnboardingPrivacyNoticeViewHolderTest {
@Test
fun `call interactor on click`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
OnboardingPrivacyNoticeViewHolder(binding.root, interactor)
binding.readButton.performClick()

View File

@ -6,6 +6,7 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding
import android.view.LayoutInflater
import io.mockk.every
import io.mockk.mockk
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
@ -26,9 +27,10 @@ class OnboardingToolbarPositionPickerViewHolderTest {
@Before
fun setup() {
val components = testContext.components
binding = OnboardingToolbarPositionPickerBinding.inflate(LayoutInflater.from(testContext))
settings = components.settings
settings = mockk(relaxed = true)
every { testContext.components.settings } returns settings
every { testContext.components.analytics } returns mockk(relaxed = true)
}
@Test

View File

@ -6,6 +6,7 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding
import android.view.LayoutInflater
import androidx.appcompat.view.ContextThemeWrapper
import io.mockk.every
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Before
@ -13,7 +14,9 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.R
import org.mozilla.fenix.databinding.OnboardingTrackingProtectionBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.utils.Settings
@RunWith(FenixRobolectricTestRunner::class)
class OnboardingTrackingProtectionViewHolderTest {
@ -28,6 +31,7 @@ class OnboardingTrackingProtectionViewHolderTest {
@Test
fun `sets description text`() {
every { testContext.components.settings } returns Settings(testContext)
OnboardingTrackingProtectionViewHolder(binding.root)
val string = testContext.getString(R.string.onboarding_tracking_protection_description_3)

View File

@ -5,8 +5,10 @@
package org.mozilla.fenix.home.topsites
import android.view.LayoutInflater
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import mozilla.components.browser.icons.BrowserIcons
import mozilla.components.feature.top.sites.TopSite
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertNotNull
@ -15,6 +17,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.databinding.TopSiteItemBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor
@ -35,6 +38,7 @@ class TopSiteItemViewHolderTest {
fun setup() {
binding = TopSiteItemBinding.inflate(LayoutInflater.from(testContext))
interactor = mockk(relaxed = true)
every { testContext.components.core.icons } returns BrowserIcons(testContext, mockk(relaxed = true))
}
@Test
@ -47,6 +51,7 @@ class TopSiteItemViewHolderTest {
@Test
fun `calls interactor on long click`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
TopSiteItemViewHolder(binding.root, interactor).bind(pocket)
binding.topSiteItem.performLongClick()

View File

@ -5,7 +5,9 @@ package org.mozilla.fenix.library.historymetadata.view
import android.view.LayoutInflater
import androidx.navigation.Navigation
import io.mockk.every
import io.mockk.mockk
import mozilla.components.browser.icons.BrowserIcons
import mozilla.components.concept.storage.HistoryMetadataKey
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
@ -13,6 +15,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.databinding.HistoryMetadataGroupListItemBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.library.history.History
import org.mozilla.fenix.library.historymetadata.interactor.HistoryMetadataGroupInteractor
@ -44,6 +47,7 @@ class HistoryMetadataGroupItemViewHolderTest {
@Test
fun `GIVEN a history metadata item on bind THEN set the title and url text`() {
every { testContext.components.core.icons } returns BrowserIcons(testContext, mockk(relaxed = true))
HistoryMetadataGroupItemViewHolder(binding.root, interactor, selectionHolder).bind(item)
assertEquals(item.title, binding.historyLayout.titleView.text)

View File

@ -9,6 +9,8 @@ import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import io.mockk.every
import io.mockk.mockk
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotEquals
@ -16,6 +18,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import java.io.File
@ -34,6 +37,7 @@ class PerformanceInflaterTest {
fun setup() {
InflationCounter.inflationCount.set(0)
every { testContext.components.core.engine.profiler } returns mockk(relaxed = true)
perfInflater = MockInflater(LayoutInflater.from(testContext), testContext)
}

View File

@ -28,6 +28,7 @@ import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.search.SearchEngineSource
import org.mozilla.fenix.search.SearchFragmentState
import org.mozilla.fenix.utils.Settings
@RunWith(FenixRobolectricTestRunner::class)
class ToolbarViewTest {
@ -154,6 +155,7 @@ class ToolbarViewTest {
private fun buildToolbarView(isPrivate: Boolean) = ToolbarView(
context,
Settings(context),
interactor,
historyStorage = null,
isPrivate = isPrivate,

View File

@ -13,6 +13,7 @@ import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.createTab
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.feature.privatemode.notification.AbstractPrivateNotificationService.Companion.ACTION_ERASE
import mozilla.components.feature.tabs.TabsUseCases
import mozilla.components.support.test.robolectric.testContext
import mozilla.components.support.test.rule.MainCoroutineRule
import org.junit.After
@ -44,8 +45,10 @@ class PrivateNotificationServiceTest {
@Before
fun setup() {
store = testContext.components.core.store
store = mockk()
every { store.dispatch(any()) } returns mockk()
every { testContext.components.core.store } returns store
every { testContext.components.useCases.tabsUseCases } returns TabsUseCases(store)
controller = Robolectric.buildService(
PrivateNotificationService::class.java,

View File

@ -10,6 +10,7 @@ import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkObject
import kotlinx.coroutines.test.TestCoroutineDispatcher
import mozilla.components.concept.fetch.Client
import mozilla.components.support.test.robolectric.testContext
import mozilla.components.support.test.rule.MainCoroutineRule
import org.junit.After
@ -41,9 +42,14 @@ class SettingsFragmentTest {
@Before
fun setup() {
// Mock client for fetching account avatar
val client = testContext.components.core.client
val client = mockk<Client>()
every { client.fetch(any()) } throws IOException("test")
every { testContext.components.core.client } returns client
every { testContext.components.settings } returns mockk(relaxed = true)
every { testContext.components.analytics } returns mockk(relaxed = true)
every { testContext.components.backgroundServices } returns mockk(relaxed = true)
mockkObject(Config)
every { Config.channel } returns ReleaseChannel.Nightly
}

View File

@ -5,10 +5,13 @@
package org.mozilla.fenix.settings
import androidx.fragment.app.FragmentActivity
import io.mockk.every
import io.mockk.mockk
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.utils.Settings
import org.robolectric.Robolectric
@ -18,9 +21,11 @@ class TrackingProtectionFragmentTest {
@Test
fun `UI component should match settings defaults`() {
val settings = Settings(testContext)
every { testContext.components.analytics } returns mockk(relaxed = true)
every { testContext.components.settings } returns settings
val settingsFragment = TrackingProtectionFragment()
val activity = Robolectric.buildActivity(FragmentActivity::class.java).create().get()
val settings = Settings(testContext)
activity.supportFragmentManager.beginTransaction()
.add(settingsFragment, "settingsFragment")

View File

@ -7,6 +7,7 @@ package org.mozilla.fenix.settings.creditcards
import androidx.fragment.app.FragmentActivity
import androidx.navigation.NavController
import androidx.preference.Preference
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.test.TestCoroutineDispatcher
@ -19,6 +20,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.getPreferenceKey
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.robolectric.Robolectric
@ -32,6 +34,8 @@ class CreditCardsSettingFragmentTest {
@Before
fun setUp() {
every { testContext.components.settings } returns mockk(relaxed = true)
creditCardsSettingFragment = CreditCardsSettingFragment()
val activity = Robolectric.buildActivity(FragmentActivity::class.java).create().get()

View File

@ -7,13 +7,13 @@ package org.mozilla.fenix.settings.logins
import androidx.navigation.NavController
import io.mockk.mockk
import io.mockk.verifyAll
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.test.robolectric.testContext
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.BrowserDirection
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.settings.logins.controller.LoginsListController
@ -24,7 +24,7 @@ import org.mozilla.fenix.utils.Settings
class LoginsListControllerTest {
private val store: LoginsFragmentStore = mockk(relaxed = true)
private val settings: Settings = mockk(relaxed = true)
private val publicSuffixList = testContext.components.publicSuffixList
private val publicSuffixList = PublicSuffixList(testContext)
private val sortingStrategy: SortingStrategy = SortingStrategy.Alphabetically(publicSuffixList)
private val navController: NavController = mockk(relaxed = true)
private val browserNavigator: (String, Boolean, BrowserDirection) -> Unit = mockk(relaxed = true)

View File

@ -5,14 +5,17 @@
package org.mozilla.fenix.settings.logins
import android.view.LayoutInflater
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import mozilla.components.browser.icons.BrowserIcons
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.databinding.LoginsItemBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.settings.logins.interactor.SavedLoginsInteractor
import org.mozilla.fenix.settings.logins.view.LoginsListViewHolder
@ -35,6 +38,7 @@ class LoginsListViewHolderTest {
fun setup() {
binding = LoginsItemBinding.inflate(LayoutInflater.from(testContext))
interactor = mockk(relaxed = true)
every { testContext.components.core.icons } returns BrowserIcons(testContext, mockk(relaxed = true))
}
@Test

View File

@ -4,8 +4,10 @@
package org.mozilla.fenix.settings.logins
import io.mockk.every
import io.mockk.mockk
import io.mockk.verifyAll
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.test.robolectric.testContext
import org.junit.Before
import org.junit.Test
@ -40,6 +42,7 @@ class SavedLoginsInteractorTest {
@Test
fun `GIVEN a change in sorting strategy, WHEN the interactor is called for it, THEN it should just delegate the controller`() {
every { testContext.components.publicSuffixList } returns PublicSuffixList(testContext)
val sortingStrategy = SortingStrategy.Alphabetically(testContext.components.publicSuffixList)
interactor.onSortingStrategyChanged(sortingStrategy)

View File

@ -12,6 +12,7 @@ import io.mockk.just
import io.mockk.mockk
import io.mockk.verify
import mozilla.components.concept.menu.candidate.HighPriorityHighlightEffect
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.ktx.android.content.getColorFromAttr
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
@ -68,13 +69,15 @@ class SavedLoginsSortingStrategyMenuTest {
@Test
fun `candidates call interactor on click`() {
val publicSuffixList = PublicSuffixList(testContext)
every { testContext.components.publicSuffixList } returns publicSuffixList
val (name, lastUsed) = menu.menuItems(Item.AlphabeticallySort)
every { interactor.onSortingStrategyChanged(any()) } just Runs
name.onClick()
verify {
interactor.onSortingStrategyChanged(
SortingStrategy.Alphabetically(context.components.publicSuffixList)
SortingStrategy.Alphabetically(publicSuffixList)
)
}

View File

@ -122,6 +122,7 @@ class DefaultQuickSettingsControllerTest {
@Test
fun `handlePermissionsShown should delegate to an injected parameter`() {
every { testContext.components.core.engine } returns mockk(relaxed = true)
var displayPermissionsInvoked = false
createController(
displayPermissions = {
@ -172,6 +173,7 @@ class DefaultQuickSettingsControllerTest {
@Test
fun `handlePermissionToggled blocked by user should navigate to site permission manager`() {
every { testContext.components.core.engine } returns mockk(relaxed = true)
val websitePermission = mockk<WebsitePermission>()
val invalidSitePermissionsController = DefaultQuickSettingsController(
context = context,
@ -265,6 +267,7 @@ class DefaultQuickSettingsControllerTest {
@Test
fun `handleAndroidPermissionRequest should request from the injected callback`() {
every { testContext.components.core.engine } returns mockk(relaxed = true)
val testPermissions = arrayOf("TestPermission")
var requestRuntimePermissionsInvoked = false

View File

@ -18,8 +18,9 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.utils.Settings
import org.mozilla.gecko.search.SearchWidgetProvider
@RunWith(FenixRobolectricTestRunner::class)
@ -27,12 +28,16 @@ class SearchEngineFragmentTest {
@Test
fun `GIVEN pref_key_show_voice_search setting WHEN it is modified THEN the value is persisted and widgets updated`() {
try {
mockkObject(SearchWidgetProvider.Companion)
val settings = mockk<Settings>(relaxed = true)
every { settings.preferences }
every { testContext.components.settings } returns settings
val preferences: SharedPreferences = mockk()
val preferencesEditor: SharedPreferences.Editor = mockk(relaxed = true)
every { testContext.settings().preferences } returns preferences
every { settings.preferences } returns preferences
every { preferences.edit() } returns preferencesEditor
mockkObject(SearchWidgetProvider.Companion)
val fragment = spyk(SearchEngineFragment()) {
every { context } returns testContext
every { isAdded } returns true

View File

@ -12,11 +12,13 @@ import mozilla.components.browser.storage.sync.Tab
import mozilla.components.browser.storage.sync.TabEntry
import mozilla.components.concept.sync.DeviceType
import mozilla.components.feature.syncedtabs.view.SyncedTabsView
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class)
@ -103,6 +105,7 @@ class SyncedTabsAdapterTest {
@Test
fun `adapter can create and bind viewholders for SyncedDeviceTabs`() {
every { testContext.components.publicSuffixList } returns PublicSuffixList(testContext)
val parent = FrameLayout(testContext)
adapter.updateData(listOf(oneTabDevice))

View File

@ -17,6 +17,7 @@ import mozilla.components.browser.storage.sync.TabEntry
import mozilla.components.concept.sync.Device
import mozilla.components.concept.sync.DeviceType
import mozilla.components.feature.syncedtabs.view.SyncedTabsView
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Before
@ -25,6 +26,7 @@ import org.junit.runner.RunWith
import org.mozilla.fenix.R
import org.mozilla.fenix.databinding.SyncTabsListItemBinding
import org.mozilla.fenix.databinding.ViewSyncedTabsGroupBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class)
@ -80,6 +82,7 @@ class SyncedTabsViewHolderTest {
@Test
fun `TabViewHolder binds active tab`() {
every { testContext.components.publicSuffixList } returns PublicSuffixList(testContext)
tabViewHolder.bind(SyncedTabsAdapter.AdapterItem.Tab(tab), mockk())
assertEquals("Firefox", syncTabsListItemBinding.syncedTabItemTitle.text)
@ -88,6 +91,7 @@ class SyncedTabsViewHolderTest {
@Test
fun `TabViewHolder calls interactor on click`() {
every { testContext.components.publicSuffixList } returns PublicSuffixList(testContext)
val interactor = mockk<SyncedTabsView.Listener>(relaxed = true)
tabViewHolder.bind(SyncedTabsAdapter.AdapterItem.Tab(tab), interactor)

View File

@ -8,9 +8,12 @@ import android.content.Context
import android.widget.FrameLayout
import androidx.appcompat.view.ContextThemeWrapper
import io.mockk.MockKAnnotations
import io.mockk.impl.annotations.MockK
import io.mockk.spyk
import io.mockk.every
import io.mockk.verify
import io.mockk.spyk
import io.mockk.mockk
import io.mockk.impl.annotations.MockK
import mozilla.components.browser.icons.BrowserIcons
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
@ -18,6 +21,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class)
@ -52,6 +56,7 @@ class TabHistoryAdapterTest {
@Test
fun `creates and binds view holder`() {
every { testContext.components.core.icons } returns BrowserIcons(testContext, mockk(relaxed = true))
adapter.submitList(listOf(selectedItem, unselectedItem))
val holder = spyk(adapter.createViewHolder(parent, 0))

View File

@ -6,6 +6,7 @@ package org.mozilla.fenix.tabstray.browser
import android.view.LayoutInflater
import android.view.View
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import mozilla.components.browser.state.state.TabSessionState
@ -21,6 +22,8 @@ import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.selection.SelectionHolder
import org.mozilla.fenix.tabstray.TabsTrayStore
import mozilla.components.browser.state.state.createTab
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import org.mozilla.fenix.ext.components
@RunWith(FenixRobolectricTestRunner::class)
class AbstractBrowserTabViewHolderTest {
@ -30,6 +33,7 @@ class AbstractBrowserTabViewHolderTest {
@Test
fun `WHEN itemView is clicked THEN interactor invokes open`() {
every { testContext.components.publicSuffixList } returns PublicSuffixList(testContext)
val view = LayoutInflater.from(testContext).inflate(R.layout.tab_tray_item, null)
val holder = TestTabTrayViewHolder(
view,
@ -50,6 +54,7 @@ class AbstractBrowserTabViewHolderTest {
@Test
fun `WHEN itemView is clicked with a selection holder THEN the select holder is invoked`() {
every { testContext.components.publicSuffixList } returns PublicSuffixList(testContext)
val view = LayoutInflater.from(testContext).inflate(R.layout.tab_tray_item, null)
val selectionHolder = TestSelectionHolder(emptySet())
val holder = TestTabTrayViewHolder(

View File

@ -4,11 +4,14 @@
package org.mozilla.fenix.tabstray.browser
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.support.test.robolectric.testContext
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.tabstray.TabsTrayStore
@ -17,6 +20,7 @@ class AbstractBrowserTrayListTest {
@Test
fun `WHEN recyclerview detaches from window THEN notify adapter`() {
every { testContext.components.core.store } returns BrowserStore()
val trayList = PrivateBrowserTrayList(testContext)
val adapter = mockk<BrowserTabsAdapter>(relaxed = true)

View File

@ -20,6 +20,8 @@ import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.selection.SelectionHolder
import org.mozilla.fenix.tabstray.TabsTrayStore
import mozilla.components.browser.state.state.createTab
import mozilla.components.browser.state.store.BrowserStore
import org.mozilla.fenix.ext.components
@RunWith(FenixRobolectricTestRunner::class)
class BrowserTabsAdapterTest {
@ -30,6 +32,7 @@ class BrowserTabsAdapterTest {
@Test
fun `WHEN bind with payloads is called THEN update the holder`() {
every { testContext.components.core.thumbnailStorage } returns mockk()
val adapter = BrowserTabsAdapter(context, interactor, store, "Test")
val holder = mockk<AbstractBrowserTabViewHolder>(relaxed = true)
@ -51,6 +54,10 @@ class BrowserTabsAdapterTest {
@Test
fun `WHEN the selection holder is set THEN update the selected tab`() {
every { testContext.components.core.thumbnailStorage } returns mockk()
every { testContext.components.core.store } returns BrowserStore()
every { testContext.components.analytics } returns mockk(relaxed = true)
every { testContext.components.settings } returns mockk(relaxed = true)
val adapter = BrowserTabsAdapter(context, interactor, store, "Test")
val binding = TabTrayItemBinding.inflate(LayoutInflater.from(testContext))
val holder = spyk(

View File

@ -5,12 +5,15 @@
package org.mozilla.fenix.tabstray.browser
import android.view.LayoutInflater
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.components.AppStore
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.tabstray.TabsTrayInteractor
import org.mozilla.fenix.tabstray.browser.InactiveTabViewHolder.HeaderHolder
@ -19,6 +22,7 @@ import org.mozilla.fenix.tabstray.browser.InactiveTabViewHolder.HeaderHolder
class InactiveTabViewHolderTest {
@Test
fun `HeaderHolder - WHEN clicked THEN notify the interactor`() {
every { testContext.components.appStore } returns AppStore()
val view = LayoutInflater.from(testContext).inflate(HeaderHolder.LAYOUT_ID, null)
val interactor: InactiveTabsInteractor = mockk(relaxed = true)
val tabsTrayInteractor: TabsTrayInteractor = mockk(relaxed = true)

View File

@ -8,6 +8,7 @@ import android.view.LayoutInflater
import android.view.View.GONE
import android.view.View.VISIBLE
import android.widget.TextView
import io.mockk.every
import io.mockk.mockk
import mozilla.components.browser.state.state.createTab
import mozilla.components.browser.state.store.BrowserStore
@ -16,6 +17,7 @@ import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.tabstray.TabsTrayInteractor
import org.mozilla.fenix.tabstray.TabsTrayStore
@ -29,6 +31,10 @@ class AbstractBrowserPageViewHolderTest {
val browserStore = BrowserStore()
val interactor = mockk<TabsTrayInteractor>(relaxed = true)
val browserTrayInteractor = mockk<BrowserTrayInteractor>(relaxed = true)
init {
every { testContext.components.core.thumbnailStorage } returns mockk()
every { testContext.components.settings } returns mockk(relaxed = true)
}
val adapter = BrowserTabsAdapter(testContext, browserTrayInteractor, tabsTrayStore, "Test")
@Test

View File

@ -7,6 +7,7 @@ package org.mozilla.fenix.trackingprotection
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.core.view.isVisible
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import mozilla.components.support.test.robolectric.testContext
@ -17,6 +18,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.CROSS_SITE_TRACKING_COOKIES
import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.SOCIAL_MEDIA_TRACKERS
@ -99,6 +101,7 @@ class TrackingProtectionPanelViewTest {
@Test
fun testSocialMediaTrackerClick() {
every { testContext.components.analytics } returns mockk(relaxed = true)
view.binding.socialMediaTrackers.performClick()
verify { interactor.openDetails(SOCIAL_MEDIA_TRACKERS, categoryBlocked = true) }
@ -108,6 +111,7 @@ class TrackingProtectionPanelViewTest {
@Test
fun testCrossSiteTrackerClick() {
every { testContext.components.analytics } returns mockk(relaxed = true)
view.binding.crossSiteTracking.performClick()
verify { interactor.openDetails(CROSS_SITE_TRACKING_COOKIES, categoryBlocked = true) }

View File

@ -5,13 +5,16 @@ package org.mozilla.fenix.whatsnew
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import androidx.preference.PreferenceManager
import io.mockk.every
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.ext.clearAndCommit
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.helpers.perf.TestStrictModeManager
@RunWith(FenixRobolectricTestRunner::class)
class WhatsNewTest {
@ -27,6 +30,7 @@ class WhatsNewTest {
@Test
fun `should highlight after fresh install`() {
every { testContext.components.strictMode } returns TestStrictModeManager()
assertEquals(true, WhatsNew.shouldHighlightWhatsNew(testContext))
}
@ -80,6 +84,7 @@ class WhatsNewTest {
@Test
fun `should not highlight after user viewed what's new`() {
every { testContext.components.strictMode } returns TestStrictModeManager()
assertEquals(true, WhatsNew.shouldHighlightWhatsNew(testContext))
WhatsNew.userViewedWhatsNew(testContext)

View File

@ -15,6 +15,9 @@ import android.speech.RecognizerIntent.EXTRA_RESULTS
import android.speech.RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
import androidx.appcompat.app.AppCompatActivity.RESULT_OK
import androidx.test.core.app.ApplicationProvider
import io.mockk.every
import io.mockk.mockk
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNull
@ -25,7 +28,9 @@ import org.junit.runner.RunWith
import org.mozilla.fenix.FenixApplication
import org.mozilla.fenix.HomeActivity.Companion.OPEN_TO_BROWSER_AND_LOAD
import org.mozilla.fenix.IntentReceiverActivity
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.helpers.perf.TestStrictModeManager
import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.PREVIOUS_INTENT
import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_PROCESSING
import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_REQUEST_CODE
@ -64,6 +69,8 @@ class VoiceSearchActivityTest {
@Test
fun `process intent with speech processing set to true`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
every { testContext.components.strictMode } returns TestStrictModeManager()
allowVoiceIntentToResolveActivity()
controller.create()
@ -135,6 +142,8 @@ class VoiceSearchActivityTest {
@Test
fun `handle speech result`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
every { testContext.components.strictMode } returns TestStrictModeManager()
allowVoiceIntentToResolveActivity()
controller.create()
@ -160,6 +169,8 @@ class VoiceSearchActivityTest {
@Test
fun `handle invalid result code`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
every { testContext.components.strictMode } returns TestStrictModeManager()
allowVoiceIntentToResolveActivity()
controller.create()

View File

@ -67,7 +67,6 @@ buildscript {
classpath Deps.tools_kotlingradle
classpath Deps.tools_benchmarkgradle
classpath Deps.androidx_safeargs
classpath Deps.allopen
classpath Deps.osslicenses_plugin
classpath "org.mozilla.components:tooling-glean-gradle:${Versions.mozilla_android_components}"

View File

@ -72,7 +72,6 @@ object Deps {
const val kotlin_coroutines_test = "org.jetbrains.kotlinx:kotlinx-coroutines-test:${Versions.coroutines}"
const val kotlin_coroutines_android = "org.jetbrains.kotlinx:kotlinx-coroutines-android:${Versions.coroutines}"
const val allopen = "org.jetbrains.kotlin:kotlin-allopen:${Versions.kotlin}"
const val osslicenses_plugin = "com.google.android.gms:oss-licenses-plugin:${Versions.osslicenses_plugin}"
const val mozilla_compose_awesomebar = "org.mozilla.components:compose-awesomebar:${Versions.mozilla_android_components}"