tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit ed8bfd0077d5b18ed54d24bede9384b30af838ae
parent b3e96c3fb4f2bca7154438f170e9a7052119effe
Author: mcarare <48995920+mcarare@users.noreply.github.com>
Date:   Tue, 18 Nov 2025 09:15:56 +0000

Bug 1996620 - Refactor BrowserFragmentTest to remove static mocks. r=android-reviewers,giorga

This patch refactors `BrowserFragmentTest` to eliminate the use of static mocks (`mockkStatic`, `mockkObject`).

The key changes include:
- Removing mocks for `FragmentKt`, `ThemeManager`, `AppCompatResources`, and `FeatureFlags`.
- Using a spied `Robolectric.testContext` and its `Resources` to control the device configuration (e.g., `smallestScreenWidthDp`) for tablet vs. non-tablet test cases.
- Cleaning up associated setup, teardown, and helper methods that were previously responsible for managing these static mocks.

Differential Revision: https://phabricator.services.mozilla.com/D272868

Diffstat:
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt | 111+++++++++++++++++--------------------------------------------------------------
1 file changed, 24 insertions(+), 87 deletions(-)

diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt @@ -5,8 +5,9 @@ package org.mozilla.fenix.browser import android.content.Context +import android.content.res.Configuration +import android.content.res.Resources import android.view.View -import androidx.appcompat.content.res.AppCompatResources import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleRegistry @@ -15,11 +16,7 @@ import io.mockk.Runs import io.mockk.every import io.mockk.just import io.mockk.mockk -import io.mockk.mockkObject -import io.mockk.mockkStatic import io.mockk.spyk -import io.mockk.unmockkObject -import io.mockk.unmockkStatic import io.mockk.verify import io.mockk.verifyOrder import mozilla.components.browser.state.action.RestoreCompleteAction @@ -30,15 +27,14 @@ import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.state.state.createTab import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.toolbar.BrowserToolbar +import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.rule.MainCoroutineRule -import org.junit.After import org.junit.Assert.assertTrue import org.junit.Assert.fail import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.FenixApplication import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R @@ -46,10 +42,8 @@ import org.mozilla.fenix.components.toolbar.BrowserToolbarView import org.mozilla.fenix.components.toolbar.ToolbarIntegration import org.mozilla.fenix.ext.application import org.mozilla.fenix.ext.components -import org.mozilla.fenix.ext.isLargeWindow import org.mozilla.fenix.ext.settings import org.mozilla.fenix.onboarding.FenixOnboarding -import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.utils.Settings import org.robolectric.RobolectricTestRunner @@ -63,6 +57,8 @@ class BrowserFragmentTest { private lateinit var homeActivity: HomeActivity private lateinit var fenixApplication: FenixApplication private lateinit var context: Context + + private lateinit var resources: Resources private lateinit var lifecycleOwner: MockedLifecycleOwner private lateinit var navController: NavController private lateinit var onboarding: FenixOnboarding @@ -73,12 +69,16 @@ class BrowserFragmentTest { @Before fun setup() { - mockkStatic("org.mozilla.fenix.ext.FragmentKt") - context = mockk(relaxed = true) + context = spyk(testContext) + resources = spyk(testContext.resources) + every { context.resources } returns resources + fenixApplication = mockk(relaxed = true) every { context.application } returns fenixApplication homeActivity = mockk(relaxed = true) + every { homeActivity.resources } returns testContext.resources + view = mockk(relaxed = true) lifecycleOwner = MockedLifecycleOwner(Lifecycle.State.STARTED) navController = mockk(relaxed = true) @@ -103,14 +103,6 @@ class BrowserFragmentTest { testTab = createTab(url = "https://mozilla.org") store = BrowserStore() every { context.components.core.store } returns store - - mockkObject(FeatureFlags) - } - - @After - fun tearDown() { - unmockkObject(FeatureFlags) - unmockkStatic("org.mozilla.fenix.ext.FragmentKt") } @Test @@ -342,19 +334,10 @@ class BrowserFragmentTest { browserFragment._browserToolbarView = browserToolbarView - mockkObject(ThemeManager.Companion) - every { ThemeManager.resolveAttribute(any(), context) } returns mockk(relaxed = true) - - mockkStatic(AppCompatResources::class) - every { AppCompatResources.getDrawable(context, any()) } returns mockk() - browserFragment.onConfigurationChanged(mockk(relaxed = true)) verify(exactly = 1) { browserFragment.onUpdateToolbarForConfigurationChange(any()) } verify(exactly = 1) { browserFragment.updateTabletToolbarActions(any()) } verify(exactly = 1) { browserFragment.reinitializeEngineView() } - - unmockkObject(ThemeManager.Companion) - unmockkStatic(AppCompatResources::class) } @Test @@ -364,18 +347,9 @@ class BrowserFragmentTest { every { browserFragment.reinitializeEngineView() } just Runs browserFragment._browserToolbarView = browserToolbarView - mockkObject(ThemeManager.Companion) - every { ThemeManager.resolveAttribute(any(), context) } returns mockk(relaxed = true) - - mockkStatic(AppCompatResources::class) - every { AppCompatResources.getDrawable(context, any()) } returns mockk() - browserFragment.onConfigurationChanged(mockk(relaxed = true)) verify(exactly = 1) { browserToolbarView.dismissMenu() } - - unmockkObject(ThemeManager.Companion) - unmockkStatic(AppCompatResources::class) } @Test @@ -389,22 +363,19 @@ class BrowserFragmentTest { every { browserToolbarView.updateMenuVisibility(any()) } just Runs every { browserFragment.reinitializeEngineView() } just Runs - mockkObject(ThemeManager.Companion) - every { ThemeManager.resolveAttribute(any(), context) } returns mockk(relaxed = true) - - mockkStatic(AppCompatResources::class) - every { AppCompatResources.getDrawable(context, any()) } returns mockk() + every { resources.configuration } returns Configuration().apply { + smallestScreenWidthDp = 900 + } - every { browserFragment.isLargeWindow() } returns true browserFragment.onConfigurationChanged(mockk(relaxed = true)) verify(exactly = 3) { browserToolbar.addNavigationAction(any()) } - every { browserFragment.isLargeWindow() } returns false + every { resources.configuration } returns Configuration().apply { + smallestScreenWidthDp = 400 + } + browserFragment.onConfigurationChanged(mockk(relaxed = true)) verify(exactly = 3) { browserToolbar.removeNavigationAction(any()) } - - unmockkObject(ThemeManager.Companion) - unmockkStatic(AppCompatResources::class) } @Test @@ -418,21 +389,15 @@ class BrowserFragmentTest { every { browserToolbarView.updateMenuVisibility(any()) } just Runs every { browserFragment.reinitializeEngineView() } just Runs - mockkObject(ThemeManager.Companion) - every { ThemeManager.resolveAttribute(any(), context) } returns mockk(relaxed = true) - - mockkStatic(AppCompatResources::class) - every { AppCompatResources.getDrawable(context, any()) } returns mockk() + every { resources.configuration } returns Configuration().apply { + smallestScreenWidthDp = 900 + } - every { browserFragment.isLargeWindow() } returns true browserFragment.onConfigurationChanged(mockk(relaxed = true)) verify(exactly = 3) { browserToolbar.addNavigationAction(any()) } browserFragment.onConfigurationChanged(mockk(relaxed = true)) verify(exactly = 3) { browserToolbar.addNavigationAction(any()) } - - unmockkObject(ThemeManager.Companion) - unmockkStatic(AppCompatResources::class) } @Test @@ -446,13 +411,9 @@ class BrowserFragmentTest { every { browserToolbarView.updateMenuVisibility(any()) } just Runs every { browserFragment.reinitializeEngineView() } just Runs - mockkObject(ThemeManager.Companion) - every { ThemeManager.resolveAttribute(any(), context) } returns mockk(relaxed = true) - - mockkStatic(AppCompatResources::class) - every { AppCompatResources.getDrawable(context, any()) } returns mockk() - - every { browserFragment.isLargeWindow() } returns false + every { resources.configuration } returns Configuration().apply { + smallestScreenWidthDp = 300 + } browserFragment.onConfigurationChanged(mockk(relaxed = true)) verify(exactly = 0) { browserToolbar.addNavigationAction(any()) } verify(exactly = 0) { browserToolbar.removeNavigationAction(any()) } @@ -460,9 +421,6 @@ class BrowserFragmentTest { browserFragment.onConfigurationChanged(mockk(relaxed = true)) verify(exactly = 0) { browserToolbar.addNavigationAction(any()) } verify(exactly = 0) { browserToolbar.removeNavigationAction(any()) } - - unmockkObject(ThemeManager.Companion) - unmockkStatic(AppCompatResources::class) } private fun addAndSelectTab(tab: TabSessionState) { @@ -490,8 +448,6 @@ class BrowserFragmentTest { @Test fun `GIVEN device is not a tablet WHEN updating toolbar actions THEN only leading action is added and no actions are removed`() { - mockThemeManagerAndAppCompatResources() - browserFragment.updateBrowserToolbarLeadingAndNavigationActions( context = context, isTablet = false, @@ -501,14 +457,10 @@ class BrowserFragmentTest { verify(exactly = 0) { browserFragment.addTabletActions(any()) } verify(exactly = 0) { browserFragment.addNavigationActions(any()) } verify(exactly = 0) { browserFragment.removeNavigationActions() } - - unmockThemeManagerAndAppCompatResources() } @Test fun `GIVEN device is a tablet WHEN updating toolbar actions THEN leading and navigation actions are added in order`() { - mockThemeManagerAndAppCompatResources() - browserFragment.updateBrowserToolbarLeadingAndNavigationActions( context = context, isTablet = true, @@ -518,20 +470,5 @@ class BrowserFragmentTest { browserFragment.addHomeAction(any()) browserFragment.addNavigationActions(any()) } - - unmockThemeManagerAndAppCompatResources() - } - - private fun mockThemeManagerAndAppCompatResources() { - mockkObject(ThemeManager.Companion) - every { ThemeManager.resolveAttribute(any(), context) } returns mockk(relaxed = true) - - mockkStatic(AppCompatResources::class) - every { AppCompatResources.getDrawable(context, any()) } returns mockk() - } - - private fun unmockThemeManagerAndAppCompatResources() { - unmockkObject(ThemeManager.Companion) - unmockkStatic(AppCompatResources::class) } }