Testing Dao

This commit is contained in:
2021-09-09 19:58:35 +02:00
parent 066f6e2dff
commit 8d68f00c3e
13 changed files with 167 additions and 87 deletions
@@ -1,24 +0,0 @@
package com.ericampire.android.androidstudycase
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.ericampire.android.androidstudycase", appContext.packageName)
}
}
@@ -1,20 +1,17 @@
package com.ericampire.android.androidstudycase.presentation
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.ui.test.assertIsSelected
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.navigation.compose.rememberNavController
import com.ericampire.android.androidstudycase.MainActivity
import com.ericampire.android.androidstudycase.presentation.screen.explore.business.ExploreAction
import com.ericampire.android.androidstudycase.presentation.screen.explore.business.ExploreViewModel
import com.ericampire.android.androidstudycase.presentation.screen.explore.ui.ExploreScreen
import com.ericampire.android.androidstudycase.util.PreviewData
import com.google.accompanist.pager.ExperimentalPagerApi
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
@ExperimentalMaterialApi
@ExperimentalPagerApi
@@ -24,17 +21,15 @@ class ExploreScreenTest {
val composeTestRule = createAndroidComposeRule<MainActivity>()
@Test
@Ignore
fun whenSubmitActionShouldReturnData() {
val exploreViewModel = mock<ExploreViewModel> {
on { submitAction(ExploreAction.FindPopularFile) }
doReturn(PreviewData.Lottiefile.data)
}
composeTestRule.setContent {
ExploreScreen(
navController = rememberNavController(),
viewModel = exploreViewModel
)
ExploreScreen(navController = rememberNavController())
}
verify(exploreViewModel).submitAction(any())
composeTestRule.onNodeWithText("Recent").performClick().assertIsSelected()
composeTestRule.onNodeWithText("Featured").performClick().assertIsSelected()
composeTestRule.onNodeWithText("Popular").performClick().assertIsSelected()
}
}
@@ -0,0 +1,32 @@
package com.ericampire.android.androidstudycase.room
import app.cash.turbine.test
import com.ericampire.android.androidstudycase.data.room.LottieFilesDao
import com.ericampire.android.androidstudycase.room.common.DatabaseTest
import com.ericampire.android.androidstudycase.util.PreviewData
import kotlinx.coroutines.runBlocking
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import kotlin.time.ExperimentalTime
@ExperimentalTime
class AnimationDoaTest : DatabaseTest() {
private lateinit var animationDao: LottieFilesDao
@BeforeEach
fun setup() {
animationDao = db.lottieFileDao
}
@Test
fun saveAnimation() = runBlocking {
val animation = PreviewData.Lottiefile.data.first().copy(type = "recent")
animationDao.save(animation)
animationDao.findByType("recent").test {
Assertions.assertEquals(awaitItem().first(), animation)
}
}
}
@@ -0,0 +1,31 @@
package com.ericampire.android.androidstudycase.room
import app.cash.turbine.test
import com.ericampire.android.androidstudycase.data.room.AnimatorDao
import com.ericampire.android.androidstudycase.room.common.DatabaseTest
import com.ericampire.android.androidstudycase.util.PreviewData
import kotlinx.coroutines.runBlocking
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import kotlin.time.ExperimentalTime
@ExperimentalTime
class AnimatorDoaTest : DatabaseTest() {
private lateinit var animatorDao: AnimatorDao
@BeforeEach
fun setup() {
animatorDao = db.animatorDao
}
@Test
fun saveAnimator() = runBlocking {
val testData = PreviewData.Animator.data.first().copy(id = 1)
animatorDao.save(testData)
animatorDao.findAll().test {
Assertions.assertEquals(awaitItem().first(), testData)
}
}
}
@@ -0,0 +1,31 @@
package com.ericampire.android.androidstudycase.room
import app.cash.turbine.test
import com.ericampire.android.androidstudycase.data.room.BlogDao
import com.ericampire.android.androidstudycase.room.common.DatabaseTest
import com.ericampire.android.androidstudycase.util.PreviewData
import kotlinx.coroutines.runBlocking
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import kotlin.time.ExperimentalTime
@ExperimentalTime
class BlogDoaTest : DatabaseTest() {
private lateinit var blogDoa: BlogDao
@BeforeEach
fun setup() {
blogDoa = db.blogDao
}
@Test
fun saveBlog() = runBlocking {
blogDoa.save(PreviewData.Blog.data.first())
blogDoa.findAll().test {
Assertions.assertEquals(awaitItem().first(), PreviewData.Blog.data.first())
}
}
}
@@ -1,64 +1,31 @@
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.room.common.DatabaseTest
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.Ignore
import org.junit.Test
import org.junit.runner.RunWith
import java.io.IOException
import kotlinx.coroutines.runBlocking
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import kotlin.time.ExperimentalTime
@RunWith(AndroidJUnit4::class)
@ExperimentalCoroutinesApi
@ExperimentalTime
class UserDaoTest {
private val testDispatcher = TestCoroutineDispatcher()
private val testScope = TestCoroutineScope(testDispatcher)
class UserDoaTest : DatabaseTest() {
private lateinit var userDao: UserDao
private lateinit var db: AppDatabase
@Before
fun setupDispatcher() {
Dispatchers.setMain(testDispatcher)
}
@Before
fun createDb() {
val context = ApplicationProvider.getApplicationContext<Context>()
db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java).build()
@BeforeEach
fun setup() {
userDao = db.userDao
}
@Test
@Ignore
fun saveUser() = testScope.runBlockingTest {
fun saveUser() = runBlocking(Dispatchers.IO) {
userDao.save(PreviewData.User.data.first())
userDao.findAll().test {
assertThat(awaitItem(), equalTo(PreviewData.User.data.first()))
assertEquals(awaitItem().first(), PreviewData.User.data.first())
}
}
@After
@Throws(IOException::class)
fun teardown() {
db.close()
Dispatchers.resetMain()
testDispatcher.cleanupTestCoroutines()
}
}
@@ -0,0 +1,24 @@
package com.ericampire.android.androidstudycase.room.common
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider.getApplicationContext
import com.ericampire.android.androidstudycase.app.room.AppDatabase
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
abstract class DatabaseTest {
lateinit var db: AppDatabase
@BeforeEach
fun initDB() {
db = Room.inMemoryDatabaseBuilder(getApplicationContext(), AppDatabase::class.java)
.allowMainThreadQueries()
.build()
}
@AfterEach
fun closeDB() {
db.close()
}
}
@@ -15,21 +15,25 @@ object PreviewData {
object Blog {
val data = listOf(
Blog(
id = 1,
postedAt = "2021-07-08T00:00:00.000Z",
imageUrl = "https://d3jl769oy69y7b.cloudfront.net/2021/07/Blog-Visual---The-Key-to-An-Immersive-UX_-Animation.png",
title = "The Key to An Immersive UX: Animation"
),
Blog(
id = 2,
title = "LottieFiles Animations are accessible across 25,000+ everyday tools with the embed feature",
postedAt = "2021-06-18T00:00:00.000Z",
imageUrl = "https://d3jl769oy69y7b.cloudfront.net/2021/06/Embed-Blog-OG.png"
),
Blog(
id = 3,
postedAt = "2021-07-08T00:00:00.000Z",
imageUrl = "https://d3jl769oy69y7b.cloudfront.net/2021/07/Blog-Visual---The-Key-to-An-Immersive-UX_-Animation.png",
title = "The Key to An Immersive UX: Animation"
),
Blog(
id = 4,
title = "LottieFiles Animations are accessible across 25,000+ everyday tools with the embed feature",
postedAt = "2021-06-18T00:00:00.000Z",
imageUrl = "https://d3jl769oy69y7b.cloudfront.net/2021/06/Embed-Blog-OG.png"