@@ -18,6 +18,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
18
18
import kotlinx.coroutines.test.runTest
19
19
import net.mullvad.mullvadvpn.applist.AppData
20
20
import net.mullvad.mullvadvpn.applist.ApplicationsProvider
21
+ import net.mullvad.mullvadvpn.compose.state.AppListState
21
22
import net.mullvad.mullvadvpn.compose.state.SplitTunnelingUiState
22
23
import net.mullvad.mullvadvpn.lib.common.test.TestCoroutineRule
23
24
import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionContainer
@@ -57,7 +58,7 @@ class SplitTunnelingViewModelTest {
57
58
initTestSubject(emptyList())
58
59
val actualState: SplitTunnelingUiState = testSubject.uiState.value
59
60
60
- val initialExpectedState = SplitTunnelingUiState . Loading
61
+ val initialExpectedState = SplitTunnelingUiState ()
61
62
62
63
assertEquals(initialExpectedState, actualState)
63
64
@@ -71,12 +72,21 @@ class SplitTunnelingViewModelTest {
71
72
{
72
73
lambda< (Set <String >) -> Unit > ().invoke(emptySet())
73
74
}
75
+ every { mockedSplitTunneling.enabledChange = captureLambda() } answers
76
+ {
77
+ lambda< (Boolean ) -> Unit > ().invoke(true )
78
+ }
79
+
74
80
initTestSubject(emptyList())
75
81
val expectedState =
76
- SplitTunnelingUiState .ShowAppList (
77
- excludedApps = emptyList(),
78
- includedApps = emptyList(),
79
- showSystemApps = false
82
+ SplitTunnelingUiState (
83
+ enabled = true ,
84
+ appListState =
85
+ AppListState .ShowAppList (
86
+ excludedApps = emptyList(),
87
+ includedApps = emptyList(),
88
+ showSystemApps = false
89
+ )
80
90
)
81
91
testSubject.uiState.test { assertEquals(expectedState, awaitItem()) }
82
92
}
@@ -90,21 +100,31 @@ class SplitTunnelingViewModelTest {
90
100
{
91
101
lambda< (Set <String >) -> Unit > ().invoke(setOf (appExcluded.packageName))
92
102
}
103
+ every { mockedSplitTunneling.enabledChange = captureLambda() } answers
104
+ {
105
+ lambda< (Boolean ) -> Unit > ().invoke(true )
106
+ }
107
+
108
+ every { mockedSplitTunneling.enableSplitTunneling(any()) } just runs
93
109
94
110
initTestSubject(listOf (appExcluded, appNotExcluded))
95
111
96
112
val expectedState =
97
- SplitTunnelingUiState .ShowAppList (
98
- excludedApps = listOf (appExcluded),
99
- includedApps = listOf (appNotExcluded),
100
- showSystemApps = false
113
+ SplitTunnelingUiState (
114
+ enabled = true ,
115
+ appListState =
116
+ AppListState .ShowAppList (
117
+ excludedApps = listOf (appExcluded),
118
+ includedApps = listOf (appNotExcluded),
119
+ showSystemApps = false
120
+ )
101
121
)
102
122
103
123
testSubject.uiState.test {
104
124
val actualState = awaitItem()
105
125
assertEquals(expectedState, actualState)
106
126
verifyAll {
107
- mockedSplitTunneling.enabled
127
+ mockedSplitTunneling.enabledChange = any()
108
128
mockedSplitTunneling.excludedAppsChange = any()
109
129
}
110
130
}
@@ -121,20 +141,32 @@ class SplitTunnelingViewModelTest {
121
141
excludedAppsCallback = lambda()
122
142
excludedAppsCallback.invoke(setOf (app.packageName))
123
143
}
144
+ every { mockedSplitTunneling.enabledChange = captureLambda() } answers
145
+ {
146
+ lambda< (Boolean ) -> Unit > ().invoke(true )
147
+ }
124
148
125
149
initTestSubject(listOf (app))
126
150
127
151
val expectedStateBeforeAction =
128
- SplitTunnelingUiState .ShowAppList (
129
- excludedApps = listOf (app),
130
- includedApps = emptyList(),
131
- showSystemApps = false
152
+ SplitTunnelingUiState (
153
+ enabled = true ,
154
+ appListState =
155
+ AppListState .ShowAppList (
156
+ excludedApps = listOf (app),
157
+ includedApps = emptyList(),
158
+ showSystemApps = false
159
+ )
132
160
)
133
161
val expectedStateAfterAction =
134
- SplitTunnelingUiState .ShowAppList (
135
- excludedApps = emptyList(),
136
- includedApps = listOf (app),
137
- showSystemApps = false
162
+ SplitTunnelingUiState (
163
+ enabled = true ,
164
+ appListState =
165
+ AppListState .ShowAppList (
166
+ excludedApps = emptyList(),
167
+ includedApps = listOf (app),
168
+ showSystemApps = false
169
+ )
138
170
)
139
171
140
172
testSubject.uiState.test {
@@ -144,7 +176,7 @@ class SplitTunnelingViewModelTest {
144
176
assertEquals(expectedStateAfterAction, awaitItem())
145
177
146
178
verifyAll {
147
- mockedSplitTunneling.enabled
179
+ mockedSplitTunneling.enabledChange = any()
148
180
mockedSplitTunneling.excludedAppsChange = any()
149
181
mockedSplitTunneling.includeApp(app.packageName)
150
182
}
@@ -162,21 +194,33 @@ class SplitTunnelingViewModelTest {
162
194
excludedAppsCallback = lambda()
163
195
excludedAppsCallback.invoke(emptySet())
164
196
}
197
+ every { mockedSplitTunneling.enabledChange = captureLambda() } answers
198
+ {
199
+ lambda< (Boolean ) -> Unit > ().invoke(true )
200
+ }
165
201
166
202
initTestSubject(listOf (app))
167
203
168
204
val expectedStateBeforeAction =
169
- SplitTunnelingUiState .ShowAppList (
170
- excludedApps = emptyList(),
171
- includedApps = listOf (app),
172
- showSystemApps = false
205
+ SplitTunnelingUiState (
206
+ enabled = true ,
207
+ appListState =
208
+ AppListState .ShowAppList (
209
+ excludedApps = emptyList(),
210
+ includedApps = listOf (app),
211
+ showSystemApps = false
212
+ )
173
213
)
174
214
175
215
val expectedStateAfterAction =
176
- SplitTunnelingUiState .ShowAppList (
177
- excludedApps = listOf (app),
178
- includedApps = emptyList(),
179
- showSystemApps = false
216
+ SplitTunnelingUiState (
217
+ enabled = true ,
218
+ appListState =
219
+ AppListState .ShowAppList (
220
+ excludedApps = listOf (app),
221
+ includedApps = emptyList(),
222
+ showSystemApps = false
223
+ )
180
224
)
181
225
182
226
testSubject.uiState.test {
@@ -186,13 +230,36 @@ class SplitTunnelingViewModelTest {
186
230
assertEquals(expectedStateAfterAction, awaitItem())
187
231
188
232
verifyAll {
189
- mockedSplitTunneling.enabled
233
+ mockedSplitTunneling.enabledChange = any()
190
234
mockedSplitTunneling.excludedAppsChange = any()
191
235
mockedSplitTunneling.excludeApp(app.packageName)
192
236
}
193
237
}
194
238
}
195
239
240
+ @Test
241
+ fun test_disabled_state () =
242
+ runTest(testCoroutineRule.testDispatcher) {
243
+ every { mockedSplitTunneling.excludedAppsChange = captureLambda() } answers
244
+ {
245
+ lambda< (Set <String >) -> Unit > ().invoke(emptySet())
246
+ }
247
+ every { mockedSplitTunneling.enabledChange = captureLambda() } answers
248
+ {
249
+ lambda< (Boolean ) -> Unit > ().invoke(false )
250
+ }
251
+
252
+ initTestSubject(emptyList())
253
+
254
+ val expectedState =
255
+ SplitTunnelingUiState (enabled = false , appListState = AppListState .Disabled )
256
+
257
+ testSubject.uiState.test {
258
+ val actualState = awaitItem()
259
+ assertEquals(expectedState, actualState)
260
+ }
261
+ }
262
+
196
263
private fun initTestSubject (appList : List <AppData >) {
197
264
every { mockedApplicationsProvider.getAppsList() } returns appList
198
265
every { mockedServiceConnectionManager.connectionState } returns
0 commit comments