diff --git a/app/src/main/java/com/duckduckgo/app/survey/rmf/TemporaryDefaultSurveyParameters.kt b/app/src/main/java/com/duckduckgo/app/survey/rmf/TemporaryDefaultSurveyParameters.kt new file mode 100644 index 000000000000..6cb3c9526ff3 --- /dev/null +++ b/app/src/main/java/com/duckduckgo/app/survey/rmf/TemporaryDefaultSurveyParameters.kt @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2025 DuckDuckGo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.duckduckgo.app.survey.rmf + +import com.duckduckgo.app.browser.senseofprotection.SenseOfProtectionToggles +import com.duckduckgo.di.scopes.AppScope +import com.duckduckgo.survey.api.SurveyParameterPlugin +import com.squareup.anvil.annotations.ContributesMultibinding +import javax.inject.Inject + +// Added while senseOfProtectionNewUserExperimentApr25 is active +@ContributesMultibinding(AppScope::class) +class SenseOfProtectionCohortSurveyParameterPlugin @Inject constructor( + private val senseOfProtectionToggles: SenseOfProtectionToggles, +) : SurveyParameterPlugin { + override val surveyParamKey: String = "senseProtectionCohort" + + override suspend fun evaluate(): String = senseOfProtectionToggles.senseOfProtectionNewUserExperimentApr25().getCohort()?.name.orEmpty() +} diff --git a/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherViewModel.kt b/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherViewModel.kt index dc12daca0e69..98843f019ed3 100644 --- a/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherViewModel.kt @@ -22,9 +22,9 @@ import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope import com.duckduckgo.anvil.annotations.ContributesViewModel import com.duckduckgo.app.browser.SwipingTabsFeatureProvider +import com.duckduckgo.app.browser.favicon.FaviconManager import com.duckduckgo.app.browser.senseofprotection.SenseOfProtectionExperiment import com.duckduckgo.app.browser.senseofprotection.SenseOfProtectionToggles.Cohorts.VARIANT_2 -import com.duckduckgo.app.browser.favicon.FaviconManager import com.duckduckgo.app.pixels.AppPixelName import com.duckduckgo.app.pixels.AppPixelName.TAB_MANAGER_GRID_VIEW_BUTTON_CLICKED import com.duckduckgo.app.pixels.AppPixelName.TAB_MANAGER_INFO_PANEL_DISMISSED diff --git a/app/src/test/java/com/duckduckgo/app/survey/rmf/TemporaryDefaultSurveyParametersPluginTest.kt b/app/src/test/java/com/duckduckgo/app/survey/rmf/TemporaryDefaultSurveyParametersPluginTest.kt new file mode 100644 index 000000000000..88be39fb5802 --- /dev/null +++ b/app/src/test/java/com/duckduckgo/app/survey/rmf/TemporaryDefaultSurveyParametersPluginTest.kt @@ -0,0 +1,72 @@ +package com.duckduckgo.app.survey.rmf + +import com.duckduckgo.app.browser.senseofprotection.SenseOfProtectionToggles +import com.duckduckgo.app.browser.senseofprotection.SenseOfProtectionToggles.Cohorts +import com.duckduckgo.feature.toggles.api.Toggle +import com.duckduckgo.feature.toggles.api.Toggle.State.Cohort +import kotlinx.coroutines.test.runTest +import org.junit.Assert.assertEquals +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever + +class TemporaryDefaultSurveyParametersPluginTest { + + private val mockSenseOfProtectionToggles: SenseOfProtectionToggles = mock() + + @Test + fun givenUserAssignedToModifiedControlThenCohortParamEvaluatesToModifiedControl() = runTest { + val modifiedControlCohort = Cohort(Cohorts.MODIFIED_CONTROL.cohortName, 1) + val mockToggle: Toggle = mock { + on { it.isEnabled() } doReturn true + on { it.getCohort() } doReturn modifiedControlCohort + } + whenever(mockSenseOfProtectionToggles.senseOfProtectionNewUserExperimentApr25()).thenReturn(mockToggle) + + val plugin = SenseOfProtectionCohortSurveyParameterPlugin(mockSenseOfProtectionToggles) + + assertEquals("modifiedControl", plugin.evaluate()) + } + + @Test + fun givenUserAssignedToVariant1ThenCohortParamEvaluatesToVariant1() = runTest { + val modifiedControlCohort = Cohort(Cohorts.VARIANT_1.cohortName, 1) + val mockToggle: Toggle = mock { + on { it.isEnabled() } doReturn true + on { it.getCohort() } doReturn modifiedControlCohort + } + whenever(mockSenseOfProtectionToggles.senseOfProtectionNewUserExperimentApr25()).thenReturn(mockToggle) + + val plugin = SenseOfProtectionCohortSurveyParameterPlugin(mockSenseOfProtectionToggles) + + assertEquals("variant1", plugin.evaluate()) + } + + @Test + fun givenUserAssignedToVariant2ThenCohortParamEvaluatesToVariant2() = runTest { + val modifiedControlCohort = Cohort(Cohorts.VARIANT_2.cohortName, 2) + val mockToggle: Toggle = mock { + on { it.isEnabled() } doReturn true + on { it.getCohort() } doReturn modifiedControlCohort + } + whenever(mockSenseOfProtectionToggles.senseOfProtectionNewUserExperimentApr25()).thenReturn(mockToggle) + + val plugin = SenseOfProtectionCohortSurveyParameterPlugin(mockSenseOfProtectionToggles) + + assertEquals("variant2", plugin.evaluate()) + } + + @Test + fun givenNotAssignedOnSenseOfProtectionExperimentThenCohortParamEvaluatesToEmptyString() = runTest { + val mockToggle: Toggle = mock { + on { it.isEnabled() } doReturn false + on { it.getCohort() } doReturn null + } + whenever(mockSenseOfProtectionToggles.senseOfProtectionNewUserExperimentApr25()).thenReturn(mockToggle) + + val plugin = SenseOfProtectionCohortSurveyParameterPlugin(mockSenseOfProtectionToggles) + + assertEquals("", plugin.evaluate()) + } +}