diff --git a/app/libros/tests.py b/app/libros/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/app/libros/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/app/libros/urls.py b/app/libros/urls.py index 8afa40c..d879fda 100644 --- a/app/libros/urls.py +++ b/app/libros/urls.py @@ -1,10 +1,11 @@ # app/libros/urls.py from django.urls import path -from app.libros.views import ping, LibrosList +from app.libros.views import * urlpatterns = [ path("ping/", ping, name="ping"), path("api/libros/", LibrosList.as_view()), -] \ No newline at end of file + path("api/libros//", LibrosDetails.as_view()), +] diff --git a/app/libros/views.py b/app/libros/views.py index c840f93..125e994 100644 --- a/app/libros/views.py +++ b/app/libros/views.py @@ -1,10 +1,11 @@ # app/libros/views.py from django.http import JsonResponse -from rest_framework.views import APIView # nuevo -from rest_framework.response import Response # nuevo -from rest_framework import status # nuevo -from .serializers import LibroSerializer # nuevo +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status +from .serializers import LibroSerializer +from .models import Libros def ping(request): @@ -14,9 +15,25 @@ def ping(request): class LibrosList(APIView): + def get(self, request, format=None): + libros = Libros.objects.all().order_by('created_at') + serializer = LibroSerializer(libros, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + def post(self, request): serializer = LibroSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) \ No newline at end of file + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class LibrosDetails(APIView): + + def get(self, request, pk, format=None): + libro = Libros.objects.filter(pk=pk).first() + serializer = LibroSerializer(libro) + if libro: + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_404_NOT_FOUND) + diff --git a/requirements.txt b/requirements.txt index 8298ba6..ef113c6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ django djangorestframework pytest-django -pytest \ No newline at end of file +pytest +Faker diff --git a/tests/libros/test_serializers.py b/tests/libros/test_serializers.py index 837b430..ac12841 100644 --- a/tests/libros/test_serializers.py +++ b/tests/libros/test_serializers.py @@ -28,4 +28,4 @@ def test_invalid_libro_serializer(): assert serializer.errors == { "year": ["This field is required."], "genre": ["This field is required."], - } \ No newline at end of file + } diff --git a/tests/libros/test_views.py b/tests/libros/test_views.py index e20a632..945196a 100644 --- a/tests/libros/test_views.py +++ b/tests/libros/test_views.py @@ -5,7 +5,8 @@ from app.libros.models import Libros @pytest.mark.django_db -def test_add_movie(client): +def test_add_book(client): + # Given libros = Libros.objects.all() assert len(libros) == 0 @@ -27,4 +28,58 @@ def test_add_movie(client): assert resp.data["title"] == "El fin de la eternidad" libros = Libros.objects.all() - assert len(libros) == 1 \ No newline at end of file + assert len(libros) == 1 + + +@pytest.mark.django_db +def test_get_single_book(client): + + # Given + libro = Libros.objects.create( + title="El fin de la eternidad", + genre="Ciencia Ficción", + author="Isaac Asimov", + year="1955", + ) + + # When + resp = client.get(f"/api/libros/{libro.id}/") + + # Then + assert resp.status_code == 200 + assert resp.data["title"] == "El fin de la eternidad" + + +@pytest.mark.django_db +def test_get_single_book_incorrect_id(client): + + # When + resp = client.get(f"/api/libros/-1/") + + # Then + assert resp.status_code == 404 + + +@pytest.mark.django_db +def test_get_all_books(client, faker): + + # Given + def create_random_book(): + return Libros.objects.create( + title=faker.name(), + genre=faker.job(), + author=faker.name_nonbinary(), + year=faker.year(), + ) + + libro_1 = create_random_book() + libro_2 = create_random_book() + + # When + resp = client.get(f"/api/libros/") + + # Then + assert resp.status_code == 200 + assert resp.data[0]["title"] == libro_1.title + assert resp.data[1]["title"] == libro_2.title +