@@ -49,9 +49,13 @@ import com.duckduckgo.app.browser.session.WebViewSessionStorage
4949import com.duckduckgo.app.cta.db.DismissedCtaDao
5050import com.duckduckgo.app.cta.model.CtaId
5151import com.duckduckgo.app.cta.model.DismissedCta
52- import com.duckduckgo.app.cta.ui.*
5352import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteDao
5453import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteEntity
54+ import com.duckduckgo.app.cta.ui.Cta
55+ import com.duckduckgo.app.cta.ui.CtaViewModel
56+ import com.duckduckgo.app.cta.ui.DaxBubbleCta
57+ import com.duckduckgo.app.cta.ui.DaxDialogCta
58+ import com.duckduckgo.app.cta.ui.HomePanelCta
5559import com.duckduckgo.app.global.db.AppDatabase
5660import com.duckduckgo.app.global.install.AppInstallStore
5761import com.duckduckgo.app.global.model.SiteFactory
@@ -65,6 +69,7 @@ import com.duckduckgo.app.privacy.model.TestEntity
6569import com.duckduckgo.app.privacy.model.UserWhitelistedDomain
6670import com.duckduckgo.app.runBlocking
6771import com.duckduckgo.app.settings.db.SettingsDataStore
72+ import com.duckduckgo.app.statistics.Variant
6873import com.duckduckgo.app.statistics.VariantManager
6974import com.duckduckgo.app.statistics.VariantManager.Companion.DEFAULT_VARIANT
7075import com.duckduckgo.app.statistics.api.StatisticsUpdater
@@ -78,7 +83,14 @@ import com.duckduckgo.app.trackerdetection.EntityLookup
7883import com.duckduckgo.app.trackerdetection.model.TrackingEvent
7984import com.duckduckgo.app.usage.search.SearchCountDao
8085import com.duckduckgo.app.widget.ui.WidgetCapabilities
81- import com.nhaarman.mockitokotlin2.*
86+ import com.nhaarman.mockitokotlin2.any
87+ import com.nhaarman.mockitokotlin2.anyOrNull
88+ import com.nhaarman.mockitokotlin2.atLeastOnce
89+ import com.nhaarman.mockitokotlin2.doReturn
90+ import com.nhaarman.mockitokotlin2.firstValue
91+ import com.nhaarman.mockitokotlin2.lastValue
92+ import com.nhaarman.mockitokotlin2.mock
93+ import com.nhaarman.mockitokotlin2.whenever
8294import io.reactivex.Observable
8395import io.reactivex.Single
8496import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -89,10 +101,14 @@ import org.junit.Assert.*
89101import org.junit.Before
90102import org.junit.Rule
91103import org.junit.Test
92- import org.mockito.*
104+ import org.mockito.ArgumentCaptor
93105import org.mockito.ArgumentMatchers.anyString
106+ import org.mockito.Captor
107+ import org.mockito.Mock
108+ import org.mockito.Mockito
94109import org.mockito.Mockito.never
95110import org.mockito.Mockito.verify
111+ import org.mockito.MockitoAnnotations
96112import java.util.concurrent.TimeUnit
97113
98114@ExperimentalCoroutinesApi
@@ -222,7 +238,7 @@ class BrowserTabViewModelTest {
222238
223239 val siteFactory = SiteFactory (mockPrivacyPractices, mockEntityLookup)
224240
225- whenever(mockOmnibarConverter.convertQueryToUrl(any())).thenReturn(" duckduckgo.com" )
241+ whenever(mockOmnibarConverter.convertQueryToUrl(any(), any() )).thenReturn(" duckduckgo.com" )
226242 whenever(mockVariantManager.getVariant()).thenReturn(DEFAULT_VARIANT )
227243 whenever(mockTabsRepository.liveSelectedTab).thenReturn(selectedTabLiveData)
228244 whenever(mockTabsRepository.retrieveSiteData(any())).thenReturn(MutableLiveData ())
@@ -250,7 +266,8 @@ class BrowserTabViewModelTest {
250266 searchCountDao = mockSearchCountDao,
251267 pixel = mockPixel,
252268 dispatchers = coroutineRule.testDispatcherProvider,
253- fireproofWebsiteDao = fireproofWebsiteDao
269+ fireproofWebsiteDao = fireproofWebsiteDao,
270+ variantManager = mockVariantManager
254271 )
255272
256273 testee.loadData(" abc" , null , false )
@@ -353,6 +370,7 @@ class BrowserTabViewModelTest {
353370
354371 @Test
355372 fun whenSubmittedQueryHasWhitespaceItIsTrimmed () {
373+ whenever(mockOmnibarConverter.convertQueryToUrl(" nytimes.com" , null )).thenReturn(" nytimes.com" )
356374 testee.onUserSubmittedQuery(" nytimes.com " )
357375 assertEquals(" nytimes.com" , omnibarViewState().omnibarText)
358376 }
@@ -413,6 +431,7 @@ class BrowserTabViewModelTest {
413431
414432 @Test
415433 fun whenNonEmptyInputThenNavigateCommandSubmittedToActivity () {
434+ whenever(mockOmnibarConverter.convertQueryToUrl(" foo" , null )).thenReturn(" foo.com" )
416435 testee.onUserSubmittedQuery(" foo" )
417436 verify(mockCommandObserver, atLeastOnce()).onChanged(commandCaptor.capture())
418437 assertTrue(commandCaptor.lastValue is Navigate )
@@ -701,6 +720,7 @@ class BrowserTabViewModelTest {
701720
702721 @Test
703722 fun whenBrowserShownAndOmnibarInputDoesNotHaveFocusThenPrivacyGradeIsShownAndSearchIconIsHidden () {
723+ whenever(mockOmnibarConverter.convertQueryToUrl(" foo" , null )).thenReturn(" foo.com" )
704724 testee.onUserSubmittedQuery(" foo" )
705725 testee.onOmnibarInputStateChanged(query = " " , hasFocus = false , hasQueryChanged = false )
706726 assertTrue(browserViewState().showPrivacyGrade)
@@ -715,6 +735,7 @@ class BrowserTabViewModelTest {
715735
716736 @Test
717737 fun whenBrowserShownAndOmnibarInputHasFocusThenSearchIconIsShownAndPrivacyGradeIsHidden () {
738+ whenever(mockOmnibarConverter.convertQueryToUrl(" foo" , null )).thenReturn(" foo.com" )
718739 testee.onUserSubmittedQuery(" foo" )
719740 testee.onOmnibarInputStateChanged(" " , true , hasQueryChanged = false )
720741 assertFalse(browserViewState().showPrivacyGrade)
@@ -853,6 +874,7 @@ class BrowserTabViewModelTest {
853874
854875 @Test
855876 fun whenEnteringNonEmptyQueryThenHideKeyboardCommandIssued () {
877+ whenever(mockOmnibarConverter.convertQueryToUrl(" foo" , null )).thenReturn(" foo.com" )
856878 testee.onUserSubmittedQuery(" foo" )
857879 verify(mockCommandObserver, atLeastOnce()).onChanged(commandCaptor.capture())
858880 assertTrue(commandCaptor.allValues.any { it == Command .HideKeyboard })
@@ -1452,6 +1474,7 @@ class BrowserTabViewModelTest {
14521474
14531475 @Test
14541476 fun whenUserSubmitsQueryThenCaretDoesNotMoveToTheEnd () {
1477+ whenever(mockOmnibarConverter.convertQueryToUrl(" foo" , null )).thenReturn(" foo.com" )
14551478 testee.onUserSubmittedQuery(" foo" )
14561479 assertFalse(omnibarViewState().shouldMoveCaretToEnd)
14571480 }
@@ -1935,6 +1958,38 @@ class BrowserTabViewModelTest {
19351958 assertTrue(findInPageViewState().canFindInPage)
19361959 }
19371960
1961+ @Test
1962+ fun whenSERPRemovalFeatureIsActiveAndBrowsingDDGSiteAndPrivacyGradeIsVisibleThenShowDaxIconIsTrue () {
1963+ val serpRemovalVariant = Variant (" foo" , 100.0 , features = listOf (VariantManager .VariantFeature .SerpHeaderRemoval ), filterBy = { true })
1964+ whenever(mockVariantManager.getVariant()).thenReturn(serpRemovalVariant)
1965+ val url = " https://duckduckgo.com?q=test%20search"
1966+ loadUrl(url, isBrowserShowing = true )
1967+ assertTrue(browserViewState().showDaxIcon)
1968+ }
1969+
1970+ @Test
1971+ fun whenSERPRemovalFeatureIsActiveAndBrowsingNonDDGSiteAndPrivacyGradeIsVisibleThenShowDaxIconIsFalse () {
1972+ val serpRemovalVariant = Variant (" foo" , 100.0 , features = listOf (VariantManager .VariantFeature .SerpHeaderRemoval ), filterBy = { true })
1973+ whenever(mockVariantManager.getVariant()).thenReturn(serpRemovalVariant)
1974+ val url = " https://example.com"
1975+ loadUrl(url, isBrowserShowing = true )
1976+ assertFalse(browserViewState().showDaxIcon)
1977+ }
1978+
1979+ @Test
1980+ fun whenSERPRemovalFeatureIsInactiveAndBrowsingDDGSiteAndPrivacyGradeIsVisibleThenShowDaxIconIsFalse () {
1981+ val url = " https://duckduckgo.com?q=test%20search"
1982+ loadUrl(url, isBrowserShowing = true )
1983+ assertFalse(browserViewState().showDaxIcon)
1984+ }
1985+
1986+ @Test
1987+ fun whenSERPRemovalFeatureIsInactiveAndBrowsingNonDDGSiteAndPrivacyGradeIsVisibleThenShowDaxIconIsFalse () {
1988+ val url = " https://example.com"
1989+ loadUrl(url, isBrowserShowing = true )
1990+ assertFalse(browserViewState().showDaxIcon)
1991+ }
1992+
19381993 private inline fun <reified T : Command > assertCommandIssued (instanceAssertions : T .() -> Unit = {}) {
19391994 verify(mockCommandObserver, atLeastOnce()).onChanged(commandCaptor.capture())
19401995 val issuedCommand = commandCaptor.allValues.find { it is T }
0 commit comments