100 lines
3.2 KiB
Python
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())
|