4. Simple GET

Para esta lección no vamos a utilizar Django REST Framework (o DRF), tan solo Django. Ello se debe a que en ciertos Endpoints (rutas que podemos invocar) son tan sencillas que es contraproducente darle la complejidad que sí nos ofrece DRF.

Crearemos el clásico ping-pong para comprobar que el servidor está vivo.

Realizamos la vista con la respuesta.

# app/libros/views.py

from django.http import JsonResponse

def ping(request):
    data = {"ping": "pong!"}
    return JsonResponse(data)

Añadimos la ruta.

# proyecto/urls.py

from django.contrib import admin
from django.urls import path

from app.libros.views import ping # nuevo

urlpatterns = [
    path('admin/', admin.site.urls),
    path('ping/', ping, name="ping"), # nuevo
]

Levantamos el servidor.

python3 manage.py runserver

Y lanzamos una petición HTTP desde el terminal con curl para comprobar que nos da una respuesta esperada.

curl http://localhost:8000/ping/

Nos devolverá el siguiente JSON.

{"ping": "pong!"}

Es el momento de crear un nuevo test. Creamos test_ping.py.

tests
    └── libros
            └── test_ejemplo.py
                test_ping.py
# tests/libros/test_ping.py

import json
from django.urls import reverse

def test_ping(client):
        # Obtenemos la ruta de "ping"
    url = reverse("ping")
        # Hacemos una peticion GET con el cliente de Django test
    response = client.get(url)
        # Recibo un JSON que convierto a un diccionario para tratarlo
    content = json.loads(response.content)
        # Los asset me ayuda hacer las comprobaciones.
        # ¿Recibo el código 200?
    assert response.status_code == 200
        # ¿El contenido de Ping es Pong?> {"ping": "pong!"}
    assert content["ping"] == "pong!"

client es un fixture de ayuda de pytest-django que proporciona una instancia de django.test.Client . Básicamente es un cliente HTTP que podemos utilizar dentro de los testings.

Ya puedes ejecutar el test.

pytest
=================================================== test session starts ===================================================
platform linux -- Python 3.9.2, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
django: settings: proyecto.settings (from ini)
plugins: django-4.4.0
collected 2 items

tests/libros/test_ejemplo.py .                                                                                      [ 50%]
tests/libros/test_ping.py .                                                                                         [100%]

==================================================== 2 passed in 0.05s ====================================================

Lo ha pasado todo, ¡genial!

Para hacer diferentes tests, un buen patrón es Given-When-Then. Una estructura de 3 bloques informales de comentarios para dividir el código.

  1. Given: Estado antes del código. Preparas el escenario y las condiciones del test, como información en la base de datos, estados u herramientas.
  2. When: Código del test. Ejecutas las acciones que prueben las diferentes características.
  3. Then: Comprobaciones o asserts para verificar que se ha cumplido los casos esperados.

En anterior código quedaría de la siguiente forma.

# tests/libros/test_ping.py

import json
from django.urls import reverse

def test_ping(client):

        ## Given
        # Nada que manipular en la base de datos

        ## When
    url = reverse("ping")
    response = client.get(url)
    content = json.loads(response.content)

        ## Then
    assert response.status_code == 200
    assert content["ping"] == "pong!"

This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.

Will you buy me a coffee?