DEV Community

Nahuel Segovia
Nahuel Segovia

Posted on

Testeando endpoints con Django Rest Framework

En mi trabajo decidimos empezar a utilizar tests unitarios como una manera rápida de identificar errores a la hora de llevar algo a producción.

Lo primero que hice fue testear una de las primeras funcionalidades del proyecto que yo mismo realicé(es un proyecto muy nuevo) y encontré diferentes maneras de hacerlo.

  • Endpoint a testear:

    • /topic/create/
  • Permisos necesarios:

    • Estar logueado
    • Ser administrador

Lo primero que tenemos que hacer es importar lo siguiente adentro del archivo test.py del proyecto:

from rest_framework.test import APITestCase, APIClient
from django.urls import reverse
from rest_framework import status
from .models import *
Enter fullscreen mode Exit fullscreen mode

Lo siguiente es crear una clase en donde vamos a reunir todos los casos de testeos:

class TestTopics(APITestCase):
Enter fullscreen mode Exit fullscreen mode

es importante que esa clase herede de APITestCase.

Una vez que tenemos la clase vamos a crear el método de configuración: acá adentro vamos a escribir todas las configuraciones necesarias para poder testear/probar nuestro endpoint, crear usuarios, asignarle permisos, crear grupos etc..

class TestTopics(APITestCase):
    def setUp(self):

        administrator_group = Group(name='administrador')
        administrator_group.save()

        administrator_group = Group.objects.get(name='administrator')

        admin1 = User(username="administradorprueba", first_name="Admin", last_name="Dos")
        admin1.set_password("administradorprueba")
        admin1.save()
        admin1.groups.add(administrator_group)
Enter fullscreen mode Exit fullscreen mode

DATO IMPORTANTE: cuando vayamos a testear nuestro endpoint y este necesite que un usuario se encuentre logueado y con todos sus permisos, no hace falta que hagamos una petición para loguearnos y obtener el token para después hacer la petición hacia nuestro endpoint. DRF nos trae por defecto en APIClient un método llamado force_authenticate al que nosotros le pasamos la instancia de nuestro usuario y se loguea por nosotros.

    def test_create_topic_only_name_and_description(self):

        client = APIClient()
        data = User.objects.get(username='administradorprueba')
        client.force_authenticate(user=data)

        response = client.post(
                    reverse('create_topic'), {
                    'name': 'productos recomendados',
                    'description': 'solo productos bien rankeados por la comunidad',
                },
                format='json')

        self.assertEqual(response.status_code, status.HTTP_200_OK)
Enter fullscreen mode Exit fullscreen mode

Como ven, ahora a través de client podemos enviar la petición después de habernos logueado con force_authenticate.

En esta línea reverse('create_topic') lo que estamos haciendo es buscar el endpoint con el name="create_topic" definido adentro de nuestro script urls.py

Image description

Discussion (0)