Compare commits
19 Commits
0fef8d96c5
...
lauffähig
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc0db8496b | ||
|
|
b7730d908c | ||
|
|
bc67232628 | ||
|
|
acaaba7758 | ||
|
|
ccc764f198 | ||
|
|
aa12d099ae | ||
|
|
ccf6717e92 | ||
|
|
a2ea61e0f3 | ||
|
|
b8d90481bc | ||
|
|
2b4be16317 | ||
|
|
5d76c6b020 | ||
|
|
02dfb69121 | ||
|
|
5b29837120 | ||
|
|
c086cbd8e1 | ||
|
|
1f265c0e3c | ||
|
|
174521cd0e | ||
|
|
18b0e4c254 | ||
|
|
fab2c04d07 | ||
|
|
ff2bc82994 |
228
README_TESTS.md
Normal file
228
README_TESTS.md
Normal 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! 🚀
|
||||
@@ -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")
|
||||
|
||||
154
gui.py
154
gui.py
@@ -6,6 +6,35 @@ import os
|
||||
from queue import Queue
|
||||
import subprocess
|
||||
|
||||
# Style einmalig konfigurieren (wird beim ersten Import ausgeführt)
|
||||
_style_configured = False
|
||||
|
||||
def create_macos_button(parent, text, command=None, width=None, height=None, padx=10, pady=5, default=False):
|
||||
"""Erstellt einen Button im nativen macOS-Stil (Aqua Theme)"""
|
||||
global _style_configured
|
||||
# Style nur einmal konfigurieren
|
||||
if not _style_configured:
|
||||
style = ttk.Style()
|
||||
# Verwende das native macOS Aqua Theme
|
||||
try:
|
||||
style.theme_use('aqua') # macOS natives Theme
|
||||
except:
|
||||
pass # Falls aqua nicht verfügbar ist, verwende Standard
|
||||
# Konfiguriere Button-Style für natives macOS-Aussehen
|
||||
style.configure('TButton', font=('Helvetica', 13), padding=(10, 6))
|
||||
_style_configured = True
|
||||
|
||||
# Verwende ttk.Button für natives macOS-Aussehen
|
||||
# Das Aqua Theme stellt primäre Buttons automatisch blau dar
|
||||
btn = ttk.Button(parent, text=text, command=command)
|
||||
if width:
|
||||
btn.config(width=width)
|
||||
|
||||
# Auf macOS werden Buttons automatisch im nativen Stil dargestellt
|
||||
# Primäre Buttons erscheinen blau, sekundäre grau
|
||||
|
||||
return btn
|
||||
|
||||
class SettingsDialog:
|
||||
def __init__(self, parent, config):
|
||||
self.config = config
|
||||
@@ -37,8 +66,9 @@ class SettingsDialog:
|
||||
|
||||
self.load_config() # Laden der aktuellen Konfiguration
|
||||
|
||||
# Speichern-Button
|
||||
Button(self.top, text="Speichern", command=self.save_config).grid(row=4, column=1, pady=10)
|
||||
# Speichern-Button (macOS-Style) - primärer Button (blau)
|
||||
save_btn = create_macos_button(self.top, text="Speichern", command=self.save_config, width=16, default=True)
|
||||
save_btn.grid(row=4, column=1, pady=12, padx=5)
|
||||
|
||||
def toggle_password_visibility(self):
|
||||
"""Wechselt die Sichtbarkeit des Passworteingabefelds."""
|
||||
@@ -97,8 +127,8 @@ class GUI:
|
||||
self.bind_shortcuts()
|
||||
|
||||
# Fenstergröße und -position festlegen
|
||||
window_width = 350
|
||||
window_height = 150
|
||||
window_width = 420
|
||||
window_height = 180
|
||||
screen_width = self.root.winfo_screenwidth()
|
||||
screen_height = self.root.winfo_screenheight()
|
||||
center_x = int(screen_width / 2 - window_width / 2)
|
||||
@@ -111,17 +141,18 @@ class GUI:
|
||||
|
||||
# Frame für die Buttons am unteren Rand des Fensters
|
||||
self.button_frame = tk.Frame(self.root)
|
||||
self.button_frame.pack(side=tk.BOTTOM, fill=tk.X, pady=10)
|
||||
self.button_frame.pack(side=tk.BOTTOM, fill=tk.X, pady=12)
|
||||
|
||||
# Durchsuchen Button
|
||||
self.browse_button = tk.Button(self.button_frame, text="Durchsuchen", command=self.browse)
|
||||
self.browse_button.pack(side=tk.LEFT, padx=10, expand=True)
|
||||
# Durchsuchen Button (macOS-Style) - primärer Standard-Button (blau)
|
||||
self.browse_button = create_macos_button(self.button_frame, text="Durchsuchen", command=self.browse, width=14, default=True)
|
||||
self.browse_button.pack(side=tk.LEFT, padx=12, expand=True, pady=4)
|
||||
|
||||
# Schließen Button
|
||||
self.close_button = tk.Button(self.button_frame, text="Abbruch", command=self.on_app_close)
|
||||
self.close_button.pack(side=tk.RIGHT, padx=10, expand=True)
|
||||
# Schließen Button (macOS-Style) - sekundärer Button (grau)
|
||||
self.close_button = create_macos_button(self.button_frame, text="Abbruch", command=self.on_app_close, width=14)
|
||||
self.close_button.pack(side=tk.RIGHT, padx=12, expand=True, pady=4)
|
||||
|
||||
self.hint_label = tk.Label(self.root, text="Bitte wählen Sie den Ordner mit den Bilddaten aus!")
|
||||
# Hinweis-Label mit angepasster Schriftgröße (wie Buttons: 13pt)
|
||||
self.hint_label = tk.Label(self.root, text="Bitte wählen Sie den Ordner mit den Bilddaten aus!", font=('Helvetica', 13))
|
||||
self.hint_label.pack(pady=5) # Pady hinzugefügt für etwas Abstand nach oben und unten
|
||||
|
||||
self.root.protocol("WM_DELETE_WINDOW", self.on_close)
|
||||
@@ -335,8 +366,8 @@ class JaAbbruchDialog(tk.Toplevel):
|
||||
self.transfer_folder = transfer_folder
|
||||
|
||||
self.title(title)
|
||||
self.geometry("750x480") # Noch größeres Fenster
|
||||
self.minsize(700, 450) # Minimale Größe setzen
|
||||
self.geometry("950x520") # Größeres Fenster für bessere Lesbarkeit und passende Proportionen
|
||||
self.minsize(900, 500) # Minimale Größe angepasst
|
||||
|
||||
# Hauptframe für besseres Layout
|
||||
main_frame = tk.Frame(self)
|
||||
@@ -361,7 +392,7 @@ class JaAbbruchDialog(tk.Toplevel):
|
||||
tk.Label(expected_inner, text="Erwartete Daten (Tomedo):", font=italic_font,
|
||||
bg='#ffffff', fg='#0066cc', anchor="w").pack(pady=(0, 8), fill=tk.X)
|
||||
expected_label = tk.Label(expected_inner, text=message.split('\n\n')[0],
|
||||
font=normal_font, justify=tk.LEFT, wraplength=650,
|
||||
font=normal_font, justify=tk.LEFT, wraplength=800,
|
||||
bg='#ffffff', fg='#000000', anchor="w")
|
||||
expected_label.pack(pady=(0, 0), fill=tk.X)
|
||||
|
||||
@@ -375,32 +406,35 @@ class JaAbbruchDialog(tk.Toplevel):
|
||||
tk.Label(found_inner, text="Gefundene Daten (DICOM):", font=italic_font,
|
||||
bg='#ffffff', fg='#cc6600', anchor="w").pack(pady=(0, 8), fill=tk.X)
|
||||
found_label = tk.Label(found_inner, text=message.split('\n\n')[1],
|
||||
font=normal_font, justify=tk.LEFT, wraplength=650,
|
||||
font=normal_font, justify=tk.LEFT, wraplength=800,
|
||||
bg='#ffffff', fg='#000000', anchor="w")
|
||||
found_label.pack(pady=(0, 0), fill=tk.X)
|
||||
|
||||
# Frage
|
||||
question_label = tk.Label(main_frame,
|
||||
text="Welche Daten sollen verwendet werden?",
|
||||
font=bold_font, wraplength=650)
|
||||
font=bold_font, wraplength=800)
|
||||
question_label.pack(pady=(0, 25))
|
||||
|
||||
# Button-Frame mit besserem Layout - Standard macOS Buttons
|
||||
btn_frame = tk.Frame(main_frame)
|
||||
btn_frame.pack(pady=15)
|
||||
btn_frame.pack(pady=18)
|
||||
|
||||
# Standard macOS Buttons (ohne spezielle Farben) - größer
|
||||
yes_btn = tk.Button(btn_frame, text="Tomedo-Daten übernehmen",
|
||||
command=self.on_yes, width=25, height=2)
|
||||
yes_btn.pack(side=tk.LEFT, padx=10)
|
||||
# Standard macOS Buttons (ttk.Button für besseres macOS-Aussehen)
|
||||
# Primärer Button (blau) - empfohlene Aktion
|
||||
yes_btn = create_macos_button(btn_frame, text="Tomedo-Daten übernehmen",
|
||||
command=self.on_yes, width=28, default=True)
|
||||
yes_btn.pack(side=tk.LEFT, padx=10, pady=6)
|
||||
|
||||
no_btn = tk.Button(btn_frame, text="Original-Daten behalten",
|
||||
command=self.on_no, width=25, height=2)
|
||||
no_btn.pack(side=tk.LEFT, padx=10)
|
||||
# Sekundärer Button (grau)
|
||||
no_btn = create_macos_button(btn_frame, text="Original-Daten behalten",
|
||||
command=self.on_no, width=28)
|
||||
no_btn.pack(side=tk.LEFT, padx=10, pady=6)
|
||||
|
||||
cancel_btn = tk.Button(btn_frame, text="Abbruch",
|
||||
command=self.on_cancel, width=18, height=2)
|
||||
cancel_btn.pack(side=tk.LEFT, padx=10)
|
||||
# Sekundärer Button (grau)
|
||||
cancel_btn = create_macos_button(btn_frame, text="Abbruch",
|
||||
command=self.on_cancel, width=20)
|
||||
cancel_btn.pack(side=tk.LEFT, padx=10, pady=6)
|
||||
|
||||
self.center_window()
|
||||
|
||||
@@ -472,8 +506,8 @@ class ConfirmKeepOriginalDialog(tk.Toplevel):
|
||||
self.transfer_folder = transfer_folder
|
||||
|
||||
self.title("Bestätigung")
|
||||
self.geometry("750x480")
|
||||
self.minsize(700, 450)
|
||||
self.geometry("1000x680") # Größeres Fenster für vollständige Datenanzeige und bessere Lesbarkeit
|
||||
self.minsize(950, 650) # Minimale Größe erhöht
|
||||
|
||||
main_frame = tk.Frame(self)
|
||||
main_frame.pack(fill=tk.BOTH, expand=True, padx=40, pady=30)
|
||||
@@ -493,7 +527,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))
|
||||
|
||||
@@ -503,11 +537,11 @@ class ConfirmKeepOriginalDialog(tk.Toplevel):
|
||||
tk.Label(tomedo_inner, text="Erwartete Daten (Tomedo):", font=italic_font,
|
||||
bg='#ffffff', fg='#0066cc', anchor="w").pack(pady=(0, 8), fill=tk.X)
|
||||
tomedo_label = tk.Label(tomedo_inner, text=tomedo_data,
|
||||
font=normal_font, justify=tk.LEFT, wraplength=650,
|
||||
font=normal_font, justify=tk.LEFT, wraplength=800,
|
||||
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))
|
||||
|
||||
@@ -517,37 +551,40 @@ class ConfirmKeepOriginalDialog(tk.Toplevel):
|
||||
tk.Label(original_inner, text="Gefundene Daten (DICOM):", font=italic_font,
|
||||
bg='#ffffff', fg='#cc6600', anchor="w").pack(pady=(0, 8), fill=tk.X)
|
||||
original_label = tk.Label(original_inner, text=original_data,
|
||||
font=normal_font, justify=tk.LEFT, wraplength=650,
|
||||
font=normal_font, justify=tk.LEFT, wraplength=800,
|
||||
bg='#ffffff', fg='#000000', anchor="w")
|
||||
original_label.pack(pady=(0, 0), fill=tk.X)
|
||||
|
||||
# Frage
|
||||
question_label = tk.Label(main_frame,
|
||||
text="Sind Sie sicher, dass Sie die Original-Daten behalten möchten?",
|
||||
font=bold_font, wraplength=650, justify=tk.CENTER)
|
||||
font=bold_font, wraplength=800, justify=tk.CENTER)
|
||||
question_label.pack(pady=(0, 10))
|
||||
|
||||
info_label = tk.Label(main_frame,
|
||||
text="Die Tomedo-Daten sind der Standard und sollten normalerweise verwendet werden.",
|
||||
font=normal_font, wraplength=650, justify=tk.CENTER, fg='#666666')
|
||||
font=normal_font, wraplength=800, justify=tk.CENTER, fg='#666666')
|
||||
info_label.pack(pady=(0, 20))
|
||||
|
||||
# Button-Frame
|
||||
btn_frame = tk.Frame(main_frame)
|
||||
btn_frame.pack(pady=10)
|
||||
btn_frame.pack(pady=12)
|
||||
|
||||
# Buttons
|
||||
tomedo_btn = tk.Button(btn_frame, text="Tomedo-Daten verwenden",
|
||||
command=self.on_use_tomedo, width=22, height=2)
|
||||
tomedo_btn.pack(side=tk.LEFT, padx=8)
|
||||
# Buttons (macOS-Style) - breiter für bessere Textlesbarkeit
|
||||
# Primärer Button (blau) - empfohlene Aktion
|
||||
tomedo_btn = create_macos_button(btn_frame, text="Tomedo-Daten verwenden",
|
||||
command=self.on_use_tomedo, width=32, default=True)
|
||||
tomedo_btn.pack(side=tk.LEFT, padx=8, pady=6)
|
||||
|
||||
keep_btn = tk.Button(btn_frame, text="Original behalten",
|
||||
command=self.on_keep_original, width=18, height=2)
|
||||
keep_btn.pack(side=tk.LEFT, padx=8)
|
||||
# Sekundärer Button (grau)
|
||||
keep_btn = create_macos_button(btn_frame, text="Original behalten",
|
||||
command=self.on_keep_original, width=26)
|
||||
keep_btn.pack(side=tk.LEFT, padx=8, pady=6)
|
||||
|
||||
cancel_btn = tk.Button(btn_frame, text="Abbruch",
|
||||
command=self.on_cancel, width=15, height=2)
|
||||
cancel_btn.pack(side=tk.LEFT, padx=8)
|
||||
# Sekundärer Button (grau)
|
||||
cancel_btn = create_macos_button(btn_frame, text="Abbruch",
|
||||
command=self.on_cancel, width=20)
|
||||
cancel_btn.pack(side=tk.LEFT, padx=8, pady=6)
|
||||
|
||||
self.center_window()
|
||||
|
||||
@@ -615,20 +652,25 @@ class JaNeinAbbruchDialog(tk.Toplevel):
|
||||
|
||||
self.title(title)
|
||||
|
||||
self.geometry("400x175") # Größe des Dialogs
|
||||
tk.Label(self, text=self.message).pack(pady=20)
|
||||
self.geometry("480x190") # Kompakteres Fenster für bessere Lesbarkeit
|
||||
self.minsize(450, 170) # Minimale Größe
|
||||
tk.Label(self, text=self.message, font=('Helvetica', 13), wraplength=420).pack(pady=20)
|
||||
|
||||
btn_frame = tk.Frame(self)
|
||||
btn_frame.pack(pady=10)
|
||||
btn_frame.pack(pady=12)
|
||||
|
||||
ja_btn = tk.Button(btn_frame, text="Ja", command=self.on_ja)
|
||||
ja_btn.pack(side=tk.LEFT, padx=10, pady=20)
|
||||
# Buttons (macOS-Style) - minimale Breiten für bessere Lesbarkeit
|
||||
# Primärer Button (blau) - Ja ist die primäre Aktion
|
||||
ja_btn = create_macos_button(btn_frame, text="Ja", command=self.on_ja, width=8, default=True)
|
||||
ja_btn.pack(side=tk.LEFT, padx=8, pady=5)
|
||||
|
||||
nein_btn = tk.Button(btn_frame, text="Nein", command=self.on_nein)
|
||||
nein_btn.pack(side=tk.LEFT, padx=10, pady=20)
|
||||
# Sekundärer Button (grau)
|
||||
nein_btn = create_macos_button(btn_frame, text="Nein", command=self.on_nein, width=8)
|
||||
nein_btn.pack(side=tk.LEFT, padx=8, pady=5)
|
||||
|
||||
abbruch_btn = tk.Button(btn_frame, text="Abbruch", command=self.on_abbruch)
|
||||
abbruch_btn.pack(side=tk.LEFT, padx=10, pady=20)
|
||||
# Sekundärer Button (grau)
|
||||
abbruch_btn = create_macos_button(btn_frame, text="Abbruch", command=self.on_abbruch, width=10)
|
||||
abbruch_btn.pack(side=tk.LEFT, padx=8, pady=5)
|
||||
|
||||
self.center_window()
|
||||
|
||||
|
||||
14
run_tests.sh
Executable file
14
run_tests.sh
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
# run_tests.sh - Führt die Python-Tests mit aktiviertem venv aus
|
||||
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
# Aktiviere venv
|
||||
if [ -d "venv" ]; then
|
||||
source venv/bin/activate
|
||||
python3 test_dicom2pacs.py
|
||||
else
|
||||
echo "FEHLER: venv nicht gefunden!"
|
||||
echo "Bitte erstellen Sie ein venv: python3 -m venv venv"
|
||||
exit 1
|
||||
fi
|
||||
339
test_dicom2pacs.py
Executable file
339
test_dicom2pacs.py
Executable file
@@ -0,0 +1,339 @@
|
||||
#!/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())
|
||||
207
test_dicom2pacs.sh
Executable file
207
test_dicom2pacs.sh
Executable 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}"
|
||||
Reference in New Issue
Block a user