summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-01-31 15:28:57 +0100
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-01-31 15:28:57 +0100
commitd64b92c30aeca95752bb5f35249c8e227b49da44 (patch)
treea98d33e995a02020d15dbadaa9fd8079f2168419 /android
parent5d9f8470a857855dcec276a90926d0a9b8ce4cf0 (diff)
parent1f85f3a1ffd5fe3ba05c5c545f5a116134041670 (diff)
downloadmullvadvpn-d64b92c30aeca95752bb5f35249c8e227b49da44.tar.xz
mullvadvpn-d64b92c30aeca95752bb5f35249c8e227b49da44.zip
Merge branch 'automate-expiry-tests-using-mockapi-droid-588'
Diffstat (limited to 'android')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/OutOfTimeScreen.kt6
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/test/ComposeTestTagConstants.kt3
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/interactor/AppInteractor.kt8
-rw-r--r--android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/AccountExpiryMockApiTest.kt93
-rw-r--r--android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/LoginMockApiTest.kt3
5 files changed, 110 insertions, 3 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/OutOfTimeScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/OutOfTimeScreen.kt
index d0d0c7460d..00cd339c09 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/OutOfTimeScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/OutOfTimeScreen.kt
@@ -18,6 +18,7 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalUriHandler
+import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
@@ -42,6 +43,7 @@ import net.mullvad.mullvadvpn.compose.destinations.SettingsDestination
import net.mullvad.mullvadvpn.compose.destinations.VerificationPendingDialogDestination
import net.mullvad.mullvadvpn.compose.extensions.createOpenAccountPageHook
import net.mullvad.mullvadvpn.compose.state.OutOfTimeUiState
+import net.mullvad.mullvadvpn.compose.test.OUT_OF_TIME_SCREEN_TITLE_TEST_TAG
import net.mullvad.mullvadvpn.compose.transitions.HomeTransition
import net.mullvad.mullvadvpn.lib.payment.model.ProductId
import net.mullvad.mullvadvpn.lib.theme.AppTheme
@@ -220,7 +222,9 @@ fun OutOfTimeScreen(
text = stringResource(id = R.string.out_of_time),
style = MaterialTheme.typography.headlineLarge,
color = MaterialTheme.colorScheme.onPrimary,
- modifier = Modifier.padding(horizontal = Dimens.sideMargin)
+ modifier =
+ Modifier.padding(horizontal = Dimens.sideMargin)
+ .testTag(OUT_OF_TIME_SCREEN_TITLE_TEST_TAG)
)
Text(
text =
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/test/ComposeTestTagConstants.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/test/ComposeTestTagConstants.kt
index 98c63ac9b9..996f610404 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/test/ComposeTestTagConstants.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/test/ComposeTestTagConstants.kt
@@ -39,3 +39,6 @@ const val LOGIN_INPUT_TEST_TAG = "login_input_test_tag"
// VoucherDialog
const val VOUCHER_INPUT_TEST_TAG = "voucher_input_test_tag"
+
+// OutOfTimeScreen
+const val OUT_OF_TIME_SCREEN_TITLE_TEST_TAG = "out_of_time_screen_title_test_tag"
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/interactor/AppInteractor.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/interactor/AppInteractor.kt
index ef52a7ef55..c875c13afa 100644
--- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/interactor/AppInteractor.kt
+++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/interactor/AppInteractor.kt
@@ -88,6 +88,14 @@ class AppInteractor(
device.findObjectWithTimeout(By.text("UNSECURED CONNECTION"), LOGIN_TIMEOUT)
}
+ fun ensureOutOfTime() {
+ device.findObjectWithTimeout(By.res("out_of_time_screen_title_test_tag"))
+ }
+
+ fun ensureAccountScreen() {
+ device.findObjectWithTimeout(By.text("Account"))
+ }
+
fun extractIpAddress(): String {
device.findObjectWithTimeout(By.res("location_info_test_tag")).click()
return device
diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/AccountExpiryMockApiTest.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/AccountExpiryMockApiTest.kt
new file mode 100644
index 0000000000..469040c4c4
--- /dev/null
+++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/AccountExpiryMockApiTest.kt
@@ -0,0 +1,93 @@
+package net.mullvad.mullvadvpn.test.mockapi
+
+import androidx.test.uiautomator.By
+import net.mullvad.mullvadvpn.test.common.extension.clickAgreeOnPrivacyDisclaimer
+import net.mullvad.mullvadvpn.test.common.extension.clickAllowOnNotificationPermissionPromptIfApiLevel33AndAbove
+import net.mullvad.mullvadvpn.test.common.extension.dismissChangelogDialogIfShown
+import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout
+import net.mullvad.mullvadvpn.test.mockapi.constant.DEFAULT_DEVICE_LIST
+import net.mullvad.mullvadvpn.test.mockapi.constant.DUMMY_DEVICE_NAME_2
+import net.mullvad.mullvadvpn.test.mockapi.constant.DUMMY_ID_2
+import net.mullvad.mullvadvpn.test.mockapi.util.currentUtcTimeWithOffsetZero
+import net.mullvad.mullvadvpn.util.toExpiryDateString
+import org.junit.jupiter.api.Disabled
+import org.junit.jupiter.api.Test
+
+class AccountExpiryMockApiTest : MockApiTest() {
+
+ @Test
+ fun testAccountExpiryDateUpdated() {
+ // Arrange
+ val validAccountToken = "1234123412341234"
+ val oldAccountExpiry = currentUtcTimeWithOffsetZero().plusMonths(1)
+ apiDispatcher.apply {
+ expectedAccountToken = validAccountToken
+ accountExpiry = oldAccountExpiry
+ devices = DEFAULT_DEVICE_LIST.toMutableMap()
+ devicePendingToGetCreated = DUMMY_ID_2 to DUMMY_DEVICE_NAME_2
+ }
+
+ // Act
+ app.launch(endpoint)
+ device.clickAgreeOnPrivacyDisclaimer()
+ device.clickAllowOnNotificationPermissionPromptIfApiLevel33AndAbove()
+ device.dismissChangelogDialogIfShown()
+ app.waitForLoginPrompt()
+ app.attemptLogin(validAccountToken)
+
+ // Assert logged in
+ app.ensureLoggedIn()
+
+ // Add one month to the account expiry
+ val newAccountExpiry = oldAccountExpiry.plusMonths(1)
+ apiDispatcher.accountExpiry = newAccountExpiry
+
+ // Go to account page to update the account expiry
+ app.clickAccountCog()
+
+ app.ensureAccountScreen()
+ device.findObjectWithTimeout(By.text(newAccountExpiry.toExpiryDateString()))
+ }
+
+ @Test
+ @Disabled(
+ "Disabled since we have a bug in the app that makes it unstable. " +
+ "We can restore it after the bug has been fixed"
+ )
+ fun testAccountTimeExpiredWhileUsingTheAppShouldShowOutOfTimeScreen() {
+ // Arrange
+ val validAccountToken = "1234123412341234"
+ val oldAccountExpiry = currentUtcTimeWithOffsetZero().plusMonths(1)
+ apiDispatcher.apply {
+ expectedAccountToken = validAccountToken
+ accountExpiry = oldAccountExpiry
+ devices = DEFAULT_DEVICE_LIST.toMutableMap()
+ devicePendingToGetCreated = DUMMY_ID_2 to DUMMY_DEVICE_NAME_2
+ }
+
+ // Act
+ app.launch(endpoint)
+ device.clickAgreeOnPrivacyDisclaimer()
+ device.clickAllowOnNotificationPermissionPromptIfApiLevel33AndAbove()
+ device.dismissChangelogDialogIfShown()
+ app.waitForLoginPrompt()
+ app.attemptLogin(validAccountToken)
+
+ // Assert logged in
+ app.ensureLoggedIn()
+
+ // Set account time as expired
+ val newAccountExpiry = oldAccountExpiry.minusMonths(2)
+ apiDispatcher.accountExpiry = newAccountExpiry
+
+ // Go to account page to update the account expiry
+ app.clickAccountCog()
+ app.ensureAccountScreen()
+
+ // Go back to the main screen
+ device.pressBack()
+
+ // Assert that we show the out of time screen
+ app.ensureOutOfTime()
+ }
+}
diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/LoginMockApiTest.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/LoginMockApiTest.kt
index 0dcbc308dc..6b03a65020 100644
--- a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/LoginMockApiTest.kt
+++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/LoginMockApiTest.kt
@@ -7,7 +7,6 @@ import net.mullvad.mullvadvpn.test.common.constant.DEFAULT_INTERACTION_TIMEOUT
import net.mullvad.mullvadvpn.test.common.extension.clickAgreeOnPrivacyDisclaimer
import net.mullvad.mullvadvpn.test.common.extension.clickAllowOnNotificationPermissionPromptIfApiLevel33AndAbove
import net.mullvad.mullvadvpn.test.common.extension.dismissChangelogDialogIfShown
-import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout
import net.mullvad.mullvadvpn.test.mockapi.constant.DEFAULT_DEVICE_LIST
import net.mullvad.mullvadvpn.test.mockapi.constant.DUMMY_DEVICE_NAME_2
import net.mullvad.mullvadvpn.test.mockapi.constant.DUMMY_ID_2
@@ -85,6 +84,6 @@ class LoginMockApiTest : MockApiTest() {
app.attemptLogin(validAccountToken)
// Assert
- device.findObjectWithTimeout(By.text("Out of time"))
+ app.ensureOutOfTime()
}
}