diff --git a/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt b/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt index 43f532861..46f30d451 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt @@ -16,32 +16,44 @@ interface LocaleSettingsController { } class DefaultLocaleSettingsController( - private val context: Context, + private val activity: Activity, private val localeSettingsStore: LocaleSettingsStore ) : LocaleSettingsController { override fun handleLocaleSelected(locale: Locale) { if (localeSettingsStore.state.selectedLocale == locale && - !LocaleManager.isDefaultLocaleSelected(context)) { + !LocaleManager.isDefaultLocaleSelected(activity)) { return } localeSettingsStore.dispatch(LocaleSettingsAction.Select(locale)) - LocaleManager.setNewLocale(context, locale.toLanguageTag()) - LocaleManager.updateBaseConfiguration(context, locale) - (context as Activity).recreate() + LocaleManager.setNewLocale(activity, locale.toLanguageTag()) + LocaleManager.updateBaseConfiguration(activity, locale) + activity.recreate() } override fun handleDefaultLocaleSelected() { - if (LocaleManager.isDefaultLocaleSelected(context)) { + if (LocaleManager.isDefaultLocaleSelected(activity)) { return } localeSettingsStore.dispatch(LocaleSettingsAction.Select(localeSettingsStore.state.localeList[0])) - LocaleManager.resetToSystemDefault(context) - LocaleManager.updateBaseConfiguration(context, localeSettingsStore.state.localeList[0]) - (context as Activity).recreate() + LocaleManager.resetToSystemDefault(activity) + LocaleManager.updateBaseConfiguration(activity, localeSettingsStore.state.localeList[0]) + activity.recreate() } override fun handleSearchQueryTyped(query: String) { localeSettingsStore.dispatch(LocaleSettingsAction.Search(query)) } + + /** + * Update the locale for the configuration of the app context's resources + */ + @Suppress("Deprecation") + fun LocaleManager.updateBaseConfiguration(context: Context, locale: Locale) { + val resources = context.applicationContext.resources + val config = resources.configuration + config.setLocale(locale) + config.setLayoutDirection(locale) + resources.updateConfiguration(config, resources.displayMetrics) + } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleAdapter.kt b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleAdapter.kt index 57648d87d..fcf980c8d 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleAdapter.kt @@ -5,14 +5,9 @@ package org.mozilla.fenix.settings.advanced import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import androidx.annotation.VisibleForTesting -import androidx.core.view.isVisible import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.locale_settings_item.view.* -import mozilla.components.support.locale.LocaleManager import org.mozilla.fenix.R import java.util.Locale @@ -95,67 +90,3 @@ class LocaleAdapter(private val interactor: LocaleSettingsViewInteractor) : DEFAULT, LOCALE; } } - -class LocaleViewHolder( - view: View, - selectedLocale: Locale, - private val interactor: LocaleSettingsViewInteractor -) : BaseLocaleViewHolder(view, selectedLocale) { - private val icon = view.locale_selected_icon - private val title = view.locale_title_text - private val subtitle = view.locale_subtitle_text - - override fun bind(locale: Locale) { - // capitalisation is done using the rules of the appropriate locale (endonym and exonym) - title.text = locale.getDisplayName(locale).capitalize(locale) - subtitle.text = locale.displayName.capitalize(Locale.getDefault()) - icon.isVisible = isCurrentLocaleSelected(locale, isDefault = false) - - itemView.setOnClickListener { - interactor.onLocaleSelected(locale) - } - } -} - -class SystemLocaleViewHolder( - view: View, - selectedLocale: Locale, - private val interactor: LocaleSettingsViewInteractor -) : BaseLocaleViewHolder(view, selectedLocale) { - private val icon = view.locale_selected_icon - private val title = view.locale_title_text - private val subtitle = view.locale_subtitle_text - - override fun bind(locale: Locale) { - title.text = itemView.context.getString(R.string.default_locale_text) - subtitle.visibility = View.GONE - icon.isVisible = isCurrentLocaleSelected(locale, isDefault = true) - itemView.setOnClickListener { - interactor.onDefaultLocaleSelected() - } - } -} - -abstract class BaseLocaleViewHolder( - view: View, - private val selectedLocale: Locale -) : RecyclerView.ViewHolder(view) { - - @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) - internal fun isCurrentLocaleSelected(locale: Locale, isDefault: Boolean): Boolean { - return if (isDefault) { - locale == selectedLocale && LocaleManager.isDefaultLocaleSelected(itemView.context) - } else { - locale == selectedLocale && !LocaleManager.isDefaultLocaleSelected(itemView.context) - } - } - - abstract fun bind(locale: Locale) -} - -/** - * Similar to Kotlin's capitalize with locale parameter, but that method is currently experimental - */ -private fun String.capitalize(locale: Locale): String { - return substring(0, 1).toUpperCase(locale) + substring(1) -} diff --git a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleManagerExtension.kt b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleManagerExtension.kt index 075ca3271..03de516e8 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleManagerExtension.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleManagerExtension.kt @@ -51,15 +51,3 @@ fun LocaleManager.getSelectedLocale( fun LocaleManager.isDefaultLocaleSelected(context: Context): Boolean { return getCurrentLocale(context) == null } - -/** - * Update the locale for the configuration of the app context's resources - */ -@Suppress("DEPRECATION") -fun LocaleManager.updateBaseConfiguration(context: Context, locale: Locale) { - val resources = context.applicationContext.resources - val config = resources.configuration - config.setLocale(locale) - config.setLayoutDirection(locale) - resources.updateConfiguration(config, resources.displayMetrics) -} diff --git a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt index ea5df963e..2696115b1 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt @@ -43,7 +43,7 @@ class LocaleSettingsFragment : Fragment() { store = getStore() interactor = LocaleSettingsInteractor( controller = DefaultLocaleSettingsController( - context = requireContext(), + activity = requireActivity(), localeSettingsStore = store ) ) diff --git a/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleViewHolders.kt b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleViewHolders.kt new file mode 100644 index 000000000..cb140ce18 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleViewHolders.kt @@ -0,0 +1,72 @@ +/* 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.advanced + +import android.view.View +import androidx.annotation.VisibleForTesting +import androidx.core.view.isVisible +import kotlinx.android.synthetic.main.locale_settings_item.* +import mozilla.components.support.locale.LocaleManager +import org.mozilla.fenix.R +import org.mozilla.fenix.utils.view.ViewHolder +import java.util.Locale + +class LocaleViewHolder( + view: View, + selectedLocale: Locale, + private val interactor: LocaleSettingsViewInteractor +) : BaseLocaleViewHolder(view, selectedLocale) { + + override fun bind(locale: Locale) { + // capitalisation is done using the rules of the appropriate locale (endonym and exonym) + locale_title_text.text = locale.getDisplayName(locale).capitalize(locale) + locale_subtitle_text.text = locale.displayName.capitalize(Locale.getDefault()) + locale_selected_icon.isVisible = isCurrentLocaleSelected(locale, isDefault = false) + + itemView.setOnClickListener { + interactor.onLocaleSelected(locale) + } + } +} + +class SystemLocaleViewHolder( + view: View, + selectedLocale: Locale, + private val interactor: LocaleSettingsViewInteractor +) : BaseLocaleViewHolder(view, selectedLocale) { + + override fun bind(locale: Locale) { + locale_title_text.text = itemView.context.getString(R.string.default_locale_text) + locale_subtitle_text.visibility = View.GONE + locale_selected_icon.isVisible = isCurrentLocaleSelected(locale, isDefault = true) + itemView.setOnClickListener { + interactor.onDefaultLocaleSelected() + } + } +} + +abstract class BaseLocaleViewHolder( + view: View, + private val selectedLocale: Locale +) : ViewHolder(view) { + + @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) + internal fun isCurrentLocaleSelected(locale: Locale, isDefault: Boolean): Boolean { + return if (isDefault) { + locale == selectedLocale && LocaleManager.isDefaultLocaleSelected(itemView.context) + } else { + locale == selectedLocale && !LocaleManager.isDefaultLocaleSelected(itemView.context) + } + } + + abstract fun bind(locale: Locale) +} + +/** + * Similar to Kotlin's capitalize with locale parameter, but that method is currently experimental + */ +private fun String.capitalize(locale: Locale): String { + return substring(0, 1).toUpperCase(locale) + substring(1) +} diff --git a/app/src/test/java/org/mozilla/fenix/settings/advanced/BaseLocaleViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/settings/advanced/BaseLocaleViewHolderTest.kt new file mode 100644 index 000000000..e1ff92b41 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/settings/advanced/BaseLocaleViewHolderTest.kt @@ -0,0 +1,59 @@ +/* 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.advanced + +import android.content.Context +import android.view.View +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkObject +import mozilla.components.support.locale.LocaleManager +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import java.util.Locale + +class BaseLocaleViewHolderTest { + + private val selectedLocale = Locale("en", "UK") + private val view: View = mockk() + private val context: Context = mockk() + + private val localeViewHolder = object : BaseLocaleViewHolder(view, selectedLocale) { + override fun bind(locale: Locale) = Unit + } + + @Before + fun setup() { + mockkObject(LocaleManager) + every { view.context } returns context + } + + @Test + fun `verify other locale checker returns false`() { + every { LocaleManager.getCurrentLocale(context) } returns mockk() + val otherLocale = mockk() + + assertFalse(localeViewHolder.isCurrentLocaleSelected(otherLocale, isDefault = true)) + assertFalse(localeViewHolder.isCurrentLocaleSelected(otherLocale, isDefault = false)) + } + + @Test + fun `verify selected locale checker returns true`() { + every { LocaleManager.getCurrentLocale(context) } returns mockk() + + assertFalse(localeViewHolder.isCurrentLocaleSelected(selectedLocale, isDefault = true)) + assertTrue(localeViewHolder.isCurrentLocaleSelected(selectedLocale, isDefault = false)) + } + + @Test + fun `verify default locale checker returns true`() { + every { LocaleManager.getCurrentLocale(context) } returns null + + assertTrue(localeViewHolder.isCurrentLocaleSelected(selectedLocale, isDefault = true)) + assertFalse(localeViewHolder.isCurrentLocaleSelected(selectedLocale, isDefault = false)) + } +} diff --git a/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleAdapterTest.kt b/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleAdapterTest.kt deleted file mode 100644 index f883e9c5b..000000000 --- a/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleAdapterTest.kt +++ /dev/null @@ -1,48 +0,0 @@ -package org.mozilla.fenix.settings.advanced - -import android.content.Context -import android.view.View -import io.mockk.every -import io.mockk.mockk -import io.mockk.mockkStatic -import mozilla.components.support.locale.LocaleManager -import org.junit.Assert.assertTrue -import org.junit.Before -import org.junit.Test -import java.util.Locale - -class LocaleAdapterTest { - - private val selectedLocale = Locale("en", "UK") - private val view: View = mockk(relaxed = true) - private val context: Context = mockk(relaxed = true) - - private val localeViewHolder: BaseLocaleViewHolder = - object : BaseLocaleViewHolder(view, selectedLocale) { - - override fun bind(locale: Locale) { - // not required - } - } - - @Before - fun setup() { - every { view.context } returns context - } - - @Test - fun `verify selected locale checker returns true`() { - mockkStatic("org.mozilla.fenix.settings.advanced.LocaleManagerExtensionKt") - every { LocaleManager.isDefaultLocaleSelected(context) } returns false - - assertTrue(localeViewHolder.isCurrentLocaleSelected(selectedLocale, isDefault = false)) - } - - @Test - fun `verify default locale checker returns true`() { - mockkStatic("org.mozilla.fenix.settings.advanced.LocaleManagerExtensionKt") - every { LocaleManager.isDefaultLocaleSelected(context) } returns true - - assertTrue(localeViewHolder.isCurrentLocaleSelected(selectedLocale, isDefault = true)) - } -} diff --git a/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleManagerExtensionTest.kt b/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleManagerExtensionTest.kt index 780795bef..99e914cdd 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleManagerExtensionTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleManagerExtensionTest.kt @@ -8,7 +8,6 @@ import android.content.Context import io.mockk.every import io.mockk.mockk import io.mockk.mockkObject -import io.mockk.mockkStatic import mozilla.components.support.locale.LocaleManager import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse @@ -24,9 +23,12 @@ import java.util.Locale @RunWith(FenixRobolectricTestRunner::class) class LocaleManagerExtensionTest { + private lateinit var context: Context + @Before fun setup() { - mockkStatic("org.mozilla.fenix.settings.advanced.LocaleManagerExtensionKt") + context = mockk() + mockkObject(LocaleManager) } @Test @@ -44,8 +46,6 @@ class LocaleManagerExtensionTest { @Test @Config(qualifiers = "en-rUS") fun `default locale selected`() { - val context: Context = mockk() - mockkObject(LocaleManager) every { LocaleManager.getCurrentLocale(context) } returns null assertTrue(LocaleManager.isDefaultLocaleSelected(context)) @@ -54,8 +54,6 @@ class LocaleManagerExtensionTest { @Test @Config(qualifiers = "en-rUS") fun `custom locale selected`() { - val context: Context = mockk() - mockkObject(LocaleManager) val selectedLocale = Locale("en", "UK") every { LocaleManager.getCurrentLocale(context) } returns selectedLocale @@ -65,13 +63,9 @@ class LocaleManagerExtensionTest { @Test @Config(qualifiers = "en-rUS") fun `match current stored locale string with a Locale from our list`() { - val context: Context = mockk() - mockkObject(LocaleManager) val otherLocale = Locale("fr") val selectedLocale = Locale("en", "UK") - val localeList = ArrayList() - localeList.add(otherLocale) - localeList.add(selectedLocale) + val localeList = listOf(otherLocale, selectedLocale) every { LocaleManager.getCurrentLocale(context) } returns selectedLocale @@ -81,13 +75,9 @@ class LocaleManagerExtensionTest { @Test @Config(qualifiers = "en-rUS") fun `match null stored locale with the default Locale from our list`() { - val context: Context = mockk() - mockkObject(LocaleManager) val firstLocale = Locale("fr") val secondLocale = Locale("en", "UK") - val localeList = ArrayList() - localeList.add(firstLocale) - localeList.add(secondLocale) + val localeList = listOf(firstLocale, secondLocale) every { LocaleManager.getCurrentLocale(context) } returns null diff --git a/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleSettingsControllerTest.kt b/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleSettingsControllerTest.kt index 8923f5e2a..c1f4f463d 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleSettingsControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleSettingsControllerTest.kt @@ -5,14 +5,15 @@ package org.mozilla.fenix.settings.advanced import android.app.Activity -import android.content.Context 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.verify +import io.mockk.verifyAll import mozilla.components.support.locale.LocaleManager import org.junit.Before import org.junit.Test @@ -20,118 +21,113 @@ import java.util.Locale class LocaleSettingsControllerTest { - private val context: Context = mockk(relaxed = true) + private val activity = mockk(relaxed = true) private val localeSettingsStore: LocaleSettingsStore = mockk(relaxed = true) + private val mockState = LocaleSettingsState(mockk(), mockk(), mockk()) - private lateinit var controller: LocaleSettingsController + private lateinit var controller: DefaultLocaleSettingsController @Before fun setup() { - controller = DefaultLocaleSettingsController(context, localeSettingsStore) + controller = spyk(DefaultLocaleSettingsController(activity, localeSettingsStore)) + + mockkObject(LocaleManager) + mockkStatic("org.mozilla.fenix.settings.advanced.LocaleManagerExtensionKt") } @Test fun `don't set locale if same locale is chosen`() { val selectedLocale = Locale("en", "UK") - every { localeSettingsStore.state } returns LocaleSettingsState( - mockk(), - mockk(), - selectedLocale - ) - mockkObject(LocaleManager) - mockkStatic("org.mozilla.fenix.settings.advanced.LocaleManagerExtensionKt") - every { LocaleManager.getCurrentLocale(context) } returns mockk() - every { LocaleManager.isDefaultLocaleSelected(context) } returns false + every { localeSettingsStore.state } returns mockState.copy(selectedLocale = selectedLocale) + every { LocaleManager.getCurrentLocale(activity) } returns mockk() controller.handleLocaleSelected(selectedLocale) - verify( - inverse = true, - verifyBlock = { localeSettingsStore.dispatch(LocaleSettingsAction.Select(selectedLocale)) }) - verify( - inverse = true, - verifyBlock = { LocaleManager.setNewLocale(context, selectedLocale.toLanguageTag()) }) - verify( - inverse = true, - verifyBlock = { LocaleManager.updateBaseConfiguration(context, selectedLocale) }) - verify(inverse = true, verifyBlock = { (context as Activity).recreate() }) + verifyAll(inverse = true) { + localeSettingsStore.dispatch(LocaleSettingsAction.Select(selectedLocale)) + LocaleManager.setNewLocale(activity, selectedLocale.toLanguageTag()) + activity.recreate() + } + with(controller) { + verify(inverse = true) { LocaleManager.updateBaseConfiguration(activity, selectedLocale) } + } } @Test - fun `set a new locale from the list`() { + fun `set a new locale from the list if other locale is chosen`() { val selectedLocale = Locale("en", "UK") val otherLocale: Locale = mockk() - every { localeSettingsStore.state } returns LocaleSettingsState( - mockk(), - mockk(), - otherLocale - ) - mockkObject(LocaleManager) - mockkStatic("org.mozilla.fenix.settings.advanced.LocaleManagerExtensionKt") - every { LocaleManager.updateBaseConfiguration(context, selectedLocale) } just Runs - every { - LocaleManager.setNewLocale( - context, - selectedLocale.toLanguageTag() - ) - } returns context + every { localeSettingsStore.state } returns mockState.copy(selectedLocale = otherLocale) + every { LocaleManager.setNewLocale(activity, selectedLocale.toLanguageTag()) } returns activity + with(controller) { + every { LocaleManager.updateBaseConfiguration(activity, selectedLocale) } just Runs + } controller.handleLocaleSelected(selectedLocale) verify { localeSettingsStore.dispatch(LocaleSettingsAction.Select(selectedLocale)) } - verify { LocaleManager.setNewLocale(context, selectedLocale.toLanguageTag()) } - verify { LocaleManager.updateBaseConfiguration(context, selectedLocale) } - verify { (context as Activity).recreate() } + verify { LocaleManager.setNewLocale(activity, selectedLocale.toLanguageTag()) } + verify { activity.recreate() } + with(controller) { + verify { LocaleManager.updateBaseConfiguration(activity, selectedLocale) } + } + } + + @Test + fun `set a new locale from the list if default locale is not selected`() { + val selectedLocale = Locale("en", "UK") + every { localeSettingsStore.state } returns mockState.copy(selectedLocale = selectedLocale) + every { LocaleManager.getCurrentLocale(activity) } returns null + every { LocaleManager.setNewLocale(activity, selectedLocale.toLanguageTag()) } returns activity + with(controller) { + every { LocaleManager.updateBaseConfiguration(activity, selectedLocale) } just Runs + } + + controller.handleLocaleSelected(selectedLocale) + + verify { localeSettingsStore.dispatch(LocaleSettingsAction.Select(selectedLocale)) } + verify { LocaleManager.setNewLocale(activity, selectedLocale.toLanguageTag()) } + verify { activity.recreate() } + with(controller) { + verify { LocaleManager.updateBaseConfiguration(activity, selectedLocale) } + } } @Test fun `don't set default locale if default locale is already chosen`() { val selectedLocale = Locale("en", "UK") - val localeList = ArrayList() - localeList.add(selectedLocale) - every { localeSettingsStore.state } returns LocaleSettingsState( - localeList, - mockk(), - mockk() - ) - mockkStatic("org.mozilla.fenix.settings.advanced.LocaleManagerExtensionKt") - every { LocaleManager.isDefaultLocaleSelected(context) } returns true + every { localeSettingsStore.state } returns mockState.copy(localeList = listOf(selectedLocale)) + every { LocaleManager.getCurrentLocale(activity) } returns null controller.handleDefaultLocaleSelected() - verify( - inverse = true, - verifyBlock = { localeSettingsStore.dispatch(LocaleSettingsAction.Select(selectedLocale)) }) - verify( - inverse = true, - verifyBlock = { LocaleManager.resetToSystemDefault(context) }) - verify( - inverse = true, - verifyBlock = { LocaleManager.updateBaseConfiguration(context, selectedLocale) }) - verify(inverse = true, verifyBlock = { (context as Activity).recreate() }) + verifyAll(inverse = true) { + localeSettingsStore.dispatch(LocaleSettingsAction.Select(selectedLocale)) + LocaleManager.resetToSystemDefault(activity) + activity.recreate() + with(controller) { + LocaleManager.updateBaseConfiguration(activity, selectedLocale) + } + } } @Test fun `set the default locale as the new locale`() { val selectedLocale = Locale("en", "UK") - val localeList = ArrayList() - localeList.add(selectedLocale) - every { localeSettingsStore.state } returns LocaleSettingsState( - localeList, - mockk(), - mockk() - ) - mockkObject(LocaleManager) - mockkStatic("org.mozilla.fenix.settings.advanced.LocaleManagerExtensionKt") - every { LocaleManager.resetToSystemDefault(context) } just Runs - every { LocaleManager.updateBaseConfiguration(context, selectedLocale) } just Runs + every { localeSettingsStore.state } returns mockState.copy(localeList = listOf(selectedLocale)) + every { LocaleManager.resetToSystemDefault(activity) } just Runs + with(controller) { + every { LocaleManager.updateBaseConfiguration(activity, selectedLocale) } just Runs + } controller.handleDefaultLocaleSelected() verify { localeSettingsStore.dispatch(LocaleSettingsAction.Select(selectedLocale)) } - verify { LocaleManager.resetToSystemDefault(context) } - verify { LocaleManager.updateBaseConfiguration(context, selectedLocale) } - verify { (context as Activity).recreate() } + verify { LocaleManager.resetToSystemDefault(activity) } + verify { activity.recreate() } + with(controller) { + verify { LocaleManager.updateBaseConfiguration(activity, selectedLocale) } + } } @Test diff --git a/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleSettingsStoreTest.kt b/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleSettingsStoreTest.kt index 24862c5a8..71bd52014 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleSettingsStoreTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleSettingsStoreTest.kt @@ -18,10 +18,11 @@ class LocaleSettingsStoreTest { @Before fun setup() { - val localeList = ArrayList() - localeList.add(Locale("fr")) // default - localeList.add(otherLocale) - localeList.add(selectedLocale) + val localeList = listOf( + Locale("fr"), // default + otherLocale, + selectedLocale + ) localeSettingsStore = LocaleSettingsStore(LocaleSettingsState(localeList, localeList, selectedLocale)) diff --git a/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleViewHoldersTest.kt b/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleViewHoldersTest.kt new file mode 100644 index 000000000..4fe4f34b0 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleViewHoldersTest.kt @@ -0,0 +1,86 @@ +/* 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.advanced + +import android.view.LayoutInflater +import android.view.View +import androidx.core.view.isVisible +import io.mockk.Runs +import io.mockk.every +import io.mockk.just +import io.mockk.mockk +import io.mockk.mockkObject +import io.mockk.verify +import kotlinx.android.synthetic.main.locale_settings_item.view.* +import mozilla.components.support.locale.LocaleManager +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import java.util.Locale + +@RunWith(FenixRobolectricTestRunner::class) +class LocaleViewHoldersTest { + + private val selectedLocale = Locale("en", "US") + private lateinit var view: View + private lateinit var interactor: LocaleSettingsViewInteractor + private lateinit var localeViewHolder: LocaleViewHolder + private lateinit var systemLocaleViewHolder: SystemLocaleViewHolder + + @Before + fun setup() { + mockkObject(LocaleManager) + every { LocaleManager.getCurrentLocale(any()) } returns null + + view = LayoutInflater.from(testContext) + .inflate(R.layout.locale_settings_item, null) + interactor = mockk() + + localeViewHolder = LocaleViewHolder(view, selectedLocale, interactor) + systemLocaleViewHolder = SystemLocaleViewHolder(view, selectedLocale, interactor) + } + + @Test + fun `bind LocaleViewHolder`() { + localeViewHolder.bind(selectedLocale) + + assertEquals("English (United States)", view.locale_title_text.text) + assertEquals("English (United States)", view.locale_subtitle_text.text) + assertFalse(view.locale_selected_icon.isVisible) + } + + @Test + fun `LocaleViewHolder calls interactor on click`() { + localeViewHolder.bind(selectedLocale) + + every { interactor.onLocaleSelected(selectedLocale) } just Runs + view.performClick() + verify { interactor.onLocaleSelected(selectedLocale) } + } + + @Test + fun `bind SystemLocaleViewHolder`() { + systemLocaleViewHolder.bind(selectedLocale) + + assertEquals("Follow device language", view.locale_title_text.text) + assertFalse(view.locale_subtitle_text.isVisible) + assertTrue(view.locale_selected_icon.isVisible) + } + + @Test + fun `SystemLocaleViewHolder calls interactor on click`() { + systemLocaleViewHolder.bind(selectedLocale) + + every { interactor.onDefaultLocaleSelected() } just Runs + view.performClick() + verify { interactor.onDefaultLocaleSelected() } + } +}