commit cfd9cdbaaa52e870fdd81349e826d6e73743df70
parent 231c20bbdffc785521f438c0545bef6a5b4d0a53
Author: mcarare <48995920+mcarare@users.noreply.github.com>
Date: Tue, 30 Dec 2025 12:23:20 +0000
Bug 2007984 - Refactor DefaultTopSiteControllerTest to use runTest and explicit CoroutineScope. r=android-reviewers,giorga
Differential Revision: https://phabricator.services.mozilla.com/D277639
Diffstat:
1 file changed, 66 insertions(+), 71 deletions(-)
diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/topsites/controller/DefaultTopSiteControllerTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/topsites/controller/DefaultTopSiteControllerTest.kt
@@ -10,6 +10,8 @@ import io.mockk.every
import io.mockk.mockk
import io.mockk.spyk
import io.mockk.verify
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.test.runTest
import mozilla.components.browser.state.action.SearchAction
import mozilla.components.browser.state.search.RegionState
import mozilla.components.browser.state.search.SearchEngine
@@ -20,9 +22,7 @@ import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.feature.tabs.TabsUseCases
import mozilla.components.feature.top.sites.TopSite
import mozilla.components.feature.top.sites.TopSitesUseCases
-import mozilla.components.support.test.ext.joinBlocking
import mozilla.components.support.test.robolectric.testContext
-import mozilla.components.support.test.rule.MainCoroutineRule
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
@@ -51,9 +51,6 @@ import java.lang.ref.WeakReference
class DefaultTopSiteControllerTest {
@get:Rule
- val coroutinesTestRule = MainCoroutineRule()
-
- @get:Rule
val gleanTestRule = FenixGleanTestRule(testContext)
private val activity: HomeActivity = mockk(relaxed = true)
@@ -66,8 +63,6 @@ class DefaultTopSiteControllerTest {
private val settings: Settings = mockk(relaxed = true)
private val analytics: Analytics = mockk(relaxed = true)
- private val scope = coroutinesTestRule.scope
-
private val searchEngine = SearchEngine(
id = "test",
name = "Test Engine",
@@ -97,7 +92,7 @@ class DefaultTopSiteControllerTest {
private lateinit var store: BrowserStore
@Before
- fun setup() {
+ fun setup() = runTest {
store = BrowserStore(
BrowserState(
search = SearchState(
@@ -113,14 +108,14 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun handleSelectDefaultTopSite() {
+ fun handleSelectDefaultTopSite() = runTest {
val topSite = TopSite.Default(
id = 1L,
title = "Mozilla",
url = "mozilla.org",
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
@@ -145,14 +140,14 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun handleSelectNonDefaultTopSite() {
+ fun handleSelectNonDefaultTopSite() = runTest {
val topSite = TopSite.Frecent(
id = 1L,
title = "Mozilla",
url = "mozilla.org",
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
@@ -173,14 +168,14 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `GIVEN homepage as a new tab is enabled WHEN Default TopSite is selected THEN open top site in existing tab`() {
+ fun `GIVEN homepage as a new tab is enabled WHEN Default TopSite is selected THEN open top site in existing tab`() = runTest {
val topSite = TopSite.Default(
id = 1L,
title = "Mozilla",
url = "mozilla.org",
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
every { settings.enableHomepageAsNewTab } returns true
@@ -198,7 +193,7 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `GIVEN current destination is the shortcuts fragment WHEN a top site is selected THEN open top site in a new tab`() {
+ fun `GIVEN current destination is the shortcuts fragment WHEN a top site is selected THEN open top site in a new tab`() = runTest {
every { navController.currentDestination } returns mockk {
every { id } returns R.id.shortcutsFragment
}
@@ -209,7 +204,7 @@ class DefaultTopSiteControllerTest {
url = "mozilla.org",
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
@@ -226,7 +221,7 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `GIVEN existing tab for url WHEN Default TopSite selected THEN open new tab`() {
+ fun `GIVEN existing tab for url WHEN Default TopSite selected THEN open new tab`() = runTest {
val url = "mozilla.org"
val existingTabForUrl = createTab(url = url)
@@ -245,7 +240,7 @@ class DefaultTopSiteControllerTest {
url = url,
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
@@ -270,7 +265,7 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `GIVEN existing tab for url WHEN Provided TopSite selected THEN open new tab`() {
+ fun `GIVEN existing tab for url WHEN Provided TopSite selected THEN open new tab`() = runTest {
val url = "mozilla.org"
val existingTabForUrl = createTab(url = url)
@@ -293,7 +288,7 @@ class DefaultTopSiteControllerTest {
createdAt = 0,
)
val position = 0
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
@@ -319,7 +314,7 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `GIVEN existing tab for url WHEN Frecent TopSite selected THEN navigate to tab`() {
+ fun `GIVEN existing tab for url WHEN Frecent TopSite selected THEN navigate to tab`() = runTest {
val url = "mozilla.org"
val existingTabForUrl = createTab(url = url)
@@ -338,7 +333,7 @@ class DefaultTopSiteControllerTest {
url = url,
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
@@ -357,7 +352,7 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `GIVEN existing tab for url WHEN Pinned TopSite selected THEN navigate to tab`() {
+ fun `GIVEN existing tab for url WHEN Pinned TopSite selected THEN navigate to tab`() = runTest {
val url = "mozilla.org"
val existingTabForUrl = createTab(url = url)
@@ -376,7 +371,7 @@ class DefaultTopSiteControllerTest {
url = url,
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
@@ -395,14 +390,14 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun handleSelectGoogleDefaultTopSiteUS() {
+ fun handleSelectGoogleDefaultTopSiteUS() = runTest {
val topSite = TopSite.Default(
id = 1L,
title = "Google",
url = SupportUtils.GOOGLE_URL,
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
@@ -433,14 +428,14 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun handleSelectGoogleDefaultTopSiteXX() {
+ fun handleSelectGoogleDefaultTopSiteXX() = runTest {
val topSite = TopSite.Default(
id = 1L,
title = "Google",
url = SupportUtils.GOOGLE_URL,
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
@@ -471,7 +466,7 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun handleSelectGoogleDefaultTopSite_EventPerformedSearchTopSite() {
+ fun handleSelectGoogleDefaultTopSite_EventPerformedSearchTopSite() = runTest {
assertNull(Events.performedSearch.testGetValue())
val topSite = TopSite.Default(
@@ -480,7 +475,7 @@ class DefaultTopSiteControllerTest {
url = SupportUtils.GOOGLE_URL,
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(googleSearchEngine)
@@ -498,7 +493,7 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun handleSelectDuckDuckGoTopSite_EventPerformedSearchTopSite() {
+ fun handleSelectDuckDuckGoTopSite_EventPerformedSearchTopSite() = runTest {
assertNull(Events.performedSearch.testGetValue())
val topSite = TopSite.Pinned(
@@ -507,7 +502,7 @@ class DefaultTopSiteControllerTest {
url = "https://duckduckgo.com",
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(
googleSearchEngine,
@@ -520,14 +515,14 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun handleSelectGooglePinnedTopSiteUS() {
+ fun handleSelectGooglePinnedTopSiteUS() = runTest {
val topSite = TopSite.Pinned(
id = 1L,
title = "Google",
url = SupportUtils.GOOGLE_URL,
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
@@ -558,14 +553,14 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun handleSelectGooglePinnedTopSiteXX() {
+ fun handleSelectGooglePinnedTopSiteXX() = runTest {
val topSite = TopSite.Pinned(
id = 1L,
title = "Google",
url = SupportUtils.GOOGLE_URL,
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
@@ -596,14 +591,14 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun handleSelectGoogleFrecentTopSiteUS() {
+ fun handleSelectGoogleFrecentTopSiteUS() = runTest {
val topSite = TopSite.Frecent(
id = 1L,
title = "Google",
url = SupportUtils.GOOGLE_URL,
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
@@ -634,14 +629,14 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun handleSelectGoogleFrecentTopSiteXX() {
+ fun handleSelectGoogleFrecentTopSiteXX() = runTest {
val topSite = TopSite.Frecent(
id = 1L,
title = "Google",
url = SupportUtils.GOOGLE_URL,
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
@@ -672,7 +667,7 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun handleSelectProvidedTopSite() {
+ fun handleSelectProvidedTopSite() = runTest {
val topSite = TopSite.Provided(
id = 1L,
title = "Mozilla",
@@ -683,7 +678,7 @@ class DefaultTopSiteControllerTest {
createdAt = 0,
)
val position = 0
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
@@ -709,8 +704,8 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `WHEN the provided top site is clicked THEN send a click callback request`() {
- val controller = spyk(createController())
+ fun `WHEN the provided top site is clicked THEN send a click callback request`() = runTest {
+ val controller = spyk(createController(this))
val topSite = TopSite.Provided(
id = 3,
title = "Mozilla",
@@ -752,8 +747,8 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `WHEN the provided top site is seen THEN send a impression callback request`() {
- val controller = spyk(createController())
+ fun `WHEN the provided top site is seen THEN send a impression callback request`() = runTest {
+ val controller = spyk(createController(this))
val topSite = TopSite.Provided(
id = 3,
title = "Mozilla",
@@ -795,8 +790,8 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `WHEN the default Google top site is removed THEN the correct metric is recorded`() {
- val controller = spyk(createController())
+ fun `WHEN the default Google top site is removed THEN the correct metric is recorded`() = runTest {
+ val controller = spyk(createController(this))
val topSite = TopSite.Default(
id = 1L,
title = "Google",
@@ -818,7 +813,7 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `WHEN the frecent top site is updated THEN add the frecent top site as a pinned top site`() {
+ fun `WHEN the frecent top site is updated THEN add the frecent top site as a pinned top site`() = runTest {
val topSite = TopSite.Frecent(
id = 1L,
title = "Mozilla",
@@ -826,7 +821,7 @@ class DefaultTopSiteControllerTest {
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
val title = "Firefox"
val url = "firefox.com"
@@ -838,7 +833,7 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `WHEN the pinned top site is updated THEN update the pinned top site in storage`() {
+ fun `WHEN the pinned top site is updated THEN update the pinned top site in storage`() = runTest {
val topSite = TopSite.Pinned(
id = 1L,
title = "Mozilla",
@@ -846,7 +841,7 @@ class DefaultTopSiteControllerTest {
createdAt = 0,
)
- val controller = spyk(createController())
+ val controller = spyk(createController(this))
val title = "Firefox"
val url = "firefox.com"
@@ -858,8 +853,8 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `WHEN handleTopSiteSettingsClicked is called THEN navigate to the HomeSettingsFragment AND report the interaction`() {
- createController().handleTopSiteSettingsClicked()
+ fun `WHEN handleTopSiteSettingsClicked is called THEN navigate to the HomeSettingsFragment AND report the interaction`() = runTest {
+ createController(this).handleTopSiteSettingsClicked()
assertNotNull(TopSites.contileSettings.testGetValue())
assertEquals(1, TopSites.contileSettings.testGetValue()!!.size)
@@ -869,8 +864,8 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `WHEN handleSponsorPrivacyClicked is called THEN navigate to the privacy webpage AND report the interaction`() {
- createController().handleSponsorPrivacyClicked()
+ fun `WHEN handleSponsorPrivacyClicked is called THEN navigate to the privacy webpage AND report the interaction`() = runTest {
+ createController(this).handleSponsorPrivacyClicked()
assertNotNull(TopSites.contileSponsorsAndPrivacy.testGetValue())
assertEquals(1, TopSites.contileSponsorsAndPrivacy.testGetValue()!!.size)
@@ -887,12 +882,12 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `GIVEN current destination is the shortcuts fragmentWHEN handleSponsorPrivacyClicked is called THEN navigate to the privacy webpage AND report the interaction`() {
+ fun `GIVEN current destination is the shortcuts fragmentWHEN handleSponsorPrivacyClicked is called THEN navigate to the privacy webpage AND report the interaction`() = runTest {
every { navController.currentDestination } returns mockk {
every { id } returns R.id.shortcutsFragment
}
- createController().handleSponsorPrivacyClicked()
+ createController(this).handleSponsorPrivacyClicked()
assertNotNull(TopSites.contileSponsorsAndPrivacy.testGetValue())
assertEquals(1, TopSites.contileSponsorsAndPrivacy.testGetValue()!!.size)
@@ -909,7 +904,7 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `WHEN top site long clicked is called THEN report the top site long click telemetry`() {
+ fun `WHEN top site long clicked is called THEN report the top site long click telemetry`() = runTest {
assertNull(TopSites.longPress.testGetValue())
val topSite = TopSite.Provided(
@@ -922,13 +917,13 @@ class DefaultTopSiteControllerTest {
createdAt = 0,
)
- createController().handleTopSiteLongClicked(topSite)
+ createController(this).handleTopSiteLongClicked(topSite)
assertEquals(topSite.type, TopSites.longPress.testGetValue()!!.single().extra!!["type"])
}
@Test
- fun `WHEN handleOpenInPrivateTabClicked is called with a TopSite#Provided site THEN navigate to the top site and record telemetry`() {
+ fun `WHEN handleOpenInPrivateTabClicked is called with a TopSite#Provided site THEN navigate to the top site and record telemetry`() = runTest {
val topSite = TopSite.Provided(
id = 1L,
title = "Mozilla",
@@ -938,7 +933,7 @@ class DefaultTopSiteControllerTest {
impressionUrl = "",
createdAt = 0,
)
- createController().handleOpenInPrivateTabClicked(topSite)
+ createController(this).handleOpenInPrivateTabClicked(topSite)
assertNotNull(TopSites.openContileInPrivateTab.testGetValue())
assertEquals(1, TopSites.openContileInPrivateTab.testGetValue()!!.size)
@@ -955,7 +950,7 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `GIVEN current destination is the shortcuts fragment WHEN handleOpenInPrivateTabClicked is called with a TopSite#Provided site THEN navigate to the top site and record telemetry`() {
+ fun `GIVEN current destination is the shortcuts fragment WHEN handleOpenInPrivateTabClicked is called with a TopSite#Provided site THEN navigate to the top site and record telemetry`() = runTest {
every { navController.currentDestination } returns mockk {
every { id } returns R.id.shortcutsFragment
}
@@ -969,7 +964,7 @@ class DefaultTopSiteControllerTest {
impressionUrl = "",
createdAt = 0,
)
- createController().handleOpenInPrivateTabClicked(topSite)
+ createController(this).handleOpenInPrivateTabClicked(topSite)
assertNotNull(TopSites.openContileInPrivateTab.testGetValue())
assertEquals(1, TopSites.openContileInPrivateTab.testGetValue()!!.size)
@@ -986,7 +981,7 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `GIVEN homepage as a new tab is enabled WHEN handleOpenInPrivateTabClicked is called with a TopSite#Provided site THEN navigate to the top site and record telemetry`() {
+ fun `GIVEN homepage as a new tab is enabled WHEN handleOpenInPrivateTabClicked is called with a TopSite#Provided site THEN navigate to the top site and record telemetry`() = runTest {
every { settings.enableHomepageAsNewTab } returns true
val topSite = TopSite.Provided(
@@ -998,7 +993,7 @@ class DefaultTopSiteControllerTest {
impressionUrl = "",
createdAt = 0,
)
- createController().handleOpenInPrivateTabClicked(topSite)
+ createController(this).handleOpenInPrivateTabClicked(topSite)
assertNotNull(TopSites.openContileInPrivateTab.testGetValue())
assertEquals(1, TopSites.openContileInPrivateTab.testGetValue()!!.size)
@@ -1015,8 +1010,8 @@ class DefaultTopSiteControllerTest {
}
@Test
- fun `WHEN handleOpenInPrivateTabClicked is called with a Default, Pinned, or Frecent top site THEN openInPrivateTab event is recorded`() {
- val controller = createController()
+ fun `WHEN handleOpenInPrivateTabClicked is called with a Default, Pinned, or Frecent top site THEN openInPrivateTab event is recorded`() = runTest {
+ val controller = createController(this)
val topSite1 = TopSite.Default(
id = 1L,
title = "Mozilla",
@@ -1048,14 +1043,14 @@ class DefaultTopSiteControllerTest {
}
}
- fun `WHEN screen is shown THEN impression is logged`() {
+ fun `WHEN screen is shown THEN impression is logged`() = runTest {
assertNull(ShortcutsLibrary.viewed.testGetValue())
- val controller = createController()
+ val controller = createController(this)
controller.handleShortcutsLibraryViewed()
assertNotNull(ShortcutsLibrary.viewed.testGetValue())
}
- private fun createController(): DefaultTopSiteController =
+ private fun createController(scope: CoroutineScope): DefaultTopSiteController =
DefaultTopSiteController(
activityRef = WeakReference(activity),
navControllerRef = WeakReference(navController),