Files
agent_platform_oci/tests/test_aoferta_transaction_continuation.py

76 lines
2.4 KiB
Python

import pytest
from agent_framework.guardrails.rails import ProactiveOfferRail
@pytest.mark.asyncio
@pytest.mark.parametrize("status", ["COLLECTING_PARAMETERS", "AWAITING_CONFIRMATION"])
async def test_aoferta_bypasses_transaction_continuation_without_llm(monkeypatch, status):
async def should_not_run(*args, **kwargs):
raise AssertionError("AOFERTA LLM must not run for transaction continuation")
monkeypatch.setattr(
"agent_framework.guardrails.rails.classify_with_framework_llm",
should_not_run,
)
decision = await ProactiveOfferRail().evaluate(
"Para prosseguir, informe valor.",
{"transaction_status": status},
)
assert decision.allowed is True
assert decision.code == "AOFERTA"
assert decision.metadata["mechanism"] == "deterministic_transaction_bypass"
assert decision.metadata["transaction_status"] == status
@pytest.mark.asyncio
async def test_aoferta_detects_transaction_continuation_from_mcp_results(monkeypatch):
async def should_not_run(*args, **kwargs):
raise AssertionError("AOFERTA LLM must not run for transaction continuation")
monkeypatch.setattr(
"agent_framework.guardrails.rails.classify_with_framework_llm",
should_not_run,
)
decision = await ProactiveOfferRail().evaluate(
"Você confirma o cancelamento do serviço TIM Fashion?",
{
"mcp_results": [
{
"tool_name": "cancelar_vas_avulso",
"awaiting_confirmation": True,
"transaction_status": "AWAITING_CONFIRMATION",
}
]
},
)
assert decision.allowed is True
assert decision.metadata["transaction_status"] == "AWAITING_CONFIRMATION"
@pytest.mark.asyncio
async def test_aoferta_still_calls_llm_outside_transaction_continuation(monkeypatch):
calls = []
async def fake_classify(*args, **kwargs):
calls.append((args, kwargs))
return {"allowed": False, "reason": "oferta proativa"}
monkeypatch.setattr(
"agent_framework.guardrails.rails.classify_with_framework_llm",
fake_classify,
)
decision = await ProactiveOfferRail().evaluate(
"Quer aproveitar e cancelar outro serviço?",
{"transaction_status": "COMPLETED"},
)
assert len(calls) == 1
assert decision.allowed is False
assert decision.metadata["mechanism"] == "llm_supervisor"