You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iceraven-browser/app/src/test/java/org/mozilla/fenix/settings/SettingsFragmentTest.kt

207 lines
8.3 KiB
Kotlin

/* 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<Client>()
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<Preference>(
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<Preference>(
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<Preference>(
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<Preference>(
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<Preference>(
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)
}
}