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 -> android.applicationVariants.all { variant ->
// ------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------

View File

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

View File

@ -26,7 +26,6 @@ import org.mozilla.fenix.experiments.NimbusFeatures
import org.mozilla.fenix.experiments.createNimbus import org.mozilla.fenix.experiments.createNimbus
import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.perf.lazyMonitored 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_BUILDID
import org.mozilla.geckoview.BuildConfig.MOZ_APP_VENDOR import org.mozilla.geckoview.BuildConfig.MOZ_APP_VENDOR
import org.mozilla.geckoview.BuildConfig.MOZ_APP_VERSION 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. * Component group for all functionality related to analytics e.g. crash reporting and telemetry.
*/ */
@Mockable
class Analytics( class Analytics(
private val context: Context 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.ext.settings
import org.mozilla.fenix.perf.lazyMonitored import org.mozilla.fenix.perf.lazyMonitored
import org.mozilla.fenix.sync.SyncedTabsIntegration import org.mozilla.fenix.sync.SyncedTabsIntegration
import org.mozilla.fenix.utils.Mockable
import org.mozilla.fenix.utils.Settings import org.mozilla.fenix.utils.Settings
/** /**
* Component group for background services. These are the components that need to be accessed from within a * Component group for background services. These are the components that need to be accessed from within a
* background worker. * background worker.
*/ */
@Mockable
@Suppress("LongParameterList") @Suppress("LongParameterList")
class BackgroundServices( class BackgroundServices(
private val context: Context, 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.StrictModeManager
import org.mozilla.fenix.perf.lazyMonitored import org.mozilla.fenix.perf.lazyMonitored
import org.mozilla.fenix.utils.ClipboardHandler import org.mozilla.fenix.utils.ClipboardHandler
import org.mozilla.fenix.utils.Mockable
import org.mozilla.fenix.utils.Settings import org.mozilla.fenix.utils.Settings
import org.mozilla.fenix.wifi.WifiConnectionMonitor import org.mozilla.fenix.wifi.WifiConnectionMonitor
import java.util.concurrent.TimeUnit 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 * Note: these aren't just "components" from "android-components": they're any "component" that
* can be considered a building block of our app. * can be considered a building block of our app.
*/ */
@Mockable
class Components(private val context: Context) { class Components(private val context: Context) {
val backgroundServices by lazyMonitored { val backgroundServices by lazyMonitored {
BackgroundServices( BackgroundServices(

View File

@ -83,7 +83,6 @@ import org.mozilla.fenix.perf.lazyMonitored
import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.settings.advanced.getSelectedLocale import org.mozilla.fenix.settings.advanced.getSelectedLocale
import org.mozilla.fenix.telemetry.TelemetryMiddleware import org.mozilla.fenix.telemetry.TelemetryMiddleware
import org.mozilla.fenix.utils.Mockable
import org.mozilla.fenix.utils.getUndoDelay import org.mozilla.fenix.utils.getUndoDelay
import org.mozilla.geckoview.GeckoRuntime import org.mozilla.geckoview.GeckoRuntime
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -91,7 +90,6 @@ import java.util.concurrent.TimeUnit
/** /**
* Component group for all core browser functionality. * Component group for all core browser functionality.
*/ */
@Mockable
@Suppress("LargeClass") @Suppress("LargeClass")
class Core( class Core(
private val context: Context, 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.databinding.FenixSnackbarBinding
import org.mozilla.fenix.ext.increaseTapArea import org.mozilla.fenix.ext.increaseTapArea
import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.utils.Mockable
@Mockable
class FenixSnackbar private constructor( class FenixSnackbar private constructor(
parent: ViewGroup, parent: ViewGroup,
private val binding: FenixSnackbarBinding, 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.feature.findinpage.view.FindInPageView
import mozilla.components.support.base.feature.LifecycleAwareFeature import mozilla.components.support.base.feature.LifecycleAwareFeature
import org.mozilla.fenix.components.FindInPageIntegration.ToolbarInfo 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. * 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. * to suit the find in page bar.
* @param toolbarInfo [ToolbarInfo] used to configure the [BrowserToolbar] while the find in page bar is shown. * @param toolbarInfo [ToolbarInfo] used to configure the [BrowserToolbar] while the find in page bar is shown.
*/ */
@Mockable
class FindInPageIntegration( class FindInPageIntegration(
private val store: BrowserStore, private val store: BrowserStore,
private val sessionId: String? = null, 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.customtabs.FennecWebAppIntentProcessor
import org.mozilla.fenix.home.intent.FennecBookmarkShortcutsIntentProcessor import org.mozilla.fenix.home.intent.FennecBookmarkShortcutsIntentProcessor
import org.mozilla.fenix.perf.lazyMonitored import org.mozilla.fenix.perf.lazyMonitored
import org.mozilla.fenix.utils.Mockable
/** /**
* Component group for miscellaneous components. * Component group for miscellaneous components.
*/ */
@Mockable
@Suppress("LongParameterList") @Suppress("LongParameterList")
class IntentProcessors( class IntentProcessors(
private val context: Context, 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.SitePermissions
import mozilla.components.concept.engine.permission.SitePermissionsStorage import mozilla.components.concept.engine.permission.SitePermissionsStorage
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.utils.Mockable
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
@Mockable
class PermissionStorage( class PermissionStorage(
private val context: Context, private val context: Context,
@VisibleForTesting internal val dispatcher: CoroutineContext = Dispatchers.IO, @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.ext.getPreferenceKey
import org.mozilla.fenix.perf.lazyMonitored import org.mozilla.fenix.perf.lazyMonitored
import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.utils.Mockable
/** /**
* Component group which encapsulates foreground-friendly services. * Component group which encapsulates foreground-friendly services.
*/ */
@Mockable
class Services( class Services(
private val context: Context, private val context: Context,
private val accountManager: FxaAccountManager 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.ext.toShortUrl
import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder
import org.mozilla.fenix.perf.StrictModeManager import org.mozilla.fenix.perf.StrictModeManager
import org.mozilla.fenix.utils.Mockable
@Mockable
class TabCollectionStorage( class TabCollectionStorage(
private val context: Context, private val context: Context,
strictMode: StrictModeManager, strictMode: StrictModeManager,

View File

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

View File

@ -4,6 +4,7 @@
package org.mozilla.fenix.components.toolbar package org.mozilla.fenix.components.toolbar
import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.view.HapticFeedbackConstants import android.view.HapticFeedbackConstants
import android.view.LayoutInflater import android.view.LayoutInflater
@ -28,30 +29,29 @@ import org.mozilla.fenix.customtabs.CustomTabToolbarIntegration
import org.mozilla.fenix.customtabs.CustomTabToolbarMenu import org.mozilla.fenix.customtabs.CustomTabToolbarMenu
import org.mozilla.fenix.ext.bookmarkStorage import org.mozilla.fenix.ext.bookmarkStorage
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.theme.ThemeManager
import org.mozilla.fenix.utils.Settings
import org.mozilla.fenix.utils.ToolbarPopupWindow import org.mozilla.fenix.utils.ToolbarPopupWindow
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import mozilla.components.browser.toolbar.behavior.ToolbarPosition as MozacToolbarPosition import mozilla.components.browser.toolbar.behavior.ToolbarPosition as MozacToolbarPosition
@SuppressWarnings("LargeClass") @SuppressWarnings("LargeClass")
class BrowserToolbarView( class BrowserToolbarView(
private val container: ViewGroup, context: Context,
private val toolbarPosition: ToolbarPosition, container: ViewGroup,
private val settings: Settings,
private val interactor: BrowserToolbarInteractor, private val interactor: BrowserToolbarInteractor,
private val customTabSession: CustomTabSessionState?, private val customTabSession: CustomTabSessionState?,
private val lifecycleOwner: LifecycleOwner private val lifecycleOwner: LifecycleOwner
) { ) {
private val settings = container.context.settings()
@LayoutRes @LayoutRes
private val toolbarLayout = when (settings.toolbarPosition) { private val toolbarLayout = when (settings.toolbarPosition) {
ToolbarPosition.BOTTOM -> R.layout.component_bottom_browser_toolbar ToolbarPosition.BOTTOM -> R.layout.component_bottom_browser_toolbar
ToolbarPosition.TOP -> R.layout.component_browser_top_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) .inflate(toolbarLayout, container, true)
@VisibleForTesting @VisibleForTesting
@ -78,7 +78,7 @@ class BrowserToolbarView(
true true
} }
with(container.context) { with(context) {
val isPinningSupported = components.useCases.webAppUseCases.isPinningSupported() val isPinningSupported = components.useCases.webAppUseCases.isPinningSupported()
view.apply { view.apply {
@ -94,22 +94,22 @@ class BrowserToolbarView(
false false
} }
display.progressGravity = when (toolbarPosition) { display.progressGravity = when (settings.toolbarPosition) {
ToolbarPosition.BOTTOM -> DisplayToolbar.Gravity.TOP ToolbarPosition.BOTTOM -> DisplayToolbar.Gravity.TOP
ToolbarPosition.TOP -> DisplayToolbar.Gravity.BOTTOM ToolbarPosition.TOP -> DisplayToolbar.Gravity.BOTTOM
} }
val primaryTextColor = ContextCompat.getColor( val primaryTextColor = ContextCompat.getColor(
container.context, context,
ThemeManager.resolveAttribute(R.attr.primaryText, container.context) ThemeManager.resolveAttribute(R.attr.primaryText, context)
) )
val secondaryTextColor = ContextCompat.getColor( val secondaryTextColor = ContextCompat.getColor(
container.context, context,
ThemeManager.resolveAttribute(R.attr.secondaryText, container.context) ThemeManager.resolveAttribute(R.attr.secondaryText, context)
) )
val separatorColor = ContextCompat.getColor( val separatorColor = ContextCompat.getColor(
container.context, context,
ThemeManager.resolveAttribute(R.attr.toolbarDivider, container.context) ThemeManager.resolveAttribute(R.attr.toolbarDivider, context)
) )
display.urlFormatter = { url -> URLStringUtils.toDisplayUrl(url) } display.urlFormatter = { url -> URLStringUtils.toDisplayUrl(url) }
@ -137,7 +137,7 @@ class BrowserToolbarView(
context = this, context = this,
store = components.core.store, store = components.core.store,
sessionId = customTabSession?.id, sessionId = customTabSession?.id,
shouldReverseItems = toolbarPosition == ToolbarPosition.TOP, shouldReverseItems = settings.toolbarPosition == ToolbarPosition.TOP,
onItemTapped = { onItemTapped = {
it.performHapticIfNeeded(view) it.performHapticIfNeeded(view)
interactor.onBrowserToolbarMenuItemTapped(it) 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.Config
import org.mozilla.fenix.components.Components import org.mozilla.fenix.components.Components
import org.mozilla.fenix.utils.ManufacturerCodes import org.mozilla.fenix.utils.ManufacturerCodes
import org.mozilla.fenix.utils.Mockable
import java.util.concurrent.Executors import java.util.concurrent.Executors
import java.util.concurrent.atomic.AtomicLong import java.util.concurrent.atomic.AtomicLong
@ -33,8 +32,7 @@ private val mainLooper = Looper.getMainLooper()
/** /**
* Manages strict mode settings for the application. * Manages strict mode settings for the application.
*/ */
@Mockable open class StrictModeManager(
class StrictModeManager(
config: Config, config: Config,
// Ideally, we'd pass in a more specific value but there is a circular dependency: StrictMode // 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]. * @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 { fun instrumentedFunctionBlock(): R {
val startProfilerTime = components.core.engine.profiler?.getProfilerTime() val startProfilerTime = components.core.engine.profiler?.getProfilerTime()

View File

@ -190,6 +190,7 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
toolbarView = ToolbarView( toolbarView = ToolbarView(
requireContext(), requireContext(),
requireContext().settings(),
interactor, interactor,
historyStorageProvider(), historyStorageProvider(),
isPrivate, 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.content.res.resolveAttribute
import mozilla.components.support.ktx.android.view.hideKeyboard import mozilla.components.support.ktx.android.view.hideKeyboard
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.search.SearchFragmentState 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 * Interface for the Toolbar Interactor. This interface is implemented by objects that want
@ -53,6 +53,7 @@ interface ToolbarInteractor {
@Suppress("LongParameterList") @Suppress("LongParameterList")
class ToolbarView( class ToolbarView(
private val context: Context, private val context: Context,
settings: Settings,
private val interactor: ToolbarInteractor, private val interactor: ToolbarInteractor,
private val historyStorage: HistoryStorage?, private val historyStorage: HistoryStorage?,
private val isPrivate: Boolean, private val isPrivate: Boolean,
@ -115,7 +116,7 @@ class ToolbarView(
val engineForSpeculativeConnects = if (!isPrivate) engine else null val engineForSpeculativeConnects = if (!isPrivate) engine else null
if (context.settings().shouldAutocompleteInAwesomebar) { if (settings.shouldAutocompleteInAwesomebar) {
ToolbarAutocompleteFeature( ToolbarAutocompleteFeature(
view, view,
engineForSpeculativeConnects 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.junit.runner.RunWith
import org.mozilla.fenix.AppRequestInterceptor.Companion.HIGH_RISK_ERROR_PAGES 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.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.ext.isOnline
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@ -64,6 +66,7 @@ class AppRequestInterceptorTest {
@Test @Test
fun `GIVEN request to install add-on WHEN on a different domain THEN no add-on installation is started`() { 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( val result = interceptor.onLoadRequest(
engineSession = mockk(), engineSession = mockk(),
uri = "https://addons.mozilla.org/android/downloads/file/12345678/test.xpi", uri = "https://addons.mozilla.org/android/downloads/file/12345678/test.xpi",
@ -81,6 +84,7 @@ class AppRequestInterceptorTest {
@Test @Test
fun `GIVEN invalid request to install add-on WHEN on same domain and triggered by user THEN no add-on installation is started`() { 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( val result = interceptor.onLoadRequest(
engineSession = mockk(), engineSession = mockk(),
uri = "https://addons.mozilla.org/android/downloads/file/12345678/test.invalid", uri = "https://addons.mozilla.org/android/downloads/file/12345678/test.invalid",
@ -98,6 +102,7 @@ class AppRequestInterceptorTest {
@Test @Test
fun `GIVEN request to install add-on WHEN not triggered by user THEN no add-on installation is started`() { 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( val result = interceptor.onLoadRequest(
engineSession = mockk(), engineSession = mockk(),
uri = "https://addons.mozilla.org/android/downloads/file/12345678/test.xpi", uri = "https://addons.mozilla.org/android/downloads/file/12345678/test.xpi",
@ -115,6 +120,7 @@ class AppRequestInterceptorTest {
@Test @Test
fun `GIVEN any request WHEN on same domain and triggered by user THEN no add-on installation is started`() { 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( val result = interceptor.onLoadRequest(
engineSession = mockk(), engineSession = mockk(),
uri = "https://blog.mozilla.org/blog/2020/10/20/mozilla-reaction-to-u-s-v-google/", uri = "https://blog.mozilla.org/blog/2020/10/20/mozilla-reaction-to-u-s-v-google/",
@ -132,6 +138,7 @@ class AppRequestInterceptorTest {
@Test @Test
fun `onErrorRequest results in correct error page for low risk level error`() { fun `onErrorRequest results in correct error page for low risk level error`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
setOf( setOf(
ErrorType.UNKNOWN, ErrorType.UNKNOWN,
ErrorType.ERROR_NET_INTERRUPT, ErrorType.ERROR_NET_INTERRUPT,
@ -165,6 +172,7 @@ class AppRequestInterceptorTest {
@Test @Test
fun `onErrorRequest results in correct error page for medium risk level error`() { fun `onErrorRequest results in correct error page for medium risk level error`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
setOf( setOf(
ErrorType.ERROR_SECURITY_BAD_CERT, ErrorType.ERROR_SECURITY_BAD_CERT,
ErrorType.ERROR_SECURITY_SSL, ErrorType.ERROR_SECURITY_SSL,
@ -182,6 +190,7 @@ class AppRequestInterceptorTest {
@Test @Test
fun `onErrorRequest results in correct error page for high risk level error`() { fun `onErrorRequest results in correct error page for high risk level error`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
setOf( setOf(
ErrorType.ERROR_SAFEBROWSING_HARMFUL_URI, ErrorType.ERROR_SAFEBROWSING_HARMFUL_URI,
ErrorType.ERROR_SAFEBROWSING_MALWARE_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.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
import org.mozilla.fenix.helpers.perf.TestStrictModeManager
import org.mozilla.fenix.utils.Settings import org.mozilla.fenix.utils.Settings
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
@ -60,6 +61,7 @@ class HomeActivityTest {
@Test @Test
fun `getModeFromIntentOrLastKnown returns mode from settings when intent does not set`() { fun `getModeFromIntentOrLastKnown returns mode from settings when intent does not set`() {
every { testContext.settings() } returns Settings(testContext)
every { activity.applicationContext } returns testContext every { activity.applicationContext } returns testContext
testContext.settings().lastKnownMode = BrowsingMode.Private testContext.settings().lastKnownMode = BrowsingMode.Private
@ -68,6 +70,7 @@ class HomeActivityTest {
@Test @Test
fun `getModeFromIntentOrLastKnown returns mode from intent when set`() { fun `getModeFromIntentOrLastKnown returns mode from intent when set`() {
every { testContext.settings() } returns Settings(testContext)
testContext.settings().lastKnownMode = BrowsingMode.Normal testContext.settings().lastKnownMode = BrowsingMode.Normal
val intent = Intent() val intent = Intent()
@ -139,6 +142,7 @@ class HomeActivityTest {
@Test @Test
fun `GIVEN the user has been away for a long time WHEN the user opens the app THEN do start on home`() { 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 settings: Settings = mockk()
val startingIntent = Intent().apply { val startingIntent = Intent().apply {
action = Intent.ACTION_MAIN action = Intent.ACTION_MAIN
@ -153,6 +157,7 @@ class HomeActivityTest {
@Test @Test
fun `GIVEN the user has been away for a long time WHEN opening a link THEN do not start on home`() { 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 settings: Settings = mockk()
val startingIntent = Intent().apply { val startingIntent = Intent().apply {
action = Intent.ACTION_VIEW action = Intent.ACTION_VIEW

View File

@ -16,7 +16,6 @@ import io.mockk.unmockkStatic
import io.mockk.verify import io.mockk.verify
import kotlinx.coroutines.test.runBlockingTest import kotlinx.coroutines.test.runBlockingTest
import mozilla.components.feature.intent.processing.IntentProcessor import mozilla.components.feature.intent.processing.IntentProcessor
import mozilla.components.support.test.robolectric.testContext
import org.junit.After import org.junit.After
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue 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.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
import org.mozilla.fenix.helpers.perf.TestStrictModeManager
import org.mozilla.fenix.shortcut.NewTabShortcutIntentProcessor import org.mozilla.fenix.shortcut.NewTabShortcutIntentProcessor
import org.mozilla.fenix.utils.Settings import org.mozilla.fenix.utils.Settings
import org.robolectric.Robolectric import org.robolectric.Robolectric
@ -201,10 +201,7 @@ class IntentReceiverActivityTest {
every { activity.settings() } returns settings every { activity.settings() } returns settings
every { activity.components.analytics } returns mockk(relaxed = true) every { activity.components.analytics } returns mockk(relaxed = true)
every { activity.components.intentProcessors } returns intentProcessors every { activity.components.intentProcessors } returns intentProcessors
every { activity.components.strictMode } returns TestStrictModeManager()
// 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
} }
private inline fun <reified T : IntentProcessor> mockIntentProcessor(): T { 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.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith 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.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.utils.Settings
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
class BaseBrowserFragmentTest { class BaseBrowserFragmentTest {
private lateinit var fragment: TestBaseBrowserFragment private lateinit var fragment: TestBaseBrowserFragment
private lateinit var swipeRefreshLayout: VerticalSwipeRefreshLayout private lateinit var swipeRefreshLayout: VerticalSwipeRefreshLayout
private lateinit var engineView: EngineView private lateinit var engineView: EngineView
private lateinit var settings: Settings
@Before @Before
fun setup() { fun setup() {
fragment = spyk(TestBaseBrowserFragment()) fragment = spyk(TestBaseBrowserFragment())
swipeRefreshLayout = mockk(relaxed = true) swipeRefreshLayout = mockk(relaxed = true)
engineView = mockk(relaxed = true) engineView = mockk(relaxed = true)
settings = mockk(relaxed = true)
every { testContext.components.settings } returns settings
every { fragment.isAdded } returns true every { fragment.isAdded } returns true
every { fragment.activity } returns mockk() every { fragment.activity } returns mockk()
every { fragment.requireContext() } returns testContext every { fragment.requireContext() } returns testContext
@ -50,8 +54,8 @@ class BaseBrowserFragmentTest {
@Test @Test
fun `initializeEngineView should setDynamicToolbarMaxHeight to 0 if top toolbar is forced for a11y`() { fun `initializeEngineView should setDynamicToolbarMaxHeight to 0 if top toolbar is forced for a11y`() {
every { testContext.settings().shouldUseBottomToolbar } returns false every { settings.shouldUseBottomToolbar } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns true every { settings.shouldUseFixedTopToolbar } returns true
fragment.initializeEngineView(13) fragment.initializeEngineView(13)
@ -60,8 +64,8 @@ class BaseBrowserFragmentTest {
@Test @Test
fun `initializeEngineView should setDynamicToolbarMaxHeight to 0 if bottom toolbar is forced for a11y`() { fun `initializeEngineView should setDynamicToolbarMaxHeight to 0 if bottom toolbar is forced for a11y`() {
every { testContext.settings().shouldUseBottomToolbar } returns true every { settings.shouldUseBottomToolbar } returns true
every { testContext.settings().shouldUseFixedTopToolbar } returns true every { settings.shouldUseFixedTopToolbar } returns true
fragment.initializeEngineView(13) fragment.initializeEngineView(13)
@ -70,8 +74,8 @@ class BaseBrowserFragmentTest {
@Test @Test
fun `initializeEngineView should setDynamicToolbarMaxHeight to toolbar height if dynamic toolbar is enabled`() { fun `initializeEngineView should setDynamicToolbarMaxHeight to toolbar height if dynamic toolbar is enabled`() {
every { testContext.settings().shouldUseFixedTopToolbar } returns false every { settings.shouldUseFixedTopToolbar } returns false
every { testContext.settings().isDynamicToolbarEnabled } returns true every { settings.isDynamicToolbarEnabled } returns true
fragment.initializeEngineView(13) fragment.initializeEngineView(13)
@ -80,8 +84,8 @@ class BaseBrowserFragmentTest {
@Test @Test
fun `initializeEngineView should setDynamicToolbarMaxHeight to 0 if dynamic toolbar is disabled`() { fun `initializeEngineView should setDynamicToolbarMaxHeight to 0 if dynamic toolbar is disabled`() {
every { testContext.settings().shouldUseFixedTopToolbar } returns false every { settings.shouldUseFixedTopToolbar } returns false
every { testContext.settings().isDynamicToolbarEnabled } returns false every { settings.isDynamicToolbarEnabled } returns false
fragment.initializeEngineView(13) fragment.initializeEngineView(13)
@ -90,8 +94,8 @@ class BaseBrowserFragmentTest {
@Test @Test
fun `initializeEngineView should set EngineViewBrowserToolbarBehavior when dynamic toolbar is enabled`() { fun `initializeEngineView should set EngineViewBrowserToolbarBehavior when dynamic toolbar is enabled`() {
every { testContext.settings().shouldUseFixedTopToolbar } returns false every { settings.shouldUseFixedTopToolbar } returns false
every { testContext.settings().isDynamicToolbarEnabled } returns true every { settings.isDynamicToolbarEnabled } returns true
val params: CoordinatorLayout.LayoutParams = mockk(relaxed = true) val params: CoordinatorLayout.LayoutParams = mockk(relaxed = true)
every { params.behavior } returns mockk(relaxed = true) every { params.behavior } returns mockk(relaxed = true)
every { swipeRefreshLayout.layoutParams } returns params every { swipeRefreshLayout.layoutParams } returns params
@ -106,8 +110,8 @@ class BaseBrowserFragmentTest {
@Test @Test
fun `initializeEngineView should set toolbar height as EngineView parent's bottom margin when using bottom toolbar`() { fun `initializeEngineView should set toolbar height as EngineView parent's bottom margin when using bottom toolbar`() {
every { testContext.settings().isDynamicToolbarEnabled } returns false every { settings.isDynamicToolbarEnabled } returns false
every { testContext.settings().shouldUseBottomToolbar } returns true every { settings.shouldUseBottomToolbar } returns true
fragment.initializeEngineView(13) fragment.initializeEngineView(13)
@ -116,8 +120,8 @@ class BaseBrowserFragmentTest {
@Test @Test
fun `initializeEngineView should set toolbar height as EngineView parent's bottom margin if top toolbar is forced for a11y`() { 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 { settings.shouldUseBottomToolbar } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns true every { settings.shouldUseFixedTopToolbar } returns true
fragment.initializeEngineView(13) fragment.initializeEngineView(13)
@ -126,8 +130,8 @@ class BaseBrowserFragmentTest {
@Test @Test
fun `initializeEngineView should set toolbar height as EngineView parent's bottom margin if bottom toolbar is forced for a11y`() { 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 { settings.shouldUseBottomToolbar } returns true
every { testContext.settings().shouldUseFixedTopToolbar } returns true every { settings.shouldUseFixedTopToolbar } returns true
fragment.initializeEngineView(13) fragment.initializeEngineView(13)

View File

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

View File

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

View File

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

View File

@ -12,12 +12,14 @@ import io.mockk.just
import io.mockk.mockk import io.mockk.mockk
import io.mockk.verify import io.mockk.verify
import mozilla.components.feature.tab.collections.TabCollection import mozilla.components.feature.tab.collections.TabCollection
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.databinding.CollectionsListItemBinding import org.mozilla.fenix.databinding.CollectionsListItemBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
@ -51,6 +53,7 @@ class SaveCollectionListAdapterTest {
@Test @Test
fun `creates and binds viewholder`() { fun `creates and binds viewholder`() {
every { testContext.components.publicSuffixList } returns PublicSuffixList(testContext)
val collection = mockk<TabCollection> { val collection = mockk<TabCollection> {
every { id } returns 0L every { id } returns 0L
every { title } returns "Collection" 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.assertEquals
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.HomeActivity
@ -22,6 +23,10 @@ import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
class IntentProcessorTypeTest { class IntentProcessorTypeTest {
@Before
fun setup() {
every { testContext.components.intentProcessors } returns mockk(relaxed = true)
}
@Test @Test
fun `should open intent with flag launched from history`() { fun `should open intent with flag launched from history`() {
@ -72,6 +77,7 @@ class IntentProcessorTypeTest {
@Test @Test
fun `get type for private custom tab intent processor`() { fun `get type for private custom tab intent processor`() {
every { testContext.components.intentProcessors } returns mockk(relaxed = true)
val processor = testContext.components.intentProcessors.privateCustomTabIntentProcessor val processor = testContext.components.intentProcessors.privateCustomTabIntentProcessor
val type = testContext.components.intentProcessors.getType(processor) 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 org.junit.runner.RunWith
import mozilla.components.browser.toolbar.BrowserToolbar import mozilla.components.browser.toolbar.BrowserToolbar
import mozilla.components.browser.toolbar.behavior.BrowserToolbarBehavior import mozilla.components.browser.toolbar.behavior.BrowserToolbarBehavior
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import org.junit.Assert.assertNotNull import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull import org.junit.Assert.assertNull
import org.junit.Before 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.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.utils.Settings
import mozilla.components.browser.toolbar.behavior.ToolbarPosition as MozacToolbarPosition import mozilla.components.browser.toolbar.behavior.ToolbarPosition as MozacToolbarPosition
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
@ -28,17 +30,23 @@ class BrowserToolbarViewTest {
private lateinit var toolbarView: BrowserToolbarView private lateinit var toolbarView: BrowserToolbarView
private lateinit var toolbar: BrowserToolbar private lateinit var toolbar: BrowserToolbar
private lateinit var behavior: BrowserToolbarBehavior private lateinit var behavior: BrowserToolbarBehavior
private lateinit var settings: Settings
@Before @Before
fun `setup`() { fun setup() {
toolbar = BrowserToolbar(testContext) toolbar = BrowserToolbar(testContext)
toolbar.layoutParams = CoordinatorLayout.LayoutParams(100, 100) toolbar.layoutParams = CoordinatorLayout.LayoutParams(100, 100)
behavior = spyk(BrowserToolbarBehavior(testContext, null, MozacToolbarPosition.BOTTOM)) behavior = spyk(BrowserToolbarBehavior(testContext, null, MozacToolbarPosition.BOTTOM))
(toolbar.layoutParams as CoordinatorLayout.LayoutParams).behavior = behavior (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( toolbarView = BrowserToolbarView(
context = testContext,
settings = settings,
container = CoordinatorLayout(testContext), container = CoordinatorLayout(testContext),
toolbarPosition = ToolbarPosition.BOTTOM,
interactor = mockk(), interactor = mockk(),
customTabSession = mockk(relaxed = true), customTabSession = mockk(relaxed = true),
lifecycleOwner = mockk() lifecycleOwner = mockk()
@ -50,10 +58,10 @@ class BrowserToolbarViewTest {
@Test @Test
fun `setToolbarBehavior(false) should setDynamicToolbarBehavior if no a11y, bottom toolbar is dynamic and the tab is not for a PWA or TWA`() { 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) val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns true every { settings.isDynamicToolbarEnabled } returns true
every { toolbarViewSpy.isPwaTabOrTwaTab } returns false every { toolbarViewSpy.isPwaTabOrTwaTab } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns false every { settings.shouldUseFixedTopToolbar } returns false
toolbarViewSpy.setToolbarBehavior(false) toolbarViewSpy.setToolbarBehavior(false)
@ -63,10 +71,10 @@ class BrowserToolbarViewTest {
@Test @Test
fun `setToolbarBehavior(false) should expandToolbarAndMakeItFixed if bottom toolbar is not set as dynamic`() { fun `setToolbarBehavior(false) should expandToolbarAndMakeItFixed if bottom toolbar is not set as dynamic`() {
val toolbarViewSpy = spyk(toolbarView) val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns false every { settings.isDynamicToolbarEnabled } returns false
every { toolbarViewSpy.isPwaTabOrTwaTab } returns false every { toolbarViewSpy.isPwaTabOrTwaTab } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns false every { settings.shouldUseFixedTopToolbar } returns false
toolbarViewSpy.setToolbarBehavior(false) toolbarViewSpy.setToolbarBehavior(false)
@ -76,10 +84,10 @@ class BrowserToolbarViewTest {
@Test @Test
fun `setToolbarBehavior(false) should expandToolbarAndMakeItFixed if bottom toolbar is dynamic but the tab is for a PWA or TWA`() { fun `setToolbarBehavior(false) should expandToolbarAndMakeItFixed if bottom toolbar is dynamic but the tab is for a PWA or TWA`() {
val toolbarViewSpy = spyk(toolbarView) val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns true every { settings.isDynamicToolbarEnabled } returns true
every { toolbarViewSpy.isPwaTabOrTwaTab } returns true every { toolbarViewSpy.isPwaTabOrTwaTab } returns true
every { testContext.settings().shouldUseFixedTopToolbar } returns false every { settings.shouldUseFixedTopToolbar } returns false
toolbarViewSpy.setToolbarBehavior(false) toolbarViewSpy.setToolbarBehavior(false)
@ -89,10 +97,10 @@ class BrowserToolbarViewTest {
@Test @Test
fun `setToolbarBehavior(false) should expandToolbarAndMakeItFixed if bottom toolbar is dynamic tab is not for a PWA or TWA but a11y is enabled`() { 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) val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns true every { settings.isDynamicToolbarEnabled } returns true
every { toolbarViewSpy.isPwaTabOrTwaTab } returns false every { toolbarViewSpy.isPwaTabOrTwaTab } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns true every { settings.shouldUseFixedTopToolbar } returns true
toolbarViewSpy.setToolbarBehavior(false) toolbarViewSpy.setToolbarBehavior(false)
@ -104,10 +112,10 @@ class BrowserToolbarViewTest {
// All intrinsic checks are met but the method was called with `shouldDisableScroll` = true // All intrinsic checks are met but the method was called with `shouldDisableScroll` = true
val toolbarViewSpy = spyk(toolbarView) val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns true every { settings.isDynamicToolbarEnabled } returns true
every { toolbarViewSpy.isPwaTabOrTwaTab } returns false every { toolbarViewSpy.isPwaTabOrTwaTab } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns false every { settings.shouldUseFixedTopToolbar } returns false
toolbarViewSpy.setToolbarBehavior(false) toolbarViewSpy.setToolbarBehavior(false)
@ -117,10 +125,10 @@ class BrowserToolbarViewTest {
@Test @Test
fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed if bottom toolbar is not set as dynamic`() { fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed if bottom toolbar is not set as dynamic`() {
val toolbarViewSpy = spyk(toolbarView) val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns false every { settings.isDynamicToolbarEnabled } returns false
every { toolbarViewSpy.isPwaTabOrTwaTab } returns false every { toolbarViewSpy.isPwaTabOrTwaTab } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns false every { settings.shouldUseFixedTopToolbar } returns false
toolbarViewSpy.setToolbarBehavior(false) toolbarViewSpy.setToolbarBehavior(false)
@ -130,10 +138,10 @@ class BrowserToolbarViewTest {
@Test @Test
fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed if bottom toolbar is dynamic but the tab is for a PWA or TWA`() { fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed if bottom toolbar is dynamic but the tab is for a PWA or TWA`() {
val toolbarViewSpy = spyk(toolbarView) val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns true every { settings.isDynamicToolbarEnabled } returns true
every { toolbarViewSpy.isPwaTabOrTwaTab } returns true every { toolbarViewSpy.isPwaTabOrTwaTab } returns true
every { testContext.settings().shouldUseFixedTopToolbar } returns false every { settings.shouldUseFixedTopToolbar } returns false
toolbarViewSpy.setToolbarBehavior(false) toolbarViewSpy.setToolbarBehavior(false)
@ -143,10 +151,10 @@ class BrowserToolbarViewTest {
@Test @Test
fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed if bottom toolbar is dynamic, the tab is for a PWA or TWA and a11 is enabled`() { 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) val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.BOTTOM every { settings.toolbarPosition } returns ToolbarPosition.BOTTOM
every { testContext.settings().isDynamicToolbarEnabled } returns true every { settings.isDynamicToolbarEnabled } returns true
every { toolbarViewSpy.isPwaTabOrTwaTab } returns false every { toolbarViewSpy.isPwaTabOrTwaTab } returns false
every { testContext.settings().shouldUseFixedTopToolbar } returns true every { settings.shouldUseFixedTopToolbar } returns true
toolbarViewSpy.setToolbarBehavior(false) toolbarViewSpy.setToolbarBehavior(false)
@ -156,8 +164,8 @@ class BrowserToolbarViewTest {
@Test @Test
fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed for top toolbar if shouldUseFixedTopToolbar`() { fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed for top toolbar if shouldUseFixedTopToolbar`() {
val toolbarViewSpy = spyk(toolbarView) val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.TOP every { settings.toolbarPosition } returns ToolbarPosition.TOP
every { testContext.settings().shouldUseFixedTopToolbar } returns true every { settings.shouldUseFixedTopToolbar } returns true
toolbarViewSpy.setToolbarBehavior(true) toolbarViewSpy.setToolbarBehavior(true)
@ -167,8 +175,8 @@ class BrowserToolbarViewTest {
@Test @Test
fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed for top toolbar if it is not dynamic`() { fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed for top toolbar if it is not dynamic`() {
val toolbarViewSpy = spyk(toolbarView) val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.TOP every { settings.toolbarPosition } returns ToolbarPosition.TOP
every { testContext.settings().isDynamicToolbarEnabled } returns false every { settings.isDynamicToolbarEnabled } returns false
toolbarViewSpy.setToolbarBehavior(true) toolbarViewSpy.setToolbarBehavior(true)
@ -178,7 +186,7 @@ class BrowserToolbarViewTest {
@Test @Test
fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed for top toolbar if shouldDisableScroll`() { fun `setToolbarBehavior(true) should expandToolbarAndMakeItFixed for top toolbar if shouldDisableScroll`() {
val toolbarViewSpy = spyk(toolbarView) val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.TOP every { settings.toolbarPosition } returns ToolbarPosition.TOP
toolbarViewSpy.setToolbarBehavior(true) toolbarViewSpy.setToolbarBehavior(true)
@ -188,9 +196,9 @@ class BrowserToolbarViewTest {
@Test @Test
fun `setToolbarBehavior(false) should setDynamicToolbarBehavior for top toolbar`() { fun `setToolbarBehavior(false) should setDynamicToolbarBehavior for top toolbar`() {
val toolbarViewSpy = spyk(toolbarView) val toolbarViewSpy = spyk(toolbarView)
every { testContext.settings().toolbarPosition } returns ToolbarPosition.TOP every { settings.toolbarPosition } returns ToolbarPosition.TOP
every { testContext.settings().shouldUseFixedTopToolbar } returns true every { settings.shouldUseFixedTopToolbar } returns true
every { testContext.settings().isDynamicToolbarEnabled } returns true every { settings.isDynamicToolbarEnabled } returns true
toolbarViewSpy.setToolbarBehavior(true) toolbarViewSpy.setToolbarBehavior(true)

View File

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

View File

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

View File

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

View File

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

View File

@ -4,9 +4,10 @@
package org.mozilla.fenix.helpers package org.mozilla.fenix.helpers
import io.mockk.mockk
import org.mozilla.fenix.FenixApplication import org.mozilla.fenix.FenixApplication
import org.mozilla.fenix.R 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 * 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() setApplicationTheme()
} }
override val components = TestComponents(this) override val components = mockk<Components>()
override fun initializeGlean() = Unit 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.state.SearchState
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.feature.search.ext.createSearchEngine import mozilla.components.feature.search.ext.createSearchEngine
import mozilla.components.support.test.robolectric.testContext
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.BrowserDirection
import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.helpers.perf.TestStrictModeManager
import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_PROCESSING import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_PROCESSING
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
@ -84,6 +87,7 @@ class SpeechProcessingIntentProcessorTest {
@Test @Test
fun `reads the speech processing extra`() { fun `reads the speech processing extra`() {
every { testContext.components.strictMode } returns TestStrictModeManager()
val intent = Intent().apply { val intent = Intent().apply {
putExtra(HomeActivity.OPEN_TO_BROWSER_AND_LOAD, true) putExtra(HomeActivity.OPEN_TO_BROWSER_AND_LOAD, true)
putExtra(SPEECH_PROCESSING, "hello world") putExtra(SPEECH_PROCESSING, "hello world")

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -9,6 +9,8 @@ import android.util.AttributeSet
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.FrameLayout import android.widget.FrameLayout
import io.mockk.every
import io.mockk.mockk
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotEquals import org.junit.Assert.assertNotEquals
@ -16,6 +18,7 @@ import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import java.io.File import java.io.File
@ -34,6 +37,7 @@ class PerformanceInflaterTest {
fun setup() { fun setup() {
InflationCounter.inflationCount.set(0) InflationCounter.inflationCount.set(0)
every { testContext.components.core.engine.profiler } returns mockk(relaxed = true)
perfInflater = MockInflater(LayoutInflater.from(testContext), testContext) 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.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.search.SearchEngineSource import org.mozilla.fenix.search.SearchEngineSource
import org.mozilla.fenix.search.SearchFragmentState import org.mozilla.fenix.search.SearchFragmentState
import org.mozilla.fenix.utils.Settings
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
class ToolbarViewTest { class ToolbarViewTest {
@ -154,6 +155,7 @@ class ToolbarViewTest {
private fun buildToolbarView(isPrivate: Boolean) = ToolbarView( private fun buildToolbarView(isPrivate: Boolean) = ToolbarView(
context, context,
Settings(context),
interactor, interactor,
historyStorage = null, historyStorage = null,
isPrivate = isPrivate, 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.state.createTab
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.feature.privatemode.notification.AbstractPrivateNotificationService.Companion.ACTION_ERASE 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.robolectric.testContext
import mozilla.components.support.test.rule.MainCoroutineRule import mozilla.components.support.test.rule.MainCoroutineRule
import org.junit.After import org.junit.After
@ -44,8 +45,10 @@ class PrivateNotificationServiceTest {
@Before @Before
fun setup() { fun setup() {
store = testContext.components.core.store store = mockk()
every { store.dispatch(any()) } returns 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( controller = Robolectric.buildService(
PrivateNotificationService::class.java, PrivateNotificationService::class.java,

View File

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

View File

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

View File

@ -7,6 +7,7 @@ package org.mozilla.fenix.settings.creditcards
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.preference.Preference import androidx.preference.Preference
import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import io.mockk.verify import io.mockk.verify
import kotlinx.coroutines.test.TestCoroutineDispatcher import kotlinx.coroutines.test.TestCoroutineDispatcher
@ -19,6 +20,7 @@ import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.getPreferenceKey import org.mozilla.fenix.ext.getPreferenceKey
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.robolectric.Robolectric import org.robolectric.Robolectric
@ -32,6 +34,8 @@ class CreditCardsSettingFragmentTest {
@Before @Before
fun setUp() { fun setUp() {
every { testContext.components.settings } returns mockk(relaxed = true)
creditCardsSettingFragment = CreditCardsSettingFragment() creditCardsSettingFragment = CreditCardsSettingFragment()
val activity = Robolectric.buildActivity(FragmentActivity::class.java).create().get() 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 androidx.navigation.NavController
import io.mockk.mockk import io.mockk.mockk
import io.mockk.verifyAll import io.mockk.verifyAll
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.BrowserDirection
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.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.settings.logins.controller.LoginsListController import org.mozilla.fenix.settings.logins.controller.LoginsListController
@ -24,7 +24,7 @@ import org.mozilla.fenix.utils.Settings
class LoginsListControllerTest { class LoginsListControllerTest {
private val store: LoginsFragmentStore = mockk(relaxed = true) private val store: LoginsFragmentStore = mockk(relaxed = true)
private val settings: Settings = 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 sortingStrategy: SortingStrategy = SortingStrategy.Alphabetically(publicSuffixList)
private val navController: NavController = mockk(relaxed = true) private val navController: NavController = mockk(relaxed = true)
private val browserNavigator: (String, Boolean, BrowserDirection) -> Unit = 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 package org.mozilla.fenix.settings.logins
import android.view.LayoutInflater import android.view.LayoutInflater
import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import io.mockk.verify import io.mockk.verify
import mozilla.components.browser.icons.BrowserIcons
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.databinding.LoginsItemBinding import org.mozilla.fenix.databinding.LoginsItemBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.settings.logins.interactor.SavedLoginsInteractor import org.mozilla.fenix.settings.logins.interactor.SavedLoginsInteractor
import org.mozilla.fenix.settings.logins.view.LoginsListViewHolder import org.mozilla.fenix.settings.logins.view.LoginsListViewHolder
@ -35,6 +38,7 @@ class LoginsListViewHolderTest {
fun setup() { fun setup() {
binding = LoginsItemBinding.inflate(LayoutInflater.from(testContext)) binding = LoginsItemBinding.inflate(LayoutInflater.from(testContext))
interactor = mockk(relaxed = true) interactor = mockk(relaxed = true)
every { testContext.components.core.icons } returns BrowserIcons(testContext, mockk(relaxed = true))
} }
@Test @Test

View File

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

View File

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

View File

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

View File

@ -18,8 +18,9 @@ import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R 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.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.utils.Settings
import org.mozilla.gecko.search.SearchWidgetProvider import org.mozilla.gecko.search.SearchWidgetProvider
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
@ -27,12 +28,16 @@ class SearchEngineFragmentTest {
@Test @Test
fun `GIVEN pref_key_show_voice_search setting WHEN it is modified THEN the value is persisted and widgets updated`() { fun `GIVEN pref_key_show_voice_search setting WHEN it is modified THEN the value is persisted and widgets updated`() {
try { try {
mockkObject(SearchWidgetProvider.Companion) val settings = mockk<Settings>(relaxed = true)
every { settings.preferences }
every { testContext.components.settings } returns settings
val preferences: SharedPreferences = mockk() val preferences: SharedPreferences = mockk()
val preferencesEditor: SharedPreferences.Editor = mockk(relaxed = true) val preferencesEditor: SharedPreferences.Editor = mockk(relaxed = true)
every { testContext.settings().preferences } returns preferences every { settings.preferences } returns preferences
every { preferences.edit() } returns preferencesEditor every { preferences.edit() } returns preferencesEditor
mockkObject(SearchWidgetProvider.Companion)
val fragment = spyk(SearchEngineFragment()) { val fragment = spyk(SearchEngineFragment()) {
every { context } returns testContext every { context } returns testContext
every { isAdded } returns true 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.browser.storage.sync.TabEntry
import mozilla.components.concept.sync.DeviceType import mozilla.components.concept.sync.DeviceType
import mozilla.components.feature.syncedtabs.view.SyncedTabsView import mozilla.components.feature.syncedtabs.view.SyncedTabsView
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
@ -103,6 +105,7 @@ class SyncedTabsAdapterTest {
@Test @Test
fun `adapter can create and bind viewholders for SyncedDeviceTabs`() { fun `adapter can create and bind viewholders for SyncedDeviceTabs`() {
every { testContext.components.publicSuffixList } returns PublicSuffixList(testContext)
val parent = FrameLayout(testContext) val parent = FrameLayout(testContext)
adapter.updateData(listOf(oneTabDevice)) 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.Device
import mozilla.components.concept.sync.DeviceType import mozilla.components.concept.sync.DeviceType
import mozilla.components.feature.syncedtabs.view.SyncedTabsView import mozilla.components.feature.syncedtabs.view.SyncedTabsView
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Before import org.junit.Before
@ -25,6 +26,7 @@ import org.junit.runner.RunWith
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.databinding.SyncTabsListItemBinding import org.mozilla.fenix.databinding.SyncTabsListItemBinding
import org.mozilla.fenix.databinding.ViewSyncedTabsGroupBinding import org.mozilla.fenix.databinding.ViewSyncedTabsGroupBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
@ -80,6 +82,7 @@ class SyncedTabsViewHolderTest {
@Test @Test
fun `TabViewHolder binds active tab`() { fun `TabViewHolder binds active tab`() {
every { testContext.components.publicSuffixList } returns PublicSuffixList(testContext)
tabViewHolder.bind(SyncedTabsAdapter.AdapterItem.Tab(tab), mockk()) tabViewHolder.bind(SyncedTabsAdapter.AdapterItem.Tab(tab), mockk())
assertEquals("Firefox", syncTabsListItemBinding.syncedTabItemTitle.text) assertEquals("Firefox", syncTabsListItemBinding.syncedTabItemTitle.text)
@ -88,6 +91,7 @@ class SyncedTabsViewHolderTest {
@Test @Test
fun `TabViewHolder calls interactor on click`() { fun `TabViewHolder calls interactor on click`() {
every { testContext.components.publicSuffixList } returns PublicSuffixList(testContext)
val interactor = mockk<SyncedTabsView.Listener>(relaxed = true) val interactor = mockk<SyncedTabsView.Listener>(relaxed = true)
tabViewHolder.bind(SyncedTabsAdapter.AdapterItem.Tab(tab), interactor) tabViewHolder.bind(SyncedTabsAdapter.AdapterItem.Tab(tab), interactor)

View File

@ -8,9 +8,12 @@ import android.content.Context
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.appcompat.view.ContextThemeWrapper import androidx.appcompat.view.ContextThemeWrapper
import io.mockk.MockKAnnotations import io.mockk.MockKAnnotations
import io.mockk.impl.annotations.MockK import io.mockk.every
import io.mockk.spyk
import io.mockk.verify 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 mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
@ -18,6 +21,7 @@ import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
@ -52,6 +56,7 @@ class TabHistoryAdapterTest {
@Test @Test
fun `creates and binds view holder`() { fun `creates and binds view holder`() {
every { testContext.components.core.icons } returns BrowserIcons(testContext, mockk(relaxed = true))
adapter.submitList(listOf(selectedItem, unselectedItem)) adapter.submitList(listOf(selectedItem, unselectedItem))
val holder = spyk(adapter.createViewHolder(parent, 0)) 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.LayoutInflater
import android.view.View import android.view.View
import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import io.mockk.verify import io.mockk.verify
import mozilla.components.browser.state.state.TabSessionState 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.selection.SelectionHolder
import org.mozilla.fenix.tabstray.TabsTrayStore import org.mozilla.fenix.tabstray.TabsTrayStore
import mozilla.components.browser.state.state.createTab import mozilla.components.browser.state.state.createTab
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import org.mozilla.fenix.ext.components
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
class AbstractBrowserTabViewHolderTest { class AbstractBrowserTabViewHolderTest {
@ -30,6 +33,7 @@ class AbstractBrowserTabViewHolderTest {
@Test @Test
fun `WHEN itemView is clicked THEN interactor invokes open`() { 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 view = LayoutInflater.from(testContext).inflate(R.layout.tab_tray_item, null)
val holder = TestTabTrayViewHolder( val holder = TestTabTrayViewHolder(
view, view,
@ -50,6 +54,7 @@ class AbstractBrowserTabViewHolderTest {
@Test @Test
fun `WHEN itemView is clicked with a selection holder THEN the select holder is invoked`() { 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 view = LayoutInflater.from(testContext).inflate(R.layout.tab_tray_item, null)
val selectionHolder = TestSelectionHolder(emptySet()) val selectionHolder = TestSelectionHolder(emptySet())
val holder = TestTabTrayViewHolder( val holder = TestTabTrayViewHolder(

View File

@ -4,11 +4,14 @@
package org.mozilla.fenix.tabstray.browser package org.mozilla.fenix.tabstray.browser
import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import io.mockk.verify import io.mockk.verify
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.tabstray.TabsTrayStore import org.mozilla.fenix.tabstray.TabsTrayStore
@ -17,6 +20,7 @@ class AbstractBrowserTrayListTest {
@Test @Test
fun `WHEN recyclerview detaches from window THEN notify adapter`() { fun `WHEN recyclerview detaches from window THEN notify adapter`() {
every { testContext.components.core.store } returns BrowserStore()
val trayList = PrivateBrowserTrayList(testContext) val trayList = PrivateBrowserTrayList(testContext)
val adapter = mockk<BrowserTabsAdapter>(relaxed = true) 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.selection.SelectionHolder
import org.mozilla.fenix.tabstray.TabsTrayStore import org.mozilla.fenix.tabstray.TabsTrayStore
import mozilla.components.browser.state.state.createTab import mozilla.components.browser.state.state.createTab
import mozilla.components.browser.state.store.BrowserStore
import org.mozilla.fenix.ext.components
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
class BrowserTabsAdapterTest { class BrowserTabsAdapterTest {
@ -30,6 +32,7 @@ class BrowserTabsAdapterTest {
@Test @Test
fun `WHEN bind with payloads is called THEN update the holder`() { 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 adapter = BrowserTabsAdapter(context, interactor, store, "Test")
val holder = mockk<AbstractBrowserTabViewHolder>(relaxed = true) val holder = mockk<AbstractBrowserTabViewHolder>(relaxed = true)
@ -51,6 +54,10 @@ class BrowserTabsAdapterTest {
@Test @Test
fun `WHEN the selection holder is set THEN update the selected tab`() { 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 adapter = BrowserTabsAdapter(context, interactor, store, "Test")
val binding = TabTrayItemBinding.inflate(LayoutInflater.from(testContext)) val binding = TabTrayItemBinding.inflate(LayoutInflater.from(testContext))
val holder = spyk( val holder = spyk(

View File

@ -5,12 +5,15 @@
package org.mozilla.fenix.tabstray.browser package org.mozilla.fenix.tabstray.browser
import android.view.LayoutInflater import android.view.LayoutInflater
import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import io.mockk.verify import io.mockk.verify
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith 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.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.tabstray.TabsTrayInteractor import org.mozilla.fenix.tabstray.TabsTrayInteractor
import org.mozilla.fenix.tabstray.browser.InactiveTabViewHolder.HeaderHolder import org.mozilla.fenix.tabstray.browser.InactiveTabViewHolder.HeaderHolder
@ -19,6 +22,7 @@ import org.mozilla.fenix.tabstray.browser.InactiveTabViewHolder.HeaderHolder
class InactiveTabViewHolderTest { class InactiveTabViewHolderTest {
@Test @Test
fun `HeaderHolder - WHEN clicked THEN notify the interactor`() { 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 view = LayoutInflater.from(testContext).inflate(HeaderHolder.LAYOUT_ID, null)
val interactor: InactiveTabsInteractor = mockk(relaxed = true) val interactor: InactiveTabsInteractor = mockk(relaxed = true)
val tabsTrayInteractor: TabsTrayInteractor = 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.GONE
import android.view.View.VISIBLE import android.view.View.VISIBLE
import android.widget.TextView import android.widget.TextView
import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import mozilla.components.browser.state.state.createTab import mozilla.components.browser.state.state.createTab
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
@ -16,6 +17,7 @@ import org.junit.Assert.assertTrue
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.tabstray.TabsTrayInteractor import org.mozilla.fenix.tabstray.TabsTrayInteractor
import org.mozilla.fenix.tabstray.TabsTrayStore import org.mozilla.fenix.tabstray.TabsTrayStore
@ -29,6 +31,10 @@ class AbstractBrowserPageViewHolderTest {
val browserStore = BrowserStore() val browserStore = BrowserStore()
val interactor = mockk<TabsTrayInteractor>(relaxed = true) val interactor = mockk<TabsTrayInteractor>(relaxed = true)
val browserTrayInteractor = mockk<BrowserTrayInteractor>(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") val adapter = BrowserTabsAdapter(testContext, browserTrayInteractor, tabsTrayStore, "Test")
@Test @Test

View File

@ -7,6 +7,7 @@ package org.mozilla.fenix.trackingprotection
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.core.view.isVisible import androidx.core.view.isVisible
import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import io.mockk.verify import io.mockk.verify
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
@ -17,6 +18,7 @@ import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.CROSS_SITE_TRACKING_COOKIES import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.CROSS_SITE_TRACKING_COOKIES
import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.SOCIAL_MEDIA_TRACKERS import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.SOCIAL_MEDIA_TRACKERS
@ -99,6 +101,7 @@ class TrackingProtectionPanelViewTest {
@Test @Test
fun testSocialMediaTrackerClick() { fun testSocialMediaTrackerClick() {
every { testContext.components.analytics } returns mockk(relaxed = true)
view.binding.socialMediaTrackers.performClick() view.binding.socialMediaTrackers.performClick()
verify { interactor.openDetails(SOCIAL_MEDIA_TRACKERS, categoryBlocked = true) } verify { interactor.openDetails(SOCIAL_MEDIA_TRACKERS, categoryBlocked = true) }
@ -108,6 +111,7 @@ class TrackingProtectionPanelViewTest {
@Test @Test
fun testCrossSiteTrackerClick() { fun testCrossSiteTrackerClick() {
every { testContext.components.analytics } returns mockk(relaxed = true)
view.binding.crossSiteTracking.performClick() view.binding.crossSiteTracking.performClick()
verify { interactor.openDetails(CROSS_SITE_TRACKING_COOKIES, categoryBlocked = true) } 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import io.mockk.every
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.ext.clearAndCommit import org.mozilla.fenix.ext.clearAndCommit
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.helpers.perf.TestStrictModeManager
@RunWith(FenixRobolectricTestRunner::class) @RunWith(FenixRobolectricTestRunner::class)
class WhatsNewTest { class WhatsNewTest {
@ -27,6 +30,7 @@ class WhatsNewTest {
@Test @Test
fun `should highlight after fresh install`() { fun `should highlight after fresh install`() {
every { testContext.components.strictMode } returns TestStrictModeManager()
assertEquals(true, WhatsNew.shouldHighlightWhatsNew(testContext)) assertEquals(true, WhatsNew.shouldHighlightWhatsNew(testContext))
} }
@ -80,6 +84,7 @@ class WhatsNewTest {
@Test @Test
fun `should not highlight after user viewed what's new`() { fun `should not highlight after user viewed what's new`() {
every { testContext.components.strictMode } returns TestStrictModeManager()
assertEquals(true, WhatsNew.shouldHighlightWhatsNew(testContext)) assertEquals(true, WhatsNew.shouldHighlightWhatsNew(testContext))
WhatsNew.userViewedWhatsNew(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 android.speech.RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
import androidx.appcompat.app.AppCompatActivity.RESULT_OK import androidx.appcompat.app.AppCompatActivity.RESULT_OK
import androidx.test.core.app.ApplicationProvider 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.assertEquals
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertNull import org.junit.Assert.assertNull
@ -25,7 +28,9 @@ import org.junit.runner.RunWith
import org.mozilla.fenix.FenixApplication import org.mozilla.fenix.FenixApplication
import org.mozilla.fenix.HomeActivity.Companion.OPEN_TO_BROWSER_AND_LOAD import org.mozilla.fenix.HomeActivity.Companion.OPEN_TO_BROWSER_AND_LOAD
import org.mozilla.fenix.IntentReceiverActivity import org.mozilla.fenix.IntentReceiverActivity
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner 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.PREVIOUS_INTENT
import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_PROCESSING import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_PROCESSING
import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_REQUEST_CODE import org.mozilla.fenix.widget.VoiceSearchActivity.Companion.SPEECH_REQUEST_CODE
@ -64,6 +69,8 @@ class VoiceSearchActivityTest {
@Test @Test
fun `process intent with speech processing set to true`() { fun `process intent with speech processing set to true`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
every { testContext.components.strictMode } returns TestStrictModeManager()
allowVoiceIntentToResolveActivity() allowVoiceIntentToResolveActivity()
controller.create() controller.create()
@ -135,6 +142,8 @@ class VoiceSearchActivityTest {
@Test @Test
fun `handle speech result`() { fun `handle speech result`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
every { testContext.components.strictMode } returns TestStrictModeManager()
allowVoiceIntentToResolveActivity() allowVoiceIntentToResolveActivity()
controller.create() controller.create()
@ -160,6 +169,8 @@ class VoiceSearchActivityTest {
@Test @Test
fun `handle invalid result code`() { fun `handle invalid result code`() {
every { testContext.components.analytics } returns mockk(relaxed = true)
every { testContext.components.strictMode } returns TestStrictModeManager()
allowVoiceIntentToResolveActivity() allowVoiceIntentToResolveActivity()
controller.create() controller.create()

View File

@ -67,7 +67,6 @@ buildscript {
classpath Deps.tools_kotlingradle classpath Deps.tools_kotlingradle
classpath Deps.tools_benchmarkgradle classpath Deps.tools_benchmarkgradle
classpath Deps.androidx_safeargs classpath Deps.androidx_safeargs
classpath Deps.allopen
classpath Deps.osslicenses_plugin classpath Deps.osslicenses_plugin
classpath "org.mozilla.components:tooling-glean-gradle:${Versions.mozilla_android_components}" 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_test = "org.jetbrains.kotlinx:kotlinx-coroutines-test:${Versions.coroutines}"
const val kotlin_coroutines_android = "org.jetbrains.kotlinx:kotlinx-coroutines-android:${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 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}" const val mozilla_compose_awesomebar = "org.mozilla.components:compose-awesomebar:${Versions.mozilla_android_components}"