Skip to content

Commit 7af7c91

Browse files
committed
Merge branch 'release/5.8.0'
2 parents 685362a + e89634a commit 7af7c91

File tree

63 files changed

+1467
-242
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+1467
-242
lines changed

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ apply plugin: 'kotlin-kapt'
66
apply from: '../versioning.gradle'
77

88
ext {
9-
VERSION_NAME = "5.7.5"
9+
VERSION_NAME = "5.8.0"
1010
USE_ORCHESTRATOR = project.hasProperty('orchestrator') ? project.property('orchestrator') : false
1111
}
1212

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import com.duckduckgo.app.browser.LongPressHandler.RequiredAction.DownloadFile
3333
import com.duckduckgo.app.browser.LongPressHandler.RequiredAction.OpenInNewTab
3434
import com.duckduckgo.app.browser.defaultBrowsing.DefaultBrowserDetector
3535
import com.duckduckgo.app.browser.defaultBrowsing.DefaultBrowserNotification
36+
import com.duckduckgo.app.browser.favicon.FaviconDownloader
3637
import com.duckduckgo.app.browser.omnibar.OmnibarEntryConverter
3738
import com.duckduckgo.app.browser.session.WebViewSessionStorage
3839
import com.duckduckgo.app.global.db.AppConfigurationDao
@@ -45,6 +46,7 @@ import com.duckduckgo.app.privacy.db.SiteVisitedEntity
4546
import com.duckduckgo.app.privacy.model.PrivacyGrade
4647
import com.duckduckgo.app.privacy.store.TermsOfServiceStore
4748
import com.duckduckgo.app.settings.db.SettingsDataStore
49+
import com.duckduckgo.app.statistics.VariantManager
4850
import com.duckduckgo.app.statistics.api.StatisticsUpdater
4951
import com.duckduckgo.app.tabs.db.TabsDao
5052
import com.duckduckgo.app.tabs.model.TabDataRepository
@@ -114,6 +116,12 @@ class BrowserTabViewModelTest {
114116
@Mock
115117
private lateinit var webViewSessionStorage: WebViewSessionStorage
116118

119+
@Mock
120+
private lateinit var variantManager: VariantManager
121+
122+
@Mock
123+
private lateinit var mockFaviconDownloader: FaviconDownloader
124+
117125
@Captor
118126
private lateinit var commandCaptor: ArgumentCaptor<Command>
119127

@@ -148,7 +156,10 @@ class BrowserTabViewModelTest {
148156
defaultBrowserDetector = mockDefaultBrowserDetector,
149157
longPressHandler = mockLongPressHandler,
150158
appConfigurationDao = appConfigurationDao,
151-
webViewSessionStorage = webViewSessionStorage
159+
webViewSessionStorage = webViewSessionStorage,
160+
specialUrlDetector = SpecialUrlDetector(),
161+
faviconDownloader = mockFaviconDownloader,
162+
variantManager = variantManager
152163
)
153164

154165
testee.loadData("abc", null)

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

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@ package com.duckduckgo.app.browser
1919
import android.view.ContextMenu
2020
import android.view.MenuItem
2121
import android.webkit.WebView.HitTestResult
22-
import com.nhaarman.mockito_kotlin.eq
23-
import com.nhaarman.mockito_kotlin.never
24-
import com.nhaarman.mockito_kotlin.verify
25-
import com.nhaarman.mockito_kotlin.whenever
22+
import com.duckduckgo.app.statistics.pixels.Pixel
23+
import com.nhaarman.mockito_kotlin.*
2624
import org.junit.Assert.assertEquals
2725
import org.junit.Assert.assertTrue
2826
import org.junit.Before
@@ -45,10 +43,31 @@ class WebViewLongPressHandlerTest {
4543
@Mock
4644
private lateinit var mockMenuItem: MenuItem
4745

46+
@Mock
47+
private lateinit var mockPixel: Pixel
48+
4849
@Before
4950
fun setup() {
5051
MockitoAnnotations.initMocks(this)
51-
testee = WebViewLongPressHandler()
52+
testee = WebViewLongPressHandler(mockPixel)
53+
}
54+
55+
@Test
56+
fun whenLongPressedWithImageTypeThenPixelFired() {
57+
testee.handleLongPress(HitTestResult.IMAGE_TYPE, HTTPS_IMAGE_URL, mockMenu)
58+
verify(mockPixel).fire(Pixel.PixelName.LONG_PRESS)
59+
}
60+
61+
@Test
62+
fun whenLongPressedWithAnchorImageTypeThenPixelFired() {
63+
testee.handleLongPress(HitTestResult.SRC_IMAGE_ANCHOR_TYPE, HTTPS_IMAGE_URL, mockMenu)
64+
verify(mockPixel).fire(Pixel.PixelName.LONG_PRESS)
65+
}
66+
67+
@Test
68+
fun whenLongPressedWithUnknownTypeThenPixelNotFired() {
69+
testee.handleLongPress(HitTestResult.UNKNOWN_TYPE, HTTPS_IMAGE_URL, mockMenu)
70+
verify(mockPixel, never()).fire(any())
5271
}
5372

5473
@Test

app/src/androidTest/java/com/duckduckgo/app/browser/defaultBrowsing/DefaultBrowserHomeScreenCallToActionTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package com.duckduckgo.app.browser.defaultBrowsing
1919
import com.duckduckgo.app.global.install.AppInstallStore
2020
import com.duckduckgo.app.statistics.Variant
2121
import com.duckduckgo.app.statistics.VariantManager
22-
import com.duckduckgo.app.statistics.VariantManager.VariantFeature.DefaultBrowserFeature.ShowHomeScreenCallToAction
22+
import com.duckduckgo.app.statistics.VariantManager.VariantFeature.DefaultBrowserFeature.ShowHomeScreenCallToActionSimpleButton
2323
import com.nhaarman.mockito_kotlin.mock
2424
import com.nhaarman.mockito_kotlin.whenever
2525
import org.junit.Assert.assertFalse
@@ -78,6 +78,6 @@ class DefaultBrowserHomeScreenCallToActionTest {
7878
whenever(appInstallStore.hasUserDeclinedDefaultBrowserHomeScreenCallToActionPreviously()).thenReturn(previousDecline)
7979
}
8080

81-
private fun variantWithFeatureEnabled() = Variant("", 0.0, listOf(ShowHomeScreenCallToAction))
81+
private fun variantWithFeatureEnabled() = Variant("", 0.0, listOf(ShowHomeScreenCallToActionSimpleButton))
8282
private fun variantWithFeatureDisabled() = Variant("", 0.0, listOf())
8383
}

app/src/androidTest/java/com/duckduckgo/app/di/StubStatisticsModule.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.duckduckgo.app.di
1818

1919
import com.duckduckgo.app.statistics.api.StatisticsService
2020
import com.duckduckgo.app.statistics.api.StatisticsUpdater
21+
import com.duckduckgo.app.statistics.pixels.Pixel
2122
import dagger.Module
2223
import dagger.Provides
2324
import retrofit2.Retrofit
@@ -39,4 +40,12 @@ class StubStatisticsModule {
3940
}
4041
}
4142
}
43+
44+
@Provides
45+
fun stubPixel(): Pixel {
46+
return object : Pixel {
47+
override fun fire(pixel: Pixel.PixelName) {
48+
}
49+
}
50+
}
4251
}

