diff options
| author | Kalle Lindström <karl.lindstrom@mullvad.net> | 2024-09-17 10:32:49 +0200 |
|---|---|---|
| committer | Kalle Lindström <karl.lindstrom@mullvad.net> | 2024-09-17 10:39:50 +0200 |
| commit | 00154eb3bce1ed925b11d1cb6ef7b562cb78b524 (patch) | |
| tree | 241cdbb77b6df7fe2e8dd9abbdbe5369ac2abdbf /android/app/src/androidTest | |
| parent | a87b10565db5ccc1b49757e8ae6d65876bc18b18 (diff) | |
| download | mullvadvpn-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.kt | 137 |
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" } } |
