morphos / backend /tests /test_traduccion_consulta.py
Jose Salazar
Añadir el stack nuevo: Vite/TypeScript + FastAPI
70e641d
Raw
History Blame Contribute Delete
2.53 kB
"""Regresión del traductor determinista ES→EN de la consulta de recuperación."""
from __future__ import annotations
import pytest
from app.rag.traduccion_consulta import traducir_consulta
@pytest.mark.parametrize(
"es,en",
[
("Anemia", "anemia"), # cognato: paso directo
("Azotemia", "azotemia"), # cognato
("Eritrocitosis", "erythrocytosis"), # raíz no-cognata (eritro→erythro)
("Leucocitosis neutrofílica", "leukocytosis neutrophilic"),
("Daño hepatocelular", "damage hepatocellular"),
("Patrón colestásico", "pattern cholestatic"),
("Hiperpotasemia", "hyperkalemia"), # potasemia→kalemia
("Creatinina elevada", "creatinine elevated"),
("Déficit de hierro sérico", "deficiency of iron serum"),
],
)
def test_traducciones_clave(es, en):
assert traducir_consulta(es, "en") == en
def test_idioma_es_es_identidad():
consulta = "Anemia ; Daño hepatocelular ; Hiperpotasemia"
assert traducir_consulta(consulta, "es") == consulta
def test_separador_de_consulta_se_conserva():
# construir_consulta une términos con ' ; '
salida = traducir_consulta("Anemia ; Azotemia", "en")
assert ";" in salida
assert "anemia" in salida and "azotemia" in salida
def test_siglas_en_mayuscula_se_conservan():
assert traducir_consulta("BUN", "en") == "BUN"
def test_vacio_no_rompe():
assert traducir_consulta("", "en") == ""
def test_cobertura_alteraciones():
"""Guarda de mantenimiento (recomendación de la revisión): toda palabra de contenido de
data/alteraciones.json debe estar en el léxico o en la allowlist de cognados. Si se añade
una alteración con un término no-cognado nuevo, este test falla y obliga a traducirlo."""
import json
import re
from pathlib import Path
from app.rag.traduccion_consulta import _LEXICO, COGNADOS_PERMITIDOS, _sin_acentos
ruta = Path(__file__).resolve().parents[2] / "data" / "alteraciones.json"
alt = json.loads(ruta.read_text(encoding="utf-8"))
palabras: set[str] = set()
for v in alt.values():
if isinstance(v, dict):
for w in re.findall(r"[A-Za-zÁÉÍÓÚÑáéíóúñ]+", v.get("nombre", "").lower()):
palabras.add(_sin_acentos(w))
sin_cubrir = {w for w in palabras if len(w) >= 5 and w not in _LEXICO and w not in COGNADOS_PERMITIDOS}
assert not sin_cubrir, f"Términos sin traducir (añádelos al léxico o a COGNADOS_PERMITIDOS): {sorted(sin_cubrir)}"