app/src/androidTest/java/com/duckduckgo/app/di/TestAppComponent.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.duckduckgo.app.TestApplication
2121
import com.duckduckgo.app.browser.autoComplete.BrowserAutoCompleteModule
2222
import com.duckduckgo.app.browser.di.BrowserModule
2323
import com.duckduckgo.app.browser.di.DefaultBrowserModule
24+
import com.duckduckgo.app.browser.favicon.FaviconModule
2425
import com.duckduckgo.app.httpsupgrade.di.HttpsUpgraderModule
2526
import com.duckduckgo.app.onboarding.di.OnboardingModule
2627
import com.duckduckgo.app.surrogates.di.ResourceSurrogateModule
@@ -56,7 +57,8 @@ import javax.inject.Singleton
5657
NotificationModule::class,
5758
DefaultBrowserModule::class,
5859
OnboardingModule::class,
59-
VariantModule::class
60+
VariantModule::class,
61+
FaviconModule::class
6062
])
6163
interface TestAppComponent : AndroidInjector<TestApplication> {
6264

app/src/androidTest/java/com/duckduckgo/app/privacy/ui/PrivacyDashboardViewModelTest.kt

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ import com.duckduckgo.app.privacy.model.HttpsStatus
2626
import com.duckduckgo.app.privacy.model.PrivacyGrade
2727
import com.duckduckgo.app.privacy.model.TermsOfService
2828
import com.duckduckgo.app.privacy.store.PrivacySettingsStore
29+
import com.duckduckgo.app.statistics.pixels.Pixel
30+
import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.*
2931
import com.nhaarman.mockito_kotlin.mock
32+
import com.nhaarman.mockito_kotlin.verify
3033
import com.nhaarman.mockito_kotlin.whenever
3134
import org.junit.After
3235
import org.junit.Assert.*
@@ -45,9 +48,10 @@ class PrivacyDashboardViewModelTest {
4548
private var networkLeaderboard: NetworkLeaderboardDao = mock()
4649
private var networkTallyLiveData: LiveData<List<NetworkTally>> = mock()
4750
private var domainsVisitedLiveData: LiveData<Int> = mock()
51+
private var mockPixel: Pixel = mock()
4852

4953
private val testee: PrivacyDashboardViewModel by lazy {
50-
val model = PrivacyDashboardViewModel(settingStore, networkLeaderboard)
54+
val model = PrivacyDashboardViewModel(settingStore, networkLeaderboard, mockPixel)
5155
model.viewState.observeForever(viewStateObserver)
5256
model
5357
}
@@ -66,6 +70,12 @@ class PrivacyDashboardViewModelTest {
6670
testee.onCleared()
6771
}
6872

73+
@Test
74+
fun whenViewModelInitialisedThenPixelIsFired() {
75+
testee // init
76+
verify(mockPixel).fire(PRIVACY_DASHBOARD_OPENED)
77+
}
78+
6979
@Test
7080
fun whenNoDataThenDefaultValuesAreUsed() {
7181
val viewState = testee.viewState.value!!
@@ -81,8 +91,8 @@ class PrivacyDashboardViewModelTest {
8191
@Test
8292
fun whenPrivacyInitiallyOnAndSwitchedOffThenShouldReloadIsTrue() {
8393
whenever(settingStore.privacyOn)
84-
.thenReturn(true)
85-
.thenReturn(false)
94+
.thenReturn(true)
95+
.thenReturn(false)
8696
assertTrue(testee.viewState.value!!.shouldReloadPage)
8797
}
8898

@@ -95,8 +105,8 @@ class PrivacyDashboardViewModelTest {
95105
@Test
96106
fun whenPrivacyInitiallyOffAndSwitchedOnThenShouldReloadIsTrue() {
97107
whenever(settingStore.privacyOn)
98-
.thenReturn(false)
99-
.thenReturn(true)
108+
.thenReturn(false)
109+
.thenReturn(true)
100110
assertTrue(testee.viewState.value!!.shouldReloadPage)
101111
}
102112

@@ -193,12 +203,14 @@ class PrivacyDashboardViewModelTest {
193203
assertFalse(viewState.showTrackerNetworkLeaderboard)
194204
}
195205

196-
private fun site(https: HttpsStatus = HttpsStatus.SECURE,
197-
trackerCount: Int = 0,
198-
networkCount: Int = 0,
199-
hasTrackerFromMajorNetwork: Boolean = false,
200-
allTrackersBlocked: Boolean = true,
201-
terms: TermsOfService = TermsOfService()): Site {
206+
private fun site(
207+
https: HttpsStatus = HttpsStatus.SECURE,
208+
trackerCount: Int = 0,
209+
networkCount: Int = 0,
210+
hasTrackerFromMajorNetwork: Boolean = false,
211+
allTrackersBlocked: Boolean = true,
212+
terms: TermsOfService = TermsOfService()
213+
): Site {
202214
val site: Site = mock()
203215
whenever(site.https).thenReturn(https)
204216
whenever(site.trackerCount).thenReturn(trackerCount)

app/src/androidTest/java/com/duckduckgo/app/settings/SettingsViewModelTest.kt

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import com.duckduckgo.app.browser.BuildConfig
2525
import com.duckduckgo.app.browser.defaultBrowsing.DefaultBrowserDetector
2626
import com.duckduckgo.app.settings.SettingsViewModel.Command
2727
import com.duckduckgo.app.settings.db.SettingsDataStore
28+
import com.duckduckgo.app.statistics.Variant
29+
import com.duckduckgo.app.statistics.VariantManager
2830
import com.nhaarman.mockito_kotlin.KArgumentCaptor
2931
import com.nhaarman.mockito_kotlin.argumentCaptor
3032
import com.nhaarman.mockito_kotlin.verify
@@ -55,6 +57,9 @@ class SettingsViewModelTest {
5557
@Mock
5658
private lateinit var mockDefaultBrowserDetector: DefaultBrowserDetector
5759

60+
@Mock
61+
private lateinit var mockVariantManager: VariantManager
62+
5863
private lateinit var commandCaptor: KArgumentCaptor<Command>
5964

6065
@Before
@@ -64,9 +69,10 @@ class SettingsViewModelTest {
6469
context = InstrumentationRegistry.getTargetContext()
6570
commandCaptor = argumentCaptor()
6671

67-
68-
testee = SettingsViewModel(mockAppSettingsDataStore, mockDefaultBrowserDetector)
72+
testee = SettingsViewModel(mockAppSettingsDataStore, mockDefaultBrowserDetector, mockVariantManager)
6973
testee.command.observeForever(commandObserver)
74+
75+
whenever(mockVariantManager.getVariant()).thenReturn(VariantManager.DEFAULT_VARIANT)
7076
}
7177

7278
@Test
@@ -92,7 +98,8 @@ class SettingsViewModelTest {
9298
fun whenStartCalledThenVersionSetCorrectly() {
9399
testee.start()
94100
val value = latestViewState()
95-
assertEquals("${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})", value.version)
101+
val expectedStartString = "${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})"
102+
assertTrue(value.version.startsWith(expectedStartString))
96103
}
97104

98105
@Test
@@ -134,5 +141,21 @@ class SettingsViewModelTest {
134141
assertTrue(latestViewState().showDefaultBrowserSetting)
135142
}
136143

144+
@Test
145+
fun whenVariantIsEmptyThenEmptyVariantIncludedInSettings() {
146+
testee.start()
147+
val expectedStartString = "${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})"
148+
assertEquals(expectedStartString, latestViewState().version)
149+
}
150+
151+
@Test
152+
fun whenVariantIsSetThenVariantKeyIncludedInSettings() {
153+
whenever(mockVariantManager.getVariant()).thenReturn(Variant("ab"))
154+
testee.start()
155+
val expectedStartString = "${BuildConfig.VERSION_NAME} ab (${BuildConfig.VERSION_CODE})"
156+
assertEquals(expectedStartString, latestViewState().version)
157+
}
158+
159+
137160
private fun latestViewState() = testee.viewState.value!!
138161
}

0 commit comments

Comments
 (0)