From 0c0248dbbc1774c8a98a56c8ecfc72b574956f93 Mon Sep 17 00:00:00 2001 From: Kirill Kamakin Date: Sun, 6 Nov 2022 20:02:51 +0100 Subject: [PATCH] Ignore ingredients with empty note --- .../ui/recipes/info/RecipeInfoFragment.kt | 16 +++++++--------- .../ui/recipes/info/RecipeInfoUiState.kt | 14 ++++++++++---- .../ui/recipes/info/RecipeInfoViewModel.kt | 12 ++++++++---- .../ui/recipes/info/RecipeInfoViewModelTest.kt | 17 +++++++++++++---- 4 files changed, 38 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoFragment.kt index b58715f..92868be 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoFragment.kt @@ -62,15 +62,13 @@ class RecipeInfoFragment : BottomSheetDialogFragment() { private fun onUiStateChange(uiState: RecipeInfoUiState) = with(binding) { logger.v { "onUiStateChange() called" } - ingredientsHolder.isVisible = uiState.areIngredientsVisible - instructionsGroup.isVisible = uiState.areInstructionsVisible - uiState.recipeInfo?.let { - recipeImageLoader.loadRecipeImage(image, it.recipeSummaryEntity) - title.text = it.recipeSummaryEntity.name - description.text = it.recipeSummaryEntity.description - ingredientsAdapter.submitList(it.recipeIngredients) - instructionsAdapter.submitList(it.recipeInstructions) - } + ingredientsHolder.isVisible = uiState.showIngredients + instructionsGroup.isVisible = uiState.showInstructions + recipeImageLoader.loadRecipeImage(image, uiState.summaryEntity) + title.text = uiState.title + description.text = uiState.description + ingredientsAdapter.submitList(uiState.recipeIngredients) + instructionsAdapter.submitList(uiState.recipeInstructions) } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoUiState.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoUiState.kt index 6083fae..7e3f812 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoUiState.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoUiState.kt @@ -1,9 +1,15 @@ package gq.kirmanak.mealient.ui.recipes.info -import gq.kirmanak.mealient.database.recipe.entity.FullRecipeEntity +import gq.kirmanak.mealient.database.recipe.entity.RecipeIngredientEntity +import gq.kirmanak.mealient.database.recipe.entity.RecipeInstructionEntity +import gq.kirmanak.mealient.database.recipe.entity.RecipeSummaryEntity data class RecipeInfoUiState( - val areIngredientsVisible: Boolean = false, - val areInstructionsVisible: Boolean = false, - val recipeInfo: FullRecipeEntity? = null, + val showIngredients: Boolean = false, + val showInstructions: Boolean = false, + val summaryEntity: RecipeSummaryEntity? = null, + val recipeIngredients: List = emptyList(), + val recipeInstructions: List = emptyList(), + val title: String? = null, + val description: String? = null, ) diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoViewModel.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoViewModel.kt index 7a23e2a..0238e85 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoViewModel.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoViewModel.kt @@ -20,11 +20,15 @@ class RecipeInfoViewModel @Inject constructor( val uiState: LiveData = liveData { logger.v { "Initializing UI state with args = $args" } - val state = recipeRepo.loadRecipeInfo(args.recipeId)?.let { + val state = recipeRepo.loadRecipeInfo(args.recipeId)?.let { entity -> RecipeInfoUiState( - areIngredientsVisible = it.recipeIngredients.isNotEmpty(), - areInstructionsVisible = it.recipeInstructions.isNotEmpty(), - recipeInfo = it, + showIngredients = entity.recipeIngredients.isNotEmpty(), + showInstructions = entity.recipeInstructions.isNotEmpty(), + summaryEntity = entity.recipeSummaryEntity, + recipeIngredients = entity.recipeIngredients.filter { it.note.isNotBlank() }, + recipeInstructions = entity.recipeInstructions.filter { it.text.isNotBlank() }, + title = entity.recipeSummaryEntity.name, + description = entity.recipeSummaryEntity.description, ) } ?: RecipeInfoUiState() emit(state) 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 index df95a04..89a8e16 100644 --- 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 @@ -4,6 +4,7 @@ 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.database.recipe.entity.RecipeIngredientEntity import gq.kirmanak.mealient.logging.Logger import gq.kirmanak.mealient.test.FakeLogger import gq.kirmanak.mealient.test.RecipeImplTestData.FULL_CAKE_INFO_ENTITY @@ -54,11 +55,19 @@ class RecipeInfoViewModelTest { @Test fun `when recipe is found then UI state has data`() = runTest { - coEvery { recipeRepo.loadRecipeInfo(eq(RECIPE_ID)) } returns FULL_CAKE_INFO_ENTITY + val emptyNoteIngredient = RecipeIngredientEntity(recipeId = "42", note = "") + val returnedEntity = FULL_CAKE_INFO_ENTITY.copy( + recipeIngredients = FULL_CAKE_INFO_ENTITY.recipeIngredients + emptyNoteIngredient + ) + coEvery { recipeRepo.loadRecipeInfo(eq(RECIPE_ID)) } returns returnedEntity val expected = RecipeInfoUiState( - areIngredientsVisible = true, - areInstructionsVisible = true, - recipeInfo = FULL_CAKE_INFO_ENTITY + showIngredients = true, + showInstructions = true, + summaryEntity = FULL_CAKE_INFO_ENTITY.recipeSummaryEntity, + recipeIngredients = FULL_CAKE_INFO_ENTITY.recipeIngredients, + recipeInstructions = FULL_CAKE_INFO_ENTITY.recipeInstructions, + title = FULL_CAKE_INFO_ENTITY.recipeSummaryEntity.name, + description = FULL_CAKE_INFO_ENTITY.recipeSummaryEntity.description, ) val actual = createSubject().uiState.asFlow().first() assertThat(actual).isEqualTo(expected)