@@ -25,15 +25,19 @@ import com.duckduckgo.app.launch.LaunchViewModel.Command.Home
25
25
import com.duckduckgo.app.launch.LaunchViewModel.Command.Onboarding
26
26
import com.duckduckgo.app.onboarding.store.AppStage
27
27
import com.duckduckgo.app.onboarding.store.UserStageStore
28
+ import com.duckduckgo.app.onboardingdesignexperiment.OnboardingDesignExperimentManager
28
29
import com.duckduckgo.app.referral.StubAppReferrerFoundStateListener
29
30
import com.duckduckgo.common.test.CoroutineTestRule
30
31
import com.duckduckgo.daxprompts.api.DaxPrompts
31
32
import com.duckduckgo.daxprompts.api.DaxPrompts.ActionType
33
+ import kotlinx.coroutines.CompletableDeferred
32
34
import kotlinx.coroutines.test.runTest
33
35
import org.junit.After
36
+ import org.junit.Before
34
37
import org.junit.Rule
35
38
import org.junit.Test
36
39
import org.mockito.kotlin.any
40
+ import org.mockito.kotlin.doSuspendableAnswer
37
41
import org.mockito.kotlin.mock
38
42
import org.mockito.kotlin.verify
39
43
import org.mockito.kotlin.whenever
@@ -51,9 +55,15 @@ class LaunchViewModelTest {
51
55
private val mockCommandObserver: Observer <LaunchViewModel .Command > = mock()
52
56
private val mockDaxPrompts: DaxPrompts = mock()
53
57
private val mockAppInstallStore: AppInstallStore = mock()
58
+ private val mockOnboardingExperiment: OnboardingDesignExperimentManager = mock()
54
59
55
60
private lateinit var testee: LaunchViewModel
56
61
62
+ @Before
63
+ fun before () = runTest {
64
+ whenever(mockOnboardingExperiment.isWaitForLocalPrivacyConfigEnabled()).thenReturn(false )
65
+ }
66
+
57
67
@After
58
68
fun after () {
59
69
testee.command.removeObserver(mockCommandObserver)
@@ -66,6 +76,7 @@ class LaunchViewModelTest {
66
76
StubAppReferrerFoundStateListener (" xx" ),
67
77
mockDaxPrompts,
68
78
mockAppInstallStore,
79
+ mockOnboardingExperiment,
69
80
)
70
81
whenever(mockDaxPrompts.evaluate()).thenReturn(ActionType .NONE )
71
82
whenever(userStageStore.getUserAppStage()).thenReturn(AppStage .NEW )
@@ -83,6 +94,7 @@ class LaunchViewModelTest {
83
94
StubAppReferrerFoundStateListener (" xx" , mockDelayMs = 1_000 ),
84
95
mockDaxPrompts,
85
96
mockAppInstallStore,
97
+ mockOnboardingExperiment,
86
98
)
87
99
whenever(mockDaxPrompts.evaluate()).thenReturn(ActionType .NONE )
88
100
whenever(userStageStore.getUserAppStage()).thenReturn(AppStage .NEW )
@@ -100,6 +112,7 @@ class LaunchViewModelTest {
100
112
StubAppReferrerFoundStateListener (" xx" , mockDelayMs = Long .MAX_VALUE ),
101
113
mockDaxPrompts,
102
114
mockAppInstallStore,
115
+ mockOnboardingExperiment,
103
116
)
104
117
whenever(mockDaxPrompts.evaluate()).thenReturn(ActionType .NONE )
105
118
whenever(userStageStore.getUserAppStage()).thenReturn(AppStage .NEW )
@@ -117,6 +130,7 @@ class LaunchViewModelTest {
117
130
StubAppReferrerFoundStateListener (" xx" ),
118
131
mockDaxPrompts,
119
132
mockAppInstallStore,
133
+ mockOnboardingExperiment,
120
134
)
121
135
whenever(mockDaxPrompts.evaluate()).thenReturn(ActionType .NONE )
122
136
whenever(userStageStore.getUserAppStage()).thenReturn(AppStage .DAX_ONBOARDING )
@@ -132,6 +146,7 @@ class LaunchViewModelTest {
132
146
StubAppReferrerFoundStateListener (" xx" , mockDelayMs = 1_000 ),
133
147
mockDaxPrompts,
134
148
mockAppInstallStore,
149
+ mockOnboardingExperiment,
135
150
)
136
151
whenever(mockDaxPrompts.evaluate()).thenReturn(ActionType .NONE )
137
152
whenever(userStageStore.getUserAppStage()).thenReturn(AppStage .DAX_ONBOARDING )
@@ -147,6 +162,7 @@ class LaunchViewModelTest {
147
162
StubAppReferrerFoundStateListener (" xx" , mockDelayMs = Long .MAX_VALUE ),
148
163
mockDaxPrompts,
149
164
mockAppInstallStore,
165
+ mockOnboardingExperiment,
150
166
)
151
167
whenever(mockDaxPrompts.evaluate()).thenReturn(ActionType .NONE )
152
168
whenever(userStageStore.getUserAppStage()).thenReturn(AppStage .DAX_ONBOARDING )
@@ -162,6 +178,7 @@ class LaunchViewModelTest {
162
178
StubAppReferrerFoundStateListener (" xx" , mockDelayMs = Long .MAX_VALUE ),
163
179
mockDaxPrompts,
164
180
mockAppInstallStore,
181
+ mockOnboardingExperiment,
165
182
)
166
183
whenever(mockDaxPrompts.evaluate()).thenReturn(ActionType .SHOW_VARIANT_DUCKPLAYER )
167
184
whenever(userStageStore.getUserAppStage()).thenReturn(AppStage .DAX_ONBOARDING )
@@ -177,11 +194,96 @@ class LaunchViewModelTest {
177
194
StubAppReferrerFoundStateListener (" xx" , mockDelayMs = Long .MAX_VALUE ),
178
195
mockDaxPrompts,
179
196
mockAppInstallStore,
197
+ mockOnboardingExperiment,
180
198
)
181
199
whenever(mockDaxPrompts.evaluate()).thenReturn(ActionType .SHOW_VARIANT_BROWSER_COMPARISON )
182
200
whenever(userStageStore.getUserAppStage()).thenReturn(AppStage .DAX_ONBOARDING )
183
201
testee.command.observeForever(mockCommandObserver)
184
202
testee.determineViewToShow()
185
203
verify(mockCommandObserver).onChanged(any<DaxPromptBrowserComparison >())
186
204
}
205
+
206
+ @Test
207
+ fun whenOnboardingShouldShowAndPrivacyConfigIsEnabledThenCommandIsOnboarding () = runTest {
208
+ whenever(mockOnboardingExperiment.isWaitForLocalPrivacyConfigEnabled()).thenReturn(true )
209
+ testee = LaunchViewModel (
210
+ userStageStore,
211
+ StubAppReferrerFoundStateListener (" xx" ),
212
+ mockDaxPrompts,
213
+ mockAppInstallStore,
214
+ mockOnboardingExperiment,
215
+ )
216
+ whenever(mockDaxPrompts.evaluate()).thenReturn(ActionType .NONE )
217
+ whenever(userStageStore.getUserAppStage()).thenReturn(AppStage .NEW )
218
+ testee.command.observeForever(mockCommandObserver)
219
+
220
+ testee.determineViewToShow()
221
+
222
+ verify(mockOnboardingExperiment).waitForPrivacyConfig()
223
+ verify(mockCommandObserver).onChanged(any<Onboarding >())
224
+ }
225
+
226
+ @Test
227
+ fun whenOnboardingShouldNotShowAndPrivacyConfigIsEnabledThenCommandIsHome () = runTest {
228
+ whenever(mockOnboardingExperiment.isWaitForLocalPrivacyConfigEnabled()).thenReturn(true )
229
+ testee = LaunchViewModel (
230
+ userStageStore,
231
+ StubAppReferrerFoundStateListener (" xx" ),
232
+ mockDaxPrompts,
233
+ mockAppInstallStore,
234
+ mockOnboardingExperiment,
235
+ )
236
+ whenever(mockDaxPrompts.evaluate()).thenReturn(ActionType .NONE )
237
+ whenever(userStageStore.getUserAppStage()).thenReturn(AppStage .DAX_ONBOARDING )
238
+ testee.command.observeForever(mockCommandObserver)
239
+
240
+ testee.determineViewToShow()
241
+
242
+ verify(mockOnboardingExperiment).waitForPrivacyConfig()
243
+ verify(mockCommandObserver).onChanged(any<Home >())
244
+ }
245
+
246
+ @Test
247
+ fun whenOnboardingExperimentIsEnabledAndOnboardingShouldShowAndReferrerTimesOutThenCommandIsOnboarding () = runTest {
248
+ whenever(mockOnboardingExperiment.isWaitForLocalPrivacyConfigEnabled()).thenReturn(true )
249
+
250
+ testee = LaunchViewModel (
251
+ userStageStore,
252
+ StubAppReferrerFoundStateListener (" xx" , mockDelayMs = Long .MAX_VALUE ),
253
+ mockDaxPrompts,
254
+ mockAppInstallStore,
255
+ mockOnboardingExperiment,
256
+ )
257
+ whenever(mockDaxPrompts.evaluate()).thenReturn(ActionType .NONE )
258
+ whenever(userStageStore.getUserAppStage()).thenReturn(AppStage .NEW )
259
+ testee.command.observeForever(mockCommandObserver)
260
+
261
+ testee.determineViewToShow()
262
+
263
+ verify(mockOnboardingExperiment).waitForPrivacyConfig()
264
+ verify(mockCommandObserver).onChanged(any<Onboarding >())
265
+ }
266
+
267
+ @Test
268
+ fun whenOnboardingExperimentIsEnabledAndOnboardingShouldShowAndWaitForPrivacyConfigTimesOutThenCommandIsOnboarding () = runTest {
269
+ whenever(mockOnboardingExperiment.isWaitForLocalPrivacyConfigEnabled()).thenReturn(true )
270
+ whenever(mockOnboardingExperiment.waitForPrivacyConfig()).doSuspendableAnswer {
271
+ CompletableDeferred <Boolean >().await()
272
+ }
273
+
274
+ testee = LaunchViewModel (
275
+ userStageStore,
276
+ StubAppReferrerFoundStateListener (" xx" ),
277
+ mockDaxPrompts,
278
+ mockAppInstallStore,
279
+ mockOnboardingExperiment,
280
+ )
281
+ whenever(mockDaxPrompts.evaluate()).thenReturn(ActionType .NONE )
282
+ whenever(userStageStore.getUserAppStage()).thenReturn(AppStage .NEW )
283
+ testee.command.observeForever(mockCommandObserver)
284
+
285
+ testee.determineViewToShow()
286
+
287
+ verify(mockCommandObserver).onChanged(any<Onboarding >())
288
+ }
187
289
}
0 commit comments