summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-01-12 10:49:51 +0100
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-01-15 10:51:14 +0100
commit05c4ae0248be7f147a09b21188d3b05b3513540f (patch)
treecf7d271c9a57802e123e360e0ffc05816e94e737 /android
parentf653cde11460cd86ac48232fba78b8ed433d7a96 (diff)
downloadmullvadvpn-05c4ae0248be7f147a09b21188d3b05b3513540f.tar.xz
mullvadvpn-05c4ae0248be7f147a09b21188d3b05b3513540f.zip
Add mockapi tests for successful and failed account creation
Diffstat (limited to 'android')
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/interactor/AppInteractor.kt17
-rw-r--r--android/test/mockapi/build.gradle.kts1
-rw-r--r--android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/CreateAccountMockApiTest.kt43
-rw-r--r--android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiDispatcher.kt20
-rw-r--r--android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/constant/Constants.kt1
-rw-r--r--android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/util/JsonUtils.kt3
6 files changed, 82 insertions, 3 deletions
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 6921e6b362..1608f28bcf 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
@@ -10,6 +10,7 @@ import net.mullvad.mullvadvpn.lib.endpoint.CustomApiEndpointConfiguration
import net.mullvad.mullvadvpn.lib.endpoint.putApiEndpointConfigurationExtra
import net.mullvad.mullvadvpn.test.common.constant.APP_LAUNCH_TIMEOUT
import net.mullvad.mullvadvpn.test.common.constant.CONNECTION_TIMEOUT
+import net.mullvad.mullvadvpn.test.common.constant.DEFAULT_INTERACTION_TIMEOUT
import net.mullvad.mullvadvpn.test.common.constant.LOGIN_PROMPT_TIMEOUT
import net.mullvad.mullvadvpn.test.common.constant.LOGIN_TIMEOUT
import net.mullvad.mullvadvpn.test.common.constant.MULLVAD_PACKAGE
@@ -62,12 +63,22 @@ class AppInteractor(private val device: UiDevice, private val targetContext: Con
loginObject.parent.findObject(By.clazz(Button::class.java)).click()
}
- private fun attemptCreateAccount() {
+ fun attemptCreateAccount() {
device.findObjectWithTimeout(By.text("Create account")).click()
}
- private fun ensureAccountCreated() {
- device.findObjectWithTimeout(By.text("Congrats!"), LOGIN_TIMEOUT)
+ fun ensureAccountCreated(accountToken: String? = null) {
+ device.findObjectWithTimeout(By.text("Congrats!"), DEFAULT_INTERACTION_TIMEOUT)
+ accountToken?.let {
+ device.findObjectWithTimeout(By.text(accountToken), DEFAULT_INTERACTION_TIMEOUT)
+ }
+ }
+
+ fun ensureAccountCreationFailed() {
+ device.findObjectWithTimeout(
+ By.text("Failed to create account"),
+ DEFAULT_INTERACTION_TIMEOUT
+ )
}
fun ensureLoggedIn() {
diff --git a/android/test/mockapi/build.gradle.kts b/android/test/mockapi/build.gradle.kts
index e5d20d3d50..3fea2d5d60 100644
--- a/android/test/mockapi/build.gradle.kts
+++ b/android/test/mockapi/build.gradle.kts
@@ -63,6 +63,7 @@ configure<org.owasp.dependencycheck.gradle.extension.DependencyCheckExtension> {
dependencies {
implementation(project(Projects.testCommon))
+ implementation(project(Dependencies.Mullvad.commonLib))
implementation(project(Dependencies.Mullvad.endpointLib))
implementation(Dependencies.AndroidX.testCore)
diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/CreateAccountMockApiTest.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/CreateAccountMockApiTest.kt
new file mode 100644
index 0000000000..a07a9e5abb
--- /dev/null
+++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/CreateAccountMockApiTest.kt
@@ -0,0 +1,43 @@
+package net.mullvad.mullvadvpn.test.mockapi
+
+import net.mullvad.mullvadvpn.lib.common.util.groupWithSpaces
+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 org.junit.jupiter.api.Test
+
+class CreateAccountMockApiTest : MockApiTest() {
+ @Test
+ fun testCreateAccountSuccessful() {
+ // Arrange
+ val createdAccountToken = "1234123412341234"
+ apiDispatcher.apply { expectedAccountToken = createdAccountToken }
+ app.launch(endpoint)
+
+ // Act
+ device.clickAgreeOnPrivacyDisclaimer()
+ device.clickAllowOnNotificationPermissionPromptIfApiLevel33AndAbove()
+ device.dismissChangelogDialogIfShown()
+ app.waitForLoginPrompt()
+ app.attemptCreateAccount()
+
+ // Assert
+ app.ensureAccountCreated(createdAccountToken.groupWithSpaces())
+ }
+
+ @Test
+ fun testCreateAccountFailed() {
+ // Arrange
+ app.launch(endpoint)
+
+ // Act
+ device.clickAgreeOnPrivacyDisclaimer()
+ device.clickAllowOnNotificationPermissionPromptIfApiLevel33AndAbove()
+ device.dismissChangelogDialogIfShown()
+ app.waitForLoginPrompt()
+ app.attemptCreateAccount()
+
+ // Assert
+ app.ensureAccountCreationFailed()
+ }
+}
diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiDispatcher.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiDispatcher.kt
index 6a604bb09f..74214501a1 100644
--- a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiDispatcher.kt
+++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiDispatcher.kt
@@ -3,12 +3,14 @@ package net.mullvad.mullvadvpn.test.mockapi
import android.util.Log
import net.mullvad.mullvadvpn.test.mockapi.constant.ACCOUNT_URL_PATH
import net.mullvad.mullvadvpn.test.mockapi.constant.AUTH_TOKEN_URL_PATH
+import net.mullvad.mullvadvpn.test.mockapi.constant.CREATE_ACCOUNT_URL_PATH
import net.mullvad.mullvadvpn.test.mockapi.constant.DEVICES_URL_PATH
import net.mullvad.mullvadvpn.test.mockapi.constant.DUMMY_ACCESS_TOKEN
import net.mullvad.mullvadvpn.test.mockapi.constant.DUMMY_DEVICE_NAME
import net.mullvad.mullvadvpn.test.mockapi.constant.DUMMY_ID
import net.mullvad.mullvadvpn.test.mockapi.constant.LOG_TAG
import net.mullvad.mullvadvpn.test.mockapi.util.accessTokenJsonResponse
+import net.mullvad.mullvadvpn.test.mockapi.util.accountCreationJson
import net.mullvad.mullvadvpn.test.mockapi.util.accountInfoJson
import net.mullvad.mullvadvpn.test.mockapi.util.currentUtcTimeWithOffsetZero
import net.mullvad.mullvadvpn.test.mockapi.util.deviceJson
@@ -41,6 +43,7 @@ class MockApiDispatcher : Dispatcher() {
}
"$DEVICES_URL_PATH/$DUMMY_ID" -> handleDeviceInfoRequest()
ACCOUNT_URL_PATH -> handleAccountInfoRequest()
+ CREATE_ACCOUNT_URL_PATH -> handleAccountCreationRequest()
else -> MockResponse().setResponseCode(404)
}.also { response ->
Log.d(LOG_TAG, "Response: $response (body=${response.getBody()?.peek()?.readUtf8()})")
@@ -139,4 +142,21 @@ class MockApiDispatcher : Dispatcher() {
}
?: MockResponse().setResponseCode(400)
}
+
+ private fun handleAccountCreationRequest(): MockResponse {
+ return expectedAccountToken?.let { expiry ->
+ MockResponse()
+ .setResponseCode(201)
+ .addJsonHeader()
+ .setBody(
+ accountCreationJson(
+ id = DUMMY_ID,
+ expiry = DateTime(),
+ accountToken = expectedAccountToken!!
+ )
+ .toString()
+ )
+ }
+ ?: MockResponse().setResponseCode(400)
+ }
}
diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/constant/Constants.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/constant/Constants.kt
index ba1ecad36e..16123a8e1a 100644
--- a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/constant/Constants.kt
+++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/constant/Constants.kt
@@ -5,6 +5,7 @@ const val LOG_TAG = "mullvad-mockapi"
const val AUTH_TOKEN_URL_PATH = "/auth/v1/token"
const val DEVICES_URL_PATH = "/accounts/v1/devices"
const val ACCOUNT_URL_PATH = "/accounts/v1/accounts/me"
+const val CREATE_ACCOUNT_URL_PATH = "/accounts/v1/accounts"
const val DUMMY_ID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
const val DUMMY_DEVICE_NAME = "mole mole"
diff --git a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/util/JsonUtils.kt b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/util/JsonUtils.kt
index 2ccae9499e..eea4f3e973 100644
--- a/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/util/JsonUtils.kt
+++ b/android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/util/JsonUtils.kt
@@ -11,6 +11,9 @@ fun accountInfoJson(id: String, expiry: DateTime) =
put("can_add_devices", true)
}
+fun accountCreationJson(id: String, accountToken: String, expiry: DateTime) =
+ accountInfoJson(id, expiry).apply { put("number", accountToken) }
+
fun deviceJson(id: String, name: String, publicKey: String, creationDate: DateTime) =
JSONObject().apply {
put("id", id)