Skip to content

Commit 2384a32

Browse files
Fix Google auth flow to allow users to sign in (#1147)
1 parent 3ade76b commit 2384a32

22 files changed

+1577
-31
lines changed

app/schemas/com.duckduckgo.app.global.db.AppDatabase/31.json

Lines changed: 866 additions & 0 deletions
Large diffs are not rendered by default.

app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ import io.reactivex.Observable
114114
import io.reactivex.Single
115115
import kotlinx.coroutines.ExperimentalCoroutinesApi
116116
import kotlinx.coroutines.channels.Channel
117+
import kotlinx.coroutines.flow.MutableSharedFlow
118+
import kotlinx.coroutines.flow.asSharedFlow
117119
import kotlinx.coroutines.flow.consumeAsFlow
118120
import kotlinx.coroutines.flow.flowOf
119121
import kotlinx.coroutines.runBlocking
@@ -173,7 +175,7 @@ class BrowserTabViewModelTest {
173175
private lateinit var mockOmnibarConverter: OmnibarEntryConverter
174176

175177
@Mock
176-
private lateinit var mockTabsRepository: TabRepository
178+
private lateinit var mockTabRepository: TabRepository
177179

178180
@Mock
179181
private lateinit var webViewSessionStorage: WebViewSessionStorage
@@ -229,9 +231,6 @@ class BrowserTabViewModelTest {
229231
@Mock
230232
private lateinit var mockFileDownloader: FileDownloader
231233

232-
@Mock
233-
private lateinit var mockTabRepository: TabRepository
234-
235234
@Mock
236235
private lateinit var geoLocationPermissions: GeoLocationPermissions
237236

@@ -263,6 +262,10 @@ class BrowserTabViewModelTest {
263262

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

265+
private val childClosedTabsSharedFlow = MutableSharedFlow<String>()
266+
267+
private val childClosedTabsFlow = childClosedTabsSharedFlow.asSharedFlow()
268+
266269
@Before
267270
fun before() {
268271
MockitoAnnotations.openMocks(this)
@@ -299,9 +302,10 @@ class BrowserTabViewModelTest {
299302

300303
whenever(mockOmnibarConverter.convertQueryToUrl(any(), any())).thenReturn("duckduckgo.com")
301304
whenever(mockVariantManager.getVariant()).thenReturn(DEFAULT_VARIANT)
302-
whenever(mockTabsRepository.liveSelectedTab).thenReturn(selectedTabLiveData)
305+
whenever(mockTabRepository.liveSelectedTab).thenReturn(selectedTabLiveData)
303306
whenever(mockNavigationAwareLoginDetector.loginEventLiveData).thenReturn(loginEventLiveData)
304-
whenever(mockTabsRepository.retrieveSiteData(any())).thenReturn(MutableLiveData())
307+
whenever(mockTabRepository.retrieveSiteData(any())).thenReturn(MutableLiveData())
308+
whenever(mockTabRepository.childClosedTabs).thenReturn(childClosedTabsFlow)
305309
whenever(mockPrivacyPractices.privacyPracticesFor(any())).thenReturn(PrivacyPractices.UNKNOWN)
306310
whenever(mockAppInstallStore.installTimestamp).thenReturn(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1))
307311
whenever(mockUserWhitelistDao.contains(anyString())).thenReturn(false)
@@ -312,7 +316,7 @@ class BrowserTabViewModelTest {
312316
queryUrlConverter = mockOmnibarConverter,
313317
duckDuckGoUrlDetector = DuckDuckGoUrlDetector(),
314318
siteFactory = siteFactory,
315-
tabRepository = mockTabsRepository,
319+
tabRepository = mockTabRepository,
316320
userWhitelistDao = mockUserWhitelistDao,
317321
networkLeaderboardDao = mockNetworkLeaderboardDao,
318322
autoComplete = mockAutoCompleteApi,
@@ -389,7 +393,7 @@ class BrowserTabViewModelTest {
389393
verify(mockCommandObserver, atLeastOnce()).onChanged(commandCaptor.capture())
390394
assertTrue(commandCaptor.lastValue is Command.OpenInNewBackgroundTab)
391395

392-
verify(mockTabsRepository).addNewTabAfterExistingTab(url, "abc")
396+
verify(mockTabRepository).addNewTabAfterExistingTab(url, "abc")
393397
}
394398

395399
@Test
@@ -553,7 +557,7 @@ class BrowserTabViewModelTest {
553557
testee.onUserSubmittedQuery("foo")
554558

555559
coroutineRule.runBlocking {
556-
verify(mockTabsRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
560+
verify(mockTabRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
557561
}
558562
}
559563

@@ -1218,7 +1222,7 @@ class BrowserTabViewModelTest {
12181222
testee.onRefreshRequested()
12191223

12201224
coroutineRule.runBlocking {
1221-
verify(mockTabsRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
1225+
verify(mockTabRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
12221226
}
12231227
}
12241228

@@ -1519,7 +1523,7 @@ class BrowserTabViewModelTest {
15191523
showErrorWithAction.action()
15201524

15211525
coroutineRule.runBlocking {
1522-
verify(mockTabsRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
1526+
verify(mockTabRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
15231527
}
15241528
}
15251529

@@ -1691,7 +1695,7 @@ class BrowserTabViewModelTest {
16911695
fun whenCloseCurrentTabSelectedThenTabDeletedFromRepository() = runBlocking {
16921696
givenOneActiveTabSelected()
16931697
testee.closeCurrentTab()
1694-
verify(mockTabsRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
1698+
verify(mockTabRepository).deleteTabAndSelectSource(selectedTabLiveData.value!!.tabId)
16951699
}
16961700

16971701
@Test
@@ -1723,7 +1727,7 @@ class BrowserTabViewModelTest {
17231727

17241728
testee.onUserPressedBack()
17251729

1726-
verify(mockTabsRepository).deleteTabAndSelectSource("TAB_ID")
1730+
verify(mockTabRepository).deleteTabAndSelectSource("TAB_ID")
17271731
}
17281732

17291733
@Test
@@ -2870,7 +2874,7 @@ class BrowserTabViewModelTest {
28702874

28712875
testee.prefetchFavicon(url)
28722876

2873-
verify(mockTabsRepository).updateTabFavicon("TAB_ID", file.name)
2877+
verify(mockTabRepository).updateTabFavicon("TAB_ID", file.name)
28742878
}
28752879

28762880
@Test
@@ -2879,7 +2883,7 @@ class BrowserTabViewModelTest {
28792883

28802884
testee.prefetchFavicon("url")
28812885

2882-
verify(mockTabsRepository, never()).updateTabFavicon(any(), any())
2886+
verify(mockTabRepository, never()).updateTabFavicon(any(), any())
28832887
}
28842888

28852889
@Test
@@ -2901,7 +2905,7 @@ class BrowserTabViewModelTest {
29012905

29022906
testee.iconReceived(bitmap)
29032907

2904-
verify(mockTabsRepository).updateTabFavicon("TAB_ID", file.name)
2908+
verify(mockTabRepository).updateTabFavicon("TAB_ID", file.name)
29052909
}
29062910

29072911
@Test
@@ -2912,7 +2916,7 @@ class BrowserTabViewModelTest {
29122916

29132917
testee.iconReceived(bitmap)
29142918

2915-
verify(mockTabsRepository, never()).updateTabFavicon(any(), any())
2919+
verify(mockTabRepository, never()).updateTabFavicon(any(), any())
29162920
}
29172921

29182922
@Test
@@ -3136,6 +3140,24 @@ class BrowserTabViewModelTest {
31363140
}
31373141
}
31383142

3143+
@Test
3144+
fun whenChildrenTabClosedIfViewModelIsParentThenChildTabClosedCommandSent() = coroutineRule.runBlocking {
3145+
givenOneActiveTabSelected()
3146+
3147+
childClosedTabsSharedFlow.emit("TAB_ID")
3148+
3149+
assertCommandIssued<Command.ChildTabClosed>()
3150+
}
3151+
3152+
@Test
3153+
fun whenChildrenTabClosedIfViewModelIsNotParentThenChildTabClosedCommandNotSent() = coroutineRule.runBlocking {
3154+
givenOneActiveTabSelected()
3155+
3156+
childClosedTabsSharedFlow.emit("other_tab")
3157+
3158+
assertCommandNotIssued<Command.ChildTabClosed>()
3159+
}
3160+
31393161
private suspend fun givenFireButtonPulsing() {
31403162
whenever(mockUserStageStore.getUserAppStage()).thenReturn(AppStage.DAX_ONBOARDING)
31413163
dismissedCtaDaoChannel.send(listOf(DismissedCta(CtaId.DAX_DIALOG_TRACKERS_FOUND)))
@@ -3222,7 +3244,7 @@ class BrowserTabViewModelTest {
32223244
whenever(site.url).thenReturn(USE_OUR_APP_DOMAIN)
32233245
val siteLiveData = MutableLiveData<Site>()
32243246
siteLiveData.value = site
3225-
whenever(mockTabsRepository.retrieveSiteData("TAB_ID")).thenReturn(siteLiveData)
3247+
whenever(mockTabRepository.retrieveSiteData("TAB_ID")).thenReturn(siteLiveData)
32263248
testee.loadData("TAB_ID", USE_OUR_APP_DOMAIN, false)
32273249
}
32283250

@@ -3232,7 +3254,7 @@ class BrowserTabViewModelTest {
32323254
whenever(site.url).thenReturn("example.com")
32333255
val siteLiveData = MutableLiveData<Site>()
32343256
siteLiveData.value = site
3235-
whenever(mockTabsRepository.retrieveSiteData("TAB_ID")).thenReturn(siteLiveData)
3257+
whenever(mockTabRepository.retrieveSiteData("TAB_ID")).thenReturn(siteLiveData)
32363258
testee.loadData("TAB_ID", "example.com", false)
32373259
}
32383260

@@ -3250,7 +3272,7 @@ class BrowserTabViewModelTest {
32503272
whenever(site.uri).thenReturn(Uri.parse(domain))
32513273
val siteLiveData = MutableLiveData<Site>()
32523274
siteLiveData.value = site
3253-
whenever(mockTabsRepository.retrieveSiteData("TAB_ID")).thenReturn(siteLiveData)
3275+
whenever(mockTabRepository.retrieveSiteData("TAB_ID")).thenReturn(siteLiveData)
32543276
testee.loadData("TAB_ID", domain, false)
32553277
}
32563278

app/src/androidTest/java/com/duckduckgo/app/browser/BrowserWebViewClientTest.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ package com.duckduckgo.app.browser
1919
import android.content.Context
2020
import android.os.Build
2121
import android.webkit.*
22+
import androidx.core.net.toUri
2223
import androidx.test.annotation.UiThreadTest
2324
import androidx.test.filters.SdkSuppress
2425
import androidx.test.platform.app.InstrumentationRegistry
2526
import com.duckduckgo.app.CoroutineTestRule
2627
import com.duckduckgo.app.browser.certificates.rootstore.TrustedCertificateStore
28+
import com.duckduckgo.app.browser.cookies.ThirdPartyCookieManager
2729
import com.duckduckgo.app.browser.httpauth.WebViewHttpAuthStore
2830
import com.duckduckgo.app.browser.logindetection.DOMLoginDetector
2931
import com.duckduckgo.app.browser.logindetection.WebNavigationEvent
@@ -34,6 +36,7 @@ import com.duckduckgo.app.runBlocking
3436
import com.duckduckgo.app.statistics.store.OfflinePixelCountDataStore
3537
import com.nhaarman.mockitokotlin2.*
3638
import kotlinx.coroutines.ExperimentalCoroutinesApi
39+
import kotlinx.coroutines.GlobalScope
3740
import org.junit.Before
3841
import org.junit.Rule
3942
import org.junit.Test
@@ -59,6 +62,7 @@ class BrowserWebViewClientTest {
5962
private val globalPrivacyControl: GlobalPrivacyControl = mock()
6063
private val trustedCertificateStore: TrustedCertificateStore = mock()
6164
private val webViewHttpAuthStore: WebViewHttpAuthStore = mock()
65+
private val thirdPartyCookieManager: ThirdPartyCookieManager = mock()
6266

6367
@UiThreadTest
6468
@Before
@@ -75,7 +79,9 @@ class BrowserWebViewClientTest {
7579
cookieManager,
7680
loginDetector,
7781
dosDetector,
78-
globalPrivacyControl
82+
globalPrivacyControl,
83+
thirdPartyCookieManager,
84+
GlobalScope
7985
)
8086
testee.webViewClientListener = listener
8187
}
@@ -117,6 +123,13 @@ class BrowserWebViewClientTest {
117123
verify(globalPrivacyControl).injectDoNotSellToDom(webView)
118124
}
119125

126+
@UiThreadTest
127+
@Test
128+
fun whenOnPageStartedCalledThenProcessUriForThirdPartyCookiesCalled() = coroutinesTestRule.runBlocking {
129+
testee.onPageStarted(webView, EXAMPLE_URL, null)
130+
verify(thirdPartyCookieManager).processUriForThirdPartyCookies(webView, EXAMPLE_URL.toUri())
131+
}
132+
120133
@UiThreadTest
121134
@Test
122135
fun whenOnPageFinishedCalledThenListenerInstructedToUpdateNavigationState() {

0 commit comments

Comments
 (0)