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.
Intento de obtener el último backup, pero este se encuentra "corrupto" (Algunos nombres de las columnas fueron alterados)
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()