340 lines
12 KiB
Python
Executable File
340 lines
12 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
test_dicom2pacs.py - Automatisierte Tests für dicom2pacs
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import shutil
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
# Füge Projektverzeichnis zum Python-Pfad hinzu
|
|
project_dir = os.path.dirname(os.path.abspath(__file__))
|
|
sys.path.insert(0, project_dir)
|
|
|
|
# Versuche venv zu verwenden
|
|
venv_path = os.path.join(project_dir, 'venv')
|
|
python_version = f"{sys.version_info.major}.{sys.version_info.minor}"
|
|
|
|
if os.path.exists(venv_path):
|
|
# Füge venv site-packages zum Python-Pfad hinzu
|
|
site_packages = os.path.join(venv_path, 'lib', f'python{python_version}', 'site-packages')
|
|
if os.path.exists(site_packages):
|
|
sys.path.insert(0, site_packages)
|
|
|
|
# Versuche auch pydicom aus der gebauten App zu verwenden
|
|
app_path = os.path.join(project_dir, 'dist', 'dicom2pacs.app', 'Contents', 'Resources', 'lib', f'python{python_version}')
|
|
if os.path.exists(app_path):
|
|
sys.path.insert(0, app_path)
|
|
|
|
# Prüfe ob pydicom verfügbar ist, sonst gebe Hinweis
|
|
try:
|
|
import pydicom
|
|
except ImportError:
|
|
print("WARNUNG: pydicom nicht gefunden. Bitte venv aktivieren oder pydicom installieren:")
|
|
print(" source venv/bin/activate")
|
|
print(" pip install pydicom")
|
|
print("Oder Tests mit test_dicom2pacs.sh ausführen, das das venv automatisch aktiviert.\n")
|
|
|
|
def test_imports():
|
|
"""Test ob alle Module importiert werden können"""
|
|
print("Teste Imports...")
|
|
try:
|
|
# Versuche zuerst pydicom zu importieren, um zu prüfen ob es verfügbar ist
|
|
try:
|
|
import pydicom
|
|
except ImportError:
|
|
print("⚠ pydicom nicht gefunden - Tests können nicht vollständig ausgeführt werden")
|
|
print(" Bitte venv aktivieren: source venv/bin/activate")
|
|
print(" Oder Tests mit test_dicom2pacs.sh ausführen")
|
|
return False
|
|
|
|
import dicom_processing
|
|
import file_management
|
|
import network_utils
|
|
import gui
|
|
print("✓ Alle Module erfolgreich importiert")
|
|
return True
|
|
except ImportError as e:
|
|
print(f"✗ Import-Fehler: {e}")
|
|
print(" Tipp: Führen Sie die Tests mit test_dicom2pacs.sh aus, um das venv automatisch zu aktivieren")
|
|
return False
|
|
|
|
def test_dicom_file_detection():
|
|
"""Test DICOM-Datei-Erkennung"""
|
|
print("\nTeste DICOM-Datei-Erkennung...")
|
|
try:
|
|
# Prüfe ob pydicom verfügbar ist
|
|
try:
|
|
import pydicom
|
|
except ImportError:
|
|
print("⚠ pydicom nicht verfügbar - Test übersprungen")
|
|
return False
|
|
|
|
import dicom_processing
|
|
|
|
# Suche nach Test-DICOM-Dateien
|
|
test_dirs = [
|
|
os.path.expanduser("~/Downloads/test_dicom"),
|
|
"dist/dicom2pacs.app/Contents/Resources/lib/python3.13/pydicom/data/test_files",
|
|
"venv/lib/python3.13/site-packages/pydicom/data/test_files"
|
|
]
|
|
|
|
test_file = None
|
|
for test_dir in test_dirs:
|
|
if os.path.exists(test_dir):
|
|
for file in os.listdir(test_dir):
|
|
if file.endswith('.dcm'):
|
|
test_file = os.path.join(test_dir, file)
|
|
break
|
|
if test_file:
|
|
break
|
|
|
|
if test_file and os.path.exists(test_file):
|
|
is_dicom = dicom_processing.is_dicom_file(test_file)
|
|
print(f"✓ DICOM-Datei erkannt: {os.path.basename(test_file)} -> {is_dicom}")
|
|
return True
|
|
else:
|
|
print("⚠ Keine Test-DICOM-Datei gefunden")
|
|
return False
|
|
except Exception as e:
|
|
print(f"✗ Fehler: {e}")
|
|
return False
|
|
|
|
def test_file_management():
|
|
"""Test Dateiverwaltung"""
|
|
print("\nTeste Dateiverwaltung...")
|
|
try:
|
|
# Prüfe ob pydicom verfügbar ist
|
|
try:
|
|
import pydicom
|
|
except ImportError:
|
|
print("⚠ pydicom nicht verfügbar - Test übersprungen")
|
|
return False
|
|
|
|
import file_management
|
|
|
|
test_dir = os.path.expanduser("~/Downloads/test_dicom")
|
|
if os.path.exists(test_dir):
|
|
result = file_management.find_dicom_files(test_dir)
|
|
if result != 'non_found':
|
|
files, count = result
|
|
print(f"✓ {count} DICOM-Dateien gefunden")
|
|
return True
|
|
else:
|
|
print("⚠ Keine DICOM-Dateien im Test-Ordner")
|
|
return False
|
|
else:
|
|
print("⚠ Test-Ordner nicht gefunden")
|
|
return False
|
|
except Exception as e:
|
|
print(f"✗ Fehler: {e}")
|
|
return False
|
|
|
|
def test_config_loading():
|
|
"""Test Konfigurationsladen"""
|
|
print("\nTeste Konfigurationsladen...")
|
|
try:
|
|
# Simuliere load_config
|
|
config_path = os.path.expanduser("~/.dicom2pacs.conf")
|
|
if os.path.exists(config_path):
|
|
print("✓ Konfigurationsdatei gefunden")
|
|
with open(config_path, 'r') as f:
|
|
content = f.read()
|
|
print(f" Inhalt: {len(content)} Zeichen")
|
|
return True
|
|
else:
|
|
print("⚠ Konfigurationsdatei nicht gefunden (wird beim ersten Start erstellt)")
|
|
return True # Nicht kritisch
|
|
except Exception as e:
|
|
print(f"✗ Fehler: {e}")
|
|
return False
|
|
|
|
def test_patient_name_formatting():
|
|
"""Test Patientenname-Formatierung"""
|
|
print("\nTeste Patientenname-Formatierung...")
|
|
try:
|
|
# Prüfe ob pydicom verfügbar ist (wird indirekt benötigt)
|
|
try:
|
|
import pydicom
|
|
except ImportError:
|
|
print("⚠ pydicom nicht verfügbar - Test übersprungen")
|
|
return False
|
|
|
|
import file_management
|
|
|
|
# Test verschiedene Formate
|
|
test_cases = [
|
|
("MUSTERMANN^MAX", ("MUSTERMANN", "MAX")),
|
|
("Mustermann^Max", ("Mustermann", "Max")),
|
|
("SMITH", ("SMITH", "")),
|
|
]
|
|
|
|
for input_name, expected in test_cases:
|
|
result = file_management.format_patient_name(input_name)
|
|
if result == expected:
|
|
print(f"✓ '{input_name}' -> {result}")
|
|
else:
|
|
print(f"✗ '{input_name}' -> {result}, erwartet: {expected}")
|
|
return False
|
|
|
|
return True
|
|
except Exception as e:
|
|
print(f"✗ Fehler: {e}")
|
|
return False
|
|
|
|
def test_birthdate_formatting():
|
|
"""Test Geburtsdatum-Formatierung"""
|
|
print("\nTeste Geburtsdatum-Formatierung...")
|
|
try:
|
|
# Prüfe ob pydicom verfügbar ist (wird indirekt benötigt)
|
|
try:
|
|
import pydicom
|
|
except ImportError:
|
|
print("⚠ pydicom nicht verfügbar - Test übersprungen")
|
|
return False
|
|
|
|
import file_management
|
|
|
|
test_cases = [
|
|
("19800101", "01.01.1980"),
|
|
("20001225", "25.12.2000"),
|
|
]
|
|
|
|
for input_date, expected in test_cases:
|
|
result = file_management.format_birthdate(input_date)
|
|
if result == expected:
|
|
print(f"✓ '{input_date}' -> {result}")
|
|
else:
|
|
print(f"✗ '{input_date}' -> {result}, erwartet: {expected}")
|
|
return False
|
|
|
|
return True
|
|
except Exception as e:
|
|
print(f"✗ Fehler: {e}")
|
|
return False
|
|
|
|
def test_upload_functionality():
|
|
"""Test Upload-Funktionalität"""
|
|
print("\nTeste Upload-Funktionalität...")
|
|
try:
|
|
import asyncio
|
|
import network_utils
|
|
|
|
# Lade Konfiguration
|
|
config_path = os.path.expanduser("~/.dicom2pacs.conf")
|
|
server_url = None
|
|
server_username = None
|
|
server_pw = None
|
|
|
|
if os.path.exists(config_path):
|
|
with open(config_path, 'r') as f:
|
|
for line in f:
|
|
line = line.strip()
|
|
if line.startswith('server_url='):
|
|
server_url = line.split('=', 1)[1]
|
|
elif line.startswith('server_username='):
|
|
server_username = line.split('=', 1)[1]
|
|
elif line.startswith('server_pw='):
|
|
server_pw = line.split('=', 1)[1]
|
|
|
|
if not server_url:
|
|
print("⚠ Keine Server-URL in Konfiguration gefunden - Upload-Test übersprungen")
|
|
print(" Bitte konfigurieren Sie die Server-URL in ~/.dicom2pacs.conf")
|
|
return True # Nicht kritisch, Test überspringen
|
|
|
|
# Test 1: Server-Verfügbarkeit prüfen
|
|
print(" Prüfe Server-Verfügbarkeit...")
|
|
try:
|
|
loop = asyncio.new_event_loop()
|
|
asyncio.set_event_loop(loop)
|
|
availability = loop.run_until_complete(network_utils.check_server_availability(server_url))
|
|
loop.close()
|
|
|
|
if availability:
|
|
print(f" ✓ Server ist erreichbar: {server_url}")
|
|
|
|
# Test 2: Prüfe ob Test-DICOM-Dateien vorhanden sind
|
|
test_dir = os.path.expanduser("~/Downloads/test_dicom")
|
|
if os.path.exists(test_dir):
|
|
import file_management
|
|
result = file_management.find_dicom_files(test_dir)
|
|
if result != 'non_found':
|
|
files, count = result
|
|
if count > 0:
|
|
print(f" ✓ {count} Test-DICOM-Dateien gefunden")
|
|
print(" ⚠ Upload-Test würde echte Dateien hochladen - wird übersprungen")
|
|
print(" (Für echten Upload-Test: Manuell mit test_dicom2pacs.sh durchführen)")
|
|
return True
|
|
else:
|
|
print(" ⚠ Keine DICOM-Dateien im Test-Ordner")
|
|
else:
|
|
print(" ⚠ Keine DICOM-Dateien im Test-Ordner")
|
|
else:
|
|
print(" ⚠ Test-Ordner nicht gefunden: ~/Downloads/test_dicom")
|
|
|
|
return True
|
|
else:
|
|
print(f" ⚠ Server ist nicht erreichbar: {server_url}")
|
|
print(" (Upload-Test kann nicht durchgeführt werden)")
|
|
return True # Nicht kritisch, Server könnte offline sein
|
|
except Exception as e:
|
|
print(f" ⚠ Fehler beim Prüfen der Server-Verfügbarkeit: {e}")
|
|
return True # Nicht kritisch
|
|
|
|
except ImportError as e:
|
|
print(f"✗ Import-Fehler: {e}")
|
|
return False
|
|
except Exception as e:
|
|
print(f"✗ Fehler: {e}")
|
|
return False
|
|
|
|
def main():
|
|
"""Hauptfunktion für alle Tests"""
|
|
print("=== dicom2pacs Automatisierte Tests ===\n")
|
|
|
|
tests = [
|
|
("Imports", test_imports),
|
|
("DICOM-Datei-Erkennung", test_dicom_file_detection),
|
|
("Dateiverwaltung", test_file_management),
|
|
("Konfiguration", test_config_loading),
|
|
("Patientenname-Formatierung", test_patient_name_formatting),
|
|
("Geburtsdatum-Formatierung", test_birthdate_formatting),
|
|
("Upload-Funktionalität", test_upload_functionality),
|
|
]
|
|
|
|
results = []
|
|
for test_name, test_func in tests:
|
|
try:
|
|
result = test_func()
|
|
results.append((test_name, result))
|
|
except Exception as e:
|
|
print(f"✗ Unerwarteter Fehler in {test_name}: {e}")
|
|
results.append((test_name, False))
|
|
|
|
# Zusammenfassung
|
|
print("\n" + "="*50)
|
|
print("Test-Zusammenfassung:")
|
|
print("="*50)
|
|
|
|
passed = sum(1 for _, result in results if result)
|
|
total = len(results)
|
|
|
|
for test_name, result in results:
|
|
status = "✓ PASS" if result else "✗ FAIL"
|
|
print(f"{status}: {test_name}")
|
|
|
|
print("="*50)
|
|
print(f"Ergebnis: {passed}/{total} Tests bestanden")
|
|
|
|
if passed == total:
|
|
print("🎉 Alle Tests bestanden!")
|
|
return 0
|
|
else:
|
|
print("⚠️ Einige Tests fehlgeschlagen")
|
|
return 1
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|