Compare commits

...

2 Commits

Author SHA1 Message Date
René Mathieu
fab2c04d07 Bestätigungsdialog: Vollständige Datenanzeige und größeres Fenster (750x600) 2026-01-17 14:11:28 +01:00
René Mathieu
ff2bc82994 Vor Änderungen am Bestätigungsdialog - Backup für Rollback 2026-01-17 14:08:03 +01:00
5 changed files with 643 additions and 5 deletions

228
README_TESTS.md Normal file
View File

@@ -0,0 +1,228 @@
# Test-Anleitung für dicom2pacs
Diese Anleitung erklärt, wie Sie die dicom2pacs-App testen können.
## Verfügbare Testskripte
### 1. `test_dicom2pacs.sh` - Interaktives Bash-Testskript
Ein interaktives Skript mit Menü für verschiedene Test-Optionen.
**Verwendung:**
```bash
./test_dicom2pacs.sh
```
**Optionen:**
- **Option 1: GUI-Test** - Öffnet die App mit GUI für manuelles Testen
- **Option 2: Unit-Test** - Prüft alle Module ohne GUI
- **Option 3: Integrationstest** - Vollständiger Test mit GUI
- **Option 4: Aufräumen** - Löscht Test-Ordner und Transfer-Ordner
**Was das Skript macht:**
- Erstellt Test-Ordner `~/Downloads/test_dicom`
- Kopiert Test-DICOM-Dateien aus pydicom
- Prüft Konfiguration
- Führt Tests basierend auf Ihrer Auswahl durch
### 2. `test_dicom2pacs.py` - Automatisiertes Python-Testskript
Ein Python-Skript, das automatisch alle Module testet.
**Verwendung:**
```bash
# Mit aktiviertem venv
source venv/bin/activate
python3 test_dicom2pacs.py
# Oder direkt mit venv-Python
venv/bin/python3 test_dicom2pacs.py
```
**Getestete Funktionen:**
- ✓ Module-Imports
- ✓ DICOM-Datei-Erkennung
- ✓ Dateiverwaltung
- ✓ Konfigurationsladen
- ✓ Patientenname-Formatierung
- ✓ Geburtsdatum-Formatierung
## Manuelle Tests
### Test 1: GUI öffnet sich
```bash
source venv/bin/activate
python dicom2pacs.py "Mustermann" "Max" "19800101" "12345"
```
**Erwartetes Verhalten:**
- GUI-Fenster öffnet sich
- "Durchsuchen"-Button ist sichtbar
- "Abbruch"-Button ist sichtbar
### Test 2: DICOM-Dateien finden
1. Erstellen Sie einen Test-Ordner:
```bash
mkdir -p ~/Downloads/test_dicom
```
2. Kopieren Sie Test-DICOM-Dateien:
```bash
# Von der gebauten App
cp dist/dicom2pacs.app/Contents/Resources/lib/python3.13/pydicom/data/test_files/CT_small.dcm ~/Downloads/test_dicom/
# Oder vom venv
cp venv/lib/python3.13/site-packages/pydicom/data/test_files/CT_small.dcm ~/Downloads/test_dicom/
```
3. Starten Sie die App und wählen Sie den Test-Ordner
**Erwartetes Verhalten:**
- App findet DICOM-Dateien
- Fortschrittsanzeige wird angezeigt
- Dateien werden in Transfer-Ordner kopiert
### Test 3: Patientendaten-Vergleich
Die App vergleicht Patientendaten aus den DICOM-Dateien mit den übergebenen Argumenten.
**Erwartetes Verhalten:**
- Wenn Daten übereinstimmen: Kein Dialog
- Wenn Daten abweichen: Dialog mit Vergleichsanzeige
- Benutzer kann wählen: Tomedo-Daten oder Original-Daten
### Test 4: Server-Verfügbarkeit
Die App prüft, ob der PACS-Server erreichbar ist.
**Erwartetes Verhalten:**
- Server erreichbar: Upload startet
- Server nicht erreichbar: Meldung "PACS SERVER NICHT ERREICHBAR"
### Test 5: Upload (mit konfiguriertem Server)
Wenn ein PACS-Server konfiguriert ist, werden Dateien hochgeladen.
**Konfiguration prüfen:**
```bash
cat ~/.dicom2pacs.conf
```
**Erwartetes Verhalten:**
- Fortschrittsanzeige während Upload
- Erfolgsmeldung nach Upload
- Transfer-Ordner wird gelöscht
## Test-Daten vorbereiten
### Automatisch (empfohlen)
Das Bash-Testskript erledigt dies automatisch:
```bash
./test_dicom2pacs.sh
```
### Manuell
1. **Test-Ordner erstellen:**
```bash
mkdir -p ~/Downloads/test_dicom
```
2. **DICOM-Dateien kopieren:**
```bash
# Option A: Von gebauter App
cp dist/dicom2pacs.app/Contents/Resources/lib/python3.13/pydicom/data/test_files/*.dcm ~/Downloads/test_dicom/
# Option B: Von venv
cp venv/lib/python3.13/site-packages/pydicom/data/test_files/*.dcm ~/Downloads/test_dicom/
```
3. **App starten:**
```bash
source venv/bin/activate
python dicom2pacs.py "Mustermann" "Max" "19800101" "12345"
```
## Häufige Probleme
### Problem: "Keine DICOM-Dateien gefunden"
**Lösung:**
- Stellen Sie sicher, dass der Test-Ordner DICOM-Dateien enthält
- Prüfen Sie, ob Dateien die Endung `.dcm` haben oder keine Endung
- Verwenden Sie `test_dicom2pacs.sh` Option 1, um Dateien automatisch zu kopieren
### Problem: "PACS SERVER NICHT ERREICHBAR"
**Lösung:**
- Normal, wenn kein Server konfiguriert ist
- Für vollständigen Test: Orthanc-Server einrichten
- Konfiguration in `~/.dicom2pacs.conf` prüfen
### Problem: "ModuleNotFoundError"
**Lösung:**
```bash
source venv/bin/activate
pip install pydicom aiohttp aiofiles tqdm
```
### Problem: GUI öffnet sich nicht
**Lösung:**
- Prüfen Sie die Konsole auf Fehlermeldungen
- Stellen Sie sicher, dass tkinter installiert ist:
```bash
python3 -m tkinter
```
## Aufräumen nach Tests
```bash
# Manuell
rm -rf ~/Downloads/test_dicom
rm -rf ~/Downloads/D2OTrans
# Oder mit Testskript
./test_dicom2pacs.sh
# Option 4 wählen
```
## Test-Zusammenfassung
Nach Ausführung von `test_dicom2pacs.py` erhalten Sie eine Zusammenfassung:
```
=== dicom2pacs Automatisierte Tests ===
Teste Imports...
✓ Alle Module erfolgreich importiert
Teste DICOM-Datei-Erkennung...
✓ DICOM-Datei erkannt: CT_small.dcm -> True
...
==================================================
Test-Zusammenfassung:
==================================================
✓ PASS: Imports
✓ PASS: DICOM-Datei-Erkennung
✓ PASS: Dateiverwaltung
...
==================================================
Ergebnis: 6/6 Tests bestanden
🎉 Alle Tests bestanden!
```
## Nächste Schritte
Nach erfolgreichen Tests können Sie:
1. Die App mit echten DICOM-Dateien testen
2. Einen PACS-Server konfigurieren für Upload-Tests
3. Die App in Produktion einsetzen
Viel Erfolg beim Testen! 🚀

