grantforge-api / backend /tests /test_red_team_auditor.py
GrantForge Bot
Deploy sha-70f310b17bc9b39fd422bfab38a4f98a61af8d8c — source build (no GHCR)
b5e92ae
Raw
History Blame Contribute Delete
2.78 kB
import pytest
from unittest.mock import patch, MagicMock
from agents.red_team_auditor import RedTeamAuditor, AuditScore
def test_red_team_auditor_init():
auditor = RedTeamAuditor()
assert auditor.min_passing_score == 15
@patch("agents.red_team_auditor.get_llm")
def test_audit_application_passes(mock_get_llm):
# Setup mock LLM response
mock_llm = MagicMock()
mock_response = AuditScore(
score=20,
passed=True,
weaknesses=["Drobne błędy stylistyczne"],
legal_risks=[],
improvement_feedback="Wszystko wygląda dobrze, można wysyłać."
)
mock_llm.invoke.return_value = mock_response
mock_get_llm.return_value = mock_llm
auditor = RedTeamAuditor()
generated_sections = {"Wstęp": "Treść wstępu..."}
context = "Regulamin SMART"
program_name = "FENG"
result = auditor.audit_application(generated_sections, context, program_name)
assert result["score"] == 20
assert result["passed"] is True
assert len(result["weaknesses"]) == 1
assert result["feedback"] == "Wszystko wygląda dobrze, można wysyłać."
@patch("agents.red_team_auditor.get_llm")
def test_audit_application_fails_threshold(mock_get_llm):
# Setup mock LLM response with score < 15, but LLM mistakenly set passed=True
mock_llm = MagicMock()
mock_response = AuditScore(
score=10,
passed=True, # Auditor logic should override this to False
weaknesses=["Poważne braki w budżecie", "Brak wskaźników mierzalnych"],
legal_risks=["Koszty niekwalifikowane"],
improvement_feedback="Budżet do całkowitej przebudowy."
)
mock_llm.invoke.return_value = mock_response
mock_get_llm.return_value = mock_llm
auditor = RedTeamAuditor()
generated_sections = {"Budżet": "10 mln na wszystko"}
context = "Regulamin"
program_name = "Ścieżka SMART"
result = auditor.audit_application(generated_sections, context, program_name)
assert result["score"] == 10
# The auditor class forces passed=False if score < 15
assert result["passed"] is False
assert len(result["legal_risks"]) == 1
@patch("agents.red_team_auditor.get_llm")
def test_audit_application_exception_handling(mock_get_llm):
# Simulate API failure
mock_get_llm.side_effect = Exception("API Error Connection")
auditor = RedTeamAuditor()
result = auditor.audit_application({"A": "B"}, "Context", "Program")
# FAIL-CLOSED: awaria audytu NIE może cicho przepuścić wniosku.
# Wynik 0, passed=False i wymuszona ręczna weryfikacja.
assert result["score"] == 0
assert result["passed"] is False
assert result["human_review_required"] is True
assert any("Błąd ewaluacji przez LLM" in w for w in result["weaknesses"])