#!/usr/bin/env python3
"""통합 테스트 - 시스템 전체 검증"""

import os
import sys
import tempfile
import unittest
from pathlib import Path

sys.path.insert(0, str(Path(__file__).parent.parent))

from code_reviewer import CodeReviewer
from red_team_orchestrator import RedTeamOrchestrator


class TestIntegration(unittest.TestCase):
    """통합 테스트 클래스"""

    def setUp(self):
        """테스트 설정"""
        self.reviewer = CodeReviewer()
        self.orchestrator = RedTeamOrchestrator({"code": self.reviewer})

    def test_normal_file_review(self):
        """시나리오 1: 정상 파일 검토"""
        # 임시 파일 생성
        with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f:
            f.write("# Normal code\npass\n")
            temp_path = f.name

        try:
            result = self.orchestrator.review("code", temp_path)

            # 검증
            self.assertIn("risk_level", result)
            self.assertIn("passed", result)
            self.assertIn(result["risk_level"], ["low", "medium"])
            self.assertTrue(result["passed"])
        finally:
            os.unlink(temp_path)

    def test_vulnerable_file_review(self):
        """시나리오 2: 취약점 파일 검토"""
        # 취약점이 있는 파일 생성
        with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f:
            f.write("password = '123456'\n")
            temp_path = f.name

        try:
            result = self.orchestrator.review("code", temp_path)

            # 검증
            self.assertEqual(result["risk_level"], "high")
            self.assertGreater(result["vulnerability_count"], 0)
            self.assertFalse(result["passed"])
        finally:
            os.unlink(temp_path)

    def test_sql_injection_detection(self):
        """시나리오 3: SQL Injection 감지"""
        with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f:
            f.write('query = "SELECT * FROM users WHERE id = " + user_input\n')
            temp_path = f.name

        try:
            result = self.orchestrator.review("code", temp_path)

            # 검증
            self.assertIn(result["risk_level"], ["high", "critical"])
            self.assertGreater(result["vulnerability_count"], 0)
            vuln_types = [v["type"] for v in result["vulnerabilities"]]
            self.assertIn("SQL Injection", vuln_types)
        finally:
            os.unlink(temp_path)

    def test_multiple_vulnerabilities(self):
        """시나리오 4: 다중 취약점 감지"""
        with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f:
            f.write("""password = "hardcoded_pass"
api_key = "sk-1234567890"
query = "SELECT * FROM users WHERE id = " + user_id
eval(user_input)
os.system("ls " + filename)
""")
            temp_path = f.name

        try:
            result = self.orchestrator.review("code", temp_path)

            # 검증
            self.assertEqual(result["risk_level"], "critical")
            self.assertGreaterEqual(result["vulnerability_count"], 5)
            self.assertFalse(result["passed"])
        finally:
            os.unlink(temp_path)

    def test_large_file_architecture_risk(self):
        """시나리오 5: 대용량 파일 아키텍처 리스크"""
        # 200줄 이상 파일 생성
        with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f:
            for i in range(250):
                f.write(f"# Line {i}\n")
            temp_path = f.name

        try:
            result = self.orchestrator.review("code", temp_path)

            # 검증
            self.assertEqual(result["risk_level"], "medium")
            self.assertGreater(len(result["architecture_issues"]), 0)
            self.assertTrue(result["passed"])  # medium은 passed=True
        finally:
            os.unlink(temp_path)


if __name__ == "__main__":
    unittest.main()
