/* 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.settings import androidx.fragment.app.FragmentActivity import androidx.preference.Preference import io.mockk.every import io.mockk.mockk import io.mockk.mockkObject import io.mockk.unmockkObject import io.mockk.verify import kotlinx.coroutines.test.advanceUntilIdle import mozilla.components.concept.fetch.Client import mozilla.components.service.fxa.manager.FxaAccountManager import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.rule.MainCoroutineRule import mozilla.components.support.test.rule.runTestOnMain import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertNotNull import org.junit.Assert.assertTrue 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.R import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getPreferenceKey import org.mozilla.fenix.ext.settings import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.utils.Settings import org.robolectric.Robolectric import java.io.IOException @RunWith(FenixRobolectricTestRunner::class) class SettingsFragmentTest { @get:Rule val coroutinesTestRule = MainCoroutineRule() private val settingsFragment = SettingsFragment() @Before fun setup() { // Mock client for fetching account avatar val client = mockk() every { client.fetch(any()) } throws IOException("test") every { testContext.components.core.engine.profiler } returns mockk(relaxed = true) 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(FeatureFlags) val activity = Robolectric.buildActivity(FragmentActivity::class.java).create().get() activity.supportFragmentManager.beginTransaction() .add(settingsFragment, "test") .commitNow() } @Test fun `Add-on collection override pref is visible if debug menu active and feature is enabled`() = runTestOnMain { val settingsFragment = SettingsFragment() val activity = Robolectric.buildActivity(FragmentActivity::class.java).create().get() activity.supportFragmentManager.beginTransaction() .add(settingsFragment, "test") .commitNow() advanceUntilIdle() every { FeatureFlags.customExtensionCollectionFeature } returns true val preferenceAmoCollectionOverride = settingsFragment.findPreference( settingsFragment.getPreferenceKey(R.string.pref_key_override_amo_collection), ) settingsFragment.setupAmoCollectionOverridePreference(mockk(relaxed = true)) assertNotNull(preferenceAmoCollectionOverride) assertFalse(preferenceAmoCollectionOverride!!.isVisible) val settings: Settings = mockk(relaxed = true) every { settings.showSecretDebugMenuThisSession } returns true settingsFragment.setupAmoCollectionOverridePreference(settings) assertTrue(preferenceAmoCollectionOverride.isVisible) } @Test fun `Add-on collection override pref is visible if already configured and feature is enabled`() = runTestOnMain { val settingsFragment = SettingsFragment() val activity = Robolectric.buildActivity(FragmentActivity::class.java).create().get() activity.supportFragmentManager.beginTransaction() .add(settingsFragment, "test") .commitNow() advanceUntilIdle() every { FeatureFlags.customExtensionCollectionFeature } returns true val preferenceAmoCollectionOverride = settingsFragment.findPreference( settingsFragment.getPreferenceKey(R.string.pref_key_override_amo_collection), ) settingsFragment.setupAmoCollectionOverridePreference(mockk(relaxed = true)) assertNotNull(preferenceAmoCollectionOverride) assertFalse(preferenceAmoCollectionOverride!!.isVisible) val settings: Settings = mockk(relaxed = true) every { settings.showSecretDebugMenuThisSession } returns false every { settings.amoCollectionOverrideConfigured() } returns false settingsFragment.setupAmoCollectionOverridePreference(settings) assertFalse(preferenceAmoCollectionOverride.isVisible) every { settings.amoCollectionOverrideConfigured() } returns true settingsFragment.setupAmoCollectionOverridePreference(settings) assertTrue(preferenceAmoCollectionOverride.isVisible) } @Test fun `Add-on collection override pref is not visible if feature is disabled`() = runTestOnMain { val settingsFragment = SettingsFragment() val activity = Robolectric.buildActivity(FragmentActivity::class.java).create().get() activity.supportFragmentManager.beginTransaction() .add(settingsFragment, "test") .commitNow() advanceUntilIdle() every { FeatureFlags.customExtensionCollectionFeature } returns false val preferenceAmoCollectionOverride = settingsFragment.findPreference( settingsFragment.getPreferenceKey(R.string.pref_key_override_amo_collection), ) val settings: Settings = mockk(relaxed = true) settingsFragment.setupAmoCollectionOverridePreference(settings) assertNotNull(preferenceAmoCollectionOverride) assertFalse(preferenceAmoCollectionOverride!!.isVisible) every { settings.showSecretDebugMenuThisSession } returns true every { settings.amoCollectionOverrideConfigured() } returns true settingsFragment.setupAmoCollectionOverridePreference(settings) assertFalse(preferenceAmoCollectionOverride.isVisible) } @Test fun `GIVEN the HttpsOnly is enabled THEN set the appropriate preference summary`() { val httpsOnlyPreference = settingsFragment.findPreference( settingsFragment.getPreferenceKey(R.string.pref_key_https_only_settings), )!! every { testContext.settings().shouldUseHttpsOnly } returns true assertTrue(httpsOnlyPreference.summary.isNullOrEmpty()) val summary = testContext.getString(R.string.preferences_https_only_on) settingsFragment.setupHttpsOnlyPreferences() assertEquals(summary, httpsOnlyPreference.summary) } @Test fun `GIVEN the HttpsOnly is disabled THEN set the appropriate preference summary`() { val httpsOnlyPreference = settingsFragment.findPreference( settingsFragment.getPreferenceKey(R.string.pref_key_https_only_settings), )!! every { testContext.settings().shouldUseHttpsOnly } returns false assertTrue(httpsOnlyPreference.summary.isNullOrEmpty()) val summary = testContext.getString(R.string.preferences_https_only_off) settingsFragment.setupHttpsOnlyPreferences() assertEquals(summary, httpsOnlyPreference.summary) } @Test fun `GIVEN an account observer WHEN the fragment is visible THEN register it for updates`() { val accountManager: FxaAccountManager = mockk(relaxed = true) every { testContext.components.backgroundServices.accountManager } returns accountManager settingsFragment.onStart() verify { accountManager.register(settingsFragment.accountObserver, settingsFragment, true) } } @Test fun `GIVEN an account observer WHEN the fragment stops being visible THEN unregister it for updates`() { val accountManager: FxaAccountManager = mockk(relaxed = true) every { testContext.components.backgroundServices.accountManager } returns accountManager settingsFragment.onStop() verify { accountManager.unregister(settingsFragment.accountObserver) } } @After fun tearDown() { unmockkObject(FeatureFlags) } }