#!/usr/bin/env python3
"""red_team_orchestrator.py 단위 테스트"""

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 TestRedTeamOrchestrator(unittest.TestCase):
    """Red Team Orchestrator 테스트"""

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

    def test_orchestrator_initialized(self):
        """오케스트레이터가 초기화되었는지 확인"""
        self.assertIsNotNone(self.orchestrator)
        self.assertIn("code", self.orchestrator.reviewers)

    def test_get_available_types(self):
        """사용 가능한 타입 확인"""
        types = self.orchestrator.get_available_types()

        self.assertIn("code", types)

    def test_review_with_code_type(self):
        """코드 검토"""
        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)
        finally:
            os.unlink(temp_path)

    def test_review_with_invalid_type(self):
        """잘못된 타입으로 검토"""
        result = self.orchestrator.review("invalid_type", "test.py")

        self.assertIn("error", result)
        self.assertIn("available_types", result)

    def test_review_returns_consistent_structure(self):
        """리뷰 결과 구조 일관성 확인"""
        with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f:
            f.write("x = 1\n")
            temp_path = f.name

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

            # 필수 필드 확인
            self.assertIn("risk_level", result)
            self.assertIn("passed", result)
            # risk_level이 유효한 값인지 확인
            self.assertIn(result["risk_level"], ["low", "medium", "high", "critical", "unknown"])
        finally:
            os.unlink(temp_path)

    def test_multiple_reviewers(self):
        """여러 리뷰어 등록"""
        from base_reviewer import ReviewerInterface

        class MockReviewer(ReviewerInterface):
            def review(self, doc):
                return {"risk_level": "low", "passed": True}

        mock = MockReviewer()
        multi_orchestrator = RedTeamOrchestrator({"code": CodeReviewer(), "mock": mock})

        types = multi_orchestrator.get_available_types()
        self.assertIn("code", types)
        self.assertIn("mock", types)


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