recipes_api/app/recipe/tests/test_ingredients_api.py

100 lines
3.2 KiB
Python

"""
Tests for the ingredients API.
"""
from django.contrib.auth import get_user_model
from django.urls import reverse
from django.test import TestCase
from rest_framework import status
from rest_framework.test import APIClient
from core.models import Ingredient
from recipe.serializers import IngredientSerializer
INGREDIENTS_URL = reverse('recipe:ingredient-list')
def detail_url(ingredient_id):
"""Create and return an ingredient detail URL."""
return reverse('recipe:ingredient-detail', args=[ingredient_id])
def create_user(email='user@example.com', password='testpass123'):
"""Create and return user."""
return get_user_model().objects.create_user(email=email, password=password)
class PublicIngredientsApiTests(TestCase):
"""Test unanthenticated API requests."""
def setUp(self):
self.client = APIClient()
def test_auth_required(self):
"""Test auth is required for retrieving ingredients."""
res = self.client.get(INGREDIENTS_URL)
self.assertEqual(res.status_code, status.HTTP_401_UNAUTHORIZED)
class PrivateIngredientsApiTests(TestCase):
"""Test authenticated API requests."""
def setUp(self):
self.user = create_user()
self.client = APIClient()
self.client.force_authenticate(self.user)
def test_retrieve_ingredients(self):
"""Test retrieving a list of ingredients."""
Ingredient.objects.create(user=self.user, name='Harina')
Ingredient.objects.create(user=self.user, name='Panela')
res = self.client.get(INGREDIENTS_URL)
ingredients = Ingredient.objects.all().order_by('-name')
serializer = IngredientSerializer(ingredients, many=True)
self.assertEqual(res.status_code, status.HTTP_200_OK)
self.assertEqual(res.data, serializer.data)
def test_ingredients_limited_to_user(self):
"""Test list of ingredients is limited to authenticated user."""
user2 = create_user(email='user2@example.com')
Ingredient.objects.create(user=user2, name='Sal')
ingredient = Ingredient.objects.create(user=self.user, name='Pimienta')
res = self.client.get(INGREDIENTS_URL)
self.assertEqual(res.status_code, status.HTTP_200_OK)
self.assertEqual(len(res.data), 1)
self.assertEqual(res.data[0]['name'], ingredient.name)
self.assertEqual(res.data[0]['id'], ingredient.id)
def test_update_ingredient(self):
"""Test updating an ingredient."""
ingredient = Ingredient.objects.create(
user=self.user, name='Coriandro'
)
payload = {'name': 'Cilantro'}
url = detail_url(ingredient.id)
res = self.client.patch(url, payload)
self.assertEqual(res.status_code, status.HTTP_200_OK)
ingredient.refresh_from_db()
self.assertEqual(ingredient.name, payload['name'])
def test_delete_ingredient(self):
"""Test deleting an ingredient."""
ingredient = Ingredient.objects.create(user=self.user, name='Lechuga')
url = detail_url(ingredient.id)
res = self.client.delete(url)
self.assertEqual(res.status_code, status.HTTP_204_NO_CONTENT)
ingredients = Ingredient.objects.filter(user=self.user)
self.assertFalse(ingredients.exists())