A previous `git pull --rebase origin main` dropped 177 local commits,
losing 3400+ files across admin-v2, backend, studio-v2, website,
klausur-service, and many other services. The partial restore attempt
(660295e2) only recovered some files.
This commit restores all missing files from pre-rebase ref 98933f5e
while preserving post-rebase additions (night-scheduler, night-mode UI,
NightModeWidget dashboard integration).
Restored features include:
- AI Module Sidebar (FAB), OCR Labeling, OCR Compare
- GPU Dashboard, RAG Pipeline, Magic Help
- Klausur-Korrektur (8 files), Abitur-Archiv (5+ files)
- Companion, Zeugnisse-Crawler, Screen Flow
- Full backend, studio-v2, website, klausur-service
- All compliance SDKs, agent-core, voice-service
- CI/CD configs, documentation, scripts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
87 lines
3.0 KiB
Python
87 lines
3.0 KiB
Python
"""
|
|
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
|