Skip to content
866 changes: 866 additions & 0 deletions app/schemas/com.duckduckgo.app.global.db.AppDatabase/31.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ import io.reactivex.Observable
import io.reactivex.Single
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.consumeAsFlow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking
Expand Down Expand Up @@ -173,7 +175,7 @@ class BrowserTabViewModelTest {
private lateinit var mockOmnibarConverter: OmnibarEntryConverter

@Mock
private lateinit var mockTabsRepository: TabRepository
private lateinit var mockTabRepository: TabRepository

@Mock
private lateinit var webViewSessionStorage: WebViewSessionStorage
Expand Down Expand Up @@ -229,9 +231,6 @@ class BrowserTabViewModelTest {
@Mock
private lateinit var mockFileDownloader: FileDownloader

@Mock
private lateinit var mockTabRepository: TabRepository

@Mock
private lateinit var geoLocationPermissions: GeoLocationPermissions

Expand Down Expand Up @@ -263,6 +262,10 @@ class BrowserTabViewModelTest {

private val dismissedCtaDaoChannel = Channel<List<DismissedCta>>()

private val childClosedTabsSharedFlow = MutableSharedFlow<String>()

private val childClosedTabsFlow = childClosedTabsSharedFlow.asSharedFlow()

@Before
fun before() {
MockitoAnnotations.openMocks(this)
Expand Down Expand Up @@ -299,9 +302,10 @@ class BrowserTabViewModelTest {

whenever(mockOmnibarConverter.convertQueryToUrl(any(), any())).thenReturn("duckduckgo.com")
whenever(mockVariantManager.getVariant()).thenReturn(DEFAULT_VARIANT)
whenever(mockTabsRepository.liveSelectedTab).thenReturn(selectedTabLiveData)
whenever(mockTabRepository.liveSelectedTab).thenReturn(selectedTabLiveData)
whenever(mockNavigationAwareLoginDetector.loginEventLiveData).thenReturn(loginEventLiveData)
whenever(mockTabsRepository.retrieveSiteData(any())).thenReturn(MutableLiveData())
whenever(mockTabRepository.retrieveSiteData(any())).thenReturn(MutableLiveData())
whenever(mockTabRepository.childClosedTabs).thenReturn(childClosedTabsFlow)
whenever(mockPrivacyPractices.privacyPracticesFor(any())).thenReturn(PrivacyPractices.UNKNOWN)
whenever(mockAppInstallStore.installTimestamp).thenReturn(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1))
whenever(mockUserWhitelistDao.contains(anyString())).thenReturn(false)
Expand All @@ -312,7 +316,7 @@ class BrowserTabViewModelTest {
queryUrlConverter = mockOmnibarConverter,
duckDuckGoUrlDetector = DuckDuckGoUrlDetector(),
siteFactory = siteFactory,
tabRepository = mockTabsRepository,
tabRepository = mockTabRepository,
userWhitelistDao = mockUserWhitelistDao,
networkLeaderboardDao = mockNetworkLeaderboardDao,
autoComplete = mockAutoCompleteApi,
Expand Down Expand Up @@ -389,7 +393,7 @@ class BrowserTabViewModelTest {
verify(mockCommandObserver, atLeastOnce()).onChanged(commandCaptor.capture())
assertTrue(commandCaptor.lastValue is Command.OpenInNewBackgroundTab)

verify(mockTabsRepository).addNewTabAfterExistingTab(url, "abc")
verify(mockTabRepository).addNewTabAfterExistingTab(url, "abc")
}

@Test
Expand Down Expand Up @@ -553,7 +557,7 @@ class BrowserTabViewModelTest {
testee.onUserSubmittedQuery("foo")

coroutineRule.runBlocking {
verify(mockTabsRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
verify(mockTabRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
}
}

Expand Down Expand Up @@ -1218,7 +1222,7 @@ class BrowserTabViewModelTest {
testee.onRefreshRequested()

coroutineRule.runBlocking {
verify(mockTabsRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
verify(mockTabRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
}
}

Expand Down Expand Up @@ -1519,7 +1523,7 @@ class BrowserTabViewModelTest {
showErrorWithAction.action()

coroutineRule.runBlocking {
verify(mockTabsRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
verify(mockTabRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
}
}

Expand Down Expand Up @@ -1691,7 +1695,7 @@ class BrowserTabViewModelTest {
fun whenCloseCurrentTabSelectedThenTabDeletedFromRepository() = runBlocking {
givenOneActiveTabSelected()
testee.closeCurrentTab()
verify(mockTabsRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
verify(mockTabRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
}

@Test
Expand Down Expand Up @@ -1723,7 +1727,7 @@ class BrowserTabViewModelTest {

testee.onUserPressedBack()

verify(mockTabsRepository).deleteTabAndSelectSource("TAB_ID")
verify(mockTabRepository).deleteTabAndSelectSource("TAB_ID")
}

@Test
Expand Down Expand Up @@ -2870,7 +2874,7 @@ class BrowserTabViewModelTest {

testee.prefetchFavicon(url)

verify(mockTabsRepository).updateTabFavicon("TAB_ID", file.name)
verify(mockTabRepository).updateTabFavicon("TAB_ID", file.name)
}

@Test
Expand All @@ -2879,7 +2883,7 @@ class BrowserTabViewModelTest {

testee.prefetchFavicon("url")

verify(mockTabsRepository, never()).updateTabFavicon(any(), any())
verify(mockTabRepository, never()).updateTabFavicon(any(), any())
}

@Test
Expand All @@ -2901,7 +2905,7 @@ class BrowserTabViewModelTest {

testee.iconReceived(bitmap)

verify(mockTabsRepository).updateTabFavicon("TAB_ID", file.name)
verify(mockTabRepository).updateTabFavicon("TAB_ID", file.name)
}

@Test
Expand All @@ -2912,7 +2916,7 @@ class BrowserTabViewModelTest {

testee.iconReceived(bitmap)

verify(mockTabsRepository, never()).updateTabFavicon(any(), any())
verify(mockTabRepository, never()).updateTabFavicon(any(), any())
}

@Test
Expand Down Expand Up @@ -3136,6 +3140,24 @@ class BrowserTabViewModelTest {
}
}

@Test
fun whenChildrenTabClosedIfViewModelIsParentThenChildTabClosedCommandSent() = coroutineRule.runBlocking {
givenOneActiveTabSelected()

childClosedTabsSharedFlow.emit("TAB_ID")

assertCommandIssued<Command.ChildTabClosed>()
}

@Test
fun whenChildrenTabClosedIfViewModelIsNotParentThenChildTabClosedCommandNotSent() = coroutineRule.runBlocking {
givenOneActiveTabSelected()

childClosedTabsSharedFlow.emit("other_tab")

assertCommandNotIssued<Command.ChildTabClosed>()
}

private suspend fun givenFireButtonPulsing() {
whenever(mockUserStageStore.getUserAppStage()).thenReturn(AppStage.DAX_ONBOARDING)
dismissedCtaDaoChannel.send(listOf(DismissedCta(CtaId.DAX_DIALOG_TRACKERS_FOUND)))
Expand Down Expand Up @@ -3222,7 +3244,7 @@ class BrowserTabViewModelTest {
whenever(site.url).thenReturn(USE_OUR_APP_DOMAIN)
val siteLiveData = MutableLiveData<Site>()
siteLiveData.value = site
whenever(mockTabsRepository.retrieveSiteData("TAB_ID")).thenReturn(siteLiveData)
whenever(mockTabRepository.retrieveSiteData("TAB_ID")).thenReturn(siteLiveData)
testee.loadData("TAB_ID", USE_OUR_APP_DOMAIN, false)
}

Expand All @@ -3232,7 +3254,7 @@ class BrowserTabViewModelTest {
whenever(site.url).thenReturn("example.com")
val siteLiveData = MutableLiveData<Site>()
siteLiveData.value = site
whenever(mockTabsRepository.retrieveSiteData("TAB_ID")).thenReturn(siteLiveData)
whenever(mockTabRepository.retrieveSiteData("TAB_ID")).thenReturn(siteLiveData)
testee.loadData("TAB_ID", "example.com", false)
}

Expand All @@ -3250,7 +3272,7 @@ class BrowserTabViewModelTest {
whenever(site.uri).thenReturn(Uri.parse(domain))
val siteLiveData = MutableLiveData<Site>()
siteLiveData.value = site
whenever(mockTabsRepository.retrieveSiteData("TAB_ID")).thenReturn(siteLiveData)
whenever(mockTabRepository.retrieveSiteData("TAB_ID")).thenReturn(siteLiveData)
testee.loadData("TAB_ID", domain, false)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@ package com.duckduckgo.app.browser
import android.content.Context
import android.os.Build
import android.webkit.*
import androidx.core.net.toUri
import androidx.test.annotation.UiThreadTest
import androidx.test.filters.SdkSuppress
import androidx.test.platform.app.InstrumentationRegistry
import com.duckduckgo.app.CoroutineTestRule
import com.duckduckgo.app.browser.certificates.rootstore.TrustedCertificateStore
import com.duckduckgo.app.browser.cookies.ThirdPartyCookieManager
import com.duckduckgo.app.browser.httpauth.WebViewHttpAuthStore
import com.duckduckgo.app.browser.logindetection.DOMLoginDetector
import com.duckduckgo.app.browser.logindetection.WebNavigationEvent
Expand All @@ -34,6 +36,7 @@ import com.duckduckgo.app.runBlocking
import com.duckduckgo.app.statistics.store.OfflinePixelCountDataStore
import com.nhaarman.mockitokotlin2.*
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.GlobalScope
import org.junit.Before
import org.junit.Rule
import org.junit.Test
Expand All @@ -59,6 +62,7 @@ class BrowserWebViewClientTest {
private val globalPrivacyControl: GlobalPrivacyControl = mock()
private val trustedCertificateStore: TrustedCertificateStore = mock()
private val webViewHttpAuthStore: WebViewHttpAuthStore = mock()
private val thirdPartyCookieManager: ThirdPartyCookieManager = mock()

@UiThreadTest
@Before
Expand All @@ -75,7 +79,9 @@ class BrowserWebViewClientTest {
cookieManager,
loginDetector,
dosDetector,
globalPrivacyControl
globalPrivacyControl,
thirdPartyCookieManager,
GlobalScope
)
testee.webViewClientListener = listener
}
Expand Down Expand Up @@ -117,6 +123,13 @@ class BrowserWebViewClientTest {
verify(globalPrivacyControl).injectDoNotSellToDom(webView)
}

@UiThreadTest
@Test
fun whenOnPageStartedCalledThenProcessUriForThirdPartyCookiesCalled() = coroutinesTestRule.runBlocking {
testee.onPageStarted(webView, EXAMPLE_URL, null)
verify(thirdPartyCookieManager).processUriForThirdPartyCookies(webView, EXAMPLE_URL.toUri())
}

@UiThreadTest
@Test
fun whenOnPageFinishedCalledThenListenerInstructedToUpdateNavigationState() {
Expand Down
Loading