Files
larry/tests/unit/test_guardrails_composite.py

45 lines
1.5 KiB
Python

"""Tests del CompositeGuardrailEngine."""
from uuid import uuid4
import pytest
from agentforge_core.domain.policy import PolicyDefinition
from agentforge_core.guardrails.composite import CompositeGuardrailEngine
from agentforge_core.guardrails.guardrails_ai import GuardrailsAIEngine
from agentforge_core.guardrails.nemo import NeMoGuardrailsEngine
@pytest.fixture
def policy() -> PolicyDefinition:
return PolicyDefinition(
name="t",
version="v1",
description="t",
input_validators=[],
output_validators=[],
)
async def test_composite_agrega_violaciones_de_todos(policy: PolicyDefinition) -> None:
engine = CompositeGuardrailEngine(
[GuardrailsAIEngine(), NeMoGuardrailsEngine(allowed_keywords=["sip"])]
)
violations = await engine.validate_input("texto sin tema", policy, uuid4())
assert isinstance(violations, list)
# NeMo debe marcar off-topic (warning, no bloqueo)
assert any(v.validator == "NeMoTopicalRails" for v in violations)
async def test_composite_no_agrega_si_match_topic(policy: PolicyDefinition) -> None:
engine = CompositeGuardrailEngine(
[GuardrailsAIEngine(), NeMoGuardrailsEngine(allowed_keywords=["sip"])]
)
violations = await engine.validate_input("incidente sip en cscf", policy, uuid4())
assert not [v for v in violations if v.validator == "NeMoTopicalRails"]
def test_composite_rechaza_lista_vacia() -> None:
with pytest.raises(ValueError):
CompositeGuardrailEngine([])