From 4932b4b2e084c467eb91d15b94e7f20cae1c5ea7 Mon Sep 17 00:00:00 2001 From: Gergely Hegedus Date: Tue, 12 Apr 2022 14:37:39 +0300 Subject: [PATCH] Issue#67 Extract MigrationTestHelper into separate module --- app/build.gradle | 9 ++- .../AndroidMigrationTestRuleFactory.kt | 41 ---------- .../SpecificTestConfigurationsFactory.kt | 7 -- .../RobolectricMigrationTestHelperFactory.kt | 41 ---------- .../SpecificTestConfigurationsFactory.kt | 7 -- .../MigrationToLatestInstrumentedTest.kt | 10 +-- .../configuration/SharedMigrationTestRule.kt | 60 -------------- .../SharedMigrationTestRuleFactory.kt | 27 ------- .../SnackbarVerificationHelper.kt | 8 +- .../TestConfigurationsFactory.kt | 12 --- .../showcase/ui/home/MainViewModelTest.kt | 2 +- gradlescripts/testdependencies.gradle | 6 +- gradlescripts/versions.gradle | 6 +- settings.gradle | 4 +- test-util-shared-android/.gitignore | 1 + test-util-shared-android/build.gradle | 36 +++++++++ test-util-shared-android/consumer-rules.pro | 0 test-util-shared-android/proguard-rules.pro | 21 +++++ .../src/main/AndroidManifest.xml | 5 ++ .../testutil}/AndroidMigrationTestRule.kt | 8 +- test-util-shared-robolectric/.gitignore | 1 + test-util-shared-robolectric/build.gradle | 35 ++++++++ .../src/main/AndroidManifest.xml | 5 ++ .../testutil/SharedMigrationTestRule.kt | 29 +++++++ .../SharedMigrationTestRuleFactory.kt | 79 +++++++++++++++++++ .../RobolectricMigrationTestRule.java | 14 ++-- 26 files changed, 249 insertions(+), 225 deletions(-) delete mode 100644 app/src/androidTest/java/org/fnives/test/showcase/testutils/configuration/AndroidMigrationTestRuleFactory.kt delete mode 100644 app/src/androidTest/java/org/fnives/test/showcase/testutils/configuration/SpecificTestConfigurationsFactory.kt delete mode 100644 app/src/robolectricTest/java/org/fnives/test/showcase/testutils/configuration/RobolectricMigrationTestHelperFactory.kt delete mode 100644 app/src/robolectricTest/java/org/fnives/test/showcase/testutils/configuration/SpecificTestConfigurationsFactory.kt delete mode 100644 app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/SharedMigrationTestRule.kt delete mode 100644 app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/SharedMigrationTestRuleFactory.kt delete mode 100644 app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/TestConfigurationsFactory.kt create mode 100644 test-util-shared-android/.gitignore create mode 100644 test-util-shared-android/build.gradle create mode 100644 test-util-shared-android/consumer-rules.pro create mode 100644 test-util-shared-android/proguard-rules.pro create mode 100644 test-util-shared-android/src/main/AndroidManifest.xml rename {app/src/androidTest/java/org/fnives/test/showcase/testutils/configuration => test-util-shared-android/src/main/java/org/fnives/test/showcase/android/testutil}/AndroidMigrationTestRule.kt (88%) create mode 100644 test-util-shared-robolectric/.gitignore create mode 100644 test-util-shared-robolectric/build.gradle create mode 100644 test-util-shared-robolectric/src/main/AndroidManifest.xml create mode 100644 test-util-shared-robolectric/src/main/java/org/fnives/test/showcase/android/testutil/SharedMigrationTestRule.kt create mode 100644 test-util-shared-robolectric/src/main/java/org/fnives/test/showcase/android/testutil/SharedMigrationTestRuleFactory.kt rename app/src/robolectricTest/java/org/fnives/test/showcase/testutils/configuration/RobolectricMigrationTestHelper.java => test-util-shared-robolectric/src/main/java/org/fnives/test/showcase/android/testutil/robolectric/RobolectricMigrationTestRule.java (97%) diff --git a/app/build.gradle b/app/build.gradle index 214a08b..e7faf43 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -92,9 +92,9 @@ dependencies { implementation "io.insert-koin:koin-android:$koin_version" implementation "io.insert-koin:koin-androidx-compose:$koin_version" - implementation "androidx.room:room-runtime:$androidx_room_version" - kapt "androidx.room:room-compiler:$androidx_room_version" - implementation "androidx.room:room-ktx:$androidx_room_version" + implementation "androidx.room:room-runtime:$room_version" + kapt "androidx.room:room-compiler:$room_version" + implementation "androidx.room:room-ktx:$room_version" implementation "io.coil-kt:coil:$coil_version" implementation "io.coil-kt:coil-compose:$coil_version" @@ -108,5 +108,8 @@ dependencies { testImplementation testFixtures(project(':core')) androidTestImplementation testFixtures(project(':core')) + implementation project(':test-util-shared-robolectric') + androidTestImplementation project(':test-util-shared-android') + } diff --git a/app/src/androidTest/java/org/fnives/test/showcase/testutils/configuration/AndroidMigrationTestRuleFactory.kt b/app/src/androidTest/java/org/fnives/test/showcase/testutils/configuration/AndroidMigrationTestRuleFactory.kt deleted file mode 100644 index b4c5395..0000000 --- a/app/src/androidTest/java/org/fnives/test/showcase/testutils/configuration/AndroidMigrationTestRuleFactory.kt +++ /dev/null @@ -1,41 +0,0 @@ -package org.fnives.test.showcase.testutils.configuration - -import android.app.Instrumentation -import androidx.room.RoomDatabase -import androidx.room.migration.AutoMigrationSpec -import androidx.sqlite.db.SupportSQLiteOpenHelper - -object AndroidMigrationTestRuleFactory : SharedMigrationTestRuleFactory { - override fun createSharedMigrationTestRule( - instrumentation: Instrumentation, - databaseClass: Class - ): SharedMigrationTestRule = - AndroidMigrationTestRule( - instrumentation, - databaseClass - ) - - override fun createSharedMigrationTestRule( - instrumentation: Instrumentation, - databaseClass: Class, - specs: List - ): SharedMigrationTestRule = - AndroidMigrationTestRule( - instrumentation, - databaseClass, - specs - ) - - override fun createSharedMigrationTestRule( - instrumentation: Instrumentation, - databaseClass: Class, - specs: List, - openFactory: SupportSQLiteOpenHelper.Factory - ): SharedMigrationTestRule = - AndroidMigrationTestRule( - instrumentation, - databaseClass, - specs, - openFactory, - ) -} diff --git a/app/src/androidTest/java/org/fnives/test/showcase/testutils/configuration/SpecificTestConfigurationsFactory.kt b/app/src/androidTest/java/org/fnives/test/showcase/testutils/configuration/SpecificTestConfigurationsFactory.kt deleted file mode 100644 index 974ff95..0000000 --- a/app/src/androidTest/java/org/fnives/test/showcase/testutils/configuration/SpecificTestConfigurationsFactory.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.fnives.test.showcase.testutils.configuration - -object SpecificTestConfigurationsFactory : TestConfigurationsFactory { - - override fun createSharedMigrationTestRuleFactory(): SharedMigrationTestRuleFactory = - AndroidMigrationTestRuleFactory -} diff --git a/app/src/robolectricTest/java/org/fnives/test/showcase/testutils/configuration/RobolectricMigrationTestHelperFactory.kt b/app/src/robolectricTest/java/org/fnives/test/showcase/testutils/configuration/RobolectricMigrationTestHelperFactory.kt deleted file mode 100644 index 887a7b9..0000000 --- a/app/src/robolectricTest/java/org/fnives/test/showcase/testutils/configuration/RobolectricMigrationTestHelperFactory.kt +++ /dev/null @@ -1,41 +0,0 @@ -package org.fnives.test.showcase.testutils.configuration - -import android.app.Instrumentation -import androidx.room.RoomDatabase -import androidx.room.migration.AutoMigrationSpec -import androidx.sqlite.db.SupportSQLiteOpenHelper - -object RobolectricMigrationTestHelperFactory : SharedMigrationTestRuleFactory { - override fun createSharedMigrationTestRule( - instrumentation: Instrumentation, - databaseClass: Class - ): SharedMigrationTestRule = - RobolectricMigrationTestHelper( - instrumentation, - databaseClass - ) - - override fun createSharedMigrationTestRule( - instrumentation: Instrumentation, - databaseClass: Class, - specs: List - ): SharedMigrationTestRule = - RobolectricMigrationTestHelper( - instrumentation, - databaseClass, - specs - ) - - override fun createSharedMigrationTestRule( - instrumentation: Instrumentation, - databaseClass: Class, - specs: List, - openFactory: SupportSQLiteOpenHelper.Factory - ): SharedMigrationTestRule = - RobolectricMigrationTestHelper( - instrumentation, - databaseClass, - specs, - openFactory - ) -} diff --git a/app/src/robolectricTest/java/org/fnives/test/showcase/testutils/configuration/SpecificTestConfigurationsFactory.kt b/app/src/robolectricTest/java/org/fnives/test/showcase/testutils/configuration/SpecificTestConfigurationsFactory.kt deleted file mode 100644 index e9c281d..0000000 --- a/app/src/robolectricTest/java/org/fnives/test/showcase/testutils/configuration/SpecificTestConfigurationsFactory.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.fnives.test.showcase.testutils.configuration - -object SpecificTestConfigurationsFactory : TestConfigurationsFactory { - - override fun createSharedMigrationTestRuleFactory(): SharedMigrationTestRuleFactory = - RobolectricMigrationTestHelperFactory -} diff --git a/app/src/sharedTest/java/org/fnives/test/showcase/storage/migration/MigrationToLatestInstrumentedTest.kt b/app/src/sharedTest/java/org/fnives/test/showcase/storage/migration/MigrationToLatestInstrumentedTest.kt index d615a49..a2527aa 100644 --- a/app/src/sharedTest/java/org/fnives/test/showcase/storage/migration/MigrationToLatestInstrumentedTest.kt +++ b/app/src/sharedTest/java/org/fnives/test/showcase/storage/migration/MigrationToLatestInstrumentedTest.kt @@ -1,16 +1,14 @@ package org.fnives.test.showcase.storage.migration import androidx.room.Room -import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking +import org.fnives.test.showcase.android.testutil.SharedMigrationTestRule import org.fnives.test.showcase.storage.LocalDatabase import org.fnives.test.showcase.storage.favourite.FavouriteEntity import org.fnives.test.showcase.storage.migation.Migration1To2 -import org.fnives.test.showcase.testutils.configuration.SharedMigrationTestRule -import org.fnives.test.showcase.testutils.configuration.createSharedMigrationTestRule import org.junit.After import org.junit.Assert import org.junit.Rule @@ -28,11 +26,7 @@ import java.io.IOException class MigrationToLatestInstrumentedTest { @get:Rule - val helper: SharedMigrationTestRule = createSharedMigrationTestRule( - InstrumentationRegistry.getInstrumentation(), - emptyList(), - FrameworkSQLiteOpenHelperFactory() - ) + val helper = SharedMigrationTestRule(instrumentation = InstrumentationRegistry.getInstrumentation()) private fun getMigratedRoomDatabase(): LocalDatabase { val database: LocalDatabase = Room.databaseBuilder( diff --git a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/SharedMigrationTestRule.kt b/app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/SharedMigrationTestRule.kt deleted file mode 100644 index f521053..0000000 --- a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/SharedMigrationTestRule.kt +++ /dev/null @@ -1,60 +0,0 @@ -package org.fnives.test.showcase.testutils.configuration - -import android.app.Instrumentation -import androidx.room.RoomDatabase -import androidx.room.migration.AutoMigrationSpec -import androidx.room.migration.Migration -import androidx.sqlite.db.SupportSQLiteDatabase -import androidx.sqlite.db.SupportSQLiteOpenHelper -import org.junit.rules.TestRule -import java.io.IOException - -interface SharedMigrationTestRule : TestRule { - - @Throws(IOException::class) - fun createDatabase(name: String, version: Int): SupportSQLiteDatabase - - @Throws(IOException::class) - fun runMigrationsAndValidate( - name: String, - version: Int, - validateDroppedTables: Boolean, - vararg migrations: Migration - ): SupportSQLiteDatabase - - fun closeWhenFinished(db: SupportSQLiteDatabase) - fun closeWhenFinished(db: RoomDatabase) -} - -inline fun createSharedMigrationTestRule( - instrumentation: Instrumentation -): SharedMigrationTestRule = - SpecificTestConfigurationsFactory.createSharedMigrationTestRuleFactory() - .createSharedMigrationTestRule( - instrumentation, - DB::class.java - ) - -inline fun createSharedMigrationTestRule( - instrumentation: Instrumentation, - specs: List -): SharedMigrationTestRule = - SpecificTestConfigurationsFactory.createSharedMigrationTestRuleFactory() - .createSharedMigrationTestRule( - instrumentation, - DB::class.java, - specs - ) - -inline fun createSharedMigrationTestRule( - instrumentation: Instrumentation, - specs: List, - openFactory: SupportSQLiteOpenHelper.Factory -): SharedMigrationTestRule = - SpecificTestConfigurationsFactory.createSharedMigrationTestRuleFactory() - .createSharedMigrationTestRule( - instrumentation, - DB::class.java, - specs, - openFactory - ) diff --git a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/SharedMigrationTestRuleFactory.kt b/app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/SharedMigrationTestRuleFactory.kt deleted file mode 100644 index c99713e..0000000 --- a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/SharedMigrationTestRuleFactory.kt +++ /dev/null @@ -1,27 +0,0 @@ -package org.fnives.test.showcase.testutils.configuration - -import android.app.Instrumentation -import androidx.room.RoomDatabase -import androidx.room.migration.AutoMigrationSpec -import androidx.sqlite.db.SupportSQLiteOpenHelper - -interface SharedMigrationTestRuleFactory { - - fun createSharedMigrationTestRule( - instrumentation: Instrumentation, - databaseClass: Class, - ): SharedMigrationTestRule - - fun createSharedMigrationTestRule( - instrumentation: Instrumentation, - databaseClass: Class, - specs: List - ): SharedMigrationTestRule - - fun createSharedMigrationTestRule( - instrumentation: Instrumentation, - databaseClass: Class, - specs: List, - openFactory: SupportSQLiteOpenHelper.Factory - ): SharedMigrationTestRule -} diff --git a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/SnackbarVerificationHelper.kt b/app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/SnackbarVerificationHelper.kt index cdba01c..3827bd7 100644 --- a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/SnackbarVerificationHelper.kt +++ b/app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/SnackbarVerificationHelper.kt @@ -15,11 +15,13 @@ import org.hamcrest.Matchers class SnackbarVerificationHelper { - fun assertIsShownWithText(@StringRes stringResID: Int) { + fun assertIsShownWithText(@StringRes stringResID: Int, doDismiss: Boolean = true) { Espresso.onView(ViewMatchers.withId(R.id.snackbar_text)) .check(ViewAssertions.matches(ViewMatchers.withText(stringResID))) - Espresso.onView(ViewMatchers.isAssignableFrom(Snackbar.SnackbarLayout::class.java)).perform(ViewActions.swipeRight()) - Espresso.onView(ViewMatchers.isRoot()).perform(LoopMainUntilSnackbarDismissed()) + if (doDismiss) { + Espresso.onView(ViewMatchers.isAssignableFrom(Snackbar.SnackbarLayout::class.java)).perform(ViewActions.swipeRight()) + Espresso.onView(ViewMatchers.isRoot()).perform(LoopMainUntilSnackbarDismissed()) + } } fun assertIsNotShown() { diff --git a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/TestConfigurationsFactory.kt b/app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/TestConfigurationsFactory.kt deleted file mode 100644 index 18336c9..0000000 --- a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/configuration/TestConfigurationsFactory.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.fnives.test.showcase.testutils.configuration - -/** - * Defines the platform specific configurations for Robolectric and AndroidTest. - * - * Each should have an object [SpecificTestConfigurationsFactory] implementing this interface so the SharedTests are - * configured properly. - */ -interface TestConfigurationsFactory { - - fun createSharedMigrationTestRuleFactory(): SharedMigrationTestRuleFactory -} diff --git a/app/src/test/java/org/fnives/test/showcase/ui/home/MainViewModelTest.kt b/app/src/test/java/org/fnives/test/showcase/ui/home/MainViewModelTest.kt index 6ce1a3c..e0ca3e8 100644 --- a/app/src/test/java/org/fnives/test/showcase/ui/home/MainViewModelTest.kt +++ b/app/src/test/java/org/fnives/test/showcase/ui/home/MainViewModelTest.kt @@ -20,11 +20,11 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith +import org.mockito.Mockito.verifyNoInteractions import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.times import org.mockito.kotlin.verify -import org.mockito.kotlin.verifyNoInteractions import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.whenever diff --git a/gradlescripts/testdependencies.gradle b/gradlescripts/testdependencies.gradle index 428a4cd..991af51 100644 --- a/gradlescripts/testdependencies.gradle +++ b/gradlescripts/testdependencies.gradle @@ -37,12 +37,12 @@ project.ext { // ------------------VERSIONS------------------ def testing_junit5_version = propertyOrNull('junit5_version') ?: "5.7.0" - def testing_junit4_version = propertyOrNull('juni4_version') ?: "4.13.2" + def testing_junit4_version = propertyOrNull('juni4_version') ?: "4.12" def testing_robolectric_version = propertyOrNull('robolectric_version') ?: "4.7" def testing_androidx_code_version = propertyOrNull('androidx_test_version') ?: "1.4.0" def testing_androidx_junit_version = propertyOrNull('androidx_junit_version') ?: "1.1.3" def testing_espresso_version = propertyOrNull('espresso_version') ?: "3.4.0" - def testing_androidx_arch_core_version = propertyOrNull('androidx_arch_version') ?: "2.1.0" + def testing_androidx_arch_core_version = propertyOrNull('arch_core_version') ?: "2.1.0" def test_coroutines_version = propertyOrNull('coroutines_versionx') ?: "1.6.0" def testing_kotlin_mockito_version = propertyOrNull('mockito_version') ?: "3.1.0" def testing_koin_version = propertyOrNull('koin_version') ?: "3.1.2" @@ -52,6 +52,7 @@ project.ext { def testing_androidx_room_version = propertyOrNull('room_version') ?: "2.4.1" def testing_livedata_version = propertyOrNull('testing_livedata_version') ?: "1.2.0" def testing_compose_version = propertyOrNull('compose_version') ?: "1.1.0" + def testing_hamcrest_version = propertyOrNull('hamcrest_version')?: "2.2" // ------------------PRIVATE------------------ // JUni4 + Espresso + Room @@ -70,6 +71,7 @@ project.ext { "androidx.test.espresso:espresso-core:$testing_espresso_version", "androidx.test.espresso:espresso-intents:$testing_espresso_version", "androidx.test.espresso:espresso-contrib:$testing_espresso_version", + "org.hamcrest:hamcrest:$testing_hamcrest_version", "androidx.arch.core:core-testing:$testing_androidx_arch_core_version", ] diff --git a/gradlescripts/versions.gradle b/gradlescripts/versions.gradle index 3732bda..a75af32 100644 --- a/gradlescripts/versions.gradle +++ b/gradlescripts/versions.gradle @@ -5,7 +5,7 @@ project.ext { androidx_constraintlayout_version = "2.1.3" androidx_livedata_version = "2.4.0" androidx_swiperefreshlayout_version = "1.1.0" - androidx_room_version = "2.4.1" + room_version = "2.4.1" activity_ktx_version = "1.4.0" androidx_navigation = "2.4.0" @@ -23,12 +23,12 @@ project.ext { testing_androidx_code_version = "1.4.0" testing_androidx_junit_version = "1.1.3" - testing_androidx_arch_core_version = "2.1.0" + arch_core_version = "2.1.0" testing_livedata_version = "1.2.0" testing_kotlin_mockito_version = "4.0.0" testing_junit5_version = "5.7.0" testing_json_assert_version = "1.5.0" - testing_junit4_version = "4.13.2" + testing_junit4_version = "4.12" testing_robolectric_version = "4.7" testing_espresso_version = "3.4.0" } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index a7f91d5..1b941c4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,8 @@ +rootProject.name = "TestShowCase" include ':mockserver' include ':model' include ':core' include ':network' include ':app' -rootProject.name = "TestShowCase" \ No newline at end of file +include ':test-util-shared-android' +include ':test-util-shared-robolectric' diff --git a/test-util-shared-android/.gitignore b/test-util-shared-android/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/test-util-shared-android/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/test-util-shared-android/build.gradle b/test-util-shared-android/build.gradle new file mode 100644 index 0000000..bf17210 --- /dev/null +++ b/test-util-shared-android/build.gradle @@ -0,0 +1,36 @@ +plugins { + id 'com.android.library' + id 'org.jetbrains.kotlin.android' +} + +android { + compileSdk 31 + + defaultConfig { + minSdk 21 + targetSdk 31 + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + implementation "androidx.room:room-testing:$room_version" + api project(':test-util-shared-robolectric') + +} \ No newline at end of file diff --git a/test-util-shared-android/consumer-rules.pro b/test-util-shared-android/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/test-util-shared-android/proguard-rules.pro b/test-util-shared-android/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/test-util-shared-android/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/test-util-shared-android/src/main/AndroidManifest.xml b/test-util-shared-android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..80e5dbb --- /dev/null +++ b/test-util-shared-android/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/androidTest/java/org/fnives/test/showcase/testutils/configuration/AndroidMigrationTestRule.kt b/test-util-shared-android/src/main/java/org/fnives/test/showcase/android/testutil/AndroidMigrationTestRule.kt similarity index 88% rename from app/src/androidTest/java/org/fnives/test/showcase/testutils/configuration/AndroidMigrationTestRule.kt rename to test-util-shared-android/src/main/java/org/fnives/test/showcase/android/testutil/AndroidMigrationTestRule.kt index 882b3eb..33d0a0a 100644 --- a/app/src/androidTest/java/org/fnives/test/showcase/testutils/configuration/AndroidMigrationTestRule.kt +++ b/test-util-shared-android/src/main/java/org/fnives/test/showcase/android/testutil/AndroidMigrationTestRule.kt @@ -1,4 +1,4 @@ -package org.fnives.test.showcase.testutils.configuration +package org.fnives.test.showcase.android.testutil import android.app.Instrumentation import androidx.room.RoomDatabase @@ -10,6 +10,9 @@ import androidx.sqlite.db.SupportSQLiteOpenHelper import org.junit.runner.Description import org.junit.runners.model.Statement +/** + * Wrapper around [MigrationTestHelper] so it can be created in SharedTests, in both Robolectric and on Device. + */ class AndroidMigrationTestRule : SharedMigrationTestRule { private val migrationTestHelper: MigrationTestHelper @@ -35,8 +38,7 @@ class AndroidMigrationTestRule : SharedMigrationTestRule { specs: List, openFactory: SupportSQLiteOpenHelper.Factory ) { - migrationTestHelper = - MigrationTestHelper(instrumentation, databaseClass, specs, openFactory) + migrationTestHelper = MigrationTestHelper(instrumentation, databaseClass, specs, openFactory) } override fun apply(base: Statement, description: Description): Statement = diff --git a/test-util-shared-robolectric/.gitignore b/test-util-shared-robolectric/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/test-util-shared-robolectric/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/test-util-shared-robolectric/build.gradle b/test-util-shared-robolectric/build.gradle new file mode 100644 index 0000000..ed8dde6 --- /dev/null +++ b/test-util-shared-robolectric/build.gradle @@ -0,0 +1,35 @@ +plugins { + id 'com.android.library' + id 'org.jetbrains.kotlin.android' +} + +android { + compileSdk 31 + + defaultConfig { + minSdk 21 + targetSdk 31 + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + implementation "androidx.room:room-testing:$room_version" + implementation "androidx.arch.core:core-testing:$arch_core_version" +} \ No newline at end of file diff --git a/test-util-shared-robolectric/src/main/AndroidManifest.xml b/test-util-shared-robolectric/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ed38c52 --- /dev/null +++ b/test-util-shared-robolectric/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/test-util-shared-robolectric/src/main/java/org/fnives/test/showcase/android/testutil/SharedMigrationTestRule.kt b/test-util-shared-robolectric/src/main/java/org/fnives/test/showcase/android/testutil/SharedMigrationTestRule.kt new file mode 100644 index 0000000..b35c199 --- /dev/null +++ b/test-util-shared-robolectric/src/main/java/org/fnives/test/showcase/android/testutil/SharedMigrationTestRule.kt @@ -0,0 +1,29 @@ +package org.fnives.test.showcase.android.testutil + +import androidx.room.RoomDatabase +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase +import org.junit.rules.TestRule +import java.io.IOException + +/** + * Unifying API above [MigrationTestHelper][androidx.room.testing.MigrationTestHelper]. + * + * This is intended to be used in MigrationTests that are shared. Meaning the same test can run on both Device and via Robolectric. +*/ +interface SharedMigrationTestRule : TestRule { + + @Throws(IOException::class) + fun createDatabase(name: String, version: Int): SupportSQLiteDatabase + + @Throws(IOException::class) + fun runMigrationsAndValidate( + name: String, + version: Int, + validateDroppedTables: Boolean, + vararg migrations: Migration + ): SupportSQLiteDatabase + + fun closeWhenFinished(db: SupportSQLiteDatabase) + fun closeWhenFinished(db: RoomDatabase) +} \ No newline at end of file diff --git a/test-util-shared-robolectric/src/main/java/org/fnives/test/showcase/android/testutil/SharedMigrationTestRuleFactory.kt b/test-util-shared-robolectric/src/main/java/org/fnives/test/showcase/android/testutil/SharedMigrationTestRuleFactory.kt new file mode 100644 index 0000000..2e3db83 --- /dev/null +++ b/test-util-shared-robolectric/src/main/java/org/fnives/test/showcase/android/testutil/SharedMigrationTestRuleFactory.kt @@ -0,0 +1,79 @@ +package org.fnives.test.showcase.android.testutil + +import android.app.Instrumentation +import androidx.room.RoomDatabase +import androidx.room.migration.AutoMigrationSpec +import androidx.sqlite.db.SupportSQLiteOpenHelper +import org.fnives.test.showcase.android.testutil.robolectric.RobolectricMigrationTestRule + +inline fun SharedMigrationTestRule( + instrumentation: Instrumentation +): SharedMigrationTestRule = + createAndroidClassOrRobolectric( + androidClassFactory = { androidClass -> + val constructor = androidClass.getConstructor( + Instrumentation::class.java, + Class::class.java + ) + constructor.newInstance(instrumentation, Database::class.java) as SharedMigrationTestRule + }, + robolectricFactory = { + RobolectricMigrationTestRule(instrumentation, Database::class.java) + } + ) + +inline fun SharedMigrationTestRule( + instrumentation: Instrumentation, + specs: List +): SharedMigrationTestRule = + createAndroidClassOrRobolectric( + androidClassFactory = { androidClass -> + val constructor = androidClass.getConstructor( + Instrumentation::class.java, + Class::class.java, + List::class.java + ) + constructor.newInstance(instrumentation, Database::class.java, specs) as SharedMigrationTestRule + }, + robolectricFactory = { + RobolectricMigrationTestRule(instrumentation, Database::class.java, specs) + } + ) + +inline fun SharedMigrationTestRule( + instrumentation: Instrumentation, + specs: List, + openFactory: SupportSQLiteOpenHelper.Factory +): SharedMigrationTestRule = + createAndroidClassOrRobolectric( + androidClassFactory = { androidClass -> + val constructor = androidClass.getConstructor( + Instrumentation::class.java, + Class::class.java, + List::class.java, + SupportSQLiteOpenHelper.Factory::class.java + ) + constructor.newInstance(instrumentation, Database::class.java, specs, openFactory) as SharedMigrationTestRule + }, + robolectricFactory = { + RobolectricMigrationTestRule(instrumentation, Database::class.java, specs, openFactory) + } + ) + +fun createAndroidClassOrRobolectric( + androidClassFactory: (Class<*>) -> Any, + robolectricFactory: () -> SharedMigrationTestRule +): SharedMigrationTestRule { + val androidClass = getAndroidClass() + return if (androidClass == null) { + robolectricFactory() + } else { + androidClassFactory(androidClass) as SharedMigrationTestRule + } +} + +private fun getAndroidClass() = try { + Class.forName("org.fnives.test.showcase.android.testutil.AndroidMigrationTestRule") +} catch (classNotFoundException: ClassNotFoundException) { + null +} \ No newline at end of file diff --git a/app/src/robolectricTest/java/org/fnives/test/showcase/testutils/configuration/RobolectricMigrationTestHelper.java b/test-util-shared-robolectric/src/main/java/org/fnives/test/showcase/android/testutil/robolectric/RobolectricMigrationTestRule.java similarity index 97% rename from app/src/robolectricTest/java/org/fnives/test/showcase/testutils/configuration/RobolectricMigrationTestHelper.java rename to test-util-shared-robolectric/src/main/java/org/fnives/test/showcase/android/testutil/robolectric/RobolectricMigrationTestRule.java index daf10f3..855d13a 100644 --- a/app/src/robolectricTest/java/org/fnives/test/showcase/testutils/configuration/RobolectricMigrationTestHelper.java +++ b/test-util-shared-robolectric/src/main/java/org/fnives/test/showcase/android/testutil/robolectric/RobolectricMigrationTestRule.java @@ -1,4 +1,4 @@ -package org.fnives.test.showcase.testutils.configuration; +package org.fnives.test.showcase.android.testutil.robolectric; import android.annotation.SuppressLint; import android.app.Instrumentation; @@ -32,6 +32,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase; import androidx.sqlite.db.SupportSQLiteOpenHelper; import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory; +import org.fnives.test.showcase.android.testutil.SharedMigrationTestRule; import org.jetbrains.annotations.NotNull; import org.junit.rules.TestWatcher; import org.junit.runner.Description; @@ -56,8 +57,9 @@ import java.util.Set; * * reference: https://github.com/robolectric/robolectric/issues/2065 */ -public class RobolectricMigrationTestHelper extends TestWatcher implements SharedMigrationTestRule { - private static final String TAG = "RobolectricMigrationTestHelper"; +@SuppressLint("RestrictedApi") +public class RobolectricMigrationTestRule extends TestWatcher implements SharedMigrationTestRule { + private static final String TAG = "RobolectricMigrationTR"; private final String mAssetsFolder; private final SupportSQLiteOpenHelper.Factory mOpenFactory; private List> mManagedDatabases = new ArrayList<>(); @@ -77,7 +79,7 @@ public class RobolectricMigrationTestHelper extends TestWatcher implements Share * @param instrumentation The instrumentation instance. * @param databaseClass The Database class to be tested. */ - public RobolectricMigrationTestHelper(@NonNull Instrumentation instrumentation, + public RobolectricMigrationTestRule(@NonNull Instrumentation instrumentation, @NonNull Class databaseClass) { this(instrumentation, databaseClass, new ArrayList<>(), new FrameworkSQLiteOpenHelperFactory()); @@ -96,7 +98,7 @@ public class RobolectricMigrationTestHelper extends TestWatcher implements Share * @param specs The list of available auto migration specs that will be provided to * Room at runtime. */ - public RobolectricMigrationTestHelper(@NonNull Instrumentation instrumentation, + public RobolectricMigrationTestRule(@NonNull Instrumentation instrumentation, @NonNull Class databaseClass, @NonNull List specs) { this(instrumentation, databaseClass, specs, new FrameworkSQLiteOpenHelperFactory()); @@ -116,7 +118,7 @@ public class RobolectricMigrationTestHelper extends TestWatcher implements Share * Room at runtime. * @param openFactory Factory class that allows creation of {@link SupportSQLiteOpenHelper} */ - public RobolectricMigrationTestHelper(@NonNull Instrumentation instrumentation, + public RobolectricMigrationTestRule(@NonNull Instrumentation instrumentation, @NonNull Class databaseClass, @NonNull List specs, @NonNull SupportSQLiteOpenHelper.Factory openFactory