Add RecipeInfoViewModel test

This commit is contained in:
Kirill Kamakin
2022-11-06 19:28:22 +01:00
parent 5ed6d44099
commit 0c87657b55

View File

@@ -0,0 +1,75 @@
package gq.kirmanak.mealient.ui.recipes.info
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.lifecycle.asFlow
import com.google.common.truth.Truth.assertThat
import gq.kirmanak.mealient.data.recipes.RecipeRepo
import gq.kirmanak.mealient.logging.Logger
import gq.kirmanak.mealient.test.FakeLogger
import gq.kirmanak.mealient.test.RecipeImplTestData.FULL_CAKE_INFO_ENTITY
import io.mockk.MockKAnnotations
import io.mockk.coEvery
import io.mockk.impl.annotations.MockK
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.resetMain
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.test.setMain
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@OptIn(ExperimentalCoroutinesApi::class)
class RecipeInfoViewModelTest {
@get:Rule
val instantExecutorRule = InstantTaskExecutorRule()
private val logger: Logger = FakeLogger()
@MockK
lateinit var recipeRepo: RecipeRepo
@Before
fun setUp() {
MockKAnnotations.init(this)
Dispatchers.setMain(UnconfinedTestDispatcher())
}
@After
fun tearDown() {
Dispatchers.resetMain()
}
@Test
fun `when recipe isn't found then UI state is empty`() = runTest {
coEvery { recipeRepo.loadRecipeInfo(eq(RECIPE_ID)) } returns null
val uiState = createSubject().uiState.asFlow().first()
assertThat(uiState).isEqualTo(RecipeInfoUiState())
}
@Test
fun `when recipe is found then UI state has data`() = runTest {
coEvery { recipeRepo.loadRecipeInfo(eq(RECIPE_ID)) } returns FULL_CAKE_INFO_ENTITY
val expected = RecipeInfoUiState(
areIngredientsVisible = true,
areInstructionsVisible = true,
recipeInfo = FULL_CAKE_INFO_ENTITY
)
val actual = createSubject().uiState.asFlow().first()
assertThat(actual).isEqualTo(expected)
}
private fun createSubject(): RecipeInfoViewModel {
val argument = RecipeInfoFragmentArgs(RECIPE_ID).toSavedStateHandle()
return RecipeInfoViewModel(recipeRepo, logger, argument)
}
companion object {
private const val RECIPE_ID = "1"
}
}