From f8927559b7f0df1579bff2758701e15297c747bd Mon Sep 17 00:00:00 2001 From: Eric Ampire Date: Wed, 8 Sep 2021 02:42:24 +0200 Subject: [PATCH] Testing UserDao --- app/build.gradle.kts | 3 + .../room/CoroutineTestRule.kt | 26 ++++++++ .../androidstudycase/room/UserDaoTest.kt | 62 +++++++++++++++++++ buildSrc/src/main/kotlin/Libs.kt | 4 +- util/build.gradle.kts | 2 +- versions.properties | 2 + 6 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 app/src/androidTest/java/com/ericampire/android/androidstudycase/room/CoroutineTestRule.kt create mode 100644 app/src/androidTest/java/com/ericampire/android/androidstudycase/room/UserDaoTest.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e753c46..009756f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -131,4 +131,7 @@ dependencies { androidTestImplementation(Libs.mockk_android) implementation(Libs.code_scanner) + + testImplementation(Libs.turbine) + androidTestImplementation(Libs.turbine) } \ No newline at end of file diff --git a/app/src/androidTest/java/com/ericampire/android/androidstudycase/room/CoroutineTestRule.kt b/app/src/androidTest/java/com/ericampire/android/androidstudycase/room/CoroutineTestRule.kt new file mode 100644 index 0000000..319db00 --- /dev/null +++ b/app/src/androidTest/java/com/ericampire/android/androidstudycase/room/CoroutineTestRule.kt @@ -0,0 +1,26 @@ +package com.ericampire.android.androidstudycase.room + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestCoroutineDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.setMain +import org.junit.rules.TestWatcher +import org.junit.runner.Description + +@ExperimentalCoroutinesApi +class CoroutineTestRule( + val testDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher() +) : TestWatcher() { + + override fun starting(description: Description?) { + super.starting(description) + Dispatchers.setMain(testDispatcher) + } + + override fun finished(description: Description?) { + super.finished(description) + Dispatchers.resetMain() + testDispatcher.cleanupTestCoroutines() + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/ericampire/android/androidstudycase/room/UserDaoTest.kt b/app/src/androidTest/java/com/ericampire/android/androidstudycase/room/UserDaoTest.kt new file mode 100644 index 0000000..34ec4a3 --- /dev/null +++ b/app/src/androidTest/java/com/ericampire/android/androidstudycase/room/UserDaoTest.kt @@ -0,0 +1,62 @@ +package com.ericampire.android.androidstudycase.room + +import android.content.Context +import androidx.room.Room +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import app.cash.turbine.test +import com.ericampire.android.androidstudycase.app.room.AppDatabase +import com.ericampire.android.androidstudycase.data.room.UserDao +import com.ericampire.android.androidstudycase.util.PreviewData +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.* +import org.hamcrest.CoreMatchers.equalTo +import org.hamcrest.MatcherAssert.assertThat +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import java.io.IOException +import kotlin.time.ExperimentalTime + +@RunWith(AndroidJUnit4::class) +@ExperimentalCoroutinesApi +@ExperimentalTime +class UserDaoTest { + + private val testDispatcher = TestCoroutineDispatcher() + private val testScope = TestCoroutineScope(testDispatcher) + + private lateinit var userDao: UserDao + private lateinit var db: AppDatabase + + @Before + fun setupDispatcher() { + Dispatchers.setMain(testDispatcher) + } + + + @Before + fun createDb() { + val context = ApplicationProvider.getApplicationContext() + db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java).build() + userDao = db.userDao + } + + @Test + fun saveUser() = testScope.runBlockingTest { + userDao.save(PreviewData.User.data.first()) + userDao.findAll().test { + assertThat(awaitItem(), equalTo(PreviewData.User.data.first())) + } + } + + @After + @Throws(IOException::class) + fun teardown() { + db.close() + Dispatchers.resetMain() + testDispatcher.cleanupTestCoroutines() + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Libs.kt b/buildSrc/src/main/kotlin/Libs.kt index 12078b5..eb17e1d 100644 --- a/buildSrc/src/main/kotlin/Libs.kt +++ b/buildSrc/src/main/kotlin/Libs.kt @@ -148,5 +148,7 @@ object Libs { const val joda_time = "net.danlew:android.joda:2.10.9" const val code_scanner = "com.budiyev.android:code-scanner:2.1.0" - const val fetch = "com.mindorks.android:prdownloader:0.6.0" + + const val turbine = "app.cash.turbine:turbine:_" + const val pr_downloader = "com.mindorks.android:prdownloader:_" } diff --git a/util/build.gradle.kts b/util/build.gradle.kts index 570fbb4..e47c848 100644 --- a/util/build.gradle.kts +++ b/util/build.gradle.kts @@ -51,5 +51,5 @@ dependencies { kapt(Libs.hilt_android_compiler) api(Libs.timber) - api(Libs.fetch) + api(Libs.pr_downloader) } \ No newline at end of file diff --git a/versions.properties b/versions.properties index ff3305a..35cc17f 100644 --- a/versions.properties +++ b/versions.properties @@ -59,3 +59,5 @@ version.io.insert-koin..koin-androidx-viewmodel=3.1.2 version.io.insert-koin..koin-androidx-compose=3.1.2 version.io.insert-koin..koin-androidx-workmanager=3.1.2 version.com.airbnb.android..lottie-compose=4.1.0 +version.app.cash.turbine..turbine=0.6.1 +version.com.mindorks.android..prdownloader=0.6.0