From 7287b5579f8a1de4a66e5b320c4162b175f522ec Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Fri, 26 Jun 2020 15:53:30 -0700 Subject: [PATCH] Test settings about/advanced (#12023) --- ...reference.kt => SecretSettingsFragment.kt} | 3 +- .../fenix/settings/about/AboutFragment.kt | 16 ++--- .../mozilla/fenix/settings/about/AboutItem.kt | 4 +- .../fenix/settings/about/AboutPageAdapter.kt | 9 +-- .../about/viewholders/AboutItemViewHolder.kt | 4 +- .../fenix/settings/advanced/LocaleAdapter.kt | 5 +- .../settings/quicksettings/WebsiteInfoView.kt | 33 ++++++----- app/src/main/res/navigation/nav_graph.xml | 2 +- .../settings/about/AboutPageAdapterTest.kt | 15 ++--- .../viewholders/AboutItemViewHolderTest.kt | 2 +- .../account/AccountSettingsInteractorTest.kt | 25 +++++++- .../quicksettings/WebsiteInfoViewTest.kt | 59 +++++++++++++++++++ 12 files changed, 128 insertions(+), 49 deletions(-) rename app/src/main/java/org/mozilla/fenix/settings/{SecretSettingsPreference.kt => SecretSettingsFragment.kt} (92%) create mode 100644 app/src/test/java/org/mozilla/fenix/settings/quicksettings/WebsiteInfoViewTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt similarity index 92% rename from app/src/main/java/org/mozilla/fenix/settings/SecretSettingsPreference.kt rename to app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt index aa0a7498f..6e128b7fe 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsPreference.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt @@ -12,7 +12,8 @@ import org.mozilla.fenix.ext.showToolbar /** * Lets the user customize Private browsing options. */ -class SecretSettingsPreference : PreferenceFragmentCompat() { +class SecretSettingsFragment : PreferenceFragmentCompat() { + override fun onResume() { super.onResume() showToolbar(getString(R.string.preferences_debug_settings)) diff --git a/app/src/main/java/org/mozilla/fenix/settings/about/AboutFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/about/AboutFragment.kt index 21c71a471..363bf901c 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/about/AboutFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/about/AboutFragment.kt @@ -25,13 +25,13 @@ import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.crashes.CrashListActivity import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.settings -import org.mozilla.fenix.utils.Do import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.settings.about.AboutItemType.LICENSING_INFO import org.mozilla.fenix.settings.about.AboutItemType.PRIVACY_NOTICE import org.mozilla.fenix.settings.about.AboutItemType.RIGHTS import org.mozilla.fenix.settings.about.AboutItemType.SUPPORT import org.mozilla.fenix.settings.about.AboutItemType.WHATS_NEW +import org.mozilla.fenix.utils.Do import org.mozilla.fenix.whatsnew.WhatsNew import org.mozilla.geckoview.BuildConfig as GeckoViewBuildConfig @@ -145,39 +145,39 @@ class AboutFragment : Fragment(), AboutPageListener { val context = requireContext() return listOf( - AboutPageItem.Item( + AboutPageItem( AboutItem.ExternalLink( WHATS_NEW, SupportUtils.getWhatsNewUrl(context) ), getString(R.string.about_whats_new, getString(R.string.app_name)) ), - AboutPageItem.Item( + AboutPageItem( AboutItem.ExternalLink( SUPPORT, SupportUtils.getSumoURLForTopic(context, SupportUtils.SumoTopic.HELP) ), getString(R.string.about_support) ), - AboutPageItem.Item( + AboutPageItem( AboutItem.Crashes, getString(R.string.about_crashes) ), - AboutPageItem.Item( + AboutPageItem( AboutItem.ExternalLink( PRIVACY_NOTICE, SupportUtils.getMozillaPageUrl(SupportUtils.MozillaPage.PRIVATE_NOTICE) ), getString(R.string.about_privacy_notice) ), - AboutPageItem.Item( + AboutPageItem( AboutItem.ExternalLink( RIGHTS, SupportUtils.getSumoURLForTopic(context, SupportUtils.SumoTopic.YOUR_RIGHTS) ), getString(R.string.about_know_your_rights) ), - AboutPageItem.Item( + AboutPageItem( AboutItem.ExternalLink(LICENSING_INFO, ABOUT_LICENSE_URL), getString(R.string.about_licensing_information) ), - AboutPageItem.Item( + AboutPageItem( AboutItem.Libraries, getString(R.string.about_other_open_source_libraries) ) diff --git a/app/src/main/java/org/mozilla/fenix/settings/about/AboutItem.kt b/app/src/main/java/org/mozilla/fenix/settings/about/AboutItem.kt index e8cf2a79c..95e221ee4 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/about/AboutItem.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/about/AboutItem.kt @@ -14,6 +14,4 @@ enum class AboutItemType { WHATS_NEW, SUPPORT, PRIVACY_NOTICE, RIGHTS, LICENSING_INFO } -sealed class AboutPageItem { - data class Item(val type: AboutItem, val title: String) : AboutPageItem() -} +data class AboutPageItem(val type: AboutItem, val title: String) diff --git a/app/src/main/java/org/mozilla/fenix/settings/about/AboutPageAdapter.kt b/app/src/main/java/org/mozilla/fenix/settings/about/AboutPageAdapter.kt index e4b418dd7..e4355655a 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/about/AboutPageAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/about/AboutPageAdapter.kt @@ -20,19 +20,16 @@ class AboutPageAdapter(private val listener: AboutPageListener) : } override fun onBindViewHolder(holder: AboutItemViewHolder, position: Int) { - holder.bind(getItem(position) as AboutPageItem.Item) + holder.bind(getItem(position)) } private object DiffCallback : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: AboutPageItem, newItem: AboutPageItem) = - oldItem === newItem + oldItem.title == newItem.title override fun areContentsTheSame(oldItem: AboutPageItem, newItem: AboutPageItem) = - when (oldItem) { - is AboutPageItem.Item -> - newItem is AboutPageItem.Item && oldItem.title == newItem.title - } + oldItem == newItem } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/about/viewholders/AboutItemViewHolder.kt b/app/src/main/java/org/mozilla/fenix/settings/about/viewholders/AboutItemViewHolder.kt index 90cdbcfa7..d42ee1a97 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/about/viewholders/AboutItemViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/about/viewholders/AboutItemViewHolder.kt @@ -17,7 +17,7 @@ class AboutItemViewHolder( ) : RecyclerView.ViewHolder(view) { private val title = view.about_item_title - private lateinit var item: AboutPageItem.Item + private lateinit var item: AboutPageItem init { itemView.setOnClickListener { @@ -25,7 +25,7 @@ class AboutItemViewHolder( } } - fun bind(item: AboutPageItem.Item) { + fun bind(item: AboutPageItem) { this.item = item title.text = item.title } 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 4020893ed..57648d87d 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 @@ -23,9 +23,8 @@ class LocaleAdapter(private val interactor: LocaleSettingsViewInteractor) : private var selectedLocale: Locale = Locale.getDefault() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseLocaleViewHolder { - val view = - LayoutInflater.from(parent.context) - .inflate(R.layout.locale_settings_item, parent, false) + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.locale_settings_item, parent, false) return when (viewType) { ItemType.DEFAULT.ordinal -> SystemLocaleViewHolder( diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsiteInfoView.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsiteInfoView.kt index 235024cc9..1c2d5098c 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsiteInfoView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsiteInfoView.kt @@ -10,7 +10,7 @@ import android.view.ViewGroup import androidx.core.content.ContextCompat.getColor import androidx.core.view.isVisible import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.quicksettings_website_info.view.* +import kotlinx.android.synthetic.main.quicksettings_website_info.* import mozilla.components.support.ktx.android.content.getDrawableWithTint import org.mozilla.fenix.R @@ -19,13 +19,14 @@ import org.mozilla.fenix.R * * Currently it does not support any user interaction. * - * @param containerView [ViewGroup] in which this View will inflate itself. + * @param container [ViewGroup] in which this View will inflate itself. */ class WebsiteInfoView( - override val containerView: ViewGroup + container: ViewGroup ) : LayoutContainer { - val view: View = LayoutInflater.from(containerView.context) - .inflate(R.layout.quicksettings_website_info, containerView, true) + + override val containerView: View = LayoutInflater.from(container.context) + .inflate(R.layout.quicksettings_website_info, container, true) /** * Allows changing what this View displays. @@ -39,25 +40,25 @@ class WebsiteInfoView( bindCertificateName(state.certificateName) } - private fun bindUrl(url: String) { - view.url.text = url + private fun bindUrl(websiteUrl: String) { + url.text = websiteUrl } - private fun bindTitle(title: String) { - view.title.text = title + private fun bindTitle(websiteTitle: String) { + title.text = websiteTitle } private fun bindCertificateName(cert: String) { - val certificateLabel = view.context.getString(R.string.certificate_info_verified_by, cert) - view.certificateInfo.text = certificateLabel - view.certificateInfo.isVisible = cert.isNotEmpty() + val certificateLabel = containerView.context.getString(R.string.certificate_info_verified_by, cert) + certificateInfo.text = certificateLabel + certificateInfo.isVisible = cert.isNotEmpty() } private fun bindSecurityInfo(uiValues: WebsiteSecurityUiValues) { - val tint = getColor(view.context, uiValues.iconTintRes) - view.securityInfo.setText(uiValues.securityInfoRes) - view.securityInfoIcon.setImageDrawable( - view.context.getDrawableWithTint(uiValues.iconRes, tint) + val tint = getColor(containerView.context, uiValues.iconTintRes) + securityInfo.setText(uiValues.securityInfoRes) + securityInfoIcon.setImageDrawable( + containerView.context.getDrawableWithTint(uiValues.iconRes, tint) ) } } diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 64b1caf45..77eba73a6 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -544,7 +544,7 @@ android:name="org.mozilla.fenix.settings.about.AboutFragment"/> = - mutableListOf( - AboutPageItem.Item( + private val aboutList: List = + listOf( + AboutPageItem( AboutItem.ExternalLink( AboutItemType.WHATS_NEW, "https://mozilla.org" ), "Libraries" ), - AboutPageItem.Item(AboutItem.Libraries, "Libraries") + AboutPageItem(AboutItem.Libraries, "Libraries"), + AboutPageItem(AboutItem.Crashes, "Crashes") ) private val listener: AboutPageListener = mockk(relaxed = true) @@ -47,7 +48,7 @@ class AboutPageAdapterTest { adapter.submitList(aboutList) - assertEquals(2, adapter.itemCount) + assertEquals(3, adapter.itemCount) } @Test @@ -78,6 +79,6 @@ class AboutPageAdapterTest { adapter.submitList(aboutList) adapter.bindViewHolder(viewHolder, 1) - verify { viewHolder.bind(aboutList[1] as AboutPageItem.Item) } + verify { viewHolder.bind(aboutList[1]) } } } diff --git a/app/src/test/java/org/mozilla/fenix/settings/about/viewholders/AboutItemViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/settings/about/viewholders/AboutItemViewHolderTest.kt index a2e1e4253..87b120dbf 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/about/viewholders/AboutItemViewHolderTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/about/viewholders/AboutItemViewHolderTest.kt @@ -22,7 +22,7 @@ import org.mozilla.fenix.settings.about.AboutPageListener @RunWith(FenixRobolectricTestRunner::class) class AboutItemViewHolderTest { - private val item = AboutPageItem.Item(AboutItem.Libraries, "Libraries") + private val item = AboutPageItem(AboutItem.Libraries, "Libraries") private lateinit var view: View private lateinit var listener: AboutPageListener diff --git a/app/src/test/java/org/mozilla/fenix/settings/account/AccountSettingsInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/settings/account/AccountSettingsInteractorTest.kt index fe637735f..78e4b6063 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/account/AccountSettingsInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/account/AccountSettingsInteractorTest.kt @@ -6,10 +6,13 @@ package org.mozilla.fenix.settings.account import androidx.navigation.NavController import androidx.navigation.NavDestination +import io.mockk.Called import io.mockk.every import io.mockk.mockk import io.mockk.verify import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue import org.junit.Test import org.mozilla.fenix.R @@ -34,6 +37,7 @@ class AccountSettingsInteractorTest { @Test fun onChangeDeviceName() { val store: AccountSettingsFragmentStore = mockk(relaxed = true) + val invalidNameResponse = mockk<() -> Unit>(relaxed = true) val interactor = AccountSettingsInteractor( mockk(), @@ -42,9 +46,28 @@ class AccountSettingsInteractorTest { store ) - interactor.onChangeDeviceName("New Name") {} + assertTrue(interactor.onChangeDeviceName("New Name", invalidNameResponse)) verify { store.dispatch(AccountSettingsFragmentAction.UpdateDeviceName("New Name")) } + verify { invalidNameResponse wasNot Called } + } + + @Test + fun onChangeDeviceNameSyncFalse() { + val store: AccountSettingsFragmentStore = mockk(relaxed = true) + val invalidNameResponse = mockk<() -> Unit>(relaxed = true) + + val interactor = AccountSettingsInteractor( + mockk(), + mockk(), + { false }, + store + ) + + assertFalse(interactor.onChangeDeviceName("New Name", invalidNameResponse)) + + verify { store wasNot Called } + verify { invalidNameResponse() } } @Test diff --git a/app/src/test/java/org/mozilla/fenix/settings/quicksettings/WebsiteInfoViewTest.kt b/app/src/test/java/org/mozilla/fenix/settings/quicksettings/WebsiteInfoViewTest.kt new file mode 100644 index 000000000..a623a34a6 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/settings/quicksettings/WebsiteInfoViewTest.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.quicksettings + +import android.widget.FrameLayout +import androidx.core.view.isVisible +import kotlinx.android.synthetic.main.library_site_item.title +import kotlinx.android.synthetic.main.library_site_item.url +import kotlinx.android.synthetic.main.quicksettings_website_info.* +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.helpers.FenixRobolectricTestRunner + +@RunWith(FenixRobolectricTestRunner::class) +class WebsiteInfoViewTest { + + private lateinit var view: WebsiteInfoView + + @Before + fun setup() { + view = WebsiteInfoView(FrameLayout(testContext)) + } + + @Test + fun bindUrlAndTitle() { + view.update(WebsiteInfoState( + websiteUrl = "https://mozilla.org", + websiteTitle = "Mozilla", + websiteSecurityUiValues = WebsiteSecurityUiValues.SECURE, + certificateName = "" + )) + + assertEquals("https://mozilla.org", view.url.text) + assertEquals("Mozilla", view.title.text) + assertEquals("Secure Connection", view.securityInfo.text) + assertFalse(view.certificateInfo.isVisible) + } + + @Test + fun bindCert() { + view.update(WebsiteInfoState( + websiteUrl = "https://mozilla.org", + websiteTitle = "Mozilla", + websiteSecurityUiValues = WebsiteSecurityUiValues.INSECURE, + certificateName = "Certificate" + )) + + assertEquals("Insecure Connection", view.securityInfo.text) + assertEquals("Verified By: Certificate", view.certificateInfo.text) + assertTrue(view.certificateInfo.isVisible) + } +}