diff options
| author | saber safavi <saber.safavi@codic.se> | 2023-07-12 14:45:54 +0200 |
|---|---|---|
| committer | saber safavi <saber.safavi@codic.se> | 2023-07-13 14:49:50 +0200 |
| commit | 214a4282860dc4abfa804f29410854fee8a7ce85 (patch) | |
| tree | 075ee7fdc792e5a155715d03e9027d20a6055fd3 /android/app | |
| parent | 8c73ec01fd85a169c43249b0c055b1d1b4e87e94 (diff) | |
| download | mullvadvpn-214a4282860dc4abfa804f29410854fee8a7ce85.tar.xz mullvadvpn-214a4282860dc4abfa804f29410854fee8a7ce85.zip | |
Add screen and view model tests
Diffstat (limited to 'android/app')
2 files changed, 197 insertions, 0 deletions
diff --git a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SettingsScreenTest.kt b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SettingsScreenTest.kt new file mode 100644 index 0000000000..5ed9ac1c8a --- /dev/null +++ b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SettingsScreenTest.kt @@ -0,0 +1,55 @@ +package net.mullvad.mullvadvpn.compose.screen + +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithText +import io.mockk.MockKAnnotations +import net.mullvad.mullvadvpn.compose.state.SettingsUiState +import org.junit.Before +import org.junit.Rule +import org.junit.Test + +class SettingsScreenTest { + @get:Rule val composeTestRule = createComposeRule() + + @Before + fun setup() { + MockKAnnotations.init(this) + } + + @Test + @OptIn(ExperimentalMaterial3Api::class) + fun testLoggedInState() { + // Arrange + composeTestRule.setContent { + SettingsScreen( + uiState = + SettingsUiState(appVersion = "", isLoggedIn = true, isUpdateAvailable = true) + ) + } + // Assert + composeTestRule.apply { + onNodeWithText("VPN settings").assertExists() + onNodeWithText("Split tunneling").assertExists() + onNodeWithText("App version").assertExists() + } + } + + @Test + @OptIn(ExperimentalMaterial3Api::class) + fun testLoggedOutState() { + // Arrange + composeTestRule.setContent { + SettingsScreen( + uiState = + SettingsUiState(appVersion = "", isLoggedIn = false, isUpdateAvailable = true) + ) + } + // Assert + composeTestRule.apply { + onNodeWithText("VPN settings").assertDoesNotExist() + onNodeWithText("Split tunneling").assertDoesNotExist() + onNodeWithText("App version").assertExists() + } + } +} diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SettingsViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SettingsViewModelTest.kt new file mode 100644 index 0000000000..8f32ddcc8e --- /dev/null +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SettingsViewModelTest.kt @@ -0,0 +1,142 @@ +package net.mullvad.mullvadvpn.viewmodel + +import androidx.lifecycle.viewModelScope +import app.cash.turbine.test +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkStatic +import io.mockk.unmockkAll +import kotlin.test.assertEquals +import kotlinx.coroutines.cancel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.test.runTest +import net.mullvad.mullvadvpn.TestCoroutineRule +import net.mullvad.mullvadvpn.model.DeviceState +import net.mullvad.mullvadvpn.repository.DeviceRepository +import net.mullvad.mullvadvpn.ui.VersionInfo +import net.mullvad.mullvadvpn.ui.serviceconnection.AppVersionInfoCache +import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionContainer +import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager +import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionState +import net.mullvad.mullvadvpn.util.appVersionCallbackFlow +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test + +class SettingsViewModelTest { + @get:Rule val testCoroutineRule = TestCoroutineRule() + + private val mockDeviceRepository: DeviceRepository = mockk() + private val mockServiceConnectionManager: ServiceConnectionManager = mockk() + private lateinit var mockAppVersionInfoCache: AppVersionInfoCache + private val mockServiceConnectionContainer: ServiceConnectionContainer = mockk() + + private val serviceConnectionState = + MutableStateFlow<ServiceConnectionState>(ServiceConnectionState.Disconnected) + private val versionInfo = + MutableStateFlow( + VersionInfo( + currentVersion = null, + upgradeVersion = null, + isOutdated = false, + isSupported = false + ) + ) + + private lateinit var viewModel: SettingsViewModel + + @Before + fun setUp() { + mockkStatic(CACHE_EXTENSION_CLASS) + val deviceState = MutableStateFlow<DeviceState>(DeviceState.LoggedOut) + mockAppVersionInfoCache = + mockk<AppVersionInfoCache>().apply { + every { appVersionCallbackFlow() } returns versionInfo + } + + every { mockServiceConnectionManager.connectionState } returns serviceConnectionState + every { mockServiceConnectionContainer.appVersionInfoCache } returns mockAppVersionInfoCache + every { mockDeviceRepository.deviceState } returns deviceState + every { mockAppVersionInfoCache.onUpdate = any() } answers {} + + viewModel = + SettingsViewModel( + deviceRepository = mockDeviceRepository, + serviceConnectionManager = mockServiceConnectionManager + ) + } + + @After + fun tearDown() { + viewModel.viewModelScope.coroutineContext.cancel() + unmockkAll() + } + + @Test + fun test_device_state_default_state() = runTest { + // Act, Assert + viewModel.uiState.test { assertEquals(false, awaitItem().isLoggedIn) } + } + + @Test + fun test_device_state_supported_version_state() = runTest { + // Arrange + val versionInfoTestItem = + VersionInfo( + currentVersion = "1.0", + upgradeVersion = "1.0", + isOutdated = false, + isSupported = true + ) + + // Act, Assert + viewModel.uiState.test { + serviceConnectionState.value = + ServiceConnectionState.ConnectedReady(mockServiceConnectionContainer) + versionInfo.value = versionInfoTestItem + val result = awaitItem() + assertEquals(false, result.isUpdateAvailable) + } + } + + @Test + fun test_device_state_unsupported_version_state() = runTest { + // Arrange + every { mockAppVersionInfoCache.isSupported } returns false + every { mockAppVersionInfoCache.isOutdated } returns false + every { mockAppVersionInfoCache.version } returns "" + + // Act, Assert + viewModel.uiState.test { + awaitItem() + + serviceConnectionState.value = + ServiceConnectionState.ConnectedReady(mockServiceConnectionContainer) + val result = awaitItem() + assertEquals(true, result.isUpdateAvailable) + } + } + + @Test + fun test_device_state_outdated_version_state() = runTest { + // Arrange + every { mockAppVersionInfoCache.isSupported } returns true + every { mockAppVersionInfoCache.isOutdated } returns true + every { mockAppVersionInfoCache.version } returns "" + + // Act, Assert + viewModel.uiState.test { + awaitItem() + + serviceConnectionState.value = + ServiceConnectionState.ConnectedReady(mockServiceConnectionContainer) + val result = awaitItem() + assertEquals(true, result.isUpdateAvailable) + } + } + + companion object { + private const val CACHE_EXTENSION_CLASS = "net.mullvad.mullvadvpn.util.CacheExtensionsKt" + } +} |
