Files
darktable-sync/tests/darktable_wrapper.bats
T
martin 6a6ce52cf9 Robuste Darktable-Synchronisation: sequenzieller Ablauf, Versions- und Concurrent-Schutz
- Race Condition behoben: Pre-Sync wird vollstaendig abgewartet bevor Darktable startet
- Post-Sync nach Schliessen von Darktable eingefuehrt (bisher fehlend)
- .env aus festem Pfad ~/.config/darktable-sync/.env geladen (nicht mehr relativ)
- Server-Erreichbarkeit per SSH statt ping (Firewall-sicher)
- Darktable-Versionscheck (Major.Minor) vor Download mit Abbruch bei Konflikt
- DB-Backup vor jedem Download (library.db.bak, data.db.bak)
- sync_pending-Marker bei Offline/Fehler, Hinweis beim naechsten Start
- darktable.active-Marker auf Server fuer Concurrent-Erkennung
- Lock-Dateien vom Sync ausgeschlossen
- systemd-Timer entfernt, Service bleibt als manueller Trigger
- Gemeinsame Hilfsfunktionen in darktable_common.sh extrahiert
- 20 BATS-Tests mit vollstaendigem Stub-System ohne GUI-Dialoge

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-19 19:41:26 +02:00

79 lines
2.4 KiB
Bash

#!/usr/bin/env bats
load helpers/setup
WRAPPER_SCRIPT="$BATS_TEST_DIRNAME/../scripts/darktable_wrapper.sh"
setup() {
create_valid_env
mkdir -p "$HOME/.local/bin"
# Sync-Stub: tut nichts
cat > "$HOME/.local/bin/darktable_sync.sh" <<'EOF'
#!/bin/bash
exit 0
EOF
chmod +x "$HOME/.local/bin/darktable_sync.sh"
# Lokale Stubs in einem eigenen Verzeichnis pro Test (kein Überschreiben der globalen Stubs)
LOCAL_STUBS="$BATS_TMPDIR/stubs"
mkdir -p "$LOCAL_STUBS"
export LOCAL_STUBS
# Alle Stubs kopieren (verhindert echte Dialoge und GUI-Aufrufe)
cp "$BATS_TEST_DIRNAME/stubs/ssh" "$LOCAL_STUBS/ssh"
cp "$BATS_TEST_DIRNAME/stubs/notify-send" "$LOCAL_STUBS/notify-send"
cp "$BATS_TEST_DIRNAME/stubs/darktable" "$LOCAL_STUBS/darktable"
cp "$BATS_TEST_DIRNAME/stubs/pgrep" "$LOCAL_STUBS/pgrep"
cp "$BATS_TEST_DIRNAME/stubs/zenity" "$LOCAL_STUBS/zenity"
cp "$BATS_TEST_DIRNAME/stubs/kdialog" "$LOCAL_STUBS/kdialog"
chmod +x "$LOCAL_STUBS/"*
export DISPLAY=:99
}
@test "Server nicht erreichbar + Dialog abgelehnt: kein Darktable-Start, Exit 0" {
run env PATH="$LOCAL_STUBS:$PATH" SSH_STUB_FAIL=1 \
bash -c "echo 'n' | bash '$WRAPPER_SCRIPT'"
[ "$status" -eq 0 ]
}
@test "Server nicht erreichbar + Dialog bestaetigt: Darktable startet" {
STARTED_FILE="$BATS_TMPDIR/darktable_started"
cat > "$LOCAL_STUBS/darktable" <<EOF
#!/bin/bash
if [[ "\${1:-}" == "--version" ]]; then echo "this is darktable 5.0.1"; exit 0; fi
touch "$STARTED_FILE"
exit 0
EOF
chmod +x "$LOCAL_STUBS/darktable"
run env PATH="$LOCAL_STUBS:$PATH" SSH_STUB_FAIL=1 \
bash -c "echo 'j' | bash '$WRAPPER_SCRIPT'"
[ -f "$STARTED_FILE" ]
}
@test "Post-Sync schlaegt fehl: sync_pending gesetzt" {
SSH_CALL_COUNT="$BATS_TMPDIR/ssh_call_count"
echo "0" > "$SSH_CALL_COUNT"
cat > "$LOCAL_STUBS/ssh" <<EOF
#!/bin/bash
count=\$(cat "$SSH_CALL_COUNT")
count=\$((count + 1))
echo "\$count" > "$SSH_CALL_COUNT"
# Ab Aufruf 3 fehlschlagen (Post-Sync-Erreichbarkeitstest)
if [ "\$count" -ge 3 ]; then exit 1; fi
exit 0
EOF
chmod +x "$LOCAL_STUBS/ssh"
run env PATH="$LOCAL_STUBS:$PATH" SSH_STUB_FAIL=0 bash "$WRAPPER_SCRIPT"
[ -f "$CONFIG_DIR/sync_pending" ]
}
@test "Darktable laeuft bereits: Abbruch mit Exit 1" {
run env PATH="$LOCAL_STUBS:$PATH" PGREP_STUB_FOUND=1 bash "$WRAPPER_SCRIPT"
[ "$status" -eq 1 ]
}