@@ -19,6 +19,7 @@ package com.duckduckgo.duckchat.impl
1919import android.annotation.SuppressLint
2020import android.content.Context
2121import android.content.Intent
22+ import android.webkit.CookieManager
2223import androidx.core.net.toUri
2324import androidx.lifecycle.Lifecycle
2425import androidx.lifecycle.Lifecycle.State.CREATED
@@ -27,6 +28,8 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
2728import com.duckduckgo.app.statistics.pixels.Pixel
2829import com.duckduckgo.app.tabs.BrowserNav
2930import com.duckduckgo.common.test.CoroutineTestRule
31+ import com.duckduckgo.common.utils.AppUrl
32+ import com.duckduckgo.cookies.api.CookieManagerProvider
3033import com.duckduckgo.duckchat.api.DuckChatSettingsNoParams
3134import com.duckduckgo.duckchat.impl.feature.AIChatImageUploadFeature
3235import com.duckduckgo.duckchat.impl.feature.DuckChatFeature
@@ -95,6 +98,7 @@ class RealDuckChatTest {
9598 private val mockNewAddressBarOptionBottomSheetDialog: NewAddressBarOptionBottomSheetDialog = mock()
9699 private val mockDuckAiContextualOnboardingBottomSheetDialogFactory: DuckAiContextualOnboardingBottomSheetDialogFactory = mock()
97100 private val mockDeviceSyncState: DeviceSyncState = mock()
101+ private val cookiesManager: CookieManagerProvider = mock()
98102
99103 private lateinit var testee: RealDuckChat
100104
@@ -131,6 +135,7 @@ class RealDuckChatTest {
131135 mockNewAddressBarOptionBottomSheetDialogFactory,
132136 mockDuckAiContextualOnboardingBottomSheetDialogFactory,
133137 mockDeviceSyncState,
138+ cookiesManager,
134139 ),
135140 )
136141 coroutineRule.testScope.advanceUntilIdle()
@@ -1234,6 +1239,7 @@ class RealDuckChatTest {
12341239 @Test
12351240 fun `when contextual mode enabled, isDuckChatContextualModeEnabled returns true` () = runTest {
12361241 duckChatFeature.contextualMode().setRawStoredState(State (enable = true ))
1242+ duckChatFeature.contextualModeKillSwitch().setRawStoredState(State (enable = true ))
12371243 testee.onPrivacyConfigDownloaded()
12381244
12391245 assertTrue(testee.isDuckChatContextualModeEnabled())
@@ -1242,11 +1248,50 @@ class RealDuckChatTest {
12421248 @Test
12431249 fun `when contextual mode disabled, isDuckChatContextualModeEnabled returns false` () = runTest {
12441250 duckChatFeature.contextualMode().setRawStoredState(State (enable = false ))
1251+ duckChatFeature.contextualModeKillSwitch().setRawStoredState(State (enable = true ))
12451252 testee.onPrivacyConfigDownloaded()
12461253
12471254 assertFalse(testee.isDuckChatContextualModeEnabled())
12481255 }
12491256
1257+ @Test
1258+ fun `when migration cookie present and kill switch enabled then isDuckChatContextualModeEnabled returns true` () = runTest {
1259+ val cookieManager = mock<CookieManager >()
1260+ whenever(cookiesManager.get()).thenReturn(cookieManager)
1261+ whenever(cookieManager.getCookie(AppUrl .Url .COOKIES )).thenReturn(" migration_status_dev_01=migrated_dev_01" )
1262+ duckChatFeature.contextualMode().setRawStoredState(State (enable = false ))
1263+ duckChatFeature.contextualModeKillSwitch().setRawStoredState(State (enable = true ))
1264+
1265+ testee.onPrivacyConfigDownloaded()
1266+
1267+ assertTrue(testee.isDuckChatContextualModeEnabled())
1268+ }
1269+
1270+ @Test
1271+ fun `when migration cookie present then isStandaloneMigrationCompleted returns true` () = runTest {
1272+ val cookieManager = mock<CookieManager >()
1273+ whenever(cookiesManager.get()).thenReturn(cookieManager)
1274+ whenever(cookieManager.getCookie(AppUrl .Url .COOKIES )).thenReturn(" a=b;migration_status_dev_01=migrated_dev_01;c=d" )
1275+
1276+ assertTrue(testee.isStandaloneMigrationCompleted())
1277+ }
1278+
1279+ @Test
1280+ fun `when migration cookie missing then isStandaloneMigrationCompleted returns false` () = runTest {
1281+ val cookieManager = mock<CookieManager >()
1282+ whenever(cookiesManager.get()).thenReturn(cookieManager)
1283+ whenever(cookieManager.getCookie(AppUrl .Url .COOKIES )).thenReturn(" a=b; c=d" )
1284+
1285+ assertFalse(testee.isStandaloneMigrationCompleted())
1286+ }
1287+
1288+ @Test
1289+ fun `when cookie manager is null then isStandaloneMigrationCompleted returns false` () = runTest {
1290+ whenever(cookiesManager.get()).thenReturn(null )
1291+
1292+ assertFalse(testee.isStandaloneMigrationCompleted())
1293+ }
1294+
12501295 companion object {
12511296 val SETTINGS_JSON = """
12521297 {
0 commit comments