implement testing and create a simple test for Userlist

This commit is contained in:
Carlos Martinez
2020-02-06 14:34:42 -03:00
parent 40e57a27ac
commit b720fb39e6
15 changed files with 199 additions and 25 deletions

View File

@@ -0,0 +1,29 @@
package com.hako.userlist.feature
import com.hako.base.domain.database.dao.UserDao
import com.hako.base.domain.database.entities.UserEntity
import com.hako.userlist.domain.datasource.UserlistRemoteApi
import com.hako.userlist.model.User
import io.reactivex.Single
class MockUserDao(private val userList: List<UserEntity>) : UserDao {
override fun save(entity: UserEntity) {}
override fun saveAll(entities: List<UserEntity>) {}
override fun saveFavorite(id: Int, favorite: Boolean) = 1
override fun getAllUsers() = userList
override fun getFavoriteUsers() = userList.filter { it.isFavorite }
override fun count() = userList.count()
override fun nukeDatabase() {}
}
class MockUserApi(private val userList: List<User>) : UserlistRemoteApi {
override fun getUsers() = Single.fromCallable { getAllUsers() }
private fun getAllUsers() = userList
}

View File

@@ -0,0 +1,94 @@
package com.hako.userlist.feature
import androidx.fragment.app.testing.launchFragmentInContainer
import androidx.test.platform.app.InstrumentationRegistry
import com.hako.base.domain.database.dao.UserDao
import com.hako.testing.isTextDisplayed
import com.hako.userlist.domain.datasource.UserlistRemoteApi
import com.hako.userlist.domain.usecase.GetFavoriteUsers
import com.hako.userlist.domain.usecase.GetUsers
import com.hako.userlist.domain.usecase.SetFavoriteStatus
import com.hako.userlist.model.User
import com.hako.userlist.model.toUserEntity
import com.hako.userlist.viewmodel.UserlistViewmodel
import org.junit.Before
import org.junit.Test
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.context.loadKoinModules
import org.koin.core.context.startKoin
import org.koin.dsl.module
class UserlistFragmentTest {
@Before
fun setupKoin() {
startKoin {
InstrumentationRegistry.getInstrumentation().targetContext
modules(module {
factory { GetUsers(get()) }
factory { GetFavoriteUsers(get()) }
factory { SetFavoriteStatus(get()) }
viewModel { UserlistViewmodel() }
})
}
}
@Test
fun shouldShowUserlist_withAllUsers() {
userlist {
initialState()
} should {
showTwoBasicUsers()
}
}
private fun userlist(func: UserlistRobot.() -> Unit) =
UserlistRobot().apply {
func()
}
}
class UserlistRobot {
fun initialState() {
loadKoinModules(
module {
factory<UserDao> { MockUserDao(loadTwoBasicUsers().map { it.toUserEntity() }) }
factory<UserlistRemoteApi> { MockUserApi(loadTwoBasicUsers()) }
}
)
launchFragmentInContainer<UserlistFragment>()
}
infix fun should(func: UserlistResult.() -> Unit) {
UserlistResult().apply { func() }
}
private fun loadTwoBasicUsers() = listOf(
User(
1,
"Marian Arriaga",
"mariancita",
"test@gmail.com",
"+56873912",
"www.test.com"
),
User(
2,
"Carlos Martinez",
"carlitos",
"test2@gmail.com",
"+56873912",
"www.test2.com"
)
)
}
class UserlistResult {
fun showTwoBasicUsers() {
"Marian Arriaga".isTextDisplayed()
"mariancita".isTextDisplayed()
"Carlos Martinez".isTextDisplayed()
"carlitos".isTextDisplayed()
}
}