summaryrefslogtreecommitdiffhomepage
path: root/android/test
diff options
context:
space:
mode:
Diffstat (limited to 'android/test')
-rw-r--r--android/test/arch/build.gradle.kts15
-rw-r--r--android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ArchitectureTests.kt17
-rw-r--r--android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/GeneralTests.kt24
-rw-r--r--android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/KonsistTests.kt14
-rw-r--r--android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ViewModelTests.kt9
-rw-r--r--android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/ClassTests.kt20
-rw-r--r--android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/DataClassTests.kt17
-rw-r--r--android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposePreviewTests.kt20
-rw-r--r--android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposeTests.kt16
-rw-r--r--android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/MockApiDispatcher.kt3
-rw-r--r--android/test/mockapi/src/main/kotlin/net/mullvad/mullvadvpn/test/mockapi/util/JsonUtils.kt3
11 files changed, 139 insertions, 19 deletions
diff --git a/android/test/arch/build.gradle.kts b/android/test/arch/build.gradle.kts
index 0a28fd2fab..dff039f0e2 100644
--- a/android/test/arch/build.gradle.kts
+++ b/android/test/arch/build.gradle.kts
@@ -7,18 +7,14 @@ android {
namespace = "net.mullvad.mullvadvpn.test.arch"
compileSdk = Versions.Android.compileSdkVersion
- defaultConfig {
- minSdk = Versions.Android.minSdkVersion
- }
+ defaultConfig { minSdk = Versions.Android.minSdkVersion }
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
- kotlinOptions {
- jvmTarget = Versions.jvmTarget
- }
+ kotlinOptions { jvmTarget = Versions.jvmTarget }
lint {
lintConfig = file("${rootProject.projectDir}/config/lint.xml")
@@ -28,14 +24,11 @@ android {
}
androidComponents {
- beforeVariants { variantBuilder ->
- variantBuilder.apply {
- enable = name != "release"
- }
- }
+ beforeVariants { variantBuilder -> variantBuilder.apply { enable = name != "release" } }
}
dependencies {
+ testImplementation(Dependencies.Compose.uiToolingAndroidPreview)
testImplementation(Dependencies.AndroidX.appcompat)
testImplementation(Dependencies.junit)
testImplementation(Dependencies.konsist)
diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ArchitectureTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ArchitectureTests.kt
new file mode 100644
index 0000000000..2a7e1e205e
--- /dev/null
+++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ArchitectureTests.kt
@@ -0,0 +1,17 @@
+package net.mullvad.mullvadvpn.test.arch
+
+import com.lemonappdev.konsist.api.Konsist
+import com.lemonappdev.konsist.api.architecture.KoArchitectureCreator.assertArchitecture
+import com.lemonappdev.konsist.api.architecture.Layer
+import org.junit.Test
+
+class ArchitectureTests {
+
+ @Test
+ fun `ensure model layer depends on nothing`() =
+ Konsist.scopeFromProduction().assertArchitecture {
+ val model = Layer("Model", "net.mullvad.mullvadvpn.model..")
+
+ model.dependsOnNothing()
+ }
+}
diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/GeneralTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/GeneralTests.kt
new file mode 100644
index 0000000000..60842537c3
--- /dev/null
+++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/GeneralTests.kt
@@ -0,0 +1,24 @@
+package net.mullvad.mullvadvpn.test.arch
+
+import com.lemonappdev.konsist.api.Konsist
+import com.lemonappdev.konsist.api.ext.list.properties
+import com.lemonappdev.konsist.api.verify.assert
+import com.lemonappdev.konsist.api.verify.assertNot
+import org.junit.Test
+
+class GeneralTests {
+ @Test
+ fun `ensure package name must match file path`() =
+ Konsist.scopeFromProject().packages.assert { it.hasMatchingPath }
+
+ @Test
+ fun `ensure no field should have 'm' prefix`() =
+ Konsist.scopeFromProject().classes().properties().assertNot {
+ val secondCharacterIsUppercase = it.name.getOrNull(1)?.isUpperCase() ?: false
+ it.name.startsWith('m') && secondCharacterIsUppercase
+ }
+
+ @Test
+ fun `ensure no empty files allowed`() =
+ Konsist.scopeFromProject().files.assertNot { it.text.isEmpty() }
+}
diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/KonsistTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/KonsistTests.kt
new file mode 100644
index 0000000000..f2954bdb68
--- /dev/null
+++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/KonsistTests.kt
@@ -0,0 +1,14 @@
+package net.mullvad.mullvadvpn.test.arch
+
+import com.lemonappdev.konsist.api.Konsist
+import com.lemonappdev.konsist.api.ext.list.withAnnotationOf
+import com.lemonappdev.konsist.api.verify.assert
+import org.junit.Test
+
+class KonsistTests {
+ @Test
+ fun `ensure konsist tests have 'ensure ' prefix`() =
+ Konsist.scopeFromModule("test/arch").functions().withAnnotationOf(Test::class).assert {
+ it.hasNameStartingWith("ensure ")
+ }
+}
diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ViewModelTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ViewModelTests.kt
index 8347c799d7..0f23e52a43 100644
--- a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ViewModelTests.kt
+++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/ViewModelTests.kt
@@ -12,26 +12,23 @@ import org.junit.Test
class ViewModelTests {
@Test
- fun ensureViewModelsHaveViewModelSuffix() {
+ fun `ensure view models have view model suffix`() =
allViewModels().assert { it.name.endsWith("ViewModel") }
- }
// The purpose of this check is to both keep the naming consistent and also to avoid exposing
// properties that shouldn't be exposed.
@Test
- fun ensurePublicPropertiesUsePermittedNames() {
+ fun `ensure public properties use permitted names`() =
allViewModels().properties(includeNested = false).withPublicOrDefaultModifier().assert {
property ->
property.name == "uiState" || property.name == "uiSideEffect"
}
- }
@Test
- fun ensurePublicFunctionsHaveNoReturnType() {
+ fun `ensure public functions have no return type`() =
allViewModels().functions().withPublicOrDefaultModifier().assertNot { function ->
function.hasReturnType()
}
- }
private fun allViewModels() =
Konsist.scopeFromProject().classes().withAllParentsOf(ViewModel::class)
diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/ClassTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/ClassTests.kt
new file mode 100644
index 0000000000..918139bf24
--- /dev/null
+++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/ClassTests.kt
@@ -0,0 +1,20 @@
+package net.mullvad.mullvadvpn.test.arch.classes
+
+import com.lemonappdev.konsist.api.Konsist
+import com.lemonappdev.konsist.api.verify.assert
+import org.junit.Test
+
+class ClassTests {
+ @Test
+ fun `ensure companion object is last declaration in the class`() =
+ Konsist.scopeFromProject().classes(includeNested = true).assert {
+ val companionObject =
+ it.objects(includeNested = false).lastOrNull { obj -> obj.hasCompanionModifier }
+ if (companionObject != null) {
+ it.declarations(includeNested = false, includeLocal = false).last() ==
+ companionObject
+ } else {
+ true
+ }
+ }
+}
diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/DataClassTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/DataClassTests.kt
new file mode 100644
index 0000000000..cc2f7262b1
--- /dev/null
+++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/classes/DataClassTests.kt
@@ -0,0 +1,17 @@
+package net.mullvad.mullvadvpn.test.arch.classes
+
+import com.lemonappdev.konsist.api.Konsist
+import com.lemonappdev.konsist.api.ext.list.modifierprovider.withDataModifier
+import com.lemonappdev.konsist.api.ext.list.properties
+import com.lemonappdev.konsist.api.verify.assertNot
+import org.junit.Test
+
+class DataClasses {
+ @Test
+ fun `ensure data classes only use immutable properties`() =
+ Konsist.scopeFromProject()
+ .classes(includeNested = true)
+ .withDataModifier()
+ .properties(includeNested = false, includeLocal = false)
+ .assertNot { it.hasVarModifier }
+}
diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposePreviewTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposePreviewTests.kt
new file mode 100644
index 0000000000..5f8b1fef80
--- /dev/null
+++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposePreviewTests.kt
@@ -0,0 +1,20 @@
+package net.mullvad.mullvadvpn.test.arch.compose
+
+import androidx.compose.ui.tooling.preview.Preview
+import com.lemonappdev.konsist.api.Konsist
+import com.lemonappdev.konsist.api.ext.list.withAllAnnotationsOf
+import com.lemonappdev.konsist.api.verify.assert
+import org.junit.Test
+
+class ComposePreviewTests {
+ @Test
+ fun `ensure all preview functions are private`() =
+ allPreviewFunctions().assert { it.hasPrivateModifier }
+
+ @Test
+ fun `ensure all preview functions are prefixed with 'Preview'`() =
+ allPreviewFunctions().assert { it.name.startsWith("Preview") }
+
+ private fun allPreviewFunctions() =
+ Konsist.scopeFromProduction("app").functions().withAllAnnotationsOf(Preview::class)
+}
diff --git a/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposeTests.kt b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposeTests.kt
new file mode 100644
index 0000000000..025f10d11f
--- /dev/null
+++ b/android/test/arch/src/test/kotlin/net/mullvad/mullvadvpn/test/arch/compose/ComposeTests.kt
@@ -0,0 +1,16 @@
+package net.mullvad.mullvadvpn.test.arch.compose
+
+import androidx.compose.runtime.Composable
+import com.lemonappdev.konsist.api.Konsist
+import com.lemonappdev.konsist.api.ext.list.withAllAnnotationsOf
+import com.lemonappdev.konsist.api.verify.assert
+import org.junit.Test
+
+class ComposeTests {
+ @Test
+ fun `ensure all app composables are in the compose package`() =
+ allAppComposeFunctions().assert { it.resideInPackage("net.mullvad.mullvadvpn.compose..") }
+
+ private fun allAppComposeFunctions() =
+ Konsist.scopeFromProduction("app").functions().withAllAnnotationsOf(Composable::class)
+}
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 06f7164034..6a604bb09f 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
@@ -8,7 +8,10 @@ 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.accountInfoJson
import net.mullvad.mullvadvpn.test.mockapi.util.currentUtcTimeWithOffsetZero
+import net.mullvad.mullvadvpn.test.mockapi.util.deviceJson
import okhttp3.mockwebserver.Dispatcher
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.RecordedRequest
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 62320a07e6..2ccae9499e 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
@@ -1,6 +1,5 @@
-package net.mullvad.mullvadvpn.test.mockapi
+package net.mullvad.mullvadvpn.test.mockapi.util
-import net.mullvad.mullvadvpn.test.mockapi.util.formatStrictlyAccordingToIso8601AndRfc3339
import org.joda.time.DateTime
import org.json.JSONObject