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