Spaces:
Running
Running
| 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 | |
| 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ć." | |
| 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 | |
| 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"]) | |