diff --git a/app/recipe/tests/test_ingredients_api.py b/app/recipe/tests/test_ingredients_api.py index e5ee789..5a8f64f 100644 --- a/app/recipe/tests/test_ingredients_api.py +++ b/app/recipe/tests/test_ingredients_api.py @@ -5,7 +5,7 @@ from rest_framework import status from rest_framework.test import APIClient -from core.models import Ingredient +from core.models import Ingredient, Recipe from recipe.serializers import IngredientSerializer @@ -82,3 +82,49 @@ def test_create_ingredient_invalid(self): res = self.client.post(INGREDIENTS_URL, payload) self.assertEqual(res.status_code, status.HTTP_400_BAD_REQUEST) + + def test_retrieve_ingredients_assinged_to_recipes(self): + """Test filtering ingredients by those assigned to recipes""" + ingredient1 = Ingredient.objects.create( + user=self.user, name='Apples' + ) + ingredient2 = Ingredient.objects.create( + user=self.user, name='Turkey' + ) + recipe = Recipe.objects.create( + title='Apple crumble', + price=10, + time_minutes=5, + user=self.user + ) + recipe.ingredients.add(ingredient1) + + res = self.client.get(INGREDIENTS_URL, {'assigned_only': 1}) + + serializer1 = IngredientSerializer(ingredient1) + serializer2 = IngredientSerializer(ingredient2) + self.assertIn(serializer1.data, res.data) + self.assertNotIn(serializer2, res.data) + + def test_retrieve_ingredients_assigned_unique(self): + """Test filtering ingredients by assigned returns unique items""" + ingredient = Ingredient.objects.create(user=self.user, name='Eggs') + Ingredient.objects.create(user=self.user, name='Cheese') + recipe1 = Recipe.objects.create( + title='Eggs benedict', + time_minutes=30, + price=12.00, + user=self.user + ) + recipe1.ingredients.add(ingredient) + recipe2 = Recipe.objects.create( + title='Coriander eggs on toast', + time_minutes=20, + price=5.00, + user=self.user + ) + recipe2.ingredients.add(ingredient) + + res = self.client.get(INGREDIENTS_URL, {'assigned_only': 1}) + + self.assertEqual(len(res.data), 1) diff --git a/app/recipe/tests/test_tags_api.py b/app/recipe/tests/test_tags_api.py index 72fe9d7..33aed92 100644 --- a/app/recipe/tests/test_tags_api.py +++ b/app/recipe/tests/test_tags_api.py @@ -5,7 +5,7 @@ from rest_framework import status from rest_framework.test import APIClient -from core.models import Tag +from core.models import Tag, Recipe from recipe.serializers import TagSerializer @@ -81,3 +81,44 @@ def test_create_tag_invalid(self): res = self.client.post(TAGS_URL, payload) self.assertEqual(res.status_code, status.HTTP_400_BAD_REQUEST) + + def test_retrieve_tags_assigned_to_recipes(self): + """Test filtering tags by those assigned to recipes""" + tag1 = Tag.objects.create(user=self.user, name='Breakfast') + tag2 = Tag.objects.create(user=self.user, name='Lunch') + recipe = Recipe.objects.create( + title='Coriander eggs on toast', + time_minutes=5, + price=5.00, + user=self.user + ) + recipe.tags.add(tag1) + + res = self.client.get(TAGS_URL, {'assigned_only': 1}) + + serializer1 = TagSerializer(tag1) + serializer2 = TagSerializer(tag2) + self.assertIn(serializer1.data, res.data) + self.assertNotIn(serializer2.data, res.data) + + def test_retrieve_tags_assinged_unique(self): + """Test filtering tags by assigned returns unique items""" + tag = Tag.objects.create(user=self.user, name='Breakfast') + recipe1 = Recipe.objects.create( + title='Pancakes', + time_minutes=5, + price=3.00, + user=self.user + ) + recipe1.tags.add(tag) + recipe2 = Recipe.objects.create( + title='Porridge', + price=2.00, + time_minutes=5, + user=self.user + ) + recipe2.tags.add(tag) + + res = self.client.get(TAGS_URL, {'assinged_only': 1}) + + self.assertEqual(len(res.data), 1) diff --git a/app/recipe/views.py b/app/recipe/views.py index e4f0c08..02f7420 100644 --- a/app/recipe/views.py +++ b/app/recipe/views.py @@ -18,7 +18,16 @@ class BaseRecipeAttrViewSet(viewsets.GenericViewSet, def get_queryset(self): """Return objects for the current authenticated user only""" - return self.queryset.filter(user=self.request.user).order_by('-name') + assigned_only = bool( + int(self.request.query_params.get('assigned_only', 0)) + ) + queryset = self.queryset + if assigned_only: + queryset = queryset.filter(recipe__isnull=False) + + return queryset.filter( + user=self.request.user + ).order_by('-name').distinct() def perform_create(self, serializer): """Create a new object"""