diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-07-18 14:28:17 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-09-26 10:36:41 +0200 |
| commit | 3b5218697a5ee581b36839941573c05d212e1e3b (patch) | |
| tree | 18b5e7e689c4030efd570c20375fbb83064cb807 /android | |
| parent | 63300e2542601610aeb7c0568509edf04a844fcb (diff) | |
| download | mullvadvpn-3b5218697a5ee581b36839941573c05d212e1e3b.tar.xz mullvadvpn-3b5218697a5ee581b36839941573c05d212e1e3b.zip | |
Update and add unit tests
Diffstat (limited to 'android')
2 files changed, 115 insertions, 0 deletions
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/AutoStartAndConnectOnBootRepositoryTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/AutoStartAndConnectOnBootRepositoryTest.kt new file mode 100644 index 0000000000..f29ba4c2df --- /dev/null +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/AutoStartAndConnectOnBootRepositoryTest.kt @@ -0,0 +1,73 @@ +package net.mullvad.mullvadvpn.repository + +import android.content.ComponentName +import android.content.pm.PackageManager +import app.cash.turbine.test +import io.mockk.Runs +import io.mockk.every +import io.mockk.just +import io.mockk.mockk +import io.mockk.verify +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test + +class AutoStartAndConnectOnBootRepositoryTest { + + private val mockPackageManager: PackageManager = mockk() + private val mockComponentName: ComponentName = mockk() + + private lateinit var autoStartAndConnectOnBootRepository: AutoStartAndConnectOnBootRepository + + @BeforeEach + fun setUp() { + every { mockPackageManager.getComponentEnabledSetting(mockComponentName) } returns + PackageManager.COMPONENT_ENABLED_STATE_DEFAULT + + autoStartAndConnectOnBootRepository = + AutoStartAndConnectOnBootRepository( + packageManager = mockPackageManager, + bootCompletedComponentName = mockComponentName, + ) + } + + @Test + fun `autoStartAndConnectOnBoot should emit false when default state is returned by package manager`() = + runTest { + // Assert + autoStartAndConnectOnBootRepository.autoStartAndConnectOnBoot.test { + assertEquals(false, awaitItem()) + } + } + + @Test + fun `when setting autoStartAndConnectOnBoot to true should call package manager and update autoStartAndConnectOnBoot`() = + runTest { + // Arrange + val targetState = true + every { + mockPackageManager.setComponentEnabledSetting( + mockComponentName, + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, + PackageManager.DONT_KILL_APP, + ) + } just Runs + every { mockPackageManager.getComponentEnabledSetting(mockComponentName) } returns + PackageManager.COMPONENT_ENABLED_STATE_ENABLED + + // Act, Assert + autoStartAndConnectOnBootRepository.autoStartAndConnectOnBoot.test { + assertEquals(false, awaitItem()) // Default state + autoStartAndConnectOnBootRepository.setAutoStartAndConnectOnBoot(targetState) + verify { + mockPackageManager.setComponentEnabledSetting( + mockComponentName, + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, + PackageManager.DONT_KILL_APP, + ) + } + assertEquals(targetState, awaitItem()) + } + } +} diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelTest.kt index 1e15b1956a..5b878b52b9 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelTest.kt @@ -3,11 +3,14 @@ package net.mullvad.mullvadvpn.viewmodel import androidx.lifecycle.viewModelScope import app.cash.turbine.test import arrow.core.right +import io.mockk.Runs import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every +import io.mockk.just import io.mockk.mockk import io.mockk.unmockkAll +import io.mockk.verify import kotlin.test.assertEquals import kotlin.test.assertIs import kotlinx.coroutines.cancel @@ -26,6 +29,7 @@ import net.mullvad.mullvadvpn.lib.model.Settings import net.mullvad.mullvadvpn.lib.model.TunnelOptions import net.mullvad.mullvadvpn.lib.model.WireguardConstraints import net.mullvad.mullvadvpn.lib.model.WireguardTunnelOptions +import net.mullvad.mullvadvpn.repository.AutoStartAndConnectOnBootRepository import net.mullvad.mullvadvpn.repository.RelayListRepository import net.mullvad.mullvadvpn.repository.SettingsRepository import net.mullvad.mullvadvpn.usecase.SystemVpnSettingsAvailableUseCase @@ -41,9 +45,12 @@ class VpnSettingsViewModelTest { private val mockSystemVpnSettingsUseCase: SystemVpnSettingsAvailableUseCase = mockk(relaxed = true) private val mockRelayListRepository: RelayListRepository = mockk() + private val mockAutoStartAndConnectOnBootRepository: AutoStartAndConnectOnBootRepository = + mockk() private val mockSettingsUpdate = MutableStateFlow<Settings?>(null) private val portRangeFlow = MutableStateFlow(emptyList<PortRange>()) + private val autoStartAndConnectOnBootFlow = MutableStateFlow(false) private lateinit var viewModel: VpnSettingsViewModel @@ -51,6 +58,8 @@ class VpnSettingsViewModelTest { fun setup() { every { mockSettingsRepository.settingsUpdates } returns mockSettingsUpdate every { mockRelayListRepository.portRanges } returns portRangeFlow + every { mockAutoStartAndConnectOnBootRepository.autoStartAndConnectOnBoot } returns + autoStartAndConnectOnBootFlow viewModel = VpnSettingsViewModel( @@ -58,6 +67,7 @@ class VpnSettingsViewModelTest { systemVpnSettingsUseCase = mockSystemVpnSettingsUseCase, relayListRepository = mockRelayListRepository, dispatcher = UnconfinedTestDispatcher(), + autoStartAndConnectOnBootRepository = mockAutoStartAndConnectOnBootRepository, ) } @@ -195,4 +205,36 @@ class VpnSettingsViewModelTest { assertEquals(systemVpnSettingsAvailable, awaitItem().systemVpnSettingsAvailable) } } + + @Test + fun `when autoStartAndConnectOnBoot is true then uiState should be autoStart=true`() = runTest { + // Arrange + val connectOnStart = true + + // Act + autoStartAndConnectOnBootFlow.value = connectOnStart + + // Assert + viewModel.uiState.test { + assertEquals(connectOnStart, awaitItem().autoStartAndConnectOnBoot) + } + } + + @Test + fun `calling onToggleAutoStartAndConnectOnBoot should call autoStartAndConnectOnBoot`() = + runTest { + // Arrange + val targetState = true + every { + mockAutoStartAndConnectOnBootRepository.setAutoStartAndConnectOnBoot(targetState) + } just Runs + + // Act + viewModel.onToggleAutoStartAndConnectOnBoot(targetState) + + // Assert + verify { + mockAutoStartAndConnectOnBootRepository.setAutoStartAndConnectOnBoot(targetState) + } + } } |
