@@ -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 }
0 commit comments