@@ -80,6 +80,9 @@ internal class AppearanceViewModelTest {
8080 @Mock
8181 private lateinit var mockOmnibarFeatureRepository: OmnibarRepository
8282
83+ @Mock
84+ private lateinit var mockAddressBarTrackersAnimationManager: com.duckduckgo.app.browser.animations.AddressBarTrackersAnimationManager
85+
8386 @SuppressLint(" DenyListedApi" )
8487 @Before
8588 fun before () {
@@ -92,6 +95,9 @@ internal class AppearanceViewModelTest {
9295 whenever(mockUrlDisplayRepository.isFullUrlEnabled).thenReturn(flowOf(true ))
9396 whenever(mockTabSwitcherDataStore.isTrackersAnimationInfoTileHidden()).thenReturn(flowOf(false ))
9497 whenever(mockOmnibarFeatureRepository.isSplitOmnibarAvailable).thenReturn(false )
98+ runTest {
99+ whenever(mockAddressBarTrackersAnimationManager.isFeatureEnabled()).thenReturn(false )
100+ }
95101
96102 initializeViewModel()
97103 }
@@ -105,6 +111,7 @@ internal class AppearanceViewModelTest {
105111 mockPixel,
106112 coroutineTestRule.testDispatcherProvider,
107113 mockTabSwitcherDataStore,
114+ mockAddressBarTrackersAnimationManager,
108115 mockOmnibarFeatureRepository,
109116 )
110117 }
@@ -315,6 +322,143 @@ internal class AppearanceViewModelTest {
315322 )
316323 }
317324
325+ @Test
326+ fun `when tracker count in address bar is enabled then setting enabled` () =
327+ runTest {
328+ val enabled = true
329+ testee.onShowTrackersCountInAddressBarChanged(enabled)
330+ verify(mockAppSettingsDataStore).showTrackersCountInAddressBar = enabled
331+ val params = mapOf (Pixel .PixelParameter .IS_ENABLED to enabled.toString())
332+ verify(mockPixel).fire(
333+ AppPixelName .SETTINGS_APPEARANCE_IS_TRACKER_COUNT_IN_ADDRESS_BAR_TOGGLED ,
334+ params,
335+ emptyMap(),
336+ Pixel .PixelType .Count ,
337+ )
338+ }
339+
340+ @Test
341+ fun `when tracker count in address bar is disabled then setting disabled` () =
342+ runTest {
343+ val enabled = false
344+ testee.onShowTrackersCountInAddressBarChanged(enabled)
345+ verify(mockAppSettingsDataStore).showTrackersCountInAddressBar = enabled
346+ val params = mapOf (Pixel .PixelParameter .IS_ENABLED to enabled.toString())
347+ verify(mockPixel).fire(
348+ AppPixelName .SETTINGS_APPEARANCE_IS_TRACKER_COUNT_IN_ADDRESS_BAR_TOGGLED ,
349+ params,
350+ emptyMap(),
351+ Pixel .PixelType .Count ,
352+ )
353+ }
354+
355+ @Test
356+ fun `when address bar trackers animation feature is disabled then toggle should be hidden` () =
357+ runTest {
358+ whenever(mockAddressBarTrackersAnimationManager.isFeatureEnabled()).thenReturn(false )
359+ initializeViewModel()
360+
361+ testee.viewState().test {
362+ val value = expectMostRecentItem()
363+ assertEquals(false , value.shouldShowTrackersCountInAddressBar)
364+ cancelAndConsumeRemainingEvents()
365+ }
366+ }
367+
368+ @Test
369+ fun `when address bar trackers animation feature is enabled then toggle should be visible` () =
370+ runTest {
371+ whenever(mockAddressBarTrackersAnimationManager.isFeatureEnabled()).thenReturn(true )
372+ initializeViewModel()
373+
374+ testee.viewState().test {
375+ val value = expectMostRecentItem()
376+ assertEquals(true , value.shouldShowTrackersCountInAddressBar)
377+ cancelAndConsumeRemainingEvents()
378+ }
379+ }
380+
381+ @Test
382+ fun `when tracker count in address bar setting is stored then it persists correctly` () =
383+ runTest {
384+ whenever(mockAppSettingsDataStore.showTrackersCountInAddressBar).thenReturn(false )
385+ initializeViewModel()
386+
387+ testee.viewState().test {
388+ val value = expectMostRecentItem()
389+ assertEquals(false , value.isTrackersCountInAddressBarEnabled)
390+ cancelAndConsumeRemainingEvents()
391+ }
392+ }
393+
394+ @Test
395+ fun `when tracker count in address bar is enabled by default then viewState reflects it` () =
396+ runTest {
397+ whenever(mockAppSettingsDataStore.showTrackersCountInAddressBar).thenReturn(true )
398+ initializeViewModel()
399+
400+ testee.viewState().test {
401+ val value = expectMostRecentItem()
402+ assertEquals(true , value.isTrackersCountInAddressBarEnabled)
403+ cancelAndConsumeRemainingEvents()
404+ }
405+ }
406+
407+ @Test
408+ fun `when both feature flag and user preference are enabled then viewState shows both enabled` () =
409+ runTest {
410+ whenever(mockAddressBarTrackersAnimationManager.isFeatureEnabled()).thenReturn(true )
411+ whenever(mockAppSettingsDataStore.showTrackersCountInAddressBar).thenReturn(true )
412+ initializeViewModel()
413+
414+ testee.viewState().test {
415+ val value = expectMostRecentItem()
416+ assertEquals(true , value.shouldShowTrackersCountInAddressBar)
417+ assertEquals(true , value.isTrackersCountInAddressBarEnabled)
418+ cancelAndConsumeRemainingEvents()
419+ }
420+ }
421+
422+ @Test
423+ fun `when feature flag is enabled but user preference is disabled then toggle is visible but unchecked` () =
424+ runTest {
425+ whenever(mockAddressBarTrackersAnimationManager.isFeatureEnabled()).thenReturn(true )
426+ whenever(mockAppSettingsDataStore.showTrackersCountInAddressBar).thenReturn(false )
427+ initializeViewModel()
428+
429+ testee.viewState().test {
430+ val value = expectMostRecentItem()
431+ assertEquals(true , value.shouldShowTrackersCountInAddressBar) // Toggle visible
432+ assertEquals(false , value.isTrackersCountInAddressBarEnabled) // But unchecked
433+ cancelAndConsumeRemainingEvents()
434+ }
435+ }
436+
437+ @Test
438+ fun `when tracker count in address bar is changed then viewState updates` () =
439+ runTest {
440+ testee.onShowTrackersCountInAddressBarChanged(false )
441+
442+ testee.viewState().test {
443+ val value = expectMostRecentItem()
444+ assertEquals(false , value.isTrackersCountInAddressBarEnabled)
445+ cancelAndConsumeRemainingEvents()
446+ }
447+ }
448+
449+ @Test
450+ fun `when tracker count in address bar is enabled then datastore is updated` () =
451+ runTest {
452+ testee.onShowTrackersCountInAddressBarChanged(true )
453+
454+ // Wait for coroutine to complete
455+ testee.viewState().test {
456+ awaitItem()
457+ verify(mockAppSettingsDataStore).showTrackersCountInAddressBar = true
458+ cancelAndConsumeRemainingEvents()
459+ }
460+ }
461+
318462 @Test
319463 fun whenInitialisedAndLightThemeThenViewStateEmittedWithProperValues () =
320464 runTest {
0 commit comments