1616
1717package com.duckduckgo.settings.impl
1818
19+ import android.annotation.SuppressLint
1920import androidx.test.ext.junit.runners.AndroidJUnit4
2021import app.cash.turbine.test
2122import com.duckduckgo.common.test.CoroutineTestRule
23+ import com.duckduckgo.common.utils.plugins.PluginPoint
24+ import com.duckduckgo.contentscopescripts.api.ContentScopeScriptsSubscriptionEventPlugin
25+ import com.duckduckgo.feature.toggles.api.FakeFeatureToggleFactory
26+ import com.duckduckgo.feature.toggles.api.Toggle.State
27+ import com.duckduckgo.js.messaging.api.SubscriptionEventData
28+ import com.duckduckgo.settings.api.SettingsPageFeature
2229import com.duckduckgo.settings.impl.SettingsWebViewViewModel.Command
2330import kotlinx.coroutines.ExperimentalCoroutinesApi
2431import kotlinx.coroutines.test.runTest
32+ import org.json.JSONObject
2533import org.junit.Assert.assertEquals
2634import org.junit.Assert.assertTrue
2735import org.junit.Before
2836import org.junit.Rule
2937import org.junit.Test
3038import org.junit.runner.RunWith
3139
40+ @SuppressLint(" DenyListedApi" )
3241@OptIn(ExperimentalCoroutinesApi ::class )
3342@RunWith(AndroidJUnit4 ::class )
3443class SettingsWebViewViewModelTest {
@@ -37,10 +46,17 @@ class SettingsWebViewViewModelTest {
3746 val coroutineTestRule: CoroutineTestRule = CoroutineTestRule ()
3847
3948 private lateinit var viewModel: SettingsWebViewViewModel
49+ private lateinit var fakeContentScopeScriptsSubscriptionEventPluginPoint: FakeContentScopeScriptsSubscriptionEventPluginPoint
50+ private var fakeSettingsPageFeature = FakeFeatureToggleFactory .create(SettingsPageFeature ::class .java)
4051
4152 @Before
4253 fun setup () {
43- viewModel = SettingsWebViewViewModel ()
54+ fakeContentScopeScriptsSubscriptionEventPluginPoint = FakeContentScopeScriptsSubscriptionEventPluginPoint ()
55+
56+ viewModel = SettingsWebViewViewModel (
57+ contentScopeScriptsSubscriptionEventPluginPoint = fakeContentScopeScriptsSubscriptionEventPluginPoint,
58+ settingsPageFeature = fakeSettingsPageFeature,
59+ )
4460 }
4561
4662 @Test
@@ -64,4 +80,102 @@ class SettingsWebViewViewModelTest {
6480 assertTrue(command is Command .Exit )
6581 }
6682 }
83+
84+ @Test
85+ fun whenOnViewResumedWithNoPluginsThenNoSubscriptionEventsSent () = runTest {
86+ fakeSettingsPageFeature.serpSettingsSync().setRawStoredState(State (enable = true ))
87+
88+ viewModel.onResume()
89+
90+ viewModel.subscriptionEventDataFlow.test {
91+ expectNoEvents()
92+ cancelAndIgnoreRemainingEvents()
93+ }
94+ }
95+
96+ @Test
97+ fun whenOnViewResumedWithPluginsThenSubscriptionEventsSent () = runTest {
98+ fakeSettingsPageFeature.serpSettingsSync().setRawStoredState(State (enable = true ))
99+ val events = mutableListOf<SubscriptionEventData >().apply {
100+ add(
101+ SubscriptionEventData (
102+ featureName = " event1" ,
103+ subscriptionName = " subscription1" ,
104+ params = JSONObject ().put(" param1" , " value1" ),
105+ ),
106+ )
107+ add(
108+ SubscriptionEventData (
109+ featureName = " event2" ,
110+ subscriptionName = " subscription2" ,
111+ params = JSONObject ().put(" param2" , " value2" ),
112+ ),
113+ )
114+ }
115+
116+ fakeContentScopeScriptsSubscriptionEventPluginPoint.addPlugins(
117+ events.map { FakeContentScopeScriptsSubscriptionEventPlugin (it) },
118+ )
119+
120+ viewModel.onResume()
121+
122+ viewModel.subscriptionEventDataFlow.test {
123+ for (expectedEvent in events) {
124+ val emittedEvent = awaitItem()
125+ assertEquals(expectedEvent.featureName, emittedEvent.featureName)
126+ assertEquals(expectedEvent.subscriptionName, emittedEvent.subscriptionName)
127+ assertEquals(expectedEvent.params.toString(), emittedEvent.params.toString())
128+ }
129+ cancelAndIgnoreRemainingEvents()
130+ }
131+ }
132+
133+ @Test
134+ fun whenOnViewResumedWithPluginsAndSerpSettingsFeatureFlagOffThenNoEventsSent () = runTest {
135+ fakeSettingsPageFeature.serpSettingsSync().setRawStoredState(State (enable = false ))
136+ val events = mutableListOf<SubscriptionEventData >().apply {
137+ add(
138+ SubscriptionEventData (
139+ featureName = " event1" ,
140+ subscriptionName = " subscription1" ,
141+ params = JSONObject ().put(" param1" , " value1" ),
142+ ),
143+ )
144+ add(
145+ SubscriptionEventData (
146+ featureName = " event2" ,
147+ subscriptionName = " subscription2" ,
148+ params = JSONObject ().put(" param2" , " value2" ),
149+ ),
150+ )
151+ }
152+
153+ fakeContentScopeScriptsSubscriptionEventPluginPoint.addPlugins(
154+ events.map { FakeContentScopeScriptsSubscriptionEventPlugin (it) },
155+ )
156+
157+ viewModel.onResume()
158+
159+ viewModel.subscriptionEventDataFlow.test {
160+ expectNoEvents()
161+ cancelAndIgnoreRemainingEvents()
162+ }
163+ }
164+ }
165+
166+ class FakeContentScopeScriptsSubscriptionEventPlugin (
167+ private val eventData : SubscriptionEventData ,
168+ ) : ContentScopeScriptsSubscriptionEventPlugin {
169+ override fun getSubscriptionEventData (): SubscriptionEventData = eventData
170+ }
171+
172+ class FakeContentScopeScriptsSubscriptionEventPluginPoint () : PluginPoint<ContentScopeScriptsSubscriptionEventPlugin> {
173+
174+ private val plugins: MutableList <ContentScopeScriptsSubscriptionEventPlugin > = mutableListOf ()
175+
176+ fun addPlugins (plugins : List <ContentScopeScriptsSubscriptionEventPlugin >) {
177+ this .plugins.addAll(plugins)
178+ }
179+
180+ override fun getPlugins (): Collection <ContentScopeScriptsSubscriptionEventPlugin > = plugins
67181}
0 commit comments