[fenix] For https://github.com/mozilla-mobile/fenix/issues/12565: Add Locale settings tests & use activity (https://github.com/mozilla-mobile/fenix/pull/12579)
parent
773884bdc4
commit
fe5b219a89
@ -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)
|
||||
}
|
@ -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<Locale>()
|
||||
|
||||
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))
|
||||
}
|
||||
}
|
@ -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))
|
||||
}
|
||||
}
|
@ -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() }
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue