Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 93 additions & 0 deletions tests/test_verificar_conexion_real.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
"""Tests para verificar_conexion_real — verificación de intentos de pago."""

from __future__ import annotations

import io
import os
import sys
import unittest
from unittest.mock import patch

_ROOT = os.path.normpath(os.path.join(os.path.dirname(__file__), ".."))
if _ROOT not in sys.path:
sys.path.insert(0, _ROOT)

from verificar_conexion_real import verificar_intentos_pago


class TestVerificarIntentosPago(unittest.TestCase):
def _capture(self, intentos):
"""Helper: captura stdout al llamar verificar_intentos_pago."""
with patch("sys.stdout", new_callable=io.StringIO) as mock_stdout:
verificar_intentos_pago(intentos)
return mock_stdout.getvalue()

# ------------------------------------------------------------------
# Cabecera
# ------------------------------------------------------------------

def test_prints_header(self) -> None:
output = self._capture([])
self.assertIn("--- [VERIFICACIÓN DE CONEXIÓN] ---", output)

# ------------------------------------------------------------------
# Bancario_Externo
# ------------------------------------------------------------------

def test_bancario_externo_prints_aviso(self) -> None:
pago = {"status": "Bancario_Externo", "emisor": "Empresa SA", "monto": 500}
output = self._capture([pago])
self.assertIn("AVISO: El pago de Empresa SA NO pasará por la App de Stripe.", output)

def test_bancario_externo_prints_motivo(self) -> None:
pago = {"status": "Bancario_Externo", "emisor": "Empresa SA", "monto": 500}
output = self._capture([pago])
self.assertIn("MOTIVO: Transferencia corporativa directa al IBAN.", output)

def test_bancario_externo_no_error_message(self) -> None:
pago = {"status": "Bancario_Externo", "emisor": "Empresa SA", "monto": 500}
output = self._capture([pago])
self.assertNotIn("ERROR:", output)

# ------------------------------------------------------------------
# Pago bloqueado (cualquier otro status)
# ------------------------------------------------------------------

def test_otro_status_prints_error(self) -> None:
pago = {"status": "Pendiente", "emisor": "Cliente X", "monto": 200}
output = self._capture([pago])
self.assertIn("ERROR: Pago de 200€ bloqueado por falta de verificación.", output)

def test_otro_status_no_aviso(self) -> None:
pago = {"status": "Fallido", "emisor": "Cliente Y", "monto": 99}
output = self._capture([pago])
self.assertNotIn("AVISO:", output)

def test_error_message_contains_monto(self) -> None:
pago = {"status": "Rechazado", "emisor": "Empresa Z", "monto": 1500}
output = self._capture([pago])
self.assertIn("1500€", output)

# ------------------------------------------------------------------
# Lista mixta
# ------------------------------------------------------------------

def test_mixed_list_processes_all(self) -> None:
intentos = [
{"status": "Bancario_Externo", "emisor": "Corp A", "monto": 3000},
{"status": "Pendiente", "emisor": "Corp B", "monto": 750},
{"status": "Bancario_Externo", "emisor": "Corp C", "monto": 100},
]
output = self._capture(intentos)
self.assertIn("AVISO: El pago de Corp A NO pasará por la App de Stripe.", output)
self.assertIn("ERROR: Pago de 750€ bloqueado por falta de verificación.", output)
self.assertIn("AVISO: El pago de Corp C NO pasará por la App de Stripe.", output)

def test_empty_list_only_header(self) -> None:
output = self._capture([])
lines = [ln for ln in output.splitlines() if ln.strip()]
self.assertEqual(lines, ["--- [VERIFICACIÓN DE CONEXIÓN] ---"])


if __name__ == "__main__":
unittest.main()
23 changes: 23 additions & 0 deletions verificar_conexion_real.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
"""
Comprueba que hay claves Stripe en el entorno (pk + sk) y si pk es live o test.
También verifica intentos de pago distinguiendo transferencias bancarias externas
(Bancario_Externo) de pagos que deben pasar por Stripe.

Acepta los mismos alias que inject_keys: VITE_STRIPE_PUBLIC_KEY, INJECT_*, E50_*.

Expand All @@ -12,6 +14,7 @@

import os
import sys
from typing import Any


def _g(*names: str) -> str:
Expand Down Expand Up @@ -56,6 +59,26 @@ def verificar_conexion_real() -> bool:
return True


def verificar_intentos_pago(intentos_pago: list[dict[str, Any]]) -> None:
"""Verifica una lista de intentos de pago e informa sobre su ruta de procesamiento.

Los pagos con status ``"Bancario_Externo"`` son transferencias corporativas
directas al IBAN que no pasan por Stripe. Cualquier otro status indica un
pago bloqueado por falta de verificación.

Args:
intentos_pago: Lista de dicts con al menos las claves ``"status"``,
``"emisor"`` y ``"monto"``.
"""
print("--- [VERIFICACIÓN DE CONEXIÓN] ---")
for pago in intentos_pago:
if pago["status"] == "Bancario_Externo":
print(f"AVISO: El pago de {pago['emisor']} NO pasará por la App de Stripe.")
print(f"MOTIVO: Transferencia corporativa directa al IBAN.")
else:
print(f"ERROR: Pago de {pago['monto']}€ bloqueado por falta de verificación.")


if __name__ == "__main__":
ok = verificar_conexion_real()
sys.exit(0 if ok else 1)