diff options
Diffstat (limited to 'android')
3 files changed, 107 insertions, 0 deletions
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index afd32e22e7..c7baf5b7d0 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -120,6 +120,10 @@ android { packagingOptions { jniLibs.useLegacyPackaging = true + + // Fixes packaging error caused by: androidx.compose.ui:ui-test-junit4 + pickFirst("META-INF/AL2.0") + pickFirst("META-INF/LGPL2.1") } project.tasks.preBuild.dependsOn("ensureJniDirectoryExist") @@ -202,8 +206,10 @@ dependencies { // UI test dependencies debugImplementation(Dependencies.AndroidX.fragmentTestning) + debugImplementation(Dependencies.Compose.testManifest) androidTestImplementation(Dependencies.AndroidX.espressoContrib) androidTestImplementation(Dependencies.AndroidX.espressoCore) + androidTestImplementation(Dependencies.Compose.junit) androidTestImplementation(Dependencies.Koin.test) androidTestImplementation(Dependencies.Kotlin.test) androidTestImplementation(Dependencies.MockK.android) diff --git a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceRevokedScreenTest.kt b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceRevokedScreenTest.kt new file mode 100644 index 0000000000..1590dcc497 --- /dev/null +++ b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceRevokedScreenTest.kt @@ -0,0 +1,99 @@ +package net.mullvad.mullvadvpn.compose.screen + +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import io.mockk.MockKAnnotations +import io.mockk.Runs +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.just +import io.mockk.verify +import kotlinx.coroutines.flow.MutableStateFlow +import net.mullvad.mullvadvpn.compose.component.AppTheme +import net.mullvad.mullvadvpn.compose.state.DeviceRevokedUiState +import net.mullvad.mullvadvpn.viewmodel.DeviceRevokedViewModel +import org.junit.Before +import org.junit.Rule +import org.junit.Test + +class DeviceRevokedScreenTest { + @get:Rule + val composeTestRule = createComposeRule() + + @MockK + lateinit var mockedViewModel: DeviceRevokedViewModel + + @Before + fun setup() { + MockKAnnotations.init(this) + every { mockedViewModel.onGoToLoginClicked() } just Runs + } + + @Test + fun testUnblockWarningShowingWhenSecured() { + // Arrange + every { + mockedViewModel.uiState + } returns MutableStateFlow(DeviceRevokedUiState(isSecured = true)) + + // Act + composeTestRule.setContent { + AppTheme { + DeviceRevokedScreen(mockedViewModel) + } + } + + // Assert + composeTestRule + .onNodeWithText(UNBLOCK_WARNING) + .assertExists() + } + + @Test + fun testUnblockWarningNotShowingWhenNotSecured() { + // Arrange + every { + mockedViewModel.uiState + } returns MutableStateFlow(DeviceRevokedUiState(isSecured = false)) + + // Act + composeTestRule.setContent { + AppTheme { + DeviceRevokedScreen(mockedViewModel) + } + } + + // Assert + composeTestRule + .onNodeWithText(UNBLOCK_WARNING) + .assertDoesNotExist() + } + + @Test + fun testGoToLogin() { + // Arrange + every { + mockedViewModel.uiState + } returns MutableStateFlow(DeviceRevokedUiState(isSecured = false)) + composeTestRule.setContent { + AppTheme { + DeviceRevokedScreen(mockedViewModel) + } + } + + // Act + composeTestRule + .onNodeWithText(GO_TO_LOGIN_BUTTON_TEXT) + .performClick() + + // Assert + verify { mockedViewModel.onGoToLoginClicked() } + } + + companion object { + private const val GO_TO_LOGIN_BUTTON_TEXT = "Go to login" + private const val UNBLOCK_WARNING = + "Going to login will unblock the internet on this device." + } +} diff --git a/android/buildSrc/src/main/kotlin/Dependencies.kt b/android/buildSrc/src/main/kotlin/Dependencies.kt index dc5458f729..38d5b8ddbd 100644 --- a/android/buildSrc/src/main/kotlin/Dependencies.kt +++ b/android/buildSrc/src/main/kotlin/Dependencies.kt @@ -43,9 +43,11 @@ object Dependencies { const val constrainLayout = "androidx.constraintlayout:constraintlayout-compose:${Versions.Compose.constrainLayout}" const val foundation = "androidx.compose.foundation:foundation:${Versions.Compose.base}" + const val junit = "androidx.compose.ui:ui-test-junit4:${Versions.Compose.base}" const val viewModelLifecycle = "androidx.lifecycle:lifecycle-viewmodel-compose:${Versions.Compose.viewModelLifecycle}" const val material = "androidx.compose.material:material:${Versions.Compose.base}" + const val testManifest = "androidx.compose.ui:ui-test-manifest:${Versions.Compose.base}" const val uiController = "com.google.accompanist:accompanist-systemuicontroller:${Versions.Compose.uiController}" const val ui = "androidx.compose.ui:ui:${Versions.Compose.base}" |
