diff options
| author | Niklas Berglund <niklas.berglund@gmail.com> | 2024-12-04 16:26:03 +0100 |
|---|---|---|
| committer | Niklas Berglund <niklas.berglund@gmail.com> | 2024-12-06 11:26:02 +0100 |
| commit | 3fe26159aebec37b6c147fc6418b35e29da23f61 (patch) | |
| tree | 87e6d5218e853a5ed192f8bbe5aab7e8c6bd53a1 /android/test/common | |
| parent | 4baba02936cffc9ca056bb6dc7b5e1db6d05ac41 (diff) | |
| download | mullvadvpn-3fe26159aebec37b6c147fc6418b35e29da23f61.tar.xz mullvadvpn-3fe26159aebec37b6c147fc6418b35e29da23f61.zip | |
Migrate ConnectionTest e2e tests to use POP
Diffstat (limited to 'android/test/common')
8 files changed, 224 insertions, 9 deletions
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/ConnectPage.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/ConnectPage.kt index fe1fafcc7f..320c01d7aa 100644 --- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/ConnectPage.kt +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/ConnectPage.kt @@ -1,10 +1,79 @@ package net.mullvad.mullvadvpn.test.common.page import androidx.test.uiautomator.By +import net.mullvad.mullvadvpn.test.common.constant.VERY_LONG_TIMEOUT import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout class ConnectPage internal constructor() : Page() { + private val disconnectSelector = By.text("Disconnect") + private val cancelSelector = By.text("Cancel") + private val connectedSelector = By.text("CONNECTED") + private val connectingSelector = By.text("CONNECTING...") + override fun assertIsDisplayed() { - uiDevice.findObjectWithTimeout(By.res("connect_card_header_test_tag")) + uiDevice.findObjectWithTimeout(By.res(CONNECT_CARD_HEADER_TEST_TAG)) + } + + fun clickSelectLocation() { + uiDevice.findObjectWithTimeout(By.res(SELECT_LOCATION_BUTTON_TEST_TAG)).click() + } + + fun clickConnect() { + uiDevice.findObjectWithTimeout(By.res(CONNECT_BUTTON_TEST_TAG)).click() + } + + fun clickDisconnect() { + uiDevice.findObjectWithTimeout(disconnectSelector).click() + } + + fun clickCancel() { + uiDevice.findObjectWithTimeout(cancelSelector).click() + } + + fun waitForConnectedLabel(timeout: Long = VERY_LONG_TIMEOUT) { + uiDevice.findObjectWithTimeout(connectedSelector, timeout) + } + + fun waitForConnectingLabel() { + uiDevice.findObjectWithTimeout(connectingSelector) + } + + /** + * Extracts the in IPv4 address from the connection card. It is a prerequisite that the + * connection card is in collapsed state. + */ + fun extractInIpv4Address(): String { + uiDevice.findObjectWithTimeout(By.res("connect_card_header_test_tag")).click() + val inString = + uiDevice + .findObjectWithTimeout( + By.res("location_info_connection_in_test_tag"), + VERY_LONG_TIMEOUT, + ) + .text + + val extractedIpAddress = inString.split(" ")[0].split(":")[0] + return extractedIpAddress + } + + /** + * Extracts the out IPv4 address from the connection card. It is a prerequisite that the + * connection card is in collapsed state. + */ + fun extractOutIpv4Address(): String { + uiDevice.findObjectWithTimeout(By.res("connect_card_header_test_tag")).click() + return uiDevice + .findObjectWithTimeout( + // Text exist and contains IP address + By.res("location_info_connection_out_test_tag").textContains("."), + VERY_LONG_TIMEOUT, + ) + .text + } + + companion object { + const val CONNECT_CARD_HEADER_TEST_TAG = "connect_card_header_test_tag" + const val SELECT_LOCATION_BUTTON_TEST_TAG = "select_location_button_test_tag" + const val CONNECT_BUTTON_TEST_TAG = "connect_button_test_tag" } } diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/LoginPage.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/LoginPage.kt index 9fdffe1eae..1098e4d1cc 100644 --- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/LoginPage.kt +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/LoginPage.kt @@ -8,6 +8,9 @@ import net.mullvad.mullvadvpn.test.common.constant.EXTREMELY_LONG_TIMEOUT import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout class LoginPage internal constructor() : Page() { + private val invalidAccountNumberSelector = By.text("Invalid account number") + private val loginSelector = By.text("Login") + fun enterAccountNumber(accountNumber: String) { uiDevice.findObjectWithTimeout(By.clazz("android.widget.EditText")).text = accountNumber } @@ -20,10 +23,10 @@ class LoginPage internal constructor() : Page() { } fun verifyShowingInvalidAccount() { - uiDevice.findObjectWithTimeout(By.text("Invalid account number"), EXTREMELY_LONG_TIMEOUT) + uiDevice.findObjectWithTimeout(invalidAccountNumberSelector, EXTREMELY_LONG_TIMEOUT) } override fun assertIsDisplayed() { - uiDevice.findObjectWithTimeout(By.text("Login")) + uiDevice.findObjectWithTimeout(loginSelector) } } diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/PrivacyPage.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/PrivacyPage.kt index 43ec183c50..f5ca662113 100644 --- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/PrivacyPage.kt +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/PrivacyPage.kt @@ -7,12 +7,16 @@ import net.mullvad.mullvadvpn.test.common.constant.DEFAULT_TIMEOUT import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout class PrivacyPage internal constructor() : Page() { + private val privacySelector = By.text("Privacy") + private val agreeSelector = By.text("Agree and continue") + private val allowSelector = By.text("Allow") + override fun assertIsDisplayed() { - uiDevice.findObjectWithTimeout(By.text("Privacy")) + uiDevice.findObjectWithTimeout(privacySelector) } fun clickAgreeOnPrivacyDisclaimer() { - uiDevice.findObjectWithTimeout(By.text("Agree and continue")).click() + uiDevice.findObjectWithTimeout(agreeSelector).click() } fun clickAllowOnNotificationPermissionPromptIfApiLevel33AndAbove( @@ -23,12 +27,10 @@ class PrivacyPage internal constructor() : Page() { return } - val selector = By.text("Allow") - - uiDevice.wait(Until.hasObject(selector), timeout) + uiDevice.wait(Until.hasObject(allowSelector), timeout) try { - uiDevice.findObjectWithTimeout(selector).click() + uiDevice.findObjectWithTimeout(allowSelector).click() } catch (e: IllegalArgumentException) { throw IllegalArgumentException( "Failed to allow notification permission within timeout ($timeout)" diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SelectLocationPage.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SelectLocationPage.kt new file mode 100644 index 0000000000..e10a53ec4d --- /dev/null +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SelectLocationPage.kt @@ -0,0 +1,25 @@ +package net.mullvad.mullvadvpn.test.common.page + +import androidx.test.uiautomator.By +import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout + +class SelectLocationPage internal constructor() : Page() { + override fun assertIsDisplayed() { + uiDevice.findObjectWithTimeout(By.res(SELECT_LOCATION_SCREEN_TEST_TAG)) + } + + fun clickLocationExpandButton(locationName: String) { + val locationCell = uiDevice.findObjectWithTimeout(By.text(locationName)).parent.parent + val expandButton = locationCell.findObjectWithTimeout(By.res(EXPAND_BUTTON_TEST_TAG)) + expandButton.click() + } + + fun clickLocationCell(locationName: String) { + uiDevice.findObjectWithTimeout(By.text(locationName)).click() + } + + companion object { + const val SELECT_LOCATION_SCREEN_TEST_TAG = "select_location_screen_test_tag" + const val EXPAND_BUTTON_TEST_TAG = "expand_button_test_tag" + } +} diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SettingsPage.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SettingsPage.kt new file mode 100644 index 0000000000..86a317d153 --- /dev/null +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SettingsPage.kt @@ -0,0 +1,20 @@ +package net.mullvad.mullvadvpn.test.common.page + +import androidx.test.uiautomator.By +import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout + +class SettingsPage internal constructor() : Page() { + private val settingsSelector = By.text("Settings") + + override fun assertIsDisplayed() { + uiDevice.findObjectWithTimeout(settingsSelector) + } + + fun clickVpnSettings() { + uiDevice.findObjectWithTimeout(By.res(VPN_SETTINGS_CELL_TEST_TAG)).click() + } + + companion object { + const val VPN_SETTINGS_CELL_TEST_TAG = "vpn_settings_cell_test_tag" + } +} diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SystemVpnConfigurationAlert.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SystemVpnConfigurationAlert.kt new file mode 100644 index 0000000000..046d6e8197 --- /dev/null +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SystemVpnConfigurationAlert.kt @@ -0,0 +1,16 @@ +package net.mullvad.mullvadvpn.test.common.page + +import androidx.test.uiautomator.By +import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout + +class SystemVpnConfigurationAlert internal constructor() : Page() { + private val okSelector = By.text("OK") + + override fun assertIsDisplayed() { + uiDevice.findObjectWithTimeout(okSelector) + } + + fun clickOk() { + uiDevice.findObjectWithTimeout(okSelector).click() + } +} diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/TopBar.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/TopBar.kt new file mode 100644 index 0000000000..c602e26def --- /dev/null +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/TopBar.kt @@ -0,0 +1,24 @@ +package net.mullvad.mullvadvpn.test.common.page + +import androidx.test.uiautomator.By +import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout + +class TopBar internal constructor() : Page() { + override fun assertIsDisplayed() { + uiDevice.findObjectWithTimeout(By.res(TOP_BAR_TEST_TAG)) + } + + fun clickSettings() { + uiDevice.findObjectWithTimeout(By.res(TOP_BAR_SETTINGS_BUTTON)).click() + } + + fun clickAccount() { + uiDevice.findObjectWithTimeout(By.res(TOP_BAR_ACCOUNT_BUTTON)).click() + } + + companion object { + const val TOP_BAR_TEST_TAG = "top_bar_test_tag" + const val TOP_BAR_ACCOUNT_BUTTON = "top_bar_account_button" + const val TOP_BAR_SETTINGS_BUTTON = "top_bar_settings_button" + } +} diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/VpnSettingsPage.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/VpnSettingsPage.kt new file mode 100644 index 0000000000..698c84aa6b --- /dev/null +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/VpnSettingsPage.kt @@ -0,0 +1,56 @@ +package net.mullvad.mullvadvpn.test.common.page + +import androidx.test.uiautomator.By +import androidx.test.uiautomator.Direction +import androidx.test.uiautomator.Until +import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout + +class VpnSettingsPage internal constructor() : Page() { + private val vpnSettingsSelector = By.text("VPN settings") + private val localNetworkSharingSelector = By.text("Local network sharing") + + override fun assertIsDisplayed() { + uiDevice.findObjectWithTimeout(vpnSettingsSelector) + } + + fun clickLocalNetworkSharingSwitch() { + val localNetworkSharingCell = + uiDevice.findObjectWithTimeout(localNetworkSharingSelector).parent + val localNetworkSharingSwitch = + localNetworkSharingCell.findObjectWithTimeout(By.res(SWITCH_TEST_TAG)) + + localNetworkSharingSwitch.click() + } + + fun scrollUntilWireguardObfuscationUdpOverTcpCell() { + scrollUntilCell(WIREGUARD_OBFUSCATION_UDP_OVER_TCP_CELL_TEST_TAG) + } + + fun scrollUntilWireguardObfuscationOffCell() { + scrollUntilCell(WIREGUARD_OBFUSCATION_OFF_CELL_TEST_TAG) + } + + fun clickWireguardObfuscationUdpOverTcpCell() { + uiDevice + .findObjectWithTimeout(By.res(WIREGUARD_OBFUSCATION_UDP_OVER_TCP_CELL_TEST_TAG)) + .click() + } + + fun clickWireguardObfuscationOffCell() { + uiDevice.findObjectWithTimeout(By.res(WIREGUARD_OBFUSCATION_OFF_CELL_TEST_TAG)).click() + } + + private fun scrollUntilCell(testTag: String) { + val scrollView2 = uiDevice.findObjectWithTimeout(By.res(SETTINGS_SCROLL_VIEW_TEST_TAG)) + scrollView2.scrollUntil(Direction.DOWN, Until.hasObject(By.res(testTag))) + } + + companion object { + const val SETTINGS_SCROLL_VIEW_TEST_TAG = "lazy_list_vpn_settings_test_tag" + const val WIREGUARD_OBFUSCATION_UDP_OVER_TCP_CELL_TEST_TAG = + "wireguard_obfuscation_udp_over_tcp_cell_test_tag" + const val WIREGUARD_OBFUSCATION_OFF_CELL_TEST_TAG = + "wireguard_obfuscation_off_cell_test_tag" + const val SWITCH_TEST_TAG = "switch_test_tag" + } +} |
