For #24098: Update tests for tabs tray metrics.

upstream-sync
mcarare 2 years ago committed by mergify[bot]
parent 1f18f62a5a
commit cb14837bc6

@ -9,7 +9,6 @@ import mozilla.components.browser.state.state.TabSessionState
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.browser.tabstray.TabsTray import mozilla.components.browser.tabstray.TabsTray
import mozilla.telemetry.glean.private.NoExtras import mozilla.telemetry.glean.private.NoExtras
import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.utils.Settings import org.mozilla.fenix.utils.Settings
import org.mozilla.fenix.GleanMetrics.TabsTray as TabsTrayMetrics import org.mozilla.fenix.GleanMetrics.TabsTray as TabsTrayMetrics
@ -18,7 +17,6 @@ class InactiveTabsAutoCloseDialogController(
private val settings: Settings, private val settings: Settings,
private val tabFilter: (TabSessionState) -> Boolean, private val tabFilter: (TabSessionState) -> Boolean,
private val tray: TabsTray, private val tray: TabsTray,
private val metrics: MetricController
) { ) {
/** /**
* Dismiss the auto-close dialog. * Dismiss the auto-close dialog.
@ -26,7 +24,7 @@ class InactiveTabsAutoCloseDialogController(
fun close() { fun close() {
markDialogAsShown() markDialogAsShown()
refreshInactiveTabsSection() refreshInactiveTabsSection()
org.mozilla.fenix.GleanMetrics.TabsTray.autoCloseSeen.record(NoExtras()) TabsTrayMetrics.autoCloseSeen.record(NoExtras())
TabsTrayMetrics.autoCloseDimissed.record(NoExtras()) TabsTrayMetrics.autoCloseDimissed.record(NoExtras())
} }

@ -22,7 +22,6 @@ import org.mozilla.fenix.GleanMetrics.History
import org.mozilla.fenix.GleanMetrics.RecentBookmarks import org.mozilla.fenix.GleanMetrics.RecentBookmarks
import org.mozilla.fenix.GleanMetrics.RecentlyVisitedHomepage import org.mozilla.fenix.GleanMetrics.RecentlyVisitedHomepage
import org.mozilla.fenix.GleanMetrics.SyncedTabs import org.mozilla.fenix.GleanMetrics.SyncedTabs
import org.mozilla.fenix.GleanMetrics.TabsTray
import org.mozilla.fenix.GleanMetrics.TopSites import org.mozilla.fenix.GleanMetrics.TopSites
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@ -228,73 +227,6 @@ class GleanMetricsServiceTest {
assertEquals("123", events[0].extra!!["addon_id"]) assertEquals("123", events[0].extra!!["addon_id"])
} }
@Test
fun `TabsTray events are correctly recorded`() {
assertFalse(TabsTray.opened.testHasValue())
gleanService.track(Event.TabsTrayOpened)
assertTrue(TabsTray.opened.testHasValue())
assertFalse(TabsTray.closed.testHasValue())
gleanService.track(Event.TabsTrayClosed)
assertTrue(TabsTray.closed.testHasValue())
assertFalse(TabsTray.openedExistingTab.testHasValue())
gleanService.track(Event.OpenedExistingTab("Test"))
assertTrue(TabsTray.openedExistingTab.testHasValue())
var events = TabsTray.openedExistingTab.testGetValue()
assertEquals(1, events.size)
assertEquals("tabs_tray", events[0].category)
assertEquals("opened_existing_tab", events[0].name)
assertEquals(1, events[0].extra!!.size)
assertEquals("Test", events[0].extra!!["source"])
assertFalse(TabsTray.closedExistingTab.testHasValue())
gleanService.track(Event.ClosedExistingTab("Test"))
assertTrue(TabsTray.closedExistingTab.testHasValue())
events = TabsTray.closedExistingTab.testGetValue()
assertEquals(1, events.size)
assertEquals("tabs_tray", events[0].category)
assertEquals("closed_existing_tab", events[0].name)
assertEquals(1, events[0].extra!!.size)
assertEquals("Test", events[0].extra!!["source"])
assertFalse(TabsTray.privateModeTapped.testHasValue())
gleanService.track(Event.TabsTrayPrivateModeTapped)
assertTrue(TabsTray.privateModeTapped.testHasValue())
assertFalse(TabsTray.normalModeTapped.testHasValue())
gleanService.track(Event.TabsTrayNormalModeTapped)
assertTrue(TabsTray.normalModeTapped.testHasValue())
assertFalse(TabsTray.syncedModeTapped.testHasValue())
gleanService.track(Event.TabsTraySyncedModeTapped)
assertTrue(TabsTray.syncedModeTapped.testHasValue())
assertFalse(TabsTray.newTabTapped.testHasValue())
gleanService.track(Event.NewTabTapped)
assertTrue(TabsTray.newTabTapped.testHasValue())
assertFalse(TabsTray.newPrivateTabTapped.testHasValue())
gleanService.track(Event.NewPrivateTabTapped)
assertTrue(TabsTray.newPrivateTabTapped.testHasValue())
assertFalse(TabsTray.menuOpened.testHasValue())
gleanService.track(Event.TabsTrayMenuOpened)
assertTrue(TabsTray.menuOpened.testHasValue())
assertFalse(TabsTray.saveToCollection.testHasValue())
gleanService.track(Event.TabsTraySaveToCollectionPressed)
assertTrue(TabsTray.saveToCollection.testHasValue())
assertFalse(TabsTray.shareAllTabs.testHasValue())
gleanService.track(Event.TabsTrayShareAllTabsPressed)
assertTrue(TabsTray.shareAllTabs.testHasValue())
assertFalse(TabsTray.closeAllTabs.testHasValue())
gleanService.track(Event.TabsTrayCloseAllTabsPressed)
assertTrue(TabsTray.closeAllTabs.testHasValue())
}
@Test @Test
fun `default browser events are correctly recorded`() { fun `default browser events are correctly recorded`() {
assertFalse(Events.defaultBrowserChanged.testHasValue()) assertFalse(Events.defaultBrowserChanged.testHasValue())

@ -36,7 +36,6 @@ import org.junit.runner.RunWith
import org.mozilla.fenix.GleanMetrics.TabsTray import org.mozilla.fenix.GleanMetrics.TabsTray
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.home.HomeFragment import org.mozilla.fenix.home.HomeFragment
import org.mozilla.fenix.ext.maxActiveTime import org.mozilla.fenix.ext.maxActiveTime
@ -83,8 +82,12 @@ class DefaultTabsTrayControllerTest {
every { getProfilerTime() } returns Double.MAX_VALUE every { getProfilerTime() } returns Double.MAX_VALUE
} }
assertFalse(TabsTray.newPrivateTabTapped.testHasValue())
createController().handleOpeningNewTab(true) createController().handleOpeningNewTab(true)
assertTrue(TabsTray.newPrivateTabTapped.testHasValue())
verifyOrder { verifyOrder {
profiler.getProfilerTime() profiler.getProfilerTime()
navController.navigate( navController.navigate(
@ -121,21 +124,27 @@ class DefaultTabsTrayControllerTest {
@Test @Test
fun `GIVEN private mode WHEN handleOpeningNewTab is called THEN Event#NewPrivateTabTapped is added to telemetry`() { fun `GIVEN private mode WHEN handleOpeningNewTab is called THEN Event#NewPrivateTabTapped is added to telemetry`() {
assertFalse(TabsTray.newPrivateTabTapped.testHasValue())
createController().handleOpeningNewTab(true) createController().handleOpeningNewTab(true)
verify { metrics.track(Event.NewPrivateTabTapped) } assertTrue(TabsTray.newPrivateTabTapped.testHasValue())
} }
@Test @Test
fun `GIVEN private mode WHEN handleOpeningNewTab is called THEN Event#NewTabTapped is added to telemetry`() { fun `GIVEN private mode WHEN handleOpeningNewTab is called THEN Event#NewTabTapped is added to telemetry`() {
assertFalse(TabsTray.newTabTapped.testHasValue())
createController().handleOpeningNewTab(false) createController().handleOpeningNewTab(false)
verify { metrics.track(Event.NewTabTapped) } assertTrue(TabsTray.newTabTapped.testHasValue())
} }
@Test @Test
fun `WHEN handleTabDeletion is called THEN Event#ClosedExistingTab is added to telemetry`() { fun `WHEN handleTabDeletion is called THEN Event#ClosedExistingTab is added to telemetry`() {
val tab: TabSessionState = mockk { every { content.private } returns true } val tab: TabSessionState = mockk { every { content.private } returns true }
assertFalse(TabsTray.closedExistingTab.testHasValue())
every { browserStore.state } returns mockk() every { browserStore.state } returns mockk()
try { try {
mockkStatic("mozilla.components.browser.state.selector.SelectorsKt") mockkStatic("mozilla.components.browser.state.selector.SelectorsKt")
@ -143,7 +152,7 @@ class DefaultTabsTrayControllerTest {
every { browserStore.state.getNormalOrPrivateTabs(any()) } returns listOf(tab) every { browserStore.state.getNormalOrPrivateTabs(any()) } returns listOf(tab)
createController().handleTabDeletion("testTabId", "unknown") createController().handleTabDeletion("testTabId", "unknown")
verify { metrics.track(Event.ClosedExistingTab("unknown")) } assertTrue(TabsTray.closedExistingTab.testHasValue())
} finally { } finally {
unmockkStatic("mozilla.components.browser.state.selector.SelectorsKt") unmockkStatic("mozilla.components.browser.state.selector.SelectorsKt")
} }
@ -440,14 +449,16 @@ class DefaultTabsTrayControllerTest {
fun `GIVEN private mode selected WHEN sendNewTabEvent is called THEN NewPrivateTabTapped is tracked in telemetry`() { fun `GIVEN private mode selected WHEN sendNewTabEvent is called THEN NewPrivateTabTapped is tracked in telemetry`() {
createController().sendNewTabEvent(true) createController().sendNewTabEvent(true)
verify { metrics.track(Event.NewPrivateTabTapped) } assertTrue(TabsTray.newPrivateTabTapped.testHasValue())
} }
@Test @Test
fun `GIVEN normal mode selected WHEN sendNewTabEvent is called THEN NewTabTapped is tracked in telemetry`() { fun `GIVEN normal mode selected WHEN sendNewTabEvent is called THEN NewTabTapped is tracked in telemetry`() {
assertFalse(TabsTray.newTabTapped.testHasValue())
createController().sendNewTabEvent(false) createController().sendNewTabEvent(false)
verify { metrics.track(Event.NewTabTapped) } assertTrue(TabsTray.newTabTapped.testHasValue())
} }
@Test @Test
@ -511,13 +522,15 @@ class DefaultTabsTrayControllerTest {
} }
} }
every { browserStore.state } returns mockk() every { browserStore.state } returns mockk()
assertFalse(TabsTray.closeAllInactiveTabs.testHasValue())
try { try {
mockkStatic("mozilla.components.browser.state.selector.SelectorsKt") mockkStatic("mozilla.components.browser.state.selector.SelectorsKt")
every { browserStore.state.potentialInactiveTabs } returns listOf(inactiveTab) every { browserStore.state.potentialInactiveTabs } returns listOf(inactiveTab)
createController().handleDeleteAllInactiveTabs() createController().handleDeleteAllInactiveTabs()
verify { metrics.track(Event.TabsTrayCloseAllInactiveTabs) } assertTrue(TabsTray.closeAllInactiveTabs.testHasValue())
} finally { } finally {
unmockkStatic("mozilla.components.browser.state.selector.SelectorsKt") unmockkStatic("mozilla.components.browser.state.selector.SelectorsKt")
} }

@ -28,6 +28,7 @@ import mozilla.components.service.glean.testing.GleanTestRule
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
import mozilla.components.support.test.rule.MainCoroutineRule import mozilla.components.support.test.rule.MainCoroutineRule
import org.junit.Assert import org.junit.Assert
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Before import org.junit.Before
import org.junit.Rule import org.junit.Rule
@ -77,6 +78,9 @@ class NavigationInteractorTest {
@Test @Test
fun `onTabTrayDismissed calls dismissTabTray on DefaultNavigationInteractor`() { fun `onTabTrayDismissed calls dismissTabTray on DefaultNavigationInteractor`() {
var dismissTabTrayInvoked = false var dismissTabTrayInvoked = false
assertFalse(TabsTray.closed.testHasValue())
createInteractor( createInteractor(
dismissTabTray = { dismissTabTray = {
dismissTabTrayInvoked = true dismissTabTrayInvoked = true
@ -84,9 +88,7 @@ class NavigationInteractorTest {
).onTabTrayDismissed() ).onTabTrayDismissed()
assertTrue(dismissTabTrayInvoked) assertTrue(dismissTabTrayInvoked)
verify { assertTrue(TabsTray.closed.testHasValue())
metrics.track(Event.TabsTrayClosed)
}
} }
@Test @Test
@ -190,8 +192,11 @@ class NavigationInteractorTest {
mockkStatic("org.mozilla.fenix.collections.CollectionsDialogKt") mockkStatic("org.mozilla.fenix.collections.CollectionsDialogKt")
every { any<CollectionsDialog>().show(any()) } answers { } every { any<CollectionsDialog>().show(any()) } answers { }
assertFalse(TabsTray.saveToCollection.testHasValue())
createInteractor().onSaveToCollections(listOf(testTab)) createInteractor().onSaveToCollections(listOf(testTab))
verify(exactly = 1) { metrics.track(Event.TabsTraySaveToCollectionPressed) }
assertTrue(TabsTray.saveToCollection.testHasValue())
unmockkStatic("org.mozilla.fenix.collections.CollectionsDialogKt") unmockkStatic("org.mozilla.fenix.collections.CollectionsDialogKt")
} }

@ -12,7 +12,6 @@ import io.mockk.verify
import org.junit.Test import org.junit.Test
import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager
import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.tabstray.TrayPagerAdapter.Companion.POSITION_NORMAL_TABS import org.mozilla.fenix.tabstray.TrayPagerAdapter.Companion.POSITION_NORMAL_TABS
import org.mozilla.fenix.tabstray.TrayPagerAdapter.Companion.POSITION_PRIVATE_TABS import org.mozilla.fenix.tabstray.TrayPagerAdapter.Companion.POSITION_PRIVATE_TABS
import org.mozilla.fenix.tabstray.TrayPagerAdapter.Companion.POSITION_SYNCED_TABS import org.mozilla.fenix.tabstray.TrayPagerAdapter.Companion.POSITION_SYNCED_TABS
@ -21,14 +20,13 @@ class TabLayoutMediatorTest {
private val modeManager: BrowsingModeManager = mockk(relaxed = true) private val modeManager: BrowsingModeManager = mockk(relaxed = true)
private val tabsTrayStore: TabsTrayStore = mockk(relaxed = true) private val tabsTrayStore: TabsTrayStore = mockk(relaxed = true)
private val interactor: TabsTrayInteractor = mockk(relaxed = true) private val interactor: TabsTrayInteractor = mockk(relaxed = true)
private val metrics: MetricController = mockk(relaxed = true)
private val tabLayout: TabLayout = mockk(relaxed = true) private val tabLayout: TabLayout = mockk(relaxed = true)
private val tab: TabLayout.Tab = mockk(relaxed = true) private val tab: TabLayout.Tab = mockk(relaxed = true)
private val viewPager: ViewPager2 = mockk(relaxed = true) private val viewPager: ViewPager2 = mockk(relaxed = true)
@Test @Test
fun `page to normal tab position when mode is also normal`() { fun `page to normal tab position when mode is also normal`() {
val mediator = TabLayoutMediator(tabLayout, viewPager, interactor, modeManager, tabsTrayStore, metrics) val mediator = TabLayoutMediator(tabLayout, viewPager, interactor, modeManager, tabsTrayStore)
every { modeManager.mode }.answers { BrowsingMode.Normal } every { modeManager.mode }.answers { BrowsingMode.Normal }
every { tabLayout.getTabAt(POSITION_NORMAL_TABS) }.answers { tab } every { tabLayout.getTabAt(POSITION_NORMAL_TABS) }.answers { tab }
@ -42,7 +40,7 @@ class TabLayoutMediatorTest {
@Test @Test
fun `page to private tab position when mode is also private`() { fun `page to private tab position when mode is also private`() {
val mediator = TabLayoutMediator(tabLayout, viewPager, interactor, modeManager, tabsTrayStore, metrics) val mediator = TabLayoutMediator(tabLayout, viewPager, interactor, modeManager, tabsTrayStore)
every { modeManager.mode }.answers { BrowsingMode.Private } every { modeManager.mode }.answers { BrowsingMode.Private }
every { tabLayout.getTabAt(POSITION_PRIVATE_TABS) }.answers { tab } every { tabLayout.getTabAt(POSITION_PRIVATE_TABS) }.answers { tab }
@ -55,7 +53,7 @@ class TabLayoutMediatorTest {
@Test @Test
fun `selectTabAtPosition will dispatch the correct TabsTrayStore action`() { fun `selectTabAtPosition will dispatch the correct TabsTrayStore action`() {
val mediator = TabLayoutMediator(tabLayout, viewPager, interactor, modeManager, tabsTrayStore, metrics) val mediator = TabLayoutMediator(tabLayout, viewPager, interactor, modeManager, tabsTrayStore)
every { tabLayout.getTabAt(POSITION_NORMAL_TABS) }.answers { tab } every { tabLayout.getTabAt(POSITION_NORMAL_TABS) }.answers { tab }
every { tabLayout.getTabAt(POSITION_PRIVATE_TABS) }.answers { tab } every { tabLayout.getTabAt(POSITION_PRIVATE_TABS) }.answers { tab }
@ -76,7 +74,7 @@ class TabLayoutMediatorTest {
@Test @Test
fun `lifecycle methods adds and removes observer`() { fun `lifecycle methods adds and removes observer`() {
val mediator = TabLayoutMediator(tabLayout, viewPager, interactor, modeManager, tabsTrayStore, metrics) val mediator = TabLayoutMediator(tabLayout, viewPager, interactor, modeManager, tabsTrayStore)
every { modeManager.mode }.answers { BrowsingMode.Private } every { modeManager.mode }.answers { BrowsingMode.Private }

@ -8,71 +8,83 @@ import com.google.android.material.tabs.TabLayout
import io.mockk.every import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import io.mockk.verify import io.mockk.verify
import mozilla.components.service.glean.testing.GleanTestRule
import mozilla.components.support.test.libstate.ext.waitUntilIdle import mozilla.components.support.test.libstate.ext.waitUntilIdle
import mozilla.components.support.test.middleware.CaptureActionsMiddleware import mozilla.components.support.test.middleware.CaptureActionsMiddleware
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before import org.junit.Before
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.mozilla.fenix.components.metrics.Event import org.junit.runner.RunWith
import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.GleanMetrics.TabsTray
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class) // for gleanTestRule
class TabLayoutObserverTest { class TabLayoutObserverTest {
private val interactor = mockk<TabsTrayInteractor>(relaxed = true) private val interactor = mockk<TabsTrayInteractor>(relaxed = true)
private lateinit var store: TabsTrayStore private lateinit var store: TabsTrayStore
private lateinit var metrics: MetricController
private val middleware = CaptureActionsMiddleware<TabsTrayState, TabsTrayAction>() private val middleware = CaptureActionsMiddleware<TabsTrayState, TabsTrayAction>()
@get:Rule
val gleanTestRule = GleanTestRule(testContext)
@Before @Before
fun setup() { fun setup() {
store = TabsTrayStore(middlewares = listOf(middleware)) store = TabsTrayStore(middlewares = listOf(middleware))
metrics = mockk(relaxed = true)
} }
@Test @Test
fun `WHEN tab is selected THEN notify the interactor`() { fun `WHEN tab is selected THEN notify the interactor`() {
val observer = TabLayoutObserver(interactor, metrics) val observer = TabLayoutObserver(interactor)
val tab = mockk<TabLayout.Tab>() val tab = mockk<TabLayout.Tab>()
every { tab.position } returns 1 every { tab.position } returns 1
assertFalse(TabsTray.privateModeTapped.testHasValue())
observer.onTabSelected(tab) observer.onTabSelected(tab)
store.waitUntilIdle() store.waitUntilIdle()
verify { interactor.onTrayPositionSelected(1, false) } verify { interactor.onTrayPositionSelected(1, false) }
verify { metrics.track(Event.TabsTrayPrivateModeTapped) } assertTrue(TabsTray.privateModeTapped.testHasValue())
every { tab.position } returns 0 every { tab.position } returns 0
assertFalse(TabsTray.normalModeTapped.testHasValue())
observer.onTabSelected(tab) observer.onTabSelected(tab)
store.waitUntilIdle() store.waitUntilIdle()
verify { interactor.onTrayPositionSelected(0, true) } verify { interactor.onTrayPositionSelected(0, true) }
verify { metrics.track(Event.TabsTrayNormalModeTapped) } assertTrue(TabsTray.normalModeTapped.testHasValue())
every { tab.position } returns 2 every { tab.position } returns 2
assertFalse(TabsTray.syncedModeTapped.testHasValue())
observer.onTabSelected(tab) observer.onTabSelected(tab)
store.waitUntilIdle() store.waitUntilIdle()
verify { interactor.onTrayPositionSelected(2, true) } verify { interactor.onTrayPositionSelected(2, true) }
verify { metrics.track(Event.TabsTraySyncedModeTapped) } assertTrue(TabsTray.syncedModeTapped.testHasValue())
} }
@Test @Test
fun `WHEN observer is first started THEN do not smooth scroll`() { fun `WHEN observer is first started THEN do not smooth scroll`() {
val observer = TabLayoutObserver(interactor, metrics) val observer = TabLayoutObserver(interactor)
val tab = mockk<TabLayout.Tab>() val tab = mockk<TabLayout.Tab>()
every { tab.position } returns 1 every { tab.position } returns 1
assertFalse(TabsTray.privateModeTapped.testHasValue())
observer.onTabSelected(tab) observer.onTabSelected(tab)
verify { interactor.onTrayPositionSelected(1, false) } verify { interactor.onTrayPositionSelected(1, false) }
verify { metrics.track(Event.TabsTrayPrivateModeTapped) } assertTrue(TabsTray.privateModeTapped.testHasValue())
observer.onTabSelected(tab) observer.onTabSelected(tab)
verify { interactor.onTrayPositionSelected(1, true) } verify { interactor.onTrayPositionSelected(1, true) }
verify { metrics.track(Event.TabsTrayPrivateModeTapped) } assertTrue(TabsTray.privateModeTapped.testHasValue())
} }
} }

@ -31,17 +31,19 @@ import io.mockk.verify
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import mozilla.components.browser.menu.BrowserMenu import mozilla.components.browser.menu.BrowserMenu
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.service.glean.testing.GleanTestRule
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertSame import org.junit.Assert.assertSame
import org.junit.Assert.assertTrue
import org.junit.Before import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.GleanMetrics.TabsTray
import org.mozilla.fenix.NavGraphDirections import org.mozilla.fenix.NavGraphDirections
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.databinding.ComponentTabstray2Binding import org.mozilla.fenix.databinding.ComponentTabstray2Binding
import org.mozilla.fenix.databinding.ComponentTabstrayFabBinding import org.mozilla.fenix.databinding.ComponentTabstrayFabBinding
@ -67,6 +69,9 @@ class TabsTrayFragmentTest {
@get:Rule @get:Rule
val mockkRule = MockkRetryTestRule() val mockkRule = MockkRetryTestRule()
@get:Rule
val gleanTestRule = GleanTestRule(testContext)
@Before @Before
fun setup() { fun setup() {
context = mockk(relaxed = true) context = mockk(relaxed = true)
@ -246,10 +251,12 @@ class TabsTrayFragmentTest {
} }
every { fragment.getTrayMenu(any(), any(), any(), any(), any()) } returns menuBuilder every { fragment.getTrayMenu(any(), any(), any(), any(), any()) } returns menuBuilder
assertFalse(TabsTray.menuOpened.testHasValue())
fragment.setupMenu(navigationInteractor) fragment.setupMenu(navigationInteractor)
tabsTrayBinding.tabTrayOverflow.performClick() tabsTrayBinding.tabTrayOverflow.performClick()
verify { metrics.track(Event.TabsTrayMenuOpened) } assertTrue(TabsTray.menuOpened.testHasValue())
verify { menuBuilder.build() } verify { menuBuilder.build() }
verify { menu.showWithTheme(tabsTrayBinding.tabTrayOverflow) } verify { menu.showWithTheme(tabsTrayBinding.tabTrayOverflow) }
} finally { } finally {

@ -13,11 +13,13 @@ import mozilla.components.service.glean.testing.GleanTestRule
import mozilla.components.support.test.libstate.ext.waitUntilIdle import mozilla.components.support.test.libstate.ext.waitUntilIdle
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Before import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mozilla.fenix.GleanMetrics.Metrics
import org.mozilla.fenix.GleanMetrics.TabsTray import org.mozilla.fenix.GleanMetrics.TabsTray
import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.components.metrics.MetricController
@ -68,10 +70,15 @@ class TabsTrayMiddlewareTest {
@Test @Test
fun `WHEN inactive tabs are updated THEN report the count of inactive tabs`() { fun `WHEN inactive tabs are updated THEN report the count of inactive tabs`() {
assertFalse(TabsTray.hasInactiveTabs.testHasValue())
assertFalse(Metrics.inactiveTabsCount.testHasValue())
store.dispatch(TabsTrayAction.UpdateInactiveTabs(emptyList())) store.dispatch(TabsTrayAction.UpdateInactiveTabs(emptyList()))
store.waitUntilIdle() store.waitUntilIdle()
verify { metrics.track(Event.TabsTrayHasInactiveTabs(0)) } assertTrue(TabsTray.hasInactiveTabs.testHasValue())
verify { metrics.track(Event.InactiveTabsCountUpdate(0)) } assertTrue(Metrics.inactiveTabsCount.testHasValue())
assertEquals(0, Metrics.inactiveTabsCount.testGetValue())
} }
@Test @Test
@ -93,6 +100,8 @@ class TabsTrayMiddlewareTest {
@Test @Test
fun `WHEN multi select mode from menu is entered THEN relevant metrics are collected`() { fun `WHEN multi select mode from menu is entered THEN relevant metrics are collected`() {
assertFalse(TabsTray.enterMultiselectMode.testHasValue())
store.dispatch(TabsTrayAction.EnterSelectMode) store.dispatch(TabsTrayAction.EnterSelectMode)
store.waitUntilIdle() store.waitUntilIdle()

@ -14,23 +14,34 @@ import io.mockk.verify
import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.state.state.TabSessionState
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.browser.tabstray.TabsTray import mozilla.components.browser.tabstray.TabsTray
import mozilla.components.service.glean.testing.GleanTestRule
import org.mozilla.fenix.GleanMetrics.TabsTray as TabsTrayMetrics
import mozilla.components.support.test.libstate.ext.waitUntilIdle import mozilla.components.support.test.libstate.ext.waitUntilIdle
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Rule
import mozilla.components.browser.state.state.createTab as createTabState import mozilla.components.browser.state.state.createTab as createTabState
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.AppStore
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.tabstray.TabsTrayState import org.mozilla.fenix.tabstray.TabsTrayState
import org.mozilla.fenix.tabstray.TabsTrayStore import org.mozilla.fenix.tabstray.TabsTrayStore
import org.mozilla.fenix.utils.Settings import org.mozilla.fenix.utils.Settings
@RunWith(FenixRobolectricTestRunner::class) // for gleanTestRule
class InactiveTabsControllerTest { class InactiveTabsControllerTest {
private val metrics: MetricController = mockk(relaxed = true) private val metrics: MetricController = mockk(relaxed = true)
private val settings: Settings = mockk(relaxed = true) private val settings: Settings = mockk(relaxed = true)
private val appStore = AppStore() private val appStore = AppStore()
@get:Rule
val gleanTestRule = GleanTestRule(testContext)
@Test @Test
fun `WHEN expanded THEN notify filtered card`() { fun `WHEN expanded THEN notify filtered card`() {
val store = TabsTrayStore( val store = TabsTrayStore(
@ -44,7 +55,7 @@ class InactiveTabsControllerTest {
val tray: TabsTray = mockk(relaxed = true) val tray: TabsTray = mockk(relaxed = true)
val tabsSlot = slot<List<TabSessionState>>() val tabsSlot = slot<List<TabSessionState>>()
val controller = val controller =
InactiveTabsController(store, appStore, tray, mockk(relaxed = true), settings) InactiveTabsController(store, appStore, tray, settings)
controller.updateCardExpansion(true) controller.updateCardExpansion(true)
@ -60,24 +71,32 @@ class InactiveTabsControllerTest {
fun `WHEN expanded THEN track telemetry event`() { fun `WHEN expanded THEN track telemetry event`() {
val store = TabsTrayStore() val store = TabsTrayStore()
val controller = InactiveTabsController( val controller = InactiveTabsController(
store, appStore, mockk(relaxed = true), metrics, settings store, appStore, mockk(relaxed = true), settings
) )
assertFalse(TabsTrayMetrics.inactiveTabsExpanded.testHasValue())
assertFalse(TabsTrayMetrics.inactiveTabsCollapsed.testHasValue())
controller.updateCardExpansion(true) controller.updateCardExpansion(true)
verify { metrics.track(Event.TabsTrayInactiveTabsExpanded) } assertTrue(TabsTrayMetrics.inactiveTabsExpanded.testHasValue())
assertFalse(TabsTrayMetrics.inactiveTabsCollapsed.testHasValue())
} }
@Test @Test
fun `WHEN collapsed THEN track telemetry event`() { fun `WHEN collapsed THEN track telemetry event`() {
val store = TabsTrayStore() val store = TabsTrayStore()
val controller = InactiveTabsController( val controller = InactiveTabsController(
store, appStore, mockk(relaxed = true), metrics, settings store, appStore, mockk(relaxed = true), settings
) )
assertFalse(TabsTrayMetrics.inactiveTabsExpanded.testHasValue())
assertFalse(TabsTrayMetrics.inactiveTabsCollapsed.testHasValue())
controller.updateCardExpansion(false) controller.updateCardExpansion(false)
verify { metrics.track(Event.TabsTrayInactiveTabsCollapsed) } assertFalse(TabsTrayMetrics.inactiveTabsExpanded.testHasValue())
assertTrue(TabsTrayMetrics.inactiveTabsCollapsed.testHasValue())
} }
@Test @Test
@ -85,15 +104,17 @@ class InactiveTabsControllerTest {
val store = TabsTrayStore() val store = TabsTrayStore()
val controller = spyk( val controller = spyk(
InactiveTabsController( InactiveTabsController(
store, appStore, mockk(relaxed = true), metrics, settings store, appStore, mockk(relaxed = true), settings
) )
) )
every { controller.refreshInactiveTabsSection() } just Runs every { controller.refreshInactiveTabsSection() } just Runs
assertFalse(TabsTrayMetrics.autoCloseDimissed.testHasValue())
controller.close() controller.close()
verify { metrics.track(Event.TabsTrayAutoCloseDialogDismissed) } assertTrue(TabsTrayMetrics.autoCloseDimissed.testHasValue())
verify { settings.hasInactiveTabsAutoCloseDialogBeenDismissed = true } verify { settings.hasInactiveTabsAutoCloseDialogBeenDismissed = true }
verify { controller.refreshInactiveTabsSection() } verify { controller.refreshInactiveTabsSection() }
} }
@ -104,13 +125,16 @@ class InactiveTabsControllerTest {
val store = BrowserStore() val store = BrowserStore()
val tray: TabsTray = mockk(relaxed = true) val tray: TabsTray = mockk(relaxed = true)
val controller = val controller =
spyk(InactiveTabsAutoCloseDialogController(store, settings, filter, tray, metrics)) spyk(InactiveTabsAutoCloseDialogController(store, settings, filter, tray))
every { controller.refreshInactiveTabsSection() } just Runs every { controller.refreshInactiveTabsSection() } just Runs
assertFalse(TabsTrayMetrics.autoCloseTurnOnClicked.testHasValue())
controller.enableAutoClosed() controller.enableAutoClosed()
verify { metrics.track(Event.TabsTrayAutoCloseDialogTurnOnClicked) } assertTrue(TabsTrayMetrics.autoCloseTurnOnClicked.testHasValue())
verify { settings.closeTabsAfterOneMonth = true } verify { settings.closeTabsAfterOneMonth = true }
verify { settings.closeTabsAfterOneWeek = false } verify { settings.closeTabsAfterOneWeek = false }
verify { settings.closeTabsAfterOneDay = false } verify { settings.closeTabsAfterOneDay = false }

@ -5,27 +5,42 @@
package org.mozilla.fenix.tabstray.browser package org.mozilla.fenix.tabstray.browser
import io.mockk.mockk import io.mockk.mockk
import io.mockk.verify import mozilla.components.service.glean.testing.GleanTestRule
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.mozilla.fenix.components.metrics.Event import org.junit.runner.RunWith
import org.mozilla.fenix.GleanMetrics.TabsTray
import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class) // for gleanTestRule
class RemoveTabUseCaseWrapperTest { class RemoveTabUseCaseWrapperTest {
val metricController = mockk<MetricController>(relaxed = true) val metricController = mockk<MetricController>(relaxed = true)
@get:Rule
val gleanTestRule = GleanTestRule(testContext)
@Test @Test
fun `WHEN invoked with no source name THEN metrics with unknown source, use case and callback are triggered`() { fun `WHEN invoked with no source name THEN metrics with unknown source, use case and callback are triggered`() {
var actualTabId: String? = null var actualTabId: String? = null
val onRemove: (String) -> Unit = { tabId -> val onRemove: (String) -> Unit = { tabId ->
actualTabId = tabId actualTabId = tabId
} }
val wrapper = RemoveTabUseCaseWrapper(metricController, onRemove) val wrapper = RemoveTabUseCaseWrapper(onRemove)
assertFalse(TabsTray.closedExistingTab.testHasValue())
wrapper("123") wrapper("123")
verify { metricController.track(Event.ClosedExistingTab("unknown")) } assertTrue(TabsTray.closedExistingTab.testHasValue())
val snapshot = TabsTray.closedExistingTab.testGetValue()
assertEquals(1, snapshot.size)
assertEquals("unknown", snapshot.single().extra?.getValue("source"))
assertEquals("123", actualTabId) assertEquals("123", actualTabId)
} }
@ -35,11 +50,16 @@ class RemoveTabUseCaseWrapperTest {
val onRemove: (String) -> Unit = { tabId -> val onRemove: (String) -> Unit = { tabId ->
actualTabId = tabId actualTabId = tabId
} }
val wrapper = RemoveTabUseCaseWrapper(metricController, onRemove) val wrapper = RemoveTabUseCaseWrapper(onRemove)
assertFalse(TabsTray.closedExistingTab.testHasValue())
wrapper("123", "Test") wrapper("123", "Test")
verify { metricController.track(Event.ClosedExistingTab("Test")) } assertTrue(TabsTray.closedExistingTab.testHasValue())
val snapshot = TabsTray.closedExistingTab.testGetValue()
assertEquals(1, snapshot.size)
assertEquals("Test", snapshot.single().extra?.getValue("source"))
assertEquals("123", actualTabId) assertEquals("123", actualTabId)
} }
} }

@ -7,25 +7,42 @@ package org.mozilla.fenix.tabstray.browser
import io.mockk.mockk import io.mockk.mockk
import io.mockk.verify import io.mockk.verify
import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.feature.tabs.TabsUseCases
import mozilla.components.service.glean.testing.GleanTestRule
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.mozilla.fenix.components.metrics.Event import org.junit.runner.RunWith
import org.mozilla.fenix.GleanMetrics.TabsTray
import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.components.metrics.MetricController
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class) // for gleanTestRule
class SelectTabUseCaseWrapperTest { class SelectTabUseCaseWrapperTest {
val metricController = mockk<MetricController>(relaxed = true) val metricController = mockk<MetricController>(relaxed = true)
val selectUseCase: TabsUseCases.SelectTabUseCase = mockk(relaxed = true) val selectUseCase: TabsUseCases.SelectTabUseCase = mockk(relaxed = true)
@get:Rule
val gleanTestRule = GleanTestRule(testContext)
@Test @Test
fun `WHEN invoked with no source name THEN metrics with unknown source, use case and callback are triggered`() { fun `WHEN invoked with no source name THEN metrics with unknown source, use case and callback are triggered`() {
var invoked = "" var invoked = ""
val onSelect: (String) -> Unit = { invoked = it } val onSelect: (String) -> Unit = { invoked = it }
val wrapper = SelectTabUseCaseWrapper(metricController, selectUseCase, onSelect) val wrapper = SelectTabUseCaseWrapper(selectUseCase, onSelect)
assertFalse(TabsTray.openedExistingTab.testHasValue())
wrapper("123") wrapper("123")
verify { metricController.track(Event.OpenedExistingTab("unknown")) } assertTrue(TabsTray.openedExistingTab.testHasValue())
val snapshot = TabsTray.openedExistingTab.testGetValue()
assertEquals(1, snapshot.size)
assertEquals("unknown", snapshot.single().extra?.getValue("source"))
verify { selectUseCase("123") } verify { selectUseCase("123") }
assertEquals("123", invoked) assertEquals("123", invoked)
} }
@ -34,11 +51,17 @@ class SelectTabUseCaseWrapperTest {
fun `WHEN invoked with a source name THEN metrics, use case and callback are triggered`() { fun `WHEN invoked with a source name THEN metrics, use case and callback are triggered`() {
var invoked = "" var invoked = ""
val onSelect: (String) -> Unit = { invoked = it } val onSelect: (String) -> Unit = { invoked = it }
val wrapper = SelectTabUseCaseWrapper(metricController, selectUseCase, onSelect) val wrapper = SelectTabUseCaseWrapper(selectUseCase, onSelect)
assertFalse(TabsTray.openedExistingTab.testHasValue())
wrapper("123", "Test") wrapper("123", "Test")
verify { metricController.track(Event.OpenedExistingTab("Test")) } assertTrue(TabsTray.openedExistingTab.testHasValue())
val snapshot = TabsTray.openedExistingTab.testGetValue()
assertEquals(1, snapshot.size)
assertEquals("Test", snapshot.single().extra?.getValue("source"))
verify { selectUseCase("123") } verify { selectUseCase("123") }
assertEquals("123", invoked) assertEquals("123", invoked)
} }

Loading…
Cancel
Save