summaryrefslogtreecommitdiffhomepage
path: root/android/app/src/androidTest
diff options
context:
space:
mode:
authorKalle Lindström <karl.lindstrom@mullvad.net>2024-09-17 10:32:49 +0200
committerKalle Lindström <karl.lindstrom@mullvad.net>2024-09-17 10:39:50 +0200
commit00154eb3bce1ed925b11d1cb6ef7b562cb78b524 (patch)
tree241cdbb77b6df7fe2e8dd9abbdbe5369ac2abdbf /android/app/src/androidTest
parenta87b10565db5ccc1b49757e8ae6d65876bc18b18 (diff)
downloadmullvadvpn-00154eb3bce1ed925b11d1cb6ef7b562cb78b524.tar.xz
mullvadvpn-00154eb3bce1ed925b11d1cb6ef7b562cb78b524.zip
Refactor port dialog to use a view model
Diffstat (limited to 'android/app/src/androidTest')
-rw-r--r--android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomPortDialogTest.kt137
1 files changed, 127 insertions, 10 deletions
diff --git a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomPortDialogTest.kt b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomPortDialogTest.kt
index 930e5f5201..ec30495265 100644
--- a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomPortDialogTest.kt
+++ b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomPortDialogTest.kt
@@ -2,16 +2,26 @@ package net.mullvad.mullvadvpn.compose.dialog
import android.annotation.SuppressLint
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.assertIsEnabled
+import androidx.compose.ui.test.assertIsNotEnabled
import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performTextInput
import io.mockk.MockKAnnotations
+import io.mockk.mockk
+import io.mockk.verify
import net.mullvad.mullvadvpn.compose.createEdgeToEdgeComposeExtension
import net.mullvad.mullvadvpn.compose.setContentWithTheme
import net.mullvad.mullvadvpn.compose.test.CUSTOM_PORT_DIALOG_INPUT_TEST_TAG
-import net.mullvad.mullvadvpn.lib.model.Port
import net.mullvad.mullvadvpn.lib.model.PortRange
import net.mullvad.mullvadvpn.onNodeWithTagAndText
+import net.mullvad.mullvadvpn.viewmodel.WireguardCustomPortDialogUiState
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.RegisterExtension
@@ -30,17 +40,29 @@ class CustomPortDialogTest {
@SuppressLint("ComposableNaming")
@Composable
private fun testWireguardCustomPortDialog(
- initialPort: Port? = null,
+ portInput: String = "",
+ isValidInput: Boolean = false,
+ showResetToDefault: Boolean = false,
allowedPortRanges: List<PortRange> = emptyList(),
- onSave: (Port?) -> Unit = { _ -> },
+ onInputChanged: (String) -> Unit = { _ -> },
+ onSavePort: (String) -> Unit = { _ -> },
+ onResetPort: () -> Unit = {},
onDismiss: () -> Unit = {},
) {
+ val state =
+ WireguardCustomPortDialogUiState(
+ portInput = portInput,
+ isValidInput = isValidInput,
+ allowedPortRanges = allowedPortRanges,
+ showResetToDefault = showResetToDefault,
+ )
WireguardCustomPortDialog(
- initialPort = initialPort,
- allowedPortRanges = allowedPortRanges,
- onSave = onSave,
+ state,
+ onInputChanged = onInputChanged,
+ onSavePort = onSavePort,
onDismiss = onDismiss,
+ onResetPort = onResetPort,
)
}
@@ -51,17 +73,112 @@ class CustomPortDialogTest {
// crash the app
// Arrange
- setContentWithTheme { testWireguardCustomPortDialog() }
+ setContentWithTheme {
+ var input by remember { mutableStateOf("") }
+ testWireguardCustomPortDialog(portInput = input, onInputChanged = { input = it })
+ }
// Act
- onNodeWithTag(CUSTOM_PORT_DIALOG_INPUT_TEST_TAG).performTextInput(INVALID_CUSTOM_PORT)
+ onNodeWithTag(CUSTOM_PORT_DIALOG_INPUT_TEST_TAG).performTextInput(INVALID_PORT_INPUT)
// Assert
- onNodeWithTagAndText(CUSTOM_PORT_DIALOG_INPUT_TEST_TAG, INVALID_CUSTOM_PORT)
+ onNodeWithTagAndText(CUSTOM_PORT_DIALOG_INPUT_TEST_TAG, INVALID_PORT_INPUT)
.assertDoesNotExist()
}
+ @Test
+ fun testEmptyInputResultsInSetPortButtonBeingDisabled() =
+ composeExtension.use {
+ // Arrange
+ setContentWithTheme { testWireguardCustomPortDialog(isValidInput = false) }
+
+ // Assert
+ onNodeWithText("Set port").assertIsNotEnabled()
+ }
+
+ @Test
+ fun testValidInputResultsInSetPortButtonBeingEnabled() =
+ composeExtension.use {
+ // Arrange
+ setContentWithTheme {
+ testWireguardCustomPortDialog(portInput = VALID_CUSTOM_PORT, isValidInput = true)
+ }
+
+ // Assert
+ onNodeWithText("Set port").assertIsEnabled()
+ onNodeWithText(VALID_CUSTOM_PORT).assertExists()
+ }
+
+ @Test
+ fun testInvalidInputResultsInSetPortButtonBeingDisabled() =
+ composeExtension.use {
+ // Arrange
+ setContentWithTheme {
+ testWireguardCustomPortDialog(portInput = INVALID_CUSTOM_PORT, isValidInput = false)
+ }
+
+ // Assert
+ onNodeWithText("Set port").assertIsNotEnabled()
+ }
+
+ @Test
+ fun testDialogSubmitOfValidValue() =
+ composeExtension.use {
+ // Arrange
+ val mockedSubmitHandler: (String) -> Unit = mockk(relaxed = true)
+ setContentWithTheme {
+ testWireguardCustomPortDialog(
+ portInput = VALID_CUSTOM_PORT,
+ isValidInput = true,
+ onSavePort = mockedSubmitHandler,
+ )
+ }
+
+ // Act
+ onNodeWithText("Set port").assertIsEnabled().performClick()
+
+ // Assert
+ verify { mockedSubmitHandler.invoke(VALID_CUSTOM_PORT) }
+ }
+
+ @Test
+ fun testDialogResetClick() =
+ composeExtension.use {
+ // Arrange
+ val mockedClickHandler: () -> Unit = mockk(relaxed = true)
+ setContentWithTheme {
+ testWireguardCustomPortDialog(
+ portInput = VALID_CUSTOM_PORT,
+ isValidInput = true,
+ showResetToDefault = true,
+ onResetPort = mockedClickHandler,
+ )
+ }
+
+ // Act
+ onNodeWithText("Remove custom port").performClick()
+
+ // Assert
+ verify { mockedClickHandler.invoke() }
+ }
+
+ @Test
+ fun testMtuDialogCancelClick() =
+ composeExtension.use {
+ // Arrange
+ val mockedClickHandler: () -> Unit = mockk(relaxed = true)
+ setContentWithTheme { testWireguardCustomPortDialog(onDismiss = mockedClickHandler) }
+
+ // Assert
+ onNodeWithText("Cancel").performClick()
+
+ // Assert
+ verify { mockedClickHandler.invoke() }
+ }
+
companion object {
- const val INVALID_CUSTOM_PORT = "21474836471"
+ const val INVALID_PORT_INPUT = "21474836471"
+ const val INVALID_CUSTOM_PORT = "10"
+ const val VALID_CUSTOM_PORT = "4001"
}
}