diff --git a/app/src/test/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoViewModelTest.kt b/app/src/test/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoViewModelTest.kt new file mode 100644 index 0000000..df95a04 --- /dev/null +++ b/app/src/test/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoViewModelTest.kt @@ -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" + } +} \ No newline at end of file