From 0cd892059bd3ea38471db042596589b185fa14a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren?= Date: Sun, 8 Jan 2023 20:46:51 +0100 Subject: [PATCH] Fix/issue#2003 - Unable to remove all instructions/ingredients from a recipe (#2008) * Fix issue where recipes could not have all their ingredients/instructions removed * Add test for removing all instructions and ingredients from a recipe --- mealie/db/models/recipe/recipe.py | 4 +-- .../user_recipe_tests/test_recipe_crud.py | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/mealie/db/models/recipe/recipe.py b/mealie/db/models/recipe/recipe.py index 648011a6..2ec48ed1 100644 --- a/mealie/db/models/recipe/recipe.py +++ b/mealie/db/models/recipe/recipe.py @@ -146,10 +146,10 @@ class RecipeModel(SqlAlchemyBase, BaseMixins): ) -> None: self.nutrition = Nutrition(**nutrition) if nutrition else Nutrition() - if recipe_instructions: + if recipe_instructions is not None: self.recipe_instructions = [RecipeInstruction(**step, session=session) for step in recipe_instructions] - if recipe_ingredient: + if recipe_ingredient is not None: self.recipe_ingredient = [RecipeIngredient(**ingr, session=session) for ingr in recipe_ingredient] if assets: diff --git a/tests/integration_tests/user_recipe_tests/test_recipe_crud.py b/tests/integration_tests/user_recipe_tests/test_recipe_crud.py index a85da206..38e02090 100644 --- a/tests/integration_tests/user_recipe_tests/test_recipe_crud.py +++ b/tests/integration_tests/user_recipe_tests/test_recipe_crud.py @@ -273,6 +273,36 @@ def test_duplicate(api_client: TestClient, recipe_data: RecipeSiteTestCase, uniq assert copy_info(original_ingredients[i]) == copy_info(edited_ingredients[i]) +# This needs to happen after test_duplicate, +# otherwise that one will run into problems with comparing the instruction/ingredient lists +@pytest.mark.parametrize("recipe_data", recipe_test_data) +def test_update_with_empty_relationship( + api_client: TestClient, + recipe_data: RecipeSiteTestCase, + unique_user: TestUser, +): + recipe_url = api_routes.recipes_slug(recipe_data.expected_slug) + response = api_client.get(recipe_url, headers=unique_user.token) + assert response.status_code == 200 + + recipe = json.loads(response.text) + + recipe["recipeInstructions"] = [] + recipe["recipeIngredient"] = [] + + response = api_client.put(recipe_url, json=utils.jsonify(recipe), headers=unique_user.token) + + assert response.status_code == 200 + assert json.loads(response.text).get("slug") == recipe_data.expected_slug + + response = api_client.get(recipe_url, headers=unique_user.token) + assert response.status_code == 200 + recipe = json.loads(response.text) + + assert recipe["recipeInstructions"] == [] + assert recipe["recipeIngredient"] == [] + + @pytest.mark.parametrize("recipe_data", recipe_test_data) def test_rename(api_client: TestClient, recipe_data: RecipeSiteTestCase, unique_user: TestUser): recipe_url = api_routes.recipes_slug(recipe_data.expected_slug)