diff options
| author | Albin <albin@mullvad.net> | 2023-10-02 16:35:34 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2023-10-02 16:35:34 +0200 |
| commit | bb3737bd8fa8daadac80de9b77efc38b9a1772ca (patch) | |
| tree | 774ca9099edc490aa4af9a0b641bed2dc308f88f /android/test | |
| parent | c2183ff16c818f3062045ca05d6e71213605861e (diff) | |
| parent | 54a8e7178e255d276007260e418ae9d32966af36 (diff) | |
| download | mullvadvpn-bb3737bd8fa8daadac80de9b77efc38b9a1772ca.tar.xz mullvadvpn-bb3737bd8fa8daadac80de9b77efc38b9a1772ca.zip | |
Merge branch 'add-konsist-tests-droid-380'
Diffstat (limited to 'android/test')
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 |
