Skip to content

Commit 14c4dbe

Browse files
committed
Merge branch 'release/5.28.0'
2 parents f549f8d + b8088d9 commit 14c4dbe

33 files changed

+888
-190
lines changed

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

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

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ import com.duckduckgo.app.global.install.AppInstallStore
5252
import com.duckduckgo.app.global.model.SiteFactory
5353
import com.duckduckgo.app.privacy.db.NetworkLeaderboardDao
5454
import com.duckduckgo.app.privacy.db.NetworkLeaderboardEntry
55-
import com.duckduckgo.app.privacy.db.SiteVisitedEntity
5655
import com.duckduckgo.app.privacy.model.PrivacyPractices
5756
import com.duckduckgo.app.privacy.store.PrevalenceStore
5857
import com.duckduckgo.app.settings.db.SettingsDataStore
@@ -298,7 +297,7 @@ class BrowserTabViewModelTest {
298297
fun whenTrackerDetectedThenNetworkLeaderboardUpdated() {
299298
val event = TrackingEvent("http://www.example.com", "http://www.tracker.com/tracker.js", TrackerNetwork("Network1", "www.tracker.com"), false)
300299
testee.trackerDetected(event)
301-
verify(mockNetworkLeaderboardDao).insert(NetworkLeaderboardEntry("Network1", "www.example.com"))
300+
verify(mockNetworkLeaderboardDao).incrementNetworkCount("Network1")
302301
}
303302

304303
@Test
@@ -389,15 +388,15 @@ class BrowserTabViewModelTest {
389388
isBrowsing(true)
390389
testee.loadingStarted("http://example.com/abc")
391390
testee.loadingFinished("http://example.com/abc")
392-
verify(mockNetworkLeaderboardDao).insert(SiteVisitedEntity("example.com"))
391+
verify(mockNetworkLeaderboardDao).incrementSitesVisited()
393392
}
394393

395394
@Test
396395
fun whenNotBrowsingAndLoadingFinishedWithUrlThenSiteVisitedEntryNotAddedToLeaderboardDao() {
397396
isBrowsing(false)
398397
testee.loadingStarted("http://example.com/abc")
399398
testee.loadingFinished("http://example.com/abc")
400-
verify(mockNetworkLeaderboardDao, never()).insert(SiteVisitedEntity("example.com"))
399+
verify(mockNetworkLeaderboardDao, never()).incrementSitesVisited()
401400
}
402401

403402
@Test
@@ -443,13 +442,13 @@ class BrowserTabViewModelTest {
443442
@Test
444443
fun whenLoadingFinishedWithNoUrlThenSiteVisitedEntryNotAddedToLeaderboardDao() {
445444
testee.loadingFinished(null)
446-
verify(mockNetworkLeaderboardDao, never()).insert(SiteVisitedEntity("example.com"))
445+
verify(mockNetworkLeaderboardDao, never()).incrementSitesVisited()
447446
}
448447

449448
@Test
450449
fun whenTrackerDetectedThenSiteVisitedEntryAddedToLeaderboardDao() {
451450
testee.trackerDetected(TrackingEvent("http://example.com/abc", "http://tracker.com", TrackerNetwork("Network", "http:// netwotk.com"), true))
452-
verify(mockNetworkLeaderboardDao).insert(SiteVisitedEntity("example.com"))
451+
verify(mockNetworkLeaderboardDao).incrementSitesVisited()
453452
}
454453

455454
@Test

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,16 @@ class SpecialUrlDetectorImplTest {
127127
val type = testee.determineType("smsto:123-555-12323") as Sms
128128
assertEquals("123-555-12323", type.telephoneNumber)
129129
}
130+
131+
@Test
132+
fun whenUrlIsCustomUriSchemeThenIntentTypeDetected() {
133+
val type = testee.determineType("myapp:foo bar") as IntentType
134+
assertEquals("myapp:foo bar", type.url)
135+
}
136+
137+
@Test
138+
fun whenUrlIsParametrizedQueryThenSearchQueryTypeDetected() {
139+
val type = testee.determineType("foo site:duckduckgo.com") as SearchQuery
140+
assertEquals("foo site:duckduckgo.com", type.query)
141+
}
130142
}

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

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -60,89 +60,97 @@ class WebViewLongPressHandlerTest {
6060
}
6161

6262
@Test
63-
fun whenLongPressedWithImageTypeThenPixelFired() {
63+
fun whenUserLongPressesWithImageTypeThenPixelFired() {
6464
testee.handleLongPress(HitTestResult.IMAGE_TYPE, HTTPS_IMAGE_URL, mockMenu)
6565
verify(mockPixel).fire(Pixel.PixelName.LONG_PRESS)
6666
}
6767

6868
@Test
69-
fun whenLongPressedWithAnchorImageTypeThenPixelFired() {
69+
fun whenUserLongPressesWithAnchorImageTypeThenPixelFired() {
7070
testee.handleLongPress(HitTestResult.SRC_IMAGE_ANCHOR_TYPE, HTTPS_IMAGE_URL, mockMenu)
7171
verify(mockPixel).fire(Pixel.PixelName.LONG_PRESS)
7272
}
7373

7474
@Test
75-
fun whenLongPressedWithUnknownTypeThenPixelNotFired() {
75+
fun whenUserLongPressesWithUnknownTypeThenPixelNotFired() {
7676
testee.handleLongPress(HitTestResult.UNKNOWN_TYPE, HTTPS_IMAGE_URL, mockMenu)
7777
verify(mockPixel, never()).fire(Pixel.PixelName.LONG_PRESS)
7878
}
7979

8080
@Test
81-
fun whenLongPressedWithImageTypeThenUrlHeaderAddedToMenu() {
81+
fun whenUserLongPressesWithImageTypeThenUrlHeaderAddedToMenu() {
8282
testee.handleLongPress(HitTestResult.IMAGE_TYPE, HTTPS_IMAGE_URL, mockMenu)
8383
verify(mockMenu).setHeaderTitle(HTTPS_IMAGE_URL)
8484
}
8585

8686
@Test
87-
fun whenLongPressedWithAnchorImageTypeThenUrlHeaderAddedToMenu() {
87+
fun whenUserLongPressesWithAnchorImageTypeThenUrlHeaderAddedToMenu() {
8888
testee.handleLongPress(HitTestResult.SRC_IMAGE_ANCHOR_TYPE, HTTPS_IMAGE_URL, mockMenu)
8989
verify(mockMenu).setHeaderTitle(HTTPS_IMAGE_URL)
9090
}
9191

9292
@Test
93-
fun whenLongPressedWithAnchorImageTypeThenTabOptionsHeaderAddedToMenu() {
93+
fun whenUserLongPressesWithAnchorImageTypeThenTabOptionsHeaderAddedToMenu() {
9494
testee.handleLongPress(HitTestResult.SRC_IMAGE_ANCHOR_TYPE, HTTPS_IMAGE_URL, mockMenu)
9595
verifyNewForegroundTabItemAdded()
9696
}
9797

9898
@Test
99-
fun whenLongPressedWithAnchorImageTypeThenBgTabOptionsHeaderAddedToMenu() {
99+
fun whenUserLongPressesWithAnchorImageTypeThenBgTabOptionsHeaderAddedToMenu() {
100100
testee.handleLongPress(HitTestResult.SRC_IMAGE_ANCHOR_TYPE, HTTPS_IMAGE_URL, mockMenu)
101101
verifyNewBackgroundTabItemAdded()
102102
}
103103

104104
@Test
105-
fun whenLongPressedWithImageTypeThenDownloadImageMenuAdded() {
105+
fun whenUserLongPressesWithImageTypeThenDownloadImageMenuAdded() {
106106
testee.handleLongPress(HitTestResult.IMAGE_TYPE, HTTPS_IMAGE_URL, mockMenu)
107107
verifyDownloadImageItemAdded()
108108
}
109109

110110
@Test
111-
fun whenLongPressedWithAnchorImageTypeThenDownloadImageMenuAdded() {
111+
fun whenUserLongPressesWithAnchorImageTypeThenDownloadImageMenuAdded() {
112112
testee.handleLongPress(HitTestResult.SRC_IMAGE_ANCHOR_TYPE, HTTPS_IMAGE_URL, mockMenu)
113113
verifyDownloadImageItemAdded()
114114
}
115115

116116
@Test
117-
fun whenLongPressedWithOtherImageTypeThenMenuNotAltered() {
117+
fun whenUserLongPressesWithOtherImageTypeThenMenuNotAltered() {
118118
testee.handleLongPress(HitTestResult.UNKNOWN_TYPE, HTTPS_IMAGE_URL, mockMenu)
119119
verifyMenuNotAltered()
120120
}
121121

122122
@Test
123-
fun whenLongPressedWithImageTypeWhichIsADataUriThenDownloadImageMenuAdded() {
123+
fun whenUserLongPressesWithImageTypeWhichIsADataUriThenDownloadImageMenuAdded() {
124124
testee.handleLongPress(HitTestResult.IMAGE_TYPE, DATA_URI_IMAGE_URL, mockMenu)
125125
verifyDownloadImageItemAdded()
126126
}
127127

128128
@Test
129-
fun whenUserSelectedDownloadImageOptionThenActionIsDownloadFileActionRequired() {
129+
fun whenUserSelectsDownloadImageOptionThenActionIsDownloadFileActionRequired() {
130130
whenever(mockMenuItem.itemId).thenReturn(WebViewLongPressHandler.CONTEXT_MENU_ID_DOWNLOAD_IMAGE)
131-
val longPressTarget = LongPressTarget(url = "example.com", type = HitTestResult.SRC_ANCHOR_TYPE)
131+
val longPressTarget = LongPressTarget(url = "example.com", imageUrl = "example.com/foo.jpg", type = HitTestResult.SRC_ANCHOR_TYPE)
132132
val action = testee.userSelectedMenuItem(longPressTarget, mockMenuItem)
133133
assertTrue(action is LongPressHandler.RequiredAction.DownloadFile)
134134
}
135135

136136
@Test
137-
fun whenUserSelectedDownloadImageOptionThenDownloadFileWithCorrectUrlReturned() {
137+
fun whenUserSelectsDownloadImageOptionButNoImageUrlAvailableThenNoActionRequired() {
138138
whenever(mockMenuItem.itemId).thenReturn(WebViewLongPressHandler.CONTEXT_MENU_ID_DOWNLOAD_IMAGE)
139-
val longPressTarget = LongPressTarget(url = "example.com", type = HitTestResult.SRC_ANCHOR_TYPE)
139+
val longPressTarget = LongPressTarget(url = "example.com", imageUrl = null, type = HitTestResult.SRC_ANCHOR_TYPE)
140+
val action = testee.userSelectedMenuItem(longPressTarget, mockMenuItem)
141+
assertTrue(action is LongPressHandler.RequiredAction.None)
142+
}
143+
144+
@Test
145+
fun whenUserSelectsDownloadImageOptionThenDownloadFileWithCorrectUrlReturned() {
146+
whenever(mockMenuItem.itemId).thenReturn(WebViewLongPressHandler.CONTEXT_MENU_ID_DOWNLOAD_IMAGE)
147+
val longPressTarget = LongPressTarget(url = "example.com", imageUrl = "example.com/foo.jpg", type = HitTestResult.SRC_ANCHOR_TYPE)
140148
val action = testee.userSelectedMenuItem(longPressTarget, mockMenuItem) as LongPressHandler.RequiredAction.DownloadFile
141-
assertEquals("example.com", action.url)
149+
assertEquals("example.com/foo.jpg", action.url)
142150
}
143151

144152
@Test
145-
fun whenUserSelectedUnknownOptionThenNoActionRequiredReturned() {
153+
fun whenUserSelectsUnknownOptionThenNoActionRequiredReturned() {
146154
val unknownMenuId = 123
147155
whenever(mockMenuItem.itemId).thenReturn(unknownMenuId)
148156
val longPressTarget = LongPressTarget(url = "example.com", type = HitTestResult.SRC_ANCHOR_TYPE)

app/src/androidTest/java/com/duckduckgo/app/global/db/AppDatabaseTest.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class AppDatabaseTest {
5252
testHelper.createDatabase(TEST_DB_NAME, 2).use {
5353
it.execSQL("INSERT INTO `network_leaderboard` VALUES ('Network2', 'example.com')")
5454
}
55-
assertTrue(database().networkLeaderboardDao().trackerNetworkTally().blockingObserve()!!.isEmpty())
55+
assertTrue(database().networkLeaderboardDao().trackerNetworkLeaderboard().blockingObserve()!!.isEmpty())
5656
}
5757

5858
@Test
@@ -120,6 +120,11 @@ class AppDatabaseTest {
120120
createDatabaseAndMigrate(11, 12, AppDatabase.MIGRATION_11_TO_12)
121121
}
122122

123+
@Test
124+
fun whenMigratingFromVersion12To13ThenValidationSucceeds() {
125+
createDatabaseAndMigrate(12, 13, AppDatabase.MIGRATION_12_TO_13)
126+
}
127+
123128
@Test
124129
fun whenMigratingFromVersion11To12ThenTabsDoNotSkipHome() {
125130
testHelper.createDatabase(TEST_DB_NAME, 11).use {

app/src/androidTest/java/com/duckduckgo/app/global/view/ClearPersonalDataActionTest.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.duckduckgo.app.global.view
1818

1919
import androidx.test.platform.app.InstrumentationRegistry
2020
import com.duckduckgo.app.browser.WebDataManager
21+
import com.duckduckgo.app.fire.AppCacheClearer
2122
import com.duckduckgo.app.fire.DuckDuckGoCookieManager
2223
import com.duckduckgo.app.fire.UnsentForgetAllPixelStore
2324
import com.duckduckgo.app.settings.db.SettingsDataStore
@@ -40,6 +41,7 @@ class ClearPersonalDataActionTest {
4041
private val mockTabRepository: TabRepository = mock()
4142
private val mockSettingsDataStore: SettingsDataStore = mock()
4243
private val mockCookieManager: DuckDuckGoCookieManager = mock()
44+
private val mockAppCacheClearer: AppCacheClearer = mock()
4345

4446
@Before
4547
fun setup() {
@@ -49,7 +51,8 @@ class ClearPersonalDataActionTest {
4951
mockClearingUnsentForgetAllPixelStore,
5052
mockTabRepository,
5153
mockSettingsDataStore,
52-
mockCookieManager
54+
mockCookieManager,
55+
mockAppCacheClearer
5356
)
5457
}
5558

@@ -83,6 +86,12 @@ class ClearPersonalDataActionTest {
8386
verify(mockDataManager).clearExternalCookies()
8487
}
8588

89+
@Test
90+
fun whenClearCalledThenAppCacheClearerClearsCache() = runBlocking<Unit> {
91+
testee.clearTabsAndAllDataAsync(false, false)
92+
verify(mockAppCacheClearer).clearCache()
93+
}
94+
8695
@Test
8796
fun whenClearCalledThenTabsCleared() = runBlocking<Unit> {
8897
testee.clearTabsAndAllDataAsync(false, false)

app/src/androidTest/java/com/duckduckgo/app/privacy/db/NetworkLeaderboardDaoTest.kt

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import androidx.room.Room
2121
import androidx.test.platform.app.InstrumentationRegistry
2222
import com.duckduckgo.app.blockingObserve
2323
import com.duckduckgo.app.global.db.AppDatabase
24-
import com.duckduckgo.app.privacy.db.NetworkLeaderboardDao.NetworkTally
2524
import org.junit.After
2625
import org.junit.Assert.assertEquals
2726
import org.junit.Assert.assertTrue
@@ -54,31 +53,34 @@ class NetworkLeaderboardDaoTest {
5453
}
5554

5655
@Test
57-
fun whenNetworksInsertedThenAddedToTallyWithCount() {
58-
dao.insert(NetworkLeaderboardEntry("Network1", domainVisited = "www.example1.com"))
59-
dao.insert(NetworkLeaderboardEntry("Network2", domainVisited = "www.example2.com"))
60-
dao.insert(NetworkLeaderboardEntry("Network3", domainVisited = "www.example3.com"))
61-
62-
val data: List<NetworkTally>? = dao.trackerNetworkTally().blockingObserve()
63-
assertEquals(3, data!!.size)
64-
assertTrue(data.contains(NetworkTally("Network1", 1)))
65-
assertTrue(data.contains(NetworkTally("Network2", 1)))
66-
assertTrue(data.contains(NetworkTally("Network3", 1)))
56+
fun whenNetworkThatDoesNotExistIncrementedThenAddedToDatabase() {
57+
dao.incrementNetworkCount("Network1")
58+
val data: List<NetworkLeaderboardEntry>? = dao.trackerNetworkLeaderboard().blockingObserve()
59+
assertEquals(1, data!!.size)
60+
assertTrue(data.contains(NetworkLeaderboardEntry("Network1", 1)))
6761
}
6862

63+
6964
@Test
70-
fun whenNetworksHaveMultipleDomainsThenAddedToTallyWithCountInDescendingOrder() {
71-
dao.insert(NetworkLeaderboardEntry("Network1", domainVisited = "www.example1.com"))
72-
dao.insert(NetworkLeaderboardEntry("Network2", domainVisited = "www.example1.com"))
73-
dao.insert(NetworkLeaderboardEntry("Network2", domainVisited = "www.example2.com"))
74-
dao.insert(NetworkLeaderboardEntry("Network2", domainVisited = "www.example3.com"))
75-
dao.insert(NetworkLeaderboardEntry("Network3", domainVisited = "www.example3.com"))
76-
dao.insert(NetworkLeaderboardEntry("Network3", domainVisited = "www.example4.com"))
65+
fun whenNetworksIncrementedMultipleTimesThenReturnedWithCountInDescendingOrder() {
66+
dao.incrementNetworkCount("Network1")
67+
dao.incrementNetworkCount("Network2")
68+
dao.incrementNetworkCount("Network2")
69+
dao.incrementNetworkCount("Network2")
70+
dao.incrementNetworkCount("Network3")
71+
dao.incrementNetworkCount("Network3")
7772

73+
val data: List<NetworkLeaderboardEntry> = dao.trackerNetworkLeaderboard().blockingObserve()!!
74+
assertEquals(NetworkLeaderboardEntry("Network2", 3), data[0])
75+
assertEquals(NetworkLeaderboardEntry("Network3", 2), data[1])
76+
assertEquals(NetworkLeaderboardEntry("Network1", 1), data[2])
77+
}
7878

79-
val data: List<NetworkTally> = dao.trackerNetworkTally().blockingObserve()!!
80-
assertEquals(NetworkTally("Network2", 3), data[0])
81-
assertEquals(NetworkTally("Network3", 2), data[1])
82-
assertEquals(NetworkTally("Network1", 1), data[2])
79+
@Test
80+
fun whenSiteVisitedIncremenetedThenSiteVisitedCountIncreaesByOne() {
81+
dao.incrementSitesVisited()
82+
assertEquals(1, dao.sitesVisited().blockingObserve())
83+
dao.incrementSitesVisited()
84+
assertEquals(2, dao.sitesVisited().blockingObserve())
8385
}
8486
}

app/src/androidTest/java/com/duckduckgo/app/privacy/renderer/TrackersRendererTest.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package com.duckduckgo.app.privacy.renderer
1818

1919
import androidx.test.platform.app.InstrumentationRegistry
2020
import com.duckduckgo.app.browser.R
21-
import com.duckduckgo.app.privacy.db.NetworkLeaderboardDao.NetworkTally
21+
import com.duckduckgo.app.privacy.db.NetworkLeaderboardEntry
2222
import org.junit.Assert.assertEquals
2323
import org.junit.Assert.assertNull
2424
import org.junit.Test
@@ -65,26 +65,26 @@ class TrackersRendererTest {
6565
}
6666

6767
@Test
68-
fun whenTotalDomainsIsZeroThenPercentageIsBlank() {
69-
val text = testee.networkPercentage(NetworkTally("", 10), 0)
68+
fun whenSitestVisitedIsZeroThenPercentageIsBlank() {
69+
val text = testee.networkPercentage(NetworkLeaderboardEntry("", 10), 0)
7070
assertEquals("", text)
7171
}
7272

7373
@Test
74-
fun whenDomainCountIsZeroThenPercentageIsBlank() {
75-
val text = testee.networkPercentage(NetworkTally("", 0), 10)
74+
fun whenNetworkCountIsZeroThenPercentageIsBlank() {
75+
val text = testee.networkPercentage(NetworkLeaderboardEntry("", 0), 10)
7676
assertEquals("", text)
7777
}
7878

7979
@Test
8080
fun whenPortionIsRecurringFractionThenPercentageIsRoundNumber() {
81-
val text = testee.networkPercentage(NetworkTally("", 10), 30)
81+
val text = testee.networkPercentage(NetworkLeaderboardEntry("", 10), 30)
8282
assertEquals("33%", text)
8383
}
8484

8585
@Test
8686
fun whenPortionIsHalfThenPercentageIs50Percent() {
87-
val text = testee.networkPercentage(NetworkTally("", 10), 20)
87+
val text = testee.networkPercentage(NetworkLeaderboardEntry("", 10), 20)
8888
assertEquals("50%", text)
8989
}
9090

0 commit comments

Comments
 (0)