From 7ddff0843f7dd30eea71c7ffdc52b0f0ad5a0220 Mon Sep 17 00:00:00 2001 From: Ryan Harg <3821-ryan_harg@users.noreply.dev.funkwhale.audio> Date: Fri, 6 Aug 2021 19:16:46 +0000 Subject: [PATCH] Housekeeping/7 integration testing --- .gitlab-ci.yml | 12 ++-- app/build.gradle.kts | 56 ++++++++++++++++--- app/src/main/java/audio/funkwhale/ffa/FFA.kt | 2 + .../ffa/activities/SplashActivityTest.kt | 27 +++++++++ build.gradle.kts | 14 ++++- .../main/java/{Constants.kt => Versions.kt} | 2 + 6 files changed, 100 insertions(+), 13 deletions(-) create mode 100644 app/src/test/java/audio/funkwhale/ffa/activities/SplashActivityTest.kt rename buildSrc/src/main/java/{Constants.kt => Versions.kt} (88%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 15dd382..1b20ca2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,9 @@ image: jangrewe/gitlab-ci-android variables: - JACOCO_CSV_LOCATION: '$CI_PROJECT_DIR/app/build/reports/jacoco/debug/jacoco.csv' + COBERTURA_REPORT: '$CI_PROJECT_DIR/app/build/reports/cobertura.xml' + JACOCO_CSV_LOCATION: '$CI_PROJECT_DIR/app/build/reports/jacoco/jacocoTestReport/jacocoTestReport.csv' + JACOCO_XML_LOCATION: '$CI_PROJECT_DIR/app/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml' stages: - test @@ -33,26 +35,26 @@ test: extends: .gradle-default stage: test script: - - ./gradlew test jacocoTestReportDebug + - ./gradlew test jacocoTestReport - awk -F"," '{ instructions += $4 + $5; covered += $5 } END { print covered, "/", instructions, " instructions covered"; print 100*covered/instructions, "% covered" }' $JACOCO_CSV_LOCATION artifacts: reports: junit: app/build/test-results/test**/TEST-*.xml paths: - - app/build/reports/jacoco/debug/jacoco.xml + - $JACOCO_XML_LOCATION coverage: stage: visualize image: gjrtimmer/jacoco2cobertura:1.0.8 script: # convert report from jacoco to cobertura, use relative project path - - 'python /opt/cover2cover.py app/build/reports/jacoco/debug/jacoco.xml $CI_PROJECT_DIR/app/src/main/java > app/build/reports/cobertura.xml' + - 'python /opt/cover2cover.py $JACOCO_XML_LOCATION $CI_PROJECT_DIR/app/src/main/java > app/build/reports/cobertura.xml' needs: [ "test" ] dependencies: - test artifacts: reports: - cobertura: app/build/reports/cobertura.xml + cobertura: $COBERTURA_REPORT build-develop: extends: .build diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0b74bb0..6f9e1e0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -12,11 +12,6 @@ plugins { id("de.mobilej.unmock") id("com.github.ben-manes.versions") jacoco - id("com.vanniktech.android.junit.jacoco") -} - -junitJacoco { - jacocoVersion = Versions.jacoco } val props = Properties().apply { @@ -41,6 +36,10 @@ android { targetCompatibility = JavaVersion.VERSION_1_8 } + testCoverage { + version = Versions.jacoco + } + kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() } @@ -50,7 +49,7 @@ android { } lint { - disable += listOf("MissingTranslation","ExtraTranslation") + disable += listOf("MissingTranslation", "ExtraTranslation") } compileSdk = 30 @@ -104,6 +103,8 @@ android { isDebuggable = true applicationIdSuffix = ".dev" + isTestCoverageEnabled = true + if (project.hasProperty("signing.store")) { signingConfig = signingConfigs.getByName("debug") } @@ -191,17 +192,58 @@ dependencies { testImplementation("io.mockk:mockk:1.12.0") testImplementation("androidx.test:core:1.4.0") testImplementation("io.strikt:strikt-core:${Versions.strikt}") + testImplementation("org.robolectric:robolectric:${Versions.robolectric}") androidTestImplementation("io.mockk:mockk-android:${Versions.mockk}") } project.afterEvaluate { - tasks.withType { + tasks.withType { + + configure { + isIncludeNoLocationClasses = true + excludes = listOf("jdk.internal.*") + } + } + + tasks.create("jacocoTestReport", type = JacocoReport::class) { + dependsOn("testDebugUnitTest", "createDebugCoverageReport") + + group = "Verification" + description = "Creates a Jacoco Coverage report" + reports { xml.required.set(true) csv.required.set(true) html.required.set(true) } + + val fileFilter = listOf( + "**/R.class", + "**/R$*.class", + "**/BuildConfig.*", + "**/Manifest*.*", + "**/*Test*.*", + "android/**/*.*", + "**/*$[0-9].*" + ) + + val debugTree = fileTree("${project.buildDir}/tmp/kotlin-classes/debug") { + setExcludes(fileFilter) + } + val mainSrc = "${project.projectDir}/src/main/java" + + sourceDirectories.setFrom(files(listOf(mainSrc))) + classDirectories.setFrom(files(listOf(debugTree))) + + executionData.setFrom(fileTree(project.buildDir) { + setIncludes( + listOf( + "outputs/unit_test_code_coverage/debugUnitTest/*.exec", + "outputs/code_coverage/debugAndroidTest/connected/**/*.ec" + ) + ) + }) } } diff --git a/app/src/main/java/audio/funkwhale/ffa/FFA.kt b/app/src/main/java/audio/funkwhale/ffa/FFA.kt index 2a02fbb..adc9ea6 100644 --- a/app/src/main/java/audio/funkwhale/ffa/FFA.kt +++ b/app/src/main/java/audio/funkwhale/ffa/FFA.kt @@ -72,6 +72,8 @@ class FFA : Application() { instance = this + PowerPreference.init(this) + when (PowerPreference.getDefaultFile().getString("night_mode")) { "on" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) "off" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) diff --git a/app/src/test/java/audio/funkwhale/ffa/activities/SplashActivityTest.kt b/app/src/test/java/audio/funkwhale/ffa/activities/SplashActivityTest.kt new file mode 100644 index 0000000..4eb754d --- /dev/null +++ b/app/src/test/java/audio/funkwhale/ffa/activities/SplashActivityTest.kt @@ -0,0 +1,27 @@ +package audio.funkwhale.ffa.activities + +import android.content.Intent +import androidx.test.core.app.ActivityScenario +import androidx.test.core.app.ApplicationProvider +import audio.funkwhale.ffa.FFA +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.Shadows +import strikt.api.expectThat +import strikt.assertions.isEqualTo + +@RunWith(RobolectricTestRunner::class) +class SplashActivityTest { + + @Test + fun `unauthorized and nonAnonymous request should redirect to LoginActivity`() { + val scenario = ActivityScenario.launch(SplashActivity::class.java) + scenario.onActivity { activity -> + val expectedIntent = Intent(activity, LoginActivity::class.java) + val appContext = Shadows.shadowOf(ApplicationProvider.getApplicationContext()) + expectThat(appContext.nextStartedActivity.component).isEqualTo(expectedIntent.component) + } + + } +} diff --git a/build.gradle.kts b/build.gradle.kts index 53c1c89..13a8650 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,8 +10,8 @@ buildscript { classpath("com.android.tools.build:gradle:${Versions.androidGradlePlugin}") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}") classpath("com.github.bjoernq:unmockplugin:${Versions.unmock}") - classpath("com.vanniktech:gradle-android-junit-jacoco-plugin:${Versions.gradleAndroidJUnitJacocoPlugin}") classpath("com.github.ben-manes:gradle-versions-plugin:${Versions.gradleDependencyPlugin}") + classpath("org.jacoco:org.jacoco.core:${Versions.jacoco}") } } @@ -24,6 +24,18 @@ allprojects { } } +subprojects { + configurations.all { + resolutionStrategy { + eachDependency { + if (this.requested.group == "org.jacoco") { + this.useVersion("0.8.7") + } + } + } + } +} + tasks { val clean by registering(Delete::class) { delete(buildDir) diff --git a/buildSrc/src/main/java/Constants.kt b/buildSrc/src/main/java/Versions.kt similarity index 88% rename from buildSrc/src/main/java/Constants.kt rename to buildSrc/src/main/java/Versions.kt index 966d820..780c380 100644 --- a/buildSrc/src/main/java/Constants.kt +++ b/buildSrc/src/main/java/Versions.kt @@ -15,4 +15,6 @@ object Versions { const val mockk = "1.12.0" const val strikt = "0.31.0" + const val androidXTest = "1.4.0" + const val robolectric = "4.6.1" }