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"])