Pruebas de endpoints - SebaUSM/GRUPO02-2025-PROYINF GitHub Wiki

Este documento presenta las pruebas realizadas para los endpoints seleccionados, detallando su funcionamiento, pruebas unitarias, clases de equivalencia y resultados esperados.


Endpoint 1: Respaldo exitoso con notificación

Descripción

Este endpoint permite generar un respaldo inmediato de las tablas users y pdf_files. El archivo se guarda en formato JSON en la carpeta /backups, y adicionalmente se envía una notificación por correo electrónico al administrador.

URI y Método

  • URI: /backup/trigger
  • Método HTTP: POST

Pruebas Unitarias (Simulación en Python)

Prueba 1: Respaldo exitoso con notificación

Input Output Esperado Contexto
Solicitud POST al endpoint /backup/trigger Código 200, "mensaje": "Backup generado exitosamente", "correo": "enviado" Sistema encendido, DB activa, SMTP válido

Prueba 2: Respaldo exitoso sin notificación

Input Output Esperado Contexto
POST /backup/trigger con SMTP mal configurado Código 200, "correo": "falló" SMTP inválido, conexión o autenticación fallida

Endpoint 2: Obtener Último Respaldo

Descripción

Este endpoint devuelve el contenido del respaldo más reciente guardado en la carpeta /backups. El archivo contiene las tablas users y pdf_files como claves.

URI y Método

  • URI: /backup/last
  • Método HTTP: GET

Prueba 1: Último respaldo disponible

Input Output Esperado Contexto
Solicitud GET al endpoint /backup/last Código 200, JSON con claves users, pdf_files Archivo de backup existente

Prueba 2: No hay respaldo disponible

Input Output Esperado Contexto
Solicitud GET al endpoint /backup/last sin archivos existentes Código 404, JSON con "error": "No hay backups disponibles" Carpeta backups/ vacía o renombrada

Estrategia de Pruebas

  • Clases de equivalencia:
    • Backup exitoso con correo.
    • Backup exitoso con falla en el envío del correo.
    • Petición a /backup/last con y sin archivos

Framework y Organización (Endpoint de respaldo)

  • Lenguaje utilizado: Python
  • Framework: unittest
  • Estructura:
    • Clase TestBackupEndpoints que contiene pruebas de respaldo y notificación
    • Uso de setUpClass() para definir estado base
    • Métodos separados para cada verificación de respuesta, archivo y notificación

Screenshots de las pruebas realizadas

Todos los endpoints con su contexto y respuesta esperada OK.

image

Intento de obtener el último backup, pero este se encuentra "corrupto" (Algunos nombres de las columnas fueron alterados)

image

Nos hubiera gustado realizar pruebas a la implementación del envío de notificaciones por medio de correo electrónico, pero debido a que esto fue implementado en JSON, unittest no nos permitió realizar dichas pruebas.


Código de ejecución en Python

import requests
import json
import glob
import os

BASE_URL = 'http://localhost:3000'

class TestBackupEndpoints(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.backup_dir = './backups'

    def test_post_backup_trigger(self):
        try:
            response = requests.post(f'{BASE_URL}/backup/trigger', timeout=5)
            self.assertEqual(response.status_code, 200)
            data = response.json()
            self.assertIn('mensaje', data)
            self.assertIn(data.get('correo'), ['enviado', 'falló'])
        except requests.exceptions.ConnectionError:
            self.fail("No se pudo conectar al servidor.")

    def test_backup_file_created_and_valid(self):
        backup_files = sorted(
            glob.glob(f'{self.backup_dir}/backup-completo-*.json'),
            key=os.path.getmtime,
            reverse=True
        )
        self.assertGreater(len(backup_files), 0)
        with open(backup_files[0], 'r', encoding='utf-8') as f:
            contenido = json.load(f)
        self.assertIn('users', contenido)
        self.assertIn('pdf_files', contenido)

    def test_get_last_backup(self):
        try:
            response = requests.get(f'{BASE_URL}/backup/last', timeout=5)
            self.assertEqual(response.status_code, 200)
            self.assertIn('users', response.json())
            self.assertIn('pdf_files', response.json())
        except requests.exceptions.ConnectionError:
            self.fail("No se pudo conectar al servidor.")

    def test_get_last_backup_sin_archivos(self):
        if os.path.exists('./backups'):
            os.rename('./backups', './backups_temp')
        try:
            response = requests.get(f'{BASE_URL}/backup/last', timeout=5)
            self.assertEqual(response.status_code, 404)
            self.assertIn('error', response.json())
        finally:
            if os.path.exists('./backups_temp'):
                os.rename('./backups_temp', './backups')

if __name__ == '__main__':
    unittest.main()