From 6cbc308d8369ac2b5802e9e3c9ee5029581f4449 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Sat, 16 Aug 2025 03:05:50 -0500 Subject: [PATCH] fix: Add Recipe From Another Household To Shopping List (#5892) --- .../household_services/shopping_lists.py | 6 +- .../test_group_shopping_lists.py | 62 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/mealie/services/household_services/shopping_lists.py b/mealie/services/household_services/shopping_lists.py index 6fef00672..22b957a11 100644 --- a/mealie/services/household_services/shopping_lists.py +++ b/mealie/services/household_services/shopping_lists.py @@ -3,6 +3,7 @@ from typing import cast from pydantic import UUID4 from mealie.core.exceptions import UnexpectedNone +from mealie.repos.all_repositories import get_repositories from mealie.repos.repository_factory import AllRepositories from mealie.schema.household.group_shopping_list import ( ShoppingListAddRecipeParamsBulk, @@ -303,7 +304,10 @@ class ShoppingListService: """Generates a list of new list items based on a recipe""" if recipe_ingredients is None: - recipe = self.repos.recipes.get_one(recipe_id, "id") + group_recipes_repo = get_repositories( + self.repos.session, group_id=self.repos.group_id, household_id=None + ).recipes + recipe = group_recipes_repo.get_one(recipe_id, "id") if not recipe: raise UnexpectedNone("Recipe not found") diff --git a/tests/integration_tests/user_household_tests/test_group_shopping_lists.py b/tests/integration_tests/user_household_tests/test_group_shopping_lists.py index 93dc976d5..9fe6cb8d4 100644 --- a/tests/integration_tests/user_household_tests/test_group_shopping_lists.py +++ b/tests/integration_tests/user_household_tests/test_group_shopping_lists.py @@ -1,5 +1,6 @@ import random +import pytest from fastapi.testclient import TestClient from mealie.schema.household.group_shopping_list import ( @@ -244,6 +245,67 @@ def test_shopping_lists_add_recipes( assert refs_by_id[str(recipe.id)]["recipeQuantity"] == 2 +@pytest.mark.parametrize("is_private_household", [True, False]) +@pytest.mark.parametrize("household_lock_recipe_edits", [True, False]) +def test_shopping_lists_add_cross_household_recipe( + api_client: TestClient, + unique_user: TestUser, + h2_user: TestUser, + shopping_lists: list[ShoppingListOut], + is_private_household: bool, + household_lock_recipe_edits: bool, +): + sample_list = random.choice(shopping_lists) + item_name = random_string(10) + + # set up household + household = h2_user.repos.households.get_one(h2_user.household_id) + assert household and household.preferences + household.preferences.private_household = is_private_household + household.preferences.lock_recipe_edits_from_other_households = household_lock_recipe_edits + h2_user.repos.household_preferences.update(household.id, household.preferences) + + # set up recipe + recipe = h2_user.repos.recipes.create( + Recipe( + user_id=h2_user.user_id, + group_id=h2_user.group_id, + name=random_string(10), + recipe_ingredient=[{"note": item_name, "quantity": 1}], + ) + ) + + # add recipe once + response = api_client.post( + api_routes.households_shopping_lists_item_id_recipe_recipe_id(sample_list.id, recipe.id), + headers=unique_user.token, + ) + assert response.status_code == 200 + response = api_client.get( + api_routes.households_shopping_lists_item_id(sample_list.id), + headers=unique_user.token, + ) + as_json = utils.assert_deserialize(response, 200) + assert len(as_json["listItems"]) == 1 + assert as_json["listItems"][0]["note"] == item_name + assert as_json["listItems"][0]["quantity"] == 1 + + # add recipe again + response = api_client.post( + api_routes.households_shopping_lists_item_id_recipe_recipe_id(sample_list.id, recipe.id), + headers=unique_user.token, + ) + assert response.status_code == 200 + response = api_client.get( + api_routes.households_shopping_lists_item_id(sample_list.id), + headers=unique_user.token, + ) + as_json = utils.assert_deserialize(response, 200) + assert len(as_json["listItems"]) == 1 + assert as_json["listItems"][0]["note"] == item_name + assert as_json["listItems"][0]["quantity"] == 2 + + def test_shopping_lists_add_one_with_zero_quantity( api_client: TestClient, unique_user: TestUser,