42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
from types import SimpleNamespace
|
|
|
|
from app.workflows.agent_graph import AgentWorkflow
|
|
|
|
|
|
def decision(code, allowed=False, reason=""):
|
|
return SimpleNamespace(code=code, allowed=allowed, reason=reason)
|
|
|
|
|
|
def test_coer_block_is_clarification_not_fake_security_message():
|
|
msg = AgentWorkflow._input_guardrail_user_message(
|
|
[decision("COER", reason="fala incompreensível ou negação ambígua na transcrição")],
|
|
{},
|
|
"está cobrando um",
|
|
)
|
|
assert "incompleta ou ambígua" in msg
|
|
assert "regra de segurança" not in msg.lower()
|
|
assert "COER" not in msg
|
|
|
|
|
|
def test_other_input_block_has_safe_non_internal_fallback():
|
|
msg = AgentWorkflow._input_guardrail_user_message(
|
|
[decision("UNKNOWN_RAIL", reason="internal implementation detail")],
|
|
{},
|
|
"texto",
|
|
)
|
|
assert "reformular" in msg.lower()
|
|
assert "internal implementation detail" not in msg
|
|
|
|
|
|
def test_blocked_input_is_routed_through_output_guardrails():
|
|
src = open("app/workflows/agent_graph.py", encoding="utf-8").read()
|
|
assert '{"blocked": "output_guardrails", "continue": "load_long_term_memory"}' in src
|
|
assert '{"blocked": "persist", "continue": "judge"}' in src
|
|
|
|
|
|
def test_blocked_input_clears_stale_tool_state():
|
|
src = open("app/workflows/agent_graph.py", encoding="utf-8").read()
|
|
assert '"mcp_tools": []' in src
|
|
assert '"mcp_results": []' in src
|
|
assert '"intent": "input_guardrail_blocked"' in src
|