Testing Data Layer

This commit is contained in:
2021-09-09 03:19:03 +02:00
parent 9684c96610
commit 5ddccb03a8
18 changed files with 443 additions and 19 deletions
@@ -0,0 +1,40 @@
package com.ericampire.android.androidstudycase.presentation
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.ui.test.junit4.createAndroidComposeRule
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.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
class ExploreScreenTest {
@get:Rule
val composeTestRule = createAndroidComposeRule<MainActivity>()
@Test
fun whenSubmitActionShouldReturnData() {
val exploreViewModel = mock<ExploreViewModel> {
on { submitAction(ExploreAction.FindPopularFile) }
doReturn(PreviewData.Lottiefile.data)
}
composeTestRule.setContent {
ExploreScreen(
navController = rememberNavController(),
viewModel = exploreViewModel
)
}
verify(exploreViewModel).submitAction(any())
}
}
@@ -0,0 +1,4 @@
package com.ericampire.android.androidstudycase.presentation
class HomeScreenTest {
}
@@ -0,0 +1,4 @@
package com.ericampire.android.androidstudycase.presentation
class PreviewScreenTest {
}
@@ -15,6 +15,7 @@ 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
@@ -45,6 +46,7 @@ class UserDaoTest {
}
@Test
@Ignore
fun saveUser() = testScope.runBlockingTest {
userDao.save(PreviewData.User.data.first())
userDao.findAll().test {
@@ -0,0 +1,55 @@
package com.ericampire.android.androidstudycase.domain
import com.ericampire.android.androidstudycase.common.CoroutineDispatcherExtension
import com.ericampire.android.androidstudycase.common.MainCoroutineExtension
import com.ericampire.android.androidstudycase.domain.repository.AnimatorRepository
import com.ericampire.android.androidstudycase.domain.usecase.FindFeaturedAnimatorUseCase
import com.ericampire.android.androidstudycase.util.PreviewData
import com.ericampire.android.androidstudycase.util.Result
import com.ericampire.android.androidstudycase.util.data
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.test.TestCoroutineDispatcher
import kotlinx.coroutines.test.runBlockingTest
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
@ExperimentalCoroutinesApi
@ExtendWith(value = [MainCoroutineExtension::class, CoroutineDispatcherExtension::class])
class FindFeaturedAnimatorUseCaseTest(
private val testCoroutineDisabled: TestCoroutineDispatcher
) {
// SUT
private lateinit var useCase: FindFeaturedAnimatorUseCase
// DOC's
private val repository = mockk<AnimatorRepository>(relaxed = true)
@BeforeEach
fun setUp() {
useCase = FindFeaturedAnimatorUseCase(
dispatcher = testCoroutineDisabled,
repository = repository
)
}
@Test
fun findFeaturedAnimator() = runBlockingTest {
every { repository.findAll() } returns flow {
emit(Result.Success(PreviewData.Animator.data))
}
useCase.invoke(Unit).collect {
Assertions.assertEquals(it.data, PreviewData.Animator.data)
}
verify(exactly = 1) {
repository.findAll()
}
}
}
@@ -0,0 +1,57 @@
package com.ericampire.android.androidstudycase.domain
import com.ericampire.android.androidstudycase.common.CoroutineDispatcherExtension
import com.ericampire.android.androidstudycase.common.MainCoroutineExtension
import com.ericampire.android.androidstudycase.domain.repository.BlogRepository
import com.ericampire.android.androidstudycase.domain.usecase.FindFeaturedBlogUseCase
import com.ericampire.android.androidstudycase.util.PreviewData
import com.ericampire.android.androidstudycase.util.Result
import com.ericampire.android.androidstudycase.util.data
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.test.TestCoroutineDispatcher
import kotlinx.coroutines.test.runBlockingTest
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
@ExperimentalCoroutinesApi
@ExtendWith(value = [MainCoroutineExtension::class, CoroutineDispatcherExtension::class])
internal class FindFeaturedBlogUseCaseTest(
private val testCoroutineDisabled: TestCoroutineDispatcher
) {
// SUT
private lateinit var useCase: FindFeaturedBlogUseCase
// DOC's
private val repository = mockk<BlogRepository>(relaxed = true)
@BeforeEach
fun setUp() {
useCase = FindFeaturedBlogUseCase(
dispatcher = testCoroutineDisabled,
repository = repository
)
}
@Test
fun findFeaturedAnimation() = runBlockingTest {
every { repository.findAll() } returns flow {
emit(Result.Success(PreviewData.Blog.data))
}
useCase.invoke(Unit).collect {
Assertions.assertEquals(it.data, PreviewData.Blog.data)
}
verify(exactly = 1) {
repository.findAll()
}
}
}
@@ -0,0 +1,57 @@
package com.ericampire.android.androidstudycase.domain.animation
import com.ericampire.android.androidstudycase.common.CoroutineDispatcherExtension
import com.ericampire.android.androidstudycase.common.MainCoroutineExtension
import com.ericampire.android.androidstudycase.domain.repository.LottieFileRepository
import com.ericampire.android.androidstudycase.domain.usecase.FindFeaturedLottieFileUseCase
import com.ericampire.android.androidstudycase.util.PreviewData
import com.ericampire.android.androidstudycase.util.Result
import com.ericampire.android.androidstudycase.util.data
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.test.TestCoroutineDispatcher
import kotlinx.coroutines.test.runBlockingTest
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
@ExperimentalCoroutinesApi
@ExtendWith(value = [MainCoroutineExtension::class, CoroutineDispatcherExtension::class])
class FindFeaturedLottieFileUseCaseTest(
private val testCoroutineDisabled: TestCoroutineDispatcher
) {
// SUT
private lateinit var useCase: FindFeaturedLottieFileUseCase
// DOC's
private val repository = mockk<LottieFileRepository>(relaxed = true)
@BeforeEach
fun setUp() {
useCase = FindFeaturedLottieFileUseCase(
dispatcher = testCoroutineDisabled,
repository = repository
)
}
@Test
fun findFeaturedAnimations() = runBlockingTest {
every { repository.findFeatured() } returns flow {
emit(Result.Success(PreviewData.Lottiefile.data))
}
useCase.invoke(Unit).collect {
Assertions.assertEquals(it.data, PreviewData.Lottiefile.data)
}
verify(exactly = 1) {
repository.findFeatured()
}
}
}
@@ -0,0 +1,57 @@
package com.ericampire.android.androidstudycase.domain.animation
import com.ericampire.android.androidstudycase.common.CoroutineDispatcherExtension
import com.ericampire.android.androidstudycase.common.MainCoroutineExtension
import com.ericampire.android.androidstudycase.domain.repository.LottieFileRepository
import com.ericampire.android.androidstudycase.domain.usecase.FindPopularLottieFileUseCase
import com.ericampire.android.androidstudycase.util.PreviewData
import com.ericampire.android.androidstudycase.util.Result
import com.ericampire.android.androidstudycase.util.data
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.test.TestCoroutineDispatcher
import kotlinx.coroutines.test.runBlockingTest
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
@ExperimentalCoroutinesApi
@ExtendWith(value = [MainCoroutineExtension::class, CoroutineDispatcherExtension::class])
class FindPopularLottieFileUseCaseTest(
private val testCoroutineDisabled: TestCoroutineDispatcher
) {
// SUT
private lateinit var useCase: FindPopularLottieFileUseCase
// DOC's
private val repository = mockk<LottieFileRepository>(relaxed = true)
@BeforeEach
fun setUp() {
useCase = FindPopularLottieFileUseCase(
dispatcher = testCoroutineDisabled,
repository = repository
)
}
@Test
fun findPopularAnimations() = runBlockingTest {
every { repository.findPopular() } returns flow {
emit(Result.Success(PreviewData.Lottiefile.data))
}
useCase.invoke(Unit).collect {
Assertions.assertEquals(it.data, PreviewData.Lottiefile.data)
}
verify(exactly = 1) {
repository.findPopular()
}
}
}
@@ -0,0 +1,56 @@
package com.ericampire.android.androidstudycase.domain.animation
import com.ericampire.android.androidstudycase.common.CoroutineDispatcherExtension
import com.ericampire.android.androidstudycase.common.MainCoroutineExtension
import com.ericampire.android.androidstudycase.domain.repository.LottieFileRepository
import com.ericampire.android.androidstudycase.domain.usecase.FindRecentLottieFileUseCase
import com.ericampire.android.androidstudycase.util.PreviewData
import com.ericampire.android.androidstudycase.util.Result
import com.ericampire.android.androidstudycase.util.data
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.test.TestCoroutineDispatcher
import kotlinx.coroutines.test.runBlockingTest
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
@ExperimentalCoroutinesApi
@ExtendWith(value = [MainCoroutineExtension::class, CoroutineDispatcherExtension::class])
class FindRecentLottieFileUseCaseTest(
private val testCoroutineDisabled: TestCoroutineDispatcher
) {
// SUT
private lateinit var useCase: FindRecentLottieFileUseCase
// DOC's
private val repository = mockk<LottieFileRepository>(relaxed = true)
@BeforeEach
fun setUp() {
useCase = FindRecentLottieFileUseCase(
dispatcher = testCoroutineDisabled,
repository = repository
)
}
@Test
fun findRecentAnimations() = runBlockingTest {
every { repository.findRecent() } returns flow {
emit(Result.Success(PreviewData.Lottiefile.data))
}
useCase.invoke(Unit).collect {
Assertions.assertEquals(it.data, PreviewData.Lottiefile.data)
}
verify(exactly = 1) {
repository.findRecent()
}
}
}
@@ -0,0 +1,55 @@
package com.ericampire.android.androidstudycase.domain.user
import com.ericampire.android.androidstudycase.common.CoroutineDispatcherExtension
import com.ericampire.android.androidstudycase.common.MainCoroutineExtension
import com.ericampire.android.androidstudycase.domain.repository.UserRepository
import com.ericampire.android.androidstudycase.domain.usecase.FindUsersUseCase
import com.ericampire.android.androidstudycase.util.PreviewData
import com.ericampire.android.androidstudycase.util.Result
import com.ericampire.android.androidstudycase.util.data
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.test.TestCoroutineDispatcher
import kotlinx.coroutines.test.runBlockingTest
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
@ExperimentalCoroutinesApi
@ExtendWith(value = [MainCoroutineExtension::class, CoroutineDispatcherExtension::class])
class FindUserUseCaseTest(
private val testCoroutineDisabled: TestCoroutineDispatcher
) {
// SUT
private lateinit var useCase: FindUsersUseCase
// DOC's
private val repository = mockk<UserRepository>(relaxed = true)
@BeforeEach
fun setUp() {
useCase = FindUsersUseCase(
dispatcher = testCoroutineDisabled,
repository = repository
)
}
@Test
fun findCurrentUser() = runBlockingTest {
every { repository.findAll() } returns flow {
emit(Result.Success(PreviewData.User.data))
}
useCase.invoke(Unit).collect {
Assertions.assertEquals(it.data, PreviewData.User.data)
}
verify(exactly = 1) {
repository.findAll()
}
}
}
@@ -0,0 +1,44 @@
package com.ericampire.android.androidstudycase.domain.user
import com.ericampire.android.androidstudycase.common.CoroutineDispatcherExtension
import com.ericampire.android.androidstudycase.common.MainCoroutineExtension
import com.ericampire.android.androidstudycase.domain.repository.UserRepository
import com.ericampire.android.androidstudycase.domain.usecase.SaveUserUseCase
import com.ericampire.android.androidstudycase.util.PreviewData
import io.mockk.*
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestCoroutineDispatcher
import kotlinx.coroutines.test.runBlockingTest
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
@ExperimentalCoroutinesApi
@ExtendWith(value = [MainCoroutineExtension::class, CoroutineDispatcherExtension::class])
class SaveUserUseCaseTest(
private val testCoroutineDisabled: TestCoroutineDispatcher
) {
// SUT
private lateinit var useCase: SaveUserUseCase
// DOC's
private val repository = mockk<UserRepository>(relaxed = true)
@BeforeEach
fun setUp() {
useCase = SaveUserUseCase(
dispatcher = testCoroutineDisabled,
repository = repository
)
}
@Test
fun saveUser() = runBlockingTest {
coEvery { repository.save(eq(PreviewData.User.data.first())) } just Runs
useCase.invoke(PreviewData.User.data.first())
coVerify(exactly = 1) {
repository.save(eq(PreviewData.User.data.first()))
}
}
}