From fe9ee4c11a69ddeac5cb27b569c64c8ad0bbb444 Mon Sep 17 00:00:00 2001 From: devfzn Date: Mon, 9 Oct 2023 15:34:58 -0300 Subject: [PATCH] =?UTF-8?q?implementaci=C3=B3n=20RECIPE=20model,=20api=20c?= =?UTF-8?q?rud=20&=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- README2.md | 264 +++++++++++++++++++++++++++- README3.md | 0 app/app/urls.py | 2 +- app/recipe/serializers.py | 7 + app/recipe/tests/test_recipe_api.py | 136 ++++++++++++-- app/recipe/views.py | 12 +- imgs_readme/api_swagger_01.png | Bin 0 -> 39075 bytes 8 files changed, 405 insertions(+), 19 deletions(-) create mode 100644 README3.md create mode 100644 imgs_readme/api_swagger_01.png diff --git a/README.md b/README.md index ef38980..44e2636 100644 --- a/README.md +++ b/README.md @@ -1853,4 +1853,5 @@ Ruta `localhost:8000/api/docs` ---- -Segunda parte -> [Recetas](./README2.md) +- Segunda parte -> [Recetas](./README2.md) +- Tercar parte -> [Tags](./README3.md) diff --git a/README2.md b/README2.md index 9647702..78ecc5f 100644 --- a/README2.md +++ b/README2.md @@ -18,7 +18,7 @@ - `PUT/PATCH` Actualizar receta - `DELETE` Borrar receta -### APIView vs Viewsets +## APIView vs Viewsets Una vista maneja un request a una URL, DRF usa clases con lógica reutilizable. DRF además soporta decoradores. @@ -149,10 +149,10 @@ RECIPES_URL = reverse('recipe:recipe-list') def create_recipe(user, **params): """Create and return a sample recipe.""" defaults = { - 'title': 'Titulo reseta de ejemplo', + 'title': 'Titulo receta de ejemplo', 'time_minutes': 31, 'price': Decimal('5.25'), - 'description': 'Descripción de ejmplo', + 'description': 'Descripción de ejemplo', 'link': 'https://defzn.kickto.net/blog', } defaults.update(params) @@ -283,3 +283,261 @@ urlpatterns = [ path('api/recipe', include('recipe.urls')), ] ``` + +### Test detalles receta API + +[`recipe/tests/test_recipe_api`](./app/recipe/tests/test_recipe_api.py) + +```py +... +from recipe.serializers import ( + RecipeSerializer, + RecipeDetailSerializer, +) + +... + +def detail_url(recipe_id): + """Create and return a recipe detail URL.""" + return reverse('recipe:recipe-deatil', args=[recipe_id]) + +... + +class PrivateRecipeApiTests(TestCase): + ... + + def test_get_recipe_detail(self): + """Test get recipe detail.""" + recipe = create_recipe(user=self.user) + + url = detail_url(recipe.id) + res = self.client.get(url) + + serializer = RecipeDetailSerializer(recipe) + self.assertEqual(res.data, serializer.data) +``` + +## Implementación Api detalles receta + +### Serializador para APIs detalles receta + +['recipe/serializer.py'](./app/recipe/serializers.py) + +```py +... + +class RecipeDetailSerializer(RecipeSerializer): + """Serializer for recipe detail view.""" + + class Meta(RecipeSerializer.Meta): + fields = RecipeSerializer.Meta.fields + ['description'] +``` + +### Views para APIs detalles receta + +Sobrescribiendo +[get_serializer_classself](https://www.django-rest-framework.org/api-guide/generic-views/#get_serializer_classself) +para usar `RecipeDetailSerializer`. Se añade la lógica para que al listar se +utilice `RecipeSerializer` + +[`recipe/views.py`](./app/recipe/views.py) + +```py +... +class RecipeViewSet(viewsets.ModelViewSet): + """View for manage recipe APIs.""" + serializer_class = serializers.RecipeDetailSerializer + ... + + def get_serializer_class(self): + """Return the serializer class for request.""" + if self.action == 'list': + return serializers.RecipeSerializer + return self.serializer_class +``` + +### Test creación de receta a travez de la API + +[`test_recipe_api.py`](./app/recipe/tests/test_recipe_api.py) + +```py +class PrivateRecipeApiTests(TestCase): + ... + + def test_create_recipe(self): + """Test creating a recipe.""" + payload = { + 'title': 'Titulo receta de ejemplo', + 'time_minutes': 16, + 'price': Decimal('5.99'), + } + res = self.client.post(RECIPES_URL, payload) + + self.assertEqual(res.status_code, status.HTTP_201_CREATED) + recipe = Recipe.objects.get(id=res.data['id']) + for k, v in payload.items(): + self.assertEqual(getattr(recipe, k), v) + self.assertEqual(recipe.user, self.user) +``` + +Se hace la Comparación utilizando el método +[getattr](https://docs.python.org/3/library/functions.html#getattr) de python + +### Implementación de vista para creación de receta + +[`recipe/views.py`](./app/recipe/views.py) + +```py + ... + + def perform_create(self, serializer): + """Create a new recipe.""" + serializer.save(user=self.request.user) +``` + +## Tests adicionales + +### Refactorizando test_recipe_api + +[`test_recipe_api.py`](./app/recipe/tests/test_recipe_api.py) + +```diff +... + ++def create_user(**params): ++ """Create and create a new user.""" ++ return get_user_model().objects.create_user(**params) + +... + +class PrivateRecipeApiTests(TestCase): + """Test authenticated API requests.""" + + def setUp(self): + self.client = APIClient() +- self.user = get_user_model().objects.create_user( +- 'user@example.com', +- 'testpass123', +- ) ++ self.user = create_user(email='user@example.com', password='test123') + self.client.force_authenticate(self.user) + +... + + def test_recipe_list_limited_to_user(self): + """Test list of recipes is limited to authenticated user.""" +- other_user = get_user_model().objects.create_user( +- 'other@example.com', +- 'password123', +- ) ++ other_user = create_user(email='other@example.com', password='test123') + create_recipe(user=other_user) + create_recipe(user=self.user) + + ... +``` + +### Test actualización parcial de receta + +```py + ... + def test_partial_update(self): + """Test partial update of a recipe.""" + original_link = 'https://devfzn.kicnto.net/blog' + recipe = create_recipe( + user=self.user, + title='Titulo de la Receta de ejemplo', + link=original_link, + ) + + payload = {'title': 'Nuevo titulo de la receta de ejemplo'} + url = detail_url(recipe.id) + res = self.client.patch(url, payload) + + self.assertEqual(res.status_code, status.HTTP_200_OK) +``` + +### Test actualización completa de receta + +```py + def test_full_update(self): + """Test full update of recipe.""" + recipe = create_recipe( + user=self.user, + title='Titulo receta de ejemplo', + link='https://devfzn.kickto.net/blog', + description='Descripción receta de ejemplo', + ) + + payload = { + 'title': 'Titulo receta de ejemplo', + 'link': 'https://defzn.kickto.net/blog', + 'description': 'Descripción de ejemplo', + 'time_minutes': 10, + 'price': Decimal('3.65'), + } + url = detail_url(recipe.id) + res = self.client.put(url, payload) + + self.assertEqual(res.status_code, status.HTTP_200_OK) + recipe.refresh_from_db() + for k, v in payload.items(): + self.assertEqual(getattr(recipe, k), v) + self.assertEqual(recipe.user, self.user) +``` + +### Test cambio de usuario dueño de receta + +```py + def test_update_user_returns_error(self): + """Test changing the recipe user results in an error.""" + new_user = create_user(email='user2@example.com', password='testpass123') + recipe = create_recipe(user=self.user) + + payload = {'user': new_user.id} + url = detail_url(recipe.id) + self.client.patch(url, payload) + + recipe.refresh_from_db() + self.assertEqual(recipe.user, self.user) +``` + +### Test eliminar receta + +```py + def test_delete_recipe(self): + """Test deleting a recipe sucessful.""" + recipe = create_recipe(user=self.user) + + url = detail_url(recipe.id) + res = self.client.delete(url) + + self.assertEqual(res.status_code, status.HTTP_204_NO_CONTENT) + self.assertFalse(Recipe.objects.filter(id=recipe.id).exists()) +``` + +### Test eliminar receta de otro usuario + +```py + def test_recipe_other_users_recipe_error(self): + """Test trying to delete another users recipe gives error.""" + new_user = create_user(email='user2@example.com', password='testpass123') + recipe = create_recipe(user=new_user) + + url = detail_url(recipe.id) + res = self.client.delete(url) + + self.assertEqual(res.status_code, status.HTTP_404_NOT_FOUND) + self.assertTrue(Recipe.objects.filter(id=recipe.id).exists()) +``` + +## Probando API en el navegador + +URL `localhost:8000/api/docs/` + +![img](./imgs_readme/api_swagger_01.png) + +---- + +- Primera parte -> [Recepi API](./README.md) +- Tercera parte -> [Tags](./README3.md) diff --git a/README3.md b/README3.md new file mode 100644 index 0000000..e69de29 diff --git a/app/app/urls.py b/app/app/urls.py index dcd19b7..777efcb 100644 --- a/app/app/urls.py +++ b/app/app/urls.py @@ -26,5 +26,5 @@ urlpatterns = [ SpectacularSwaggerView.as_view(url_name='api-schema'), name='api-docs'), path('api/user/', include('user.urls')), - path('api/recipe', include('recipe.urls')), + path('api/recipe/', include('recipe.urls')), ] diff --git a/app/recipe/serializers.py b/app/recipe/serializers.py index b3bded3..7ce5914 100644 --- a/app/recipe/serializers.py +++ b/app/recipe/serializers.py @@ -13,3 +13,10 @@ class RecipeSerializer(serializers.ModelSerializer): model = Recipe fields = ['id', 'title', 'time_minutes', 'price', 'link'] read_only_fields = ['id'] + + +class RecipeDetailSerializer(RecipeSerializer): + """Serializer for recipe detail view.""" + + class Meta(RecipeSerializer.Meta): + fields = RecipeSerializer.Meta.fields + ['description'] diff --git a/app/recipe/tests/test_recipe_api.py b/app/recipe/tests/test_recipe_api.py index 67351cd..fba0344 100644 --- a/app/recipe/tests/test_recipe_api.py +++ b/app/recipe/tests/test_recipe_api.py @@ -1,9 +1,10 @@ """ -Test for reicpe APIs. +Test for recipe APIs. """ from decimal import Decimal +from operator import itemgetter -from django.contrib.auth import get_user_model +from django.contrib.auth import get_user, get_user_model from django.test import TestCase from django. urls import reverse @@ -12,19 +13,27 @@ from rest_framework.test import APIClient from core.models import Recipe -from recipe.serializers import RecipeSerializer +from recipe.serializers import ( + RecipeSerializer, + RecipeDetailSerializer, +) RECIPES_URL = reverse('recipe:recipe-list') +def detail_url(recipe_id): + """Create and return a recipe detail URL.""" + return reverse('recipe:recipe-detail', args=[recipe_id]) + + def create_recipe(user, **params): """Create and return a sample recipe.""" defaults = { - 'title': 'Titulo reseta de ejemplo', + 'title': 'Titulo receta de ejemplo', 'time_minutes': 31, 'price': Decimal('5.25'), - 'description': 'Descripción de ejmplo', + 'description': 'Descripción de ejemplo', 'link': 'https://defzn.kickto.net/blog', } defaults.update(params) @@ -33,6 +42,11 @@ def create_recipe(user, **params): return recipe +def create_user(**params): + """Create and create a new user.""" + return get_user_model().objects.create_user(**params) + + class PublicRecipeApiTests(TestCase): """Test unauthenticated API requests.""" @@ -51,10 +65,7 @@ class PrivateRecipeApiTests(TestCase): def setUp(self): self.client = APIClient() - self.user = get_user_model().objects.create_user( - 'user@example.com', - 'testpass123', - ) + self.user = create_user(email='user@example.com', password='testpass123') self.client.force_authenticate(self.user) def test_retrive_recipes(self): @@ -72,10 +83,7 @@ class PrivateRecipeApiTests(TestCase): def test_recipe_list_limited_to_user(self): """Test list of recipes is limited to authenticated user.""" - other_user = get_user_model().objects.create_user( - 'other@example.com', - 'password123', - ) + other_user = create_user(email='other@example.com', password='password123') create_recipe(user=other_user) create_recipe(user=self.user) @@ -85,3 +93,105 @@ class PrivateRecipeApiTests(TestCase): serializer = RecipeSerializer(recipes, many=True) self.assertEqual(res.status_code, status.HTTP_200_OK) self.assertEqual(res.data, serializer.data) + + def test_get_recipe_detail(self): + """Test get recipe detail.""" + recipe = create_recipe(user=self.user) + + url = detail_url(recipe.id) + res = self.client.get(url) + + serializer = RecipeDetailSerializer(recipe) + self.assertEqual(res.data, serializer.data) + + def test_create_recipe(self): + """Test creating a recipe.""" + payload = { + 'title': 'Titulo receta de ejemplo', + 'time_minutes': 16, + 'price': Decimal('5.99'), + } + res = self.client.post(RECIPES_URL, payload) + + self.assertEqual(res.status_code, status.HTTP_201_CREATED) + recipe = Recipe.objects.get(id=res.data['id']) + for k, v in payload.items(): + self.assertEqual(getattr(recipe, k), v) + self.assertEqual(recipe.user, self.user) + + def test_partial_update(self): + """Test partial update of a recipe.""" + original_link = 'https://devfzn.kickto.net/acerca' + recipe = create_recipe( + user=self.user, + title='Titulo de la Receta de ejemplo', + link=original_link, + ) + + payload = {'title': 'Nuevo titulo de la receta de ejemplo'} + url = 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']) + self.assertEqual(recipe.link, original_link) + self.assertEqual(recipe.user, self.user) + + def test_full_update(self): + """Test full update of recipe.""" + recipe = create_recipe( + user=self.user, + title='Titulo receta de ejemplo', + link='https://devfzn.kickto.net/blog', + description='Descripción receta de ejemplo', + ) + + payload = { + 'title': 'Titulo receta de ejemplo', + 'link': 'https://defzn.kickto.net/blog', + 'description': 'Descripción de ejemplo', + 'time_minutes': 10, + 'price': Decimal('3.65'), + } + url = detail_url(recipe.id) + res = self.client.put(url, payload) + + self.assertEqual(res.status_code, status.HTTP_200_OK) + recipe.refresh_from_db() + for k, v in payload.items(): + self.assertEqual(getattr(recipe, k), v) + self.assertEqual(recipe.user, self.user) + + def test_update_user_returns_error(self): + """Test changing the recipe user results in an error.""" + new_user = create_user(email='user2@example.com', password='testpass123') + recipe = create_recipe(user=self.user) + + payload = {'user': new_user.id} + url = detail_url(recipe.id) + self.client.patch(url, payload) + + recipe.refresh_from_db() + self.assertEqual(recipe.user, self.user) + + def test_delete_recipe(self): + """Test deleting a recipe sucessful.""" + recipe = create_recipe(user=self.user) + + url = detail_url(recipe.id) + res = self.client.delete(url) + + self.assertEqual(res.status_code, status.HTTP_204_NO_CONTENT) + self.assertFalse(Recipe.objects.filter(id=recipe.id).exists()) + + def test_recipe_other_users_recipe_error(self): + """Test trying to delete another users recipe gives error.""" + new_user = create_user(email='user2@example.com', password='testpass123') + recipe = create_recipe(user=new_user) + + url = detail_url(recipe.id) + res = self.client.delete(url) + + self.assertEqual(res.status_code, status.HTTP_404_NOT_FOUND) + self.assertTrue(Recipe.objects.filter(id=recipe.id).exists()) diff --git a/app/recipe/views.py b/app/recipe/views.py index e47e50e..0f7050a 100644 --- a/app/recipe/views.py +++ b/app/recipe/views.py @@ -11,7 +11,7 @@ from recipe import serializers class RecipeViewSet(viewsets.ModelViewSet): """View for manage recipe APIs.""" - serializer_class = serializers.RecipeSerializer + serializer_class = serializers.RecipeDetailSerializer queryset = Recipe.objects.all() authentication_classes = [TokenAuthentication] permission_classes = [IsAuthenticated] @@ -19,3 +19,13 @@ class RecipeViewSet(viewsets.ModelViewSet): def get_queryset(self): """Retrieve recipes for authenticated user.""" return self.queryset.filter(user=self.request.user).order_by('-id') + + def get_serializer_class(self): + """Return the serializer class for request.""" + if self.action == 'list': + return serializers.RecipeSerializer + return self.serializer_class + + def perform_create(self, serializer): + """Create a new recipe.""" + serializer.save(user=self.request.user) diff --git a/imgs_readme/api_swagger_01.png b/imgs_readme/api_swagger_01.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c366614e3ddb1d761db64e101f44cba74ec283 GIT binary patch literal 39075 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 literal 0 HcmV?d00001