""" Python Test Discovery Functions for discovering Python and BQAS tests in a codebase. """ import json from pathlib import Path from typing import List from ...models import TestCase, TestFramework, TestCategory from ..config import PROJECT_ROOT def discover_python_tests(base_path: Path) -> List[TestCase]: """Entdeckt Python-Tests in einem Verzeichnis""" tests = [] if not base_path.exists(): return tests # Suche nach test_*.py Dateien test_files = list(base_path.rglob("test_*.py")) for test_file in test_files: try: content = test_file.read_text() for i, line in enumerate(content.split("\n"), 1): stripped = line.strip() # Test-Funktionen if stripped.startswith("def test_"): name_end = stripped.find("(") if name_end > 4: func_name = stripped[4:name_end] tests.append(TestCase( id=f"{test_file.stem}_{func_name}", name=func_name, file_path=str(test_file.relative_to(PROJECT_ROOT)), line_number=i, framework=TestFramework.PYTEST, category=TestCategory.UNIT, )) # Async Test-Methoden elif stripped.startswith("async def test_"): name_end = stripped.find("(") if name_end > 10: func_name = stripped[10:name_end] tests.append(TestCase( id=f"{test_file.stem}_{func_name}", name=func_name, file_path=str(test_file.relative_to(PROJECT_ROOT)), line_number=i, framework=TestFramework.PYTEST, category=TestCategory.UNIT, )) except Exception: pass return tests def discover_bqas_tests(base_path: Path, test_type: str) -> List[TestCase]: """Entdeckt BQAS-Tests (Golden/RAG)""" tests = [] if not base_path.exists(): return tests # Suche nach JSON-Dateien test_files = list(base_path.rglob("*.json")) for test_file in test_files: try: content = json.loads(test_file.read_text()) if isinstance(content, list): for i, test_case in enumerate(content): test_id = test_case.get("id", f"{test_file.stem}_{i}") tests.append(TestCase( id=test_id, name=test_case.get("name", test_id), file_path=str(test_file.relative_to(PROJECT_ROOT)), framework=TestFramework.BQAS_GOLDEN if test_type == "golden" else TestFramework.BQAS_RAG, category=TestCategory.BQAS, )) except Exception: pass return tests