DEV Community

Nahuel Segovia
Nahuel Segovia

Posted on

6 2

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

Billboard image

Deploy and scale your apps on AWS and GCP with a world class developer experience

Coherence makes it easy to set up and maintain cloud infrastructure. Harness the extensibility, compliance and cost efficiency of the cloud.

Learn more

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay