Skip to content

Commit fc86c9c

Browse files
MaryamShaghaghiBoki91
authored andcommitted
Add test for split tunneling view model and update the other tests
Co-Authored-By: Boban Sijuk <49131853+Boki91@users.noreply.github.com>
1 parent e56928d commit fc86c9c

File tree

2 files changed

+132
-49
lines changed

2 files changed

+132
-49
lines changed

android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreenTest.kt

+37-21
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import io.mockk.verify
1212
import net.mullvad.mullvadvpn.applist.AppData
1313
import net.mullvad.mullvadvpn.applist.ApplicationsIconManager
1414
import net.mullvad.mullvadvpn.compose.setContentWithTheme
15+
import net.mullvad.mullvadvpn.compose.state.AppListState
1516
import net.mullvad.mullvadvpn.compose.state.SplitTunnelingUiState
1617
import org.junit.After
1718
import org.junit.Before
@@ -49,7 +50,7 @@ class SplitTunnelingScreenTest {
4950
fun testLoadingState() {
5051
// Arrange
5152
composeTestRule.setContentWithTheme {
52-
SplitTunnelingScreen(uiState = SplitTunnelingUiState.Loading)
53+
SplitTunnelingScreen(uiState = SplitTunnelingUiState())
5354
}
5455

5556
// Assert
@@ -72,10 +73,13 @@ class SplitTunnelingScreenTest {
7273
composeTestRule.setContentWithTheme {
7374
SplitTunnelingScreen(
7475
uiState =
75-
SplitTunnelingUiState.ShowAppList(
76-
excludedApps = listOf(excludedApp),
77-
includedApps = listOf(includedApp),
78-
showSystemApps = false
76+
SplitTunnelingUiState(
77+
appListState =
78+
AppListState.ShowAppList(
79+
excludedApps = listOf(excludedApp),
80+
includedApps = listOf(includedApp),
81+
showSystemApps = false
82+
)
7983
)
8084
)
8185
}
@@ -100,10 +104,13 @@ class SplitTunnelingScreenTest {
100104
composeTestRule.setContentWithTheme {
101105
SplitTunnelingScreen(
102106
uiState =
103-
SplitTunnelingUiState.ShowAppList(
104-
excludedApps = emptyList(),
105-
includedApps = listOf(includedApp),
106-
showSystemApps = false
107+
SplitTunnelingUiState(
108+
appListState =
109+
AppListState.ShowAppList(
110+
excludedApps = emptyList(),
111+
includedApps = listOf(includedApp),
112+
showSystemApps = false
113+
)
107114
)
108115
)
109116
}
@@ -131,10 +138,13 @@ class SplitTunnelingScreenTest {
131138
composeTestRule.setContentWithTheme {
132139
SplitTunnelingScreen(
133140
uiState =
134-
SplitTunnelingUiState.ShowAppList(
135-
excludedApps = listOf(excludedApp),
136-
includedApps = listOf(includedApp),
137-
showSystemApps = false
141+
SplitTunnelingUiState(
142+
appListState =
143+
AppListState.ShowAppList(
144+
excludedApps = listOf(excludedApp),
145+
includedApps = listOf(includedApp),
146+
showSystemApps = false
147+
)
138148
),
139149
onExcludeAppClick = mockedClickHandler
140150
)
@@ -158,10 +168,13 @@ class SplitTunnelingScreenTest {
158168
composeTestRule.setContentWithTheme {
159169
SplitTunnelingScreen(
160170
uiState =
161-
SplitTunnelingUiState.ShowAppList(
162-
excludedApps = listOf(excludedApp),
163-
includedApps = listOf(includedApp),
164-
showSystemApps = false
171+
SplitTunnelingUiState(
172+
appListState =
173+
AppListState.ShowAppList(
174+
excludedApps = listOf(excludedApp),
175+
includedApps = listOf(includedApp),
176+
showSystemApps = false
177+
)
165178
),
166179
onIncludeAppClick = mockedClickHandler
167180
)
@@ -185,10 +198,13 @@ class SplitTunnelingScreenTest {
185198
composeTestRule.setContentWithTheme {
186199
SplitTunnelingScreen(
187200
uiState =
188-
SplitTunnelingUiState.ShowAppList(
189-
excludedApps = listOf(excludedApp),
190-
includedApps = listOf(includedApp),
191-
showSystemApps = false
201+
SplitTunnelingUiState(
202+
appListState =
203+
AppListState.ShowAppList(
204+
excludedApps = listOf(excludedApp),
205+
includedApps = listOf(includedApp),
206+
showSystemApps = false
207+
)
192208
),
193209
onShowSystemAppsClick = mockedClickHandler
194210
)

android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt

+95-28
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
1818
import kotlinx.coroutines.test.runTest
1919
import net.mullvad.mullvadvpn.applist.AppData
2020
import net.mullvad.mullvadvpn.applist.ApplicationsProvider
21+
import net.mullvad.mullvadvpn.compose.state.AppListState
2122
import net.mullvad.mullvadvpn.compose.state.SplitTunnelingUiState
2223
import net.mullvad.mullvadvpn.lib.common.test.TestCoroutineRule
2324
import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionContainer
@@ -57,7 +58,7 @@ class SplitTunnelingViewModelTest {
5758
initTestSubject(emptyList())
5859
val actualState: SplitTunnelingUiState = testSubject.uiState.value
5960

60-
val initialExpectedState = SplitTunnelingUiState.Loading
61+
val initialExpectedState = SplitTunnelingUiState()
6162

6263
assertEquals(initialExpectedState, actualState)
6364

@@ -71,12 +72,21 @@ class SplitTunnelingViewModelTest {
7172
{
7273
lambda<(Set<String>) -> Unit>().invoke(emptySet())
7374
}
75+
every { mockedSplitTunneling.enabledChange = captureLambda() } answers
76+
{
77+
lambda<(Boolean) -> Unit>().invoke(true)
78+
}
79+
7480
initTestSubject(emptyList())
7581
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+
)
8090
)
8191
testSubject.uiState.test { assertEquals(expectedState, awaitItem()) }
8292
}
@@ -90,21 +100,31 @@ class SplitTunnelingViewModelTest {
90100
{
91101
lambda<(Set<String>) -> Unit>().invoke(setOf(appExcluded.packageName))
92102
}
103+
every { mockedSplitTunneling.enabledChange = captureLambda() } answers
104+
{
105+
lambda<(Boolean) -> Unit>().invoke(true)
106+
}
107+
108+
every { mockedSplitTunneling.enableSplitTunneling(any()) } just runs
93109

94110
initTestSubject(listOf(appExcluded, appNotExcluded))
95111

96112
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+
)
101121
)
102122

103123
testSubject.uiState.test {
104124
val actualState = awaitItem()
105125
assertEquals(expectedState, actualState)
106126
verifyAll {
107-
mockedSplitTunneling.enabled
127+
mockedSplitTunneling.enabledChange = any()
108128
mockedSplitTunneling.excludedAppsChange = any()
109129
}
110130
}
@@ -121,20 +141,32 @@ class SplitTunnelingViewModelTest {
121141
excludedAppsCallback = lambda()
122142
excludedAppsCallback.invoke(setOf(app.packageName))
123143
}
144+
every { mockedSplitTunneling.enabledChange = captureLambda() } answers
145+
{
146+
lambda<(Boolean) -> Unit>().invoke(true)
147+
}
124148

125149
initTestSubject(listOf(app))
126150

127151
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+
)
132160
)
133161
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+
)
138170
)
139171

140172
testSubject.uiState.test {
@@ -144,7 +176,7 @@ class SplitTunnelingViewModelTest {
144176
assertEquals(expectedStateAfterAction, awaitItem())
145177

146178
verifyAll {
147-
mockedSplitTunneling.enabled
179+
mockedSplitTunneling.enabledChange = any()
148180
mockedSplitTunneling.excludedAppsChange = any()
149181
mockedSplitTunneling.includeApp(app.packageName)
150182
}
@@ -162,21 +194,33 @@ class SplitTunnelingViewModelTest {
162194
excludedAppsCallback = lambda()
163195
excludedAppsCallback.invoke(emptySet())
164196
}
197+
every { mockedSplitTunneling.enabledChange = captureLambda() } answers
198+
{
199+
lambda<(Boolean) -> Unit>().invoke(true)
200+
}
165201

166202
initTestSubject(listOf(app))
167203

168204
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+
)
173213
)
174214

175215
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+
)
180224
)
181225

182226
testSubject.uiState.test {
@@ -186,13 +230,36 @@ class SplitTunnelingViewModelTest {
186230
assertEquals(expectedStateAfterAction, awaitItem())
187231

188232
verifyAll {
189-
mockedSplitTunneling.enabled
233+
mockedSplitTunneling.enabledChange = any()
190234
mockedSplitTunneling.excludedAppsChange = any()
191235
mockedSplitTunneling.excludeApp(app.packageName)
192236
}
193237
}
194238
}
195239

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+
196263
private fun initTestSubject(appList: List<AppData>) {
197264
every { mockedApplicationsProvider.getAppsList() } returns appList
198265
every { mockedServiceConnectionManager.connectionState } returns

0 commit comments

Comments
 (0)