From e9fb1a61c74cc766b19295420b3e53e9ddf75156 Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Tue, 14 Jul 2020 10:31:50 -0700 Subject: [PATCH] Test viewholders in home.sessioncontrol (#12524) --- .../topsites/TopSiteItemViewHolder.kt | 9 +-- .../NoCollectionsMessageViewHolderTest.kt | 59 +++++++++++++++++++ .../viewholders/TopSiteViewHolderTest.kt | 46 +++++++++++++++ ...OnboardingPrivacyBrowsingViewHolderTest.kt | 56 ++++++++++++++++++ .../OnboardingPrivacyNoticeViewHolderTest.kt | 56 ++++++++++++++++++ ...oardingTrackingProtectionViewHolderTest.kt | 54 +++++++++++++++++ .../topsites/TopSiteItemViewHolderTest.kt | 46 +++++++++++++++ 7 files changed, 322 insertions(+), 4 deletions(-) create mode 100644 app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolderTest.kt create mode 100644 app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSiteViewHolderTest.kt create mode 100644 app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingPrivacyBrowsingViewHolderTest.kt create mode 100644 app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingPrivacyNoticeViewHolderTest.kt create mode 100644 app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingTrackingProtectionViewHolderTest.kt create mode 100644 app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolderTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolder.kt index 446e58aaa..4812197db 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolder.kt @@ -9,17 +9,18 @@ import android.content.Context import android.view.MotionEvent import android.view.View import android.widget.PopupWindow +import androidx.appcompat.content.res.AppCompatResources.getDrawable import kotlinx.android.synthetic.main.top_site_item.* import kotlinx.android.synthetic.main.top_site_item.view.* import mozilla.components.browser.menu.BrowserMenuBuilder import mozilla.components.browser.menu.item.SimpleBrowserMenuItem import mozilla.components.feature.top.sites.TopSite import org.mozilla.fenix.R -import org.mozilla.fenix.utils.view.ViewHolder import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.loadIntoView import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor import org.mozilla.fenix.settings.SupportUtils +import org.mozilla.fenix.utils.view.ViewHolder class TopSiteItemViewHolder( view: View, @@ -42,12 +43,12 @@ class TopSiteItemViewHolder( interactor.onSelectTopSite(topSite.url, topSite.isDefault) } - top_site_item.setOnLongClickListener() { + top_site_item.setOnLongClickListener { val menu = topSiteMenu.menuBuilder.build(view.context).show(anchor = it.top_site_title) it.setOnTouchListener @SuppressLint("ClickableViewAccessibility") { v, event -> onTouchEvent(v, event, menu) } - return@setOnLongClickListener true + true } } @@ -56,7 +57,7 @@ class TopSiteItemViewHolder( top_site_title.text = topSite.title when (topSite.url) { SupportUtils.POCKET_TRENDING_URL -> { - favicon_image.setImageDrawable(itemView.context.getDrawable(R.drawable.ic_pocket)) + favicon_image.setImageDrawable(getDrawable(itemView.context, R.drawable.ic_pocket)) } else -> { itemView.context.components.core.icons.loadIntoView(favicon_image, topSite.url) diff --git a/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolderTest.kt new file mode 100644 index 000000000..54b50341c --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolderTest.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.home.sessioncontrol.viewholders + +import android.view.LayoutInflater +import android.view.View +import androidx.appcompat.view.ContextThemeWrapper +import androidx.core.view.isVisible +import io.mockk.mockk +import io.mockk.verify +import kotlinx.android.synthetic.main.no_collections_message.view.* +import mozilla.components.support.test.robolectric.testContext +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 org.mozilla.fenix.home.sessioncontrol.CollectionInteractor + +@RunWith(FenixRobolectricTestRunner::class) +class NoCollectionsMessageViewHolderTest { + + private lateinit var view: View + private lateinit var interactor: CollectionInteractor + + @Before + fun setup() { + val appCompatContext = ContextThemeWrapper(testContext, R.style.NormalTheme) + view = LayoutInflater.from(appCompatContext) + .inflate(NoCollectionsMessageViewHolder.LAYOUT_ID, null) + interactor = mockk(relaxed = true) + } + + @Test + fun `hide button when hasNormalTabsOpened is false`() { + NoCollectionsMessageViewHolder(view, interactor, hasNormalTabsOpened = false) + + assertFalse(view.add_tabs_to_collections_button.isVisible) + } + + @Test + fun `show button when hasNormalTabsOpened is true`() { + NoCollectionsMessageViewHolder(view, interactor, hasNormalTabsOpened = true) + + assertTrue(view.add_tabs_to_collections_button.isVisible) + } + + @Test + fun `call interactor on click`() { + NoCollectionsMessageViewHolder(view, interactor, hasNormalTabsOpened = true) + + view.add_tabs_to_collections_button.performClick() + verify { interactor.onAddTabsToCollectionTapped() } + } +} diff --git a/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSiteViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSiteViewHolderTest.kt new file mode 100644 index 000000000..8477eb7d2 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSiteViewHolderTest.kt @@ -0,0 +1,46 @@ +/* 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.home.sessioncontrol.viewholders + +import android.view.LayoutInflater +import android.view.View +import io.mockk.mockk +import kotlinx.android.synthetic.main.component_top_sites.view.* +import mozilla.components.feature.top.sites.TopSite +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor + +@RunWith(FenixRobolectricTestRunner::class) +class TopSiteViewHolderTest { + + private lateinit var view: View + private lateinit var interactor: TopSiteInteractor + + @Before + fun setup() { + view = LayoutInflater.from(testContext) + .inflate(TopSiteViewHolder.LAYOUT_ID, null) + interactor = mockk() + } + + @Test + fun `binds list of top sites`() { + TopSiteViewHolder(view, interactor).bind(listOf( + object : TopSite { + override val id = 1L + override val isDefault = true + override val title = "Pocket" + override val url = "https://getpocket.com" + } + )) + + assertEquals(1, view.top_sites_list.adapter!!.itemCount) + } +} diff --git a/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingPrivacyBrowsingViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingPrivacyBrowsingViewHolderTest.kt new file mode 100644 index 000000000..524ccf614 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingPrivacyBrowsingViewHolderTest.kt @@ -0,0 +1,56 @@ +/* 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.home.sessioncontrol.viewholders.onboarding + +import android.content.res.Resources +import android.view.LayoutInflater +import android.view.View +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkStatic +import io.mockk.unmockkStatic +import io.mockk.verify +import kotlinx.android.synthetic.main.onboarding_private_browsing.view.* +import mozilla.components.support.ktx.android.content.res.resolveAttribute +import mozilla.components.support.test.robolectric.testContext +import org.junit.After +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 org.mozilla.fenix.home.sessioncontrol.OnboardingInteractor + +@RunWith(FenixRobolectricTestRunner::class) +class OnboardingPrivacyBrowsingViewHolderTest { + + private lateinit var view: View + private lateinit var interactor: OnboardingInteractor + + @Before + fun setup() { + mockkStatic("mozilla.components.support.ktx.android.content.res.ThemeKt") + view = LayoutInflater.from(testContext) + .inflate(OnboardingPrivateBrowsingViewHolder.LAYOUT_ID, null) + interactor = mockk(relaxed = true) + + every { + any().resolveAttribute(R.attr.onboardingSelected) + } returns R.color.onboarding_illustration_selected_normal_theme + } + + @After + fun teardown() { + unmockkStatic("mozilla.components.support.ktx.android.content.res.ThemeKt") + } + + @Test + fun `call interactor on click`() { + OnboardingPrivateBrowsingViewHolder(view, interactor) + + view.open_settings_button.performClick() + verify { interactor.onOpenSettingsClicked() } + } +} diff --git a/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingPrivacyNoticeViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingPrivacyNoticeViewHolderTest.kt new file mode 100644 index 000000000..00ab421ec --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingPrivacyNoticeViewHolderTest.kt @@ -0,0 +1,56 @@ +/* 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.home.sessioncontrol.viewholders.onboarding + +import android.content.res.Resources +import android.view.LayoutInflater +import android.view.View +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkStatic +import io.mockk.unmockkStatic +import io.mockk.verify +import kotlinx.android.synthetic.main.onboarding_privacy_notice.view.* +import mozilla.components.support.ktx.android.content.res.resolveAttribute +import mozilla.components.support.test.robolectric.testContext +import org.junit.After +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 org.mozilla.fenix.home.sessioncontrol.OnboardingInteractor + +@RunWith(FenixRobolectricTestRunner::class) +class OnboardingPrivacyNoticeViewHolderTest { + + private lateinit var view: View + private lateinit var interactor: OnboardingInteractor + + @Before + fun setup() { + mockkStatic("mozilla.components.support.ktx.android.content.res.ThemeKt") + view = LayoutInflater.from(testContext) + .inflate(OnboardingPrivacyNoticeViewHolder.LAYOUT_ID, null) + interactor = mockk(relaxed = true) + + every { + any().resolveAttribute(R.attr.onboardingSelected) + } returns R.color.onboarding_illustration_selected_normal_theme + } + + @After + fun teardown() { + unmockkStatic("mozilla.components.support.ktx.android.content.res.ThemeKt") + } + + @Test + fun `call interactor on click`() { + OnboardingPrivacyNoticeViewHolder(view, interactor) + + view.read_button.performClick() + verify { interactor.onReadPrivacyNoticeClicked() } + } +} diff --git a/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingTrackingProtectionViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingTrackingProtectionViewHolderTest.kt new file mode 100644 index 000000000..b422e87a6 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingTrackingProtectionViewHolderTest.kt @@ -0,0 +1,54 @@ +/* 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.home.sessioncontrol.viewholders.onboarding + +import android.content.res.Resources +import android.view.LayoutInflater +import android.view.View +import io.mockk.every +import io.mockk.mockkStatic +import io.mockk.unmockkStatic +import kotlinx.android.synthetic.main.onboarding_tracking_protection.view.* +import mozilla.components.support.ktx.android.content.res.resolveAttribute +import mozilla.components.support.test.robolectric.testContext +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner + +@RunWith(FenixRobolectricTestRunner::class) +class OnboardingTrackingProtectionViewHolderTest { + + private lateinit var view: View + + @Before + fun setup() { + mockkStatic("mozilla.components.support.ktx.android.content.res.ThemeKt") + view = LayoutInflater.from(testContext) + .inflate(OnboardingTrackingProtectionViewHolder.LAYOUT_ID, null) + + every { + any().resolveAttribute(R.attr.onboardingSelected) + } returns R.color.onboarding_illustration_selected_normal_theme + } + + @After + fun teardown() { + unmockkStatic("mozilla.components.support.ktx.android.content.res.ThemeKt") + } + + @Test + fun `sets description text`() { + OnboardingTrackingProtectionViewHolder(view) + + assertEquals( + "Privacy and security settings block trackers, malware, and companies that follow you.", + view.description_text.text + ) + } +} diff --git a/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolderTest.kt new file mode 100644 index 000000000..47c18277c --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolderTest.kt @@ -0,0 +1,46 @@ +/* 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.home.sessioncontrol.viewholders.topsites + +import android.view.LayoutInflater +import android.view.View +import io.mockk.mockk +import io.mockk.verify +import kotlinx.android.synthetic.main.top_site_item.view.* +import mozilla.components.feature.top.sites.TopSite +import mozilla.components.support.test.robolectric.testContext +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor + +@RunWith(FenixRobolectricTestRunner::class) +class TopSiteItemViewHolderTest { + + private lateinit var view: View + private lateinit var interactor: TopSiteInteractor + private val pocket = object : TopSite { + override val id = 1L + override val isDefault = true + override val title = "Pocket" + override val url = "https://getpocket.com" + } + + @Before + fun setup() { + view = LayoutInflater.from(testContext) + .inflate(TopSiteItemViewHolder.LAYOUT_ID, null) + interactor = mockk(relaxed = true) + } + + @Test + fun `calls interactor on click`() { + TopSiteItemViewHolder(view, interactor).bind(pocket) + + view.top_site_item.performClick() + verify { interactor.onSelectTopSite("https://getpocket.com", isDefault = true) } + } +}