Skip to content

Commit 6157a96

Browse files
committed
Merge branch 'release/5.22.0'
2 parents ae8def0 + 1c12405 commit 6157a96

File tree

18 files changed

+978
-114
lines changed

18 files changed

+978
-114
lines changed

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

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

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

Lines changed: 213 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -202,11 +202,10 @@ class BrowserTabViewModelTest {
202202
searchCountDao = mockSearchCountDao
203203
)
204204

205-
testee.loadData("abc", null)
205+
testee.loadData("abc", null, false)
206206
testee.command.observeForever(mockCommandObserver)
207207

208208
whenever(mockOmnibarConverter.convertQueryToUrl(any())).thenReturn("duckduckgo.com")
209-
210209
}
211210

212211
@After
@@ -317,57 +316,117 @@ class BrowserTabViewModelTest {
317316
}
318317

319318
@Test
320-
fun whenViewModelNotifiedThatWebViewIsLoadingThenViewStateIsUpdated() {
319+
fun whenBrowsingAndViewModelNotifiedThatWebViewIsLoadingThenViewStateIsUpdated() {
320+
isBrowsing(true)
321321
testee.loadingStarted("http://example.com")
322322
assertTrue(loadingViewState().isLoading)
323323
}
324324

325325
@Test
326-
fun whenViewModelNotifiedThatWebViewHasFinishedLoadingThenViewStateIsUpdated() {
326+
fun whenNotBrowsingAndViewModelNotifiedThatWebViewIsLoadingThenViewStateIsNotUpdated() {
327+
isBrowsing(false)
328+
testee.loadingStarted("http://example.com")
329+
assertFalse(loadingViewState().isLoading)
330+
}
331+
332+
@Test
333+
fun whenBrowsingAndViewModelNotifiedThatWebViewHasFinishedLoadingThenViewStateIsUpdated() {
334+
isBrowsing(true)
335+
testee.loadingStarted("http://example.com")
327336
testee.loadingFinished(null)
328337
assertFalse(loadingViewState().isLoading)
329338
}
330339

331340
@Test
332-
fun whenLoadingFinishedAndInitialUrlNeverProgressedThenUrlUpdated() {
341+
fun whenBrowsingAndLoadingFinishedAndInitialUrlNeverProgressedThenUrlUpdated() {
333342
val initialUrl = "http://foo.com/abc"
334343
val finalUrl = "http://bar.com/abc"
344+
isBrowsing(true)
335345
testee.loadingStarted(initialUrl)
336346
testee.loadingFinished(finalUrl)
337347
assertEquals(finalUrl, testee.url)
338348
}
339349

340350
@Test
341-
fun whenLoadingFinishedAndInitialUrlProgressedThenUrlNotUpdated() {
351+
fun whenNotBrowsingAndLoadingFinishedAndInitialUrlNeverProgressedThenUrlNotUpdated() {
352+
val initialUrl = "http://foo.com/abc"
353+
val finalUrl = "http://bar.com/abc"
354+
isBrowsing(false)
355+
testee.loadingStarted(initialUrl)
356+
testee.loadingFinished(finalUrl)
357+
assertNull(testee.url)
358+
}
359+
360+
@Test
361+
fun whenBrowsingAndLoadingFinishedAndInitialUrlProgressedThenUrlNotUpdated() {
342362
val initialUrl = "http://foo.com/abc"
343363
val finalUrl = "http://foo.com/xyz"
364+
isBrowsing(true)
344365
testee.loadingStarted(initialUrl)
345366
testee.progressChanged(initialUrl, 10)
346367
testee.loadingFinished(finalUrl)
347368
assertEquals(initialUrl, testee.url)
348369
}
349370

350371
@Test
351-
fun whenLoadingFinishedWithUrlThenSiteVisitedEntryAddedToLeaderboardDao() {
372+
fun whenNotBrowsingAndLoadingFinishedAndInitialUrlProgressedThenUrlNotUpdated() {
373+
val initialUrl = "http://foo.com/abc"
374+
val finalUrl = "http://foo.com/xyz"
375+
isBrowsing(false)
376+
testee.loadingStarted(initialUrl)
377+
testee.progressChanged(initialUrl, 10)
378+
testee.loadingFinished(finalUrl)
379+
assertNull(testee.url)
380+
}
381+
382+
@Test
383+
fun whenBrowsingAndLoadingFinishedWithUrlThenSiteVisitedEntryAddedToLeaderboardDao() {
384+
isBrowsing(true)
352385
testee.loadingStarted("http://example.com/abc")
353386
testee.loadingFinished("http://example.com/abc")
354387
verify(mockNetworkLeaderboardDao).insert(SiteVisitedEntity("example.com"))
355388
}
356389

357390
@Test
358-
fun whenLoadingFinishedWithUrlThenOmnibarTextUpdatedToMatch() {
391+
fun whenNotBrowsingAndLoadingFinishedWithUrlThenSiteVisitedEntryNotAddedToLeaderboardDao() {
392+
isBrowsing(false)
393+
testee.loadingStarted("http://example.com/abc")
394+
testee.loadingFinished("http://example.com/abc")
395+
verify(mockNetworkLeaderboardDao, never()).insert(SiteVisitedEntity("example.com"))
396+
}
397+
398+
@Test
399+
fun whenBrowsingAndLoadingFinishedWithUrlThenOmnibarTextUpdatedToMatch() {
400+
isBrowsing(true)
359401
val exampleUrl = "http://example.com/abc"
360402
testee.loadingFinished(exampleUrl)
361403
assertEquals(exampleUrl, omnibarViewState().omnibarText)
362404
}
363405

364406
@Test
365-
fun whenLoadingFinishedWithQueryUrlThenOmnibarTextUpdatedToShowQuery() {
407+
fun whenNotBrowsingAndLoadingFinishedWithUrlThenOmnibarTextRemainsBlank() {
408+
isBrowsing(false)
409+
val exampleUrl = "http://example.com/abc"
410+
testee.loadingFinished(exampleUrl)
411+
assertEquals("", omnibarViewState().omnibarText)
412+
}
413+
414+
@Test
415+
fun whenBrowsingAndLoadingFinishedWithQueryUrlThenOmnibarTextUpdatedToShowQuery() {
416+
isBrowsing(true)
366417
val queryUrl = "http://duckduckgo.com?q=test"
367418
testee.loadingFinished(queryUrl)
368419
assertEquals("test", omnibarViewState().omnibarText)
369420
}
370421

422+
@Test
423+
fun whenNotBrowsingAndLoadingFinishedWithQueryUrlThenOmnibarTextextRemainsBlank() {
424+
isBrowsing(false)
425+
val queryUrl = "http://duckduckgo.com?q=test"
426+
testee.loadingFinished(queryUrl)
427+
assertEquals("", omnibarViewState().omnibarText)
428+
}
429+
371430
@Test
372431
fun whenLoadingFinishedWithNoUrlThenOmnibarTextUpdatedToMatch() {
373432
val exampleUrl = "http://example.com/abc"
@@ -406,13 +465,23 @@ class BrowserTabViewModelTest {
406465
}
407466

408467
@Test
409-
fun whenUrlStartsLoadingWithProgressChangeThenUrlUpdated() {
468+
fun whenBrowsingAndUrlStartsLoadingWithProgressChangeThenUrlUpdated() {
410469
val url = "foo.com"
470+
isBrowsing(true)
411471
testee.loadingStarted(url)
412472
testee.progressChanged(url, 10)
413473
assertEquals(url, testee.url)
414474
}
415475

476+
@Test
477+
fun whenNotBrowsingAndUrlStartsLoadingWithProgressChangeThenUrlNotUpdated() {
478+
val url = "foo.com"
479+
isBrowsing(false)
480+
testee.loadingStarted(url)
481+
testee.progressChanged(url, 10)
482+
assertNull(testee.url)
483+
}
484+
416485
@Test
417486
fun whenUrlStartsLoadingButProgressHasNotChangedThenUrlNotUpdated() {
418487
testee.loadingStarted("foo.com")
@@ -426,11 +495,17 @@ class BrowserTabViewModelTest {
426495
}
427496

428497
@Test
429-
fun whenUrlChangedThenViewStateIsUpdated() {
430-
changeUrl("duckduckgo.com")
498+
fun whenBrowsingAndUrlChangedThenViewStateIsUpdated() {
499+
changeUrl("duckduckgo.com", true)
431500
assertEquals("duckduckgo.com", omnibarViewState().omnibarText)
432501
}
433502

503+
@Test
504+
fun whenNotBrowsingAndUrlChangedThenUrlIsNotUpdated() {
505+
changeUrl("duckduckgo.com", false)
506+
assertEquals("", omnibarViewState().omnibarText)
507+
}
508+
434509
@Test
435510
fun whenUrlChangedWithDuckDuckGoUrlContainingQueryThenUrlRewrittenToContainQuery() {
436511
changeUrl("http://duckduckgo.com?q=test")
@@ -456,7 +531,9 @@ class BrowserTabViewModelTest {
456531
}
457532

458533
@Test
459-
fun whenViewModelGetsProgressUpdateThenViewStateIsUpdated() {
534+
fun whenBrowsingAndViewModelGetsProgressUpdateThenViewStateIsUpdated() {
535+
isBrowsing(true)
536+
460537
testee.progressChanged("", 0)
461538
assertEquals(0, loadingViewState().progress)
462539

@@ -467,6 +544,14 @@ class BrowserTabViewModelTest {
467544
assertEquals(100, loadingViewState().progress)
468545
}
469546

547+
548+
@Test
549+
fun whenNotBrowserAndViewModelGetsProgressUpdateThenViewStateIsNotUpdated() {
550+
isBrowsing(false)
551+
testee.progressChanged("", 10)
552+
assertEquals(0, loadingViewState().progress)
553+
}
554+
470555
@Test
471556
fun whenLoadingStartedThenPrivacyGradeIsCleared() {
472557
testee.loadingStarted("http://example.com")
@@ -751,6 +836,104 @@ class BrowserTabViewModelTest {
751836
assertFalse(browserViewState().isDesktopBrowsingMode)
752837
}
753838

839+
@Test
840+
fun whenHomeShowingAndNeverBrowsedThenForwardButtonInactive() {
841+
setupNavigation(isBrowsing = false)
842+
assertFalse(browserViewState().canGoForward)
843+
}
844+
845+
@Test
846+
fun whenHomeShowingByPressingBackOnBrowserThenForwardButtonActive() {
847+
setupNavigation(isBrowsing = true)
848+
testee.onUserPressedBack()
849+
assertFalse(browserViewState().browserShowing)
850+
assertTrue(browserViewState().canGoForward)
851+
}
852+
853+
@Test
854+
fun whenBrowserShowingAndCanGoForwardThenForwardButtonActive() {
855+
setupNavigation(isBrowsing = true, canGoForward = true)
856+
assertTrue(browserViewState().canGoForward)
857+
}
858+
859+
@Test
860+
fun whenBrowserShowingAndCannotGoForwardThenForwardButtonInactive() {
861+
setupNavigation(isBrowsing = true, canGoForward = false)
862+
assertFalse(browserViewState().canGoForward)
863+
}
864+
865+
@Test
866+
fun whenHomeShowingThenBackButtonInactiveEvenIfBrowserCanGoBack() {
867+
setupNavigation(isBrowsing = false, canGoBack = false)
868+
assertFalse(browserViewState().canGoBack)
869+
870+
setupNavigation(isBrowsing = false, canGoBack = true)
871+
assertFalse(browserViewState().canGoBack)
872+
}
873+
874+
@Test
875+
fun whenBrowserShowingAndCanGoBackThenBackButtonActive() {
876+
setupNavigation(isBrowsing = true, canGoBack = true)
877+
assertTrue(browserViewState().canGoBack)
878+
}
879+
880+
@Test
881+
fun whenBrowserShowingAndCannotGoBackAndSkipHomeThenBackButtonInactive() {
882+
setupNavigation(skipHome = true, isBrowsing = true, canGoBack = false)
883+
assertFalse(browserViewState().canGoBack)
884+
}
885+
886+
@Test
887+
fun whenBrowserShowingAndCannotGoBackAndNotSkipHomeThenBackButtonActive() {
888+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
889+
assertTrue(browserViewState().canGoBack)
890+
}
891+
892+
@Test
893+
fun whenUserBrowsingPressesForwardThenNavigatesForward() {
894+
isBrowsing(true)
895+
testee.onUserPressedForward()
896+
assertTrue(captureCommands().lastValue == Command.NavigateForward)
897+
}
898+
899+
@Test
900+
fun whenUserOnHomePressesForwardThenBrowserShownAndPageRefreshed() {
901+
isBrowsing(false)
902+
testee.onUserPressedForward()
903+
assertTrue(browserViewState().browserShowing)
904+
assertTrue(captureCommands().lastValue == Command.Refresh)
905+
}
906+
907+
@Test
908+
fun whenUserBrowsingPressesBackAndBrowserCanGoBackThenNavigatesToPreviousPageAndHandledTrue() {
909+
setupNavigation(isBrowsing = true, canGoBack = true, stepsToPreviousPage = 2)
910+
assertTrue(testee.onUserPressedBack())
911+
912+
val backCommand = captureCommands().lastValue as Command.NavigateBack
913+
assertNotNull(backCommand)
914+
assertEquals(2, backCommand.steps)
915+
}
916+
917+
@Test
918+
fun whenUserBrowsingPressesBackAndBrowserCannotGoBackAndHomeNotSkippedThenHomeShownAndHandledTrue() {
919+
setupNavigation(skipHome = false, isBrowsing = true, canGoBack = false)
920+
assertTrue(testee.onUserPressedBack())
921+
assertFalse(browserViewState().browserShowing)
922+
assertEquals("", omnibarViewState().omnibarText)
923+
}
924+
925+
@Test
926+
fun whenUserBrowsingPressesBackAndBrowserCannotGoBackAndHomeIsSkippedThenHandledFalse() {
927+
setupNavigation(skipHome = true, isBrowsing = false, canGoBack = false)
928+
assertFalse(testee.onUserPressedBack())
929+
}
930+
931+
@Test
932+
fun whenUserOnHomePressesBackThenReturnsHandledFalse() {
933+
isBrowsing(false)
934+
assertFalse(testee.onUserPressedBack())
935+
}
936+
754937
@Test
755938
fun whenUserSelectsDesktopSiteWhenOnMobileSpecificSiteThenUrlModified() {
756939
testee.desktopSiteModeToggled("http://m.example.com", desktopSiteRequested = true)
@@ -802,6 +985,7 @@ class BrowserTabViewModelTest {
802985

803986
@Test
804987
fun whenOnSiteAndBrokenSiteSelectedThenBrokenSiteFeedbackCommandSentWithUrl() {
988+
isBrowsing(true)
805989
changeUrl("foo.com")
806990
testee.onBrokenSiteSelected()
807991
val command = captureCommands().value as Command.BrokenSiteFeedback
@@ -885,7 +1069,22 @@ class BrowserTabViewModelTest {
8851069
verify(mockHandler, atLeastOnce()).proceed(username, password)
8861070
}
8871071

888-
private fun changeUrl(url: String?) {
1072+
private fun isBrowsing(isBrowsing: Boolean) {
1073+
testee.browserViewState.value = browserViewState().copy(browserShowing = isBrowsing)
1074+
}
1075+
1076+
private fun setupNavigation(skipHome: Boolean = false, isBrowsing: Boolean, canGoForward: Boolean = false, canGoBack: Boolean = false, stepsToPreviousPage:Int = 0) {
1077+
testee.skipHome = skipHome
1078+
isBrowsing(isBrowsing)
1079+
val nav: BrowserWebViewClient.BrowserNavigationOptions = mock()
1080+
whenever(nav.canGoForward).thenReturn(canGoForward)
1081+
whenever(nav.canGoBack).thenReturn(canGoBack)
1082+
whenever(nav.stepsToPreviousPage).thenReturn(stepsToPreviousPage)
1083+
testee.navigationOptionsChanged(nav)
1084+
}
1085+
1086+
private fun changeUrl(url: String?, isBrowsing: Boolean = true) {
1087+
isBrowsing(isBrowsing)
8891088
testee.loadingStarted(url)
8901089
testee.progressChanged(url, 100)
8911090
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,12 @@ class BrowserViewModelTest {
111111
@Test
112112
fun whenTabsUpdatedAndNoTabsThenNewTabAddedToRepository() {
113113
testee.onTabsUpdated(ArrayList())
114-
verify(mockTabRepository).add(null, true)
114+
verify(mockTabRepository).add(null, false, true)
115115
}
116116

117117
@Test
118118
fun whenTabsUpdatedWithTabsThenNewTabNotLaunched() {
119-
testee.onTabsUpdated(asList(TabEntity(TAB_ID, "", "", true, 0)))
119+
testee.onTabsUpdated(asList(TabEntity(TAB_ID, "", "", false, true, 0)))
120120
verify(mockCommandObserver, never()).onChanged(any())
121121
}
122122

0 commit comments

Comments
 (0)