"""Tests del CompositeGuardrailEngine.""" from uuid import uuid4 import pytest from forja_core.domain.policy import PolicyDefinition from forja_core.guardrails.composite import CompositeGuardrailEngine from forja_core.guardrails.guardrails_ai import GuardrailsAIEngine from forja_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([])