diff --git a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreenTest.kt b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreenTest.kt index a4f6d1ab4a38..8b3cdeca2e27 100644 --- a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreenTest.kt +++ b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreenTest.kt @@ -34,7 +34,9 @@ class SplitTunnelingScreenTest { fun testLoadingState() = composeExtension.use { // Arrange - setContentWithTheme { SplitTunnelingScreen(uiState = SplitTunnelingUiState.Loading) } + setContentWithTheme { + SplitTunnelingScreen(uiState = SplitTunnelingUiState.Loading(enabled = true)) + } // Assert onNodeWithText(TITLE).assertExists() @@ -64,6 +66,7 @@ class SplitTunnelingScreenTest { SplitTunnelingScreen( uiState = SplitTunnelingUiState.ShowAppList( + enabled = true, excludedApps = listOf(excludedApp), includedApps = listOf(includedApp), showSystemApps = false @@ -95,6 +98,7 @@ class SplitTunnelingScreenTest { SplitTunnelingScreen( uiState = SplitTunnelingUiState.ShowAppList( + enabled = true, excludedApps = emptyList(), includedApps = listOf(includedApp), showSystemApps = false @@ -133,6 +137,7 @@ class SplitTunnelingScreenTest { SplitTunnelingScreen( uiState = SplitTunnelingUiState.ShowAppList( + enabled = true, excludedApps = listOf(excludedApp), includedApps = listOf(includedApp), showSystemApps = false @@ -169,6 +174,7 @@ class SplitTunnelingScreenTest { SplitTunnelingScreen( uiState = SplitTunnelingUiState.ShowAppList( + enabled = true, excludedApps = listOf(excludedApp), includedApps = listOf(includedApp), showSystemApps = false @@ -205,6 +211,7 @@ class SplitTunnelingScreenTest { SplitTunnelingScreen( uiState = SplitTunnelingUiState.ShowAppList( + enabled = true, excludedApps = listOf(excludedApp), includedApps = listOf(includedApp), showSystemApps = false diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt index 7b2b4cacd5fb..c0d349e1dac1 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt @@ -57,7 +57,7 @@ class SplitTunnelingViewModelTest { initTestSubject(emptyList()) val actualState: SplitTunnelingUiState = testSubject.uiState.value - val initialExpectedState = SplitTunnelingUiState.Loading + val initialExpectedState = SplitTunnelingUiState.Loading(enabled = false) assertEquals(initialExpectedState, actualState) @@ -70,9 +70,14 @@ class SplitTunnelingViewModelTest { { lambda<(Set) -> Unit>().invoke(emptySet()) } + every { mockedSplitTunneling.enabledChange = captureLambda() } answers + { + lambda<(Boolean) -> Unit>().invoke(true) + } initTestSubject(emptyList()) val expectedState = SplitTunnelingUiState.ShowAppList( + enabled = true, excludedApps = emptyList(), includedApps = emptyList(), showSystemApps = false @@ -88,11 +93,16 @@ class SplitTunnelingViewModelTest { { lambda<(Set) -> Unit>().invoke(setOf(appExcluded.packageName)) } + every { mockedSplitTunneling.enabledChange = captureLambda() } answers + { + lambda<(Boolean) -> Unit>().invoke(true) + } initTestSubject(listOf(appExcluded, appNotExcluded)) val expectedState = SplitTunnelingUiState.ShowAppList( + enabled = true, excludedApps = listOf(appExcluded), includedApps = listOf(appNotExcluded), showSystemApps = false @@ -102,7 +112,7 @@ class SplitTunnelingViewModelTest { val actualState = awaitItem() assertEquals(expectedState, actualState) verifyAll { - mockedSplitTunneling.enabled + mockedSplitTunneling.enabledChange = any() mockedSplitTunneling.excludedAppsChange = any() } } @@ -118,17 +128,23 @@ class SplitTunnelingViewModelTest { excludedAppsCallback = lambda() excludedAppsCallback.invoke(setOf(app.packageName)) } + every { mockedSplitTunneling.enabledChange = captureLambda() } answers + { + lambda<(Boolean) -> Unit>().invoke(true) + } initTestSubject(listOf(app)) val expectedStateBeforeAction = SplitTunnelingUiState.ShowAppList( + enabled = true, excludedApps = listOf(app), includedApps = emptyList(), showSystemApps = false ) val expectedStateAfterAction = SplitTunnelingUiState.ShowAppList( + enabled = true, excludedApps = emptyList(), includedApps = listOf(app), showSystemApps = false @@ -141,7 +157,7 @@ class SplitTunnelingViewModelTest { assertEquals(expectedStateAfterAction, awaitItem()) verifyAll { - mockedSplitTunneling.enabled + mockedSplitTunneling.enabledChange = any() mockedSplitTunneling.excludedAppsChange = any() mockedSplitTunneling.includeApp(app.packageName) } @@ -158,11 +174,16 @@ class SplitTunnelingViewModelTest { excludedAppsCallback = lambda() excludedAppsCallback.invoke(emptySet()) } + every { mockedSplitTunneling.enabledChange = captureLambda() } answers + { + lambda<(Boolean) -> Unit>().invoke(true) + } initTestSubject(listOf(app)) val expectedStateBeforeAction = SplitTunnelingUiState.ShowAppList( + enabled = true, excludedApps = emptyList(), includedApps = listOf(app), showSystemApps = false @@ -170,6 +191,7 @@ class SplitTunnelingViewModelTest { val expectedStateAfterAction = SplitTunnelingUiState.ShowAppList( + enabled = true, excludedApps = listOf(app), includedApps = emptyList(), showSystemApps = false @@ -182,13 +204,34 @@ class SplitTunnelingViewModelTest { assertEquals(expectedStateAfterAction, awaitItem()) verifyAll { - mockedSplitTunneling.enabled + mockedSplitTunneling.enabledChange = any() mockedSplitTunneling.excludedAppsChange = any() mockedSplitTunneling.excludeApp(app.packageName) } } } + @Test + fun test_disabled_state() = runTest { + every { mockedSplitTunneling.excludedAppsChange = captureLambda() } answers + { + lambda<(Set) -> Unit>().invoke(emptySet()) + } + every { mockedSplitTunneling.enabledChange = captureLambda() } answers + { + lambda<(Boolean) -> Unit>().invoke(false) + } + + initTestSubject(emptyList()) + + val expectedState = SplitTunnelingUiState.ShowAppList(enabled = false) + + testSubject.uiState.test { + val actualState = awaitItem() + assertEquals(expectedState, actualState) + } + } + private fun initTestSubject(appList: List) { every { mockedApplicationsProvider.getAppsList() } returns appList every { mockedServiceConnectionManager.connectionState } returns