View File

@@ -157,7 +157,10 @@ async def vergleich_target_source(transfer_folder, gui, name, vorname, geburtsda
elif response is False:
print("Benutzer hat Nein gewählt - Bestätigungsdialog wird angezeigt")
# Zeige Bestätigungsdialog, ob wirklich Original-Daten behalten werden sollen
confirm_response = gui.show_confirm_keep_original_dialog()
# Übergebe die vollständigen Daten aus dem vorherigen Dialog
tomedo_data_full = f"{name}, {vorname}, * {geburtsdatum_formatted}"
original_data_full = f"{name_source}, {vorname_source}, * {geburtsdatum_source_formatted}"
confirm_response = gui.show_confirm_keep_original_dialog(tomedo_data_full, original_data_full)
if confirm_response is True:
# Benutzer hat sich umentschieden - Tomedo-Daten verwenden
print("Benutzer hat sich umentschieden - Tomedo-Daten werden übernommen")

8
gui.py
View File

@@ -472,8 +472,8 @@ class ConfirmKeepOriginalDialog(tk.Toplevel):
self.transfer_folder = transfer_folder
self.title("Bestätigung")
self.geometry("750x480")
self.minsize(700, 450)
self.geometry("750x600") # Größeres Fenster für vollständige Datenanzeige
self.minsize(750, 600) # Minimale Größe erhöht
main_frame = tk.Frame(self)
main_frame.pack(fill=tk.BOTH, expand=True, padx=40, pady=30)
@@ -493,7 +493,7 @@ class ConfirmKeepOriginalDialog(tk.Toplevel):
font=bold_font, fg='#cc6600')
warning_label.pack(pady=(0, 20))
# Tomedo-Daten - in einem Frame mit Hintergrund
# Erwartete Daten (Tomedo) - in einem Frame mit Hintergrund (wie im ersten Dialog)
tomedo_frame = tk.Frame(main_frame, bg='#ffffff', relief=tk.SUNKEN, bd=1)
tomedo_frame.pack(fill=tk.X, pady=(0, 20))
@@ -507,7 +507,7 @@ class ConfirmKeepOriginalDialog(tk.Toplevel):
bg='#ffffff', fg='#000000', anchor="w")
tomedo_label.pack(pady=(0, 0), fill=tk.X)
# Original-Daten - in einem Frame mit Hintergrund
# Gefundene Daten (DICOM) - in einem Frame mit Hintergrund (wie im ersten Dialog)
original_frame = tk.Frame(main_frame, bg='#ffffff', relief=tk.SUNKEN, bd=1)
original_frame.pack(fill=tk.X, pady=(0, 25))

