def test_retrive_recipes(self):
        """Test retrieving a list of recipes"""
        utils.create_recipe(self.user)
        utils.create_recipe(self.user)

        res = self.client.get(utils.RECIPES_URL)

        serializer = RecipeSerializer(utils.all_recipes(), many=True)

        self.assertEqual(res.status_code, status.HTTP_200_OK)
        self.assertEqual(res.data, serializer.data)
    def test_recipes_limited_to_user(self):
        """Test retrieving recipes for user"""
        utils.create_recipe(self.user)
        utils.create_recipe(self.user2)

        res = self.client.get(utils.RECIPES_URL)

        recipes = Recipe.objects.filter(user=self.user)
        serializer = RecipeSerializer(recipes, many=True)

        self.assertEqual(res.status_code, status.HTTP_200_OK)
        self.assertEqual(len(res.data), 1)
        self.assertEqual(res.data, serializer.data)
    def test_retrieve_ingredients_assigned_unique(self):
        """Test filtering ingredients by assigned returns unique items"""
        ingredient = utils.create_ingredent(self.user, "Appels")
        utils.create_ingredent(self.user, "Turkey")

        recipe1 = utils.create_recipe(self.user, **utils.RECIPE_PAYLOAD)
        recipe2 = utils.create_recipe(self.user, **utils.RECIPE_PAYLOAD_UPDATE)

        recipe1.ingredients.add(ingredient)
        recipe2.ingredients.add(ingredient)

        res = self.client.get(utils.INGREDIENTS_URL, {"assigned_only": 1})

        self.assertEqual(len(res.data), 1)
    def test_retrieve_tags_assigned_unique(self):
        """Test filtering tags by assigned returns unique items"""
        tag = utils.create_tag(self.user, "Vegan")
        utils.create_tag(self.user, "Lunch")

        recipe1 = utils.create_recipe(self.user, **utils.RECIPE_PAYLOAD)
        recipe2 = utils.create_recipe(self.user, **utils.RECIPE_PAYLOAD_UPDATE)

        recipe1.tags.add(tag)
        recipe2.tags.add(tag)

        res = self.client.get(utils.TAGS_URL, {"assigned_only": 1})

        self.assertEqual(len(res.data), 1)
    def test_view_recipe_detail(self):
        """Test viewing a recipe detial"""
        recipe = utils.create_recipe(self.user)
        recipe.tags.add(utils.create_tag(self.user, "Vegan"))
        recipe.ingredients.add(utils.create_ingredent(self.user, "Salt"))

        res = self.client.get(utils.recipe_detail_url(recipe.id))

        serializer = RecipeDetailSerializer(recipe)

        self.assertEqual(res.data, serializer.data)
    def test_filter_recipes_by_ingredients(self):
        """Test returning recipes with specific ingredients"""
        recipe1 = utils.create_recipe(self.user)
        recipe2 = utils.create_recipe(self.user)
        recipe3 = utils.create_recipe(self.user)

        ingredient1 = utils.create_ingredent(self.user, "Salt")
        ingredient2 = utils.create_ingredent(self.user, "Pepper")

        recipe1.ingredients.add(ingredient1)
        recipe2.ingredients.add(ingredient2)

        res = self.client.get(
            utils.RECIPES_URL,
            {"ingredients": f"{ingredient1.id}, {ingredient2.id}"})

        serializer1 = RecipeSerializer(recipe1)
        serializer2 = RecipeSerializer(recipe2)
        serializer3 = RecipeSerializer(recipe3)

        self.assertIn(serializer1.data, res.data)
        self.assertIn(serializer2.data, res.data)
        self.assertNotIn(serializer3.data, res.data)
    def test_filter_recipes_by_tags(self):
        """Test returning recipes with specific tags"""
        recipe1 = utils.create_recipe(self.user)
        recipe2 = utils.create_recipe(self.user)
        recipe3 = utils.create_recipe(self.user)

        tag1 = utils.create_tag(self.user, "Vegan")
        tag2 = utils.create_tag(self.user, "Vegetatian")

        recipe1.tags.add(tag1)
        recipe2.tags.add(tag2)

        res = self.client.get(
            utils.RECIPES_URL,
            {"tags": f"{tag1.id}, {tag2.id}"},
        )

        serializer1 = RecipeSerializer(recipe1)
        serializer2 = RecipeSerializer(recipe2)
        serializer3 = RecipeSerializer(recipe3)

        self.assertIn(serializer1.data, res.data)
        self.assertIn(serializer2.data, res.data)
        self.assertNotIn(serializer3.data, res.data)
    def test_retrieve_ingredients_assigned_to_recipes(self):
        """Test filtering ingredients by those assigned to recipes"""
        ingredient1 = utils.create_ingredent(self.user, "Appels")
        ingredient2 = utils.create_ingredent(self.user, "Turkey")

        recipe = utils.create_recipe(self.user, **utils.RECIPE_PAYLOAD)
        recipe.ingredients.add(ingredient1)

        res = self.client.get(utils.INGREDIENTS_URL, {"assigned_only": 1})

        serializer1 = IngredientSerializer(ingredient1)
        serializer2 = IngredientSerializer(ingredient2)

        self.assertIn(serializer1.data, res.data)
        self.assertNotIn(serializer2.data, res.data)
    def test_retrieve_tags_assigned_to_recipes(self):
        """Test filtering tags by those assigned to recipes"""
        tag1 = utils.create_tag(self.user, "Vegan")
        tag2 = utils.create_tag(self.user, "Lunch")

        recipe = utils.create_recipe(self.user)
        recipe.tags.add(tag1)

        res = self.client.get(utils.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_full_update_recipe(self):
        """Test updating a recipe with put"""
        recipe = utils.create_recipe(self.user)
        recipe.tags.add(utils.create_tag(self.user, "Spicy"))
        url = utils.recipe_detail_url(recipe.id)
        payload = deepcopy(utils.RECIPE_PAYLOAD)
        res = self.client.put(url, payload)

        self.assertEqual(res.status_code, status.HTTP_200_OK)

        recipe.refresh_from_db()
        self.assertEqual(recipe.title, payload["title"])
        self.assertEqual(recipe.time_minutes, payload["time_minutes"])
        self.assertEqual(recipe.price, payload["price"])
        tags = recipe.tags.all()
        self.assertEqual(len(tags), 0)
    def test_partial_update_recipe(self):
        """Test updating a recipe with patch"""
        recipe = utils.create_recipe(self.user)
        recipe.tags.add(utils.create_tag(self.user, "Spicy"))
        new_tag = utils.create_tag(self.user, "Curry")

        payload = deepcopy(utils.RECIPE_PAYLOAD)
        payload.update({"tags": [new_tag.id]})

        url = utils.recipe_detail_url(recipe.id)
        res = self.client.patch(url, payload)

        self.assertEqual(res.status_code, status.HTTP_200_OK)

        recipe.refresh_from_db()
        self.assertEqual(recipe.title, payload["title"])
        tags = recipe.tags.all()
        self.assertEqual(len(tags), 1)
        self.assertIn(new_tag, tags)
 def setUp(self):
     self.client = APIClient()
     self.user = utils.create_user(**utils.USER_PAYLOAD)
     self.client.force_authenticate(self.user)
     self.recipe = utils.create_recipe(self.user)
 def test_recipe_str(self):
     """Test the recipe string represention"""
     recipe = utils.create_recipe(self.user)
     self.assertEqual(str(recipe), recipe.title)