200
test_dicom2pacs.py Executable file
View File

@@ -0,0 +1,200 @@
#!/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
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
def test_imports():
"""Test ob alle Module importiert werden können"""
print("Teste Imports...")
try:
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}")
return False
def test_dicom_file_detection():
"""Test DICOM-Datei-Erkennung"""
print("\nTeste DICOM-Datei-Erkennung...")
try:
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:
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:
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:
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 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),
]
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())

207
test_dicom2pacs.sh Executable file
View File

@@ -0,0 +1,207 @@
#!/bin/bash
# test_dicom2pacs.sh - Automatisiertes Testskript für dicom2pacs
set -e # Beende bei Fehlern
# Farben für Ausgabe
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo "=== dicom2pacs Test-Suite ==="
echo ""
# 1. Prüfe ob venv existiert
if [ ! -d "venv" ]; then
echo -e "${YELLOW}Warnung: venv nicht gefunden. Erstelle es...${NC}"
python3 -m venv venv
fi
# 2. Aktiviere venv
echo "Aktiviere virtuelles Environment..."
source venv/bin/activate
# 3. Prüfe ob pydicom installiert ist
if ! python3 -c "import pydicom" 2>/dev/null; then
echo "Installiere pydicom..."
pip install pydicom
fi
# 4. Erstelle Test-Ordner
TEST_DIR="$HOME/Downloads/test_dicom"
echo ""
echo "Erstelle Test-Ordner: $TEST_DIR"
mkdir -p "$TEST_DIR"
# 5. Kopiere Test-DICOM-Dateien
echo "Kopiere Test-DICOM-Dateien..."
# Prüfe ob gebaute App existiert
if [ -d "dist/dicom2pacs.app" ]; then
PYDICOM_PATH="dist/dicom2pacs.app/Contents/Resources/lib/python3.13/pydicom/data/test_files"
if [ -d "$PYDICOM_PATH" ]; then
cp "$PYDICOM_PATH/CT_small.dcm" "$TEST_DIR/" 2>/dev/null || echo "CT_small.dcm nicht gefunden"
cp "$PYDICOM_PATH/MR_small.dcm" "$TEST_DIR/" 2>/dev/null || echo "MR_small.dcm nicht gefunden"
cp "$PYDICOM_PATH/image_dfl.dcm" "$TEST_DIR/" 2>/dev/null || echo "image_dfl.dcm nicht gefunden"
fi
fi
# Alternative: Prüfe ob pydicom im venv installiert ist
if [ -d "venv/lib/python3.13/site-packages/pydicom/data/test_files" ]; then
PYDICOM_VENV_PATH="venv/lib/python3.13/site-packages/pydicom/data/test_files"
cp "$PYDICOM_VENV_PATH/CT_small.dcm" "$TEST_DIR/" 2>/dev/null || true
cp "$PYDICOM_VENV_PATH/MR_small.dcm" "$TEST_DIR/" 2>/dev/null || true
cp "$PYDICOM_VENV_PATH/image_dfl.dcm" "$TEST_DIR/" 2>/dev/null || true
fi
# Prüfe ob Dateien kopiert wurden
DICOM_COUNT=$(find "$TEST_DIR" -name "*.dcm" 2>/dev/null | wc -l | tr -d ' ')
if [ "$DICOM_COUNT" -eq 0 ]; then
echo -e "${RED}FEHLER: Keine DICOM-Testdateien gefunden!${NC}"
echo "Bitte manuell DICOM-Dateien nach $TEST_DIR kopieren"
exit 1
fi
echo -e "${GREEN}$DICOM_COUNT DICOM-Dateien gefunden${NC}"
# 6. Prüfe Konfiguration
echo ""
echo "Prüfe Konfiguration..."
CONFIG_FILE="$HOME/.dicom2pacs.conf"
if [ ! -f "$CONFIG_FILE" ]; then
echo -e "${YELLOW}Konfigurationsdatei nicht gefunden. Wird beim ersten Start erstellt.${NC}"
else
echo -e "${GREEN}✓ Konfigurationsdatei gefunden${NC}"
cat "$CONFIG_FILE"
fi
# 7. Test-Parameter
TEST_NAME="Mustermann"
TEST_VORNAME="Max"
TEST_GEBURTSDATUM="19800101"
TEST_PATIENTEN_ID="TEST12345"
echo ""
echo "=== Test-Parameter ==="
echo "Name: $TEST_NAME"
echo "Vorname: $TEST_VORNAME"
echo "Geburtsdatum: $TEST_GEBURTSDATUM"
echo "Patienten-ID: $TEST_PATIENTEN_ID"
echo "Test-Ordner: $TEST_DIR"
echo ""
# 8. Prüfe ob App existiert
if [ ! -f "dicom2pacs.py" ]; then
echo -e "${RED}FEHLER: dicom2pacs.py nicht gefunden!${NC}"
exit 1
fi
# 9. Test-Menü
echo "=== Test-Menü ==="
echo "1. GUI-Test (manuell - App öffnet sich)"
echo "2. Unit-Test (prüft Module ohne GUI)"
echo "3. Integrationstest (vollständiger Test)"
echo "4. Aufräumen (löscht Test-Ordner)"
echo ""
read -p "Wählen Sie eine Option (1-4): " choice
case $choice in
1)
echo ""
echo -e "${GREEN}Starte GUI-Test...${NC}"
echo "Die App öffnet sich jetzt."
echo "Bitte wählen Sie den Ordner: $TEST_DIR"
echo ""
python dicom2pacs.py "$TEST_NAME" "$TEST_VORNAME" "$TEST_GEBURTSDATUM" "$TEST_PATIENTEN_ID"
;;
2)
echo ""
echo -e "${GREEN}Starte Unit-Tests...${NC}"
python3 << 'EOF'
import sys
import os
sys.path.insert(0, os.getcwd())
print("Teste dicom_processing...")
try:
import dicom_processing
print("✓ dicom_processing importiert")
# Test is_dicom_file
test_file = os.path.expanduser("~/Downloads/test_dicom/CT_small.dcm")
if os.path.exists(test_file):
result = dicom_processing.is_dicom_file(test_file)
print(f"✓ is_dicom_file: {result}")
else:
print("⚠ Test-Datei nicht gefunden")
except Exception as e:
print(f"✗ Fehler: {e}")
print("\nTeste file_management...")
try:
import file_management
print("✓ file_management importiert")
test_dir = os.path.expanduser("~/Downloads/test_dicom")
if os.path.exists(test_dir):
files = file_management.find_dicom_files(test_dir)
if files != 'non_found':
dicom_files, count = files
print(f"✓ find_dicom_files: {count} Dateien gefunden")
else:
print("⚠ Keine DICOM-Dateien gefunden")
else:
print("⚠ Test-Ordner nicht gefunden")
except Exception as e:
print(f"✗ Fehler: {e}")
print("\nTeste network_utils...")
try:
import network_utils
print("✓ network_utils importiert")
except Exception as e:
print(f"✗ Fehler: {e}")
print("\n✓ Unit-Tests abgeschlossen")
EOF
;;
3)
echo ""
echo -e "${GREEN}Starte Integrationstest...${NC}"
echo "Dieser Test führt die App im Hintergrund aus."
echo "Bitte beachten Sie, dass die GUI geöffnet wird."
echo ""
read -p "Fortfahren? (j/n): " confirm
if [ "$confirm" = "j" ] || [ "$confirm" = "J" ]; then
python dicom2pacs.py "$TEST_NAME" "$TEST_VORNAME" "$TEST_GEBURTSDATUM" "$TEST_PATIENTEN_ID" &
echo "App gestartet. PID: $!"
echo "Bitte testen Sie die App manuell."
fi
;;
4)
echo ""
echo -e "${YELLOW}Lösche Test-Ordner...${NC}"
if [ -d "$TEST_DIR" ]; then
rm -rf "$TEST_DIR"
echo -e "${GREEN}✓ Test-Ordner gelöscht${NC}"
else
echo "Test-Ordner existiert nicht"
fi
# Lösche auch Transfer-Ordner falls vorhanden
TRANSFER_DIR="$HOME/Downloads/D2OTrans"
if [ -d "$TRANSFER_DIR" ]; then
echo "Lösche Transfer-Ordner..."
rm -rf "$TRANSFER_DIR"
echo -e "${GREEN}✓ Transfer-Ordner gelöscht${NC}"
fi
;;
*)
echo -e "${RED}Ungültige Option${NC}"
exit 1
;;
esac
echo ""
echo -e "${GREEN}=== Test abgeschlossen ===${NC}"