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>
This commit is contained in:
2026-04-19 19:41:26 +02:00
parent 3bdd26ed81
commit 6a6ce52cf9
21 changed files with 777 additions and 201 deletions
+77
View File
@@ -0,0 +1,77 @@
#!/usr/bin/env bats
load helpers/setup
COMMON_SCRIPT="$BATS_TEST_DIRNAME/../scripts/darktable_common.sh"
@test "check_dependency schlaegt fehl wenn Tool fehlt" {
run bash -c "source '$COMMON_SCRIPT'; check_dependency nicht_existierendes_tool"
[ "$status" -eq 1 ]
[[ "$output" == *"nicht_existierendes_tool"* ]]
[[ "$output" == *"sudo apt install"* ]]
}
@test "check_dependency besteht wenn Tool vorhanden" {
run bash -c "source '$COMMON_SCRIPT'; check_dependency bash"
[ "$status" -eq 0 ]
}
@test "load_config schlaegt fehl wenn .env fehlt" {
rm -f "$CONFIG_DIR/.env"
run bash -c "source '$COMMON_SCRIPT'; load_config"
[ "$status" -eq 1 ]
[[ "$output" == *"nicht gefunden"* ]]
}
@test "load_config laedt .env erfolgreich" {
create_valid_env
run bash -c "source '$COMMON_SCRIPT'; load_config; echo \$SERVER_IP"
[ "$status" -eq 0 ]
[[ "$output" == *"192.168.1.100"* ]]
}
@test "validate_config schlaegt fehl wenn Variable leer" {
create_valid_env
echo "SERVER_IP=" >> "$CONFIG_DIR/.env"
run bash -c "source '$COMMON_SCRIPT'; load_config; validate_config"
[ "$status" -eq 1 ]
[[ "$output" == *"SERVER_IP"* ]]
}
@test "server_reachable gibt false zurueck wenn SSH fehlschlaegt" {
create_valid_env
run_with_stubs bash -c "
export SSH_STUB_FAIL=1
source '$COMMON_SCRIPT'
load_config
server_reachable
"
[ "$status" -eq 1 ]
}
@test "server_reachable gibt true zurueck wenn SSH erfolgreich" {
create_valid_env
run_with_stubs bash -c "
export SSH_STUB_FAIL=0
source '$COMMON_SCRIPT'
load_config
server_reachable
"
[ "$status" -eq 0 ]
}
@test "ask_user: j-Eingabe gibt Exit 0" {
TMP_SCRIPT=$(mktemp)
echo "source '$COMMON_SCRIPT'; ask_user 'Titel' 'Frage?'" > "$TMP_SCRIPT"
run bash -c "echo 'j' | env PATH='$STUBS_DIR:$PATH' bash '$TMP_SCRIPT'"
rm -f "$TMP_SCRIPT"
[ "$status" -eq 0 ]
}
@test "ask_user: n-Eingabe gibt Exit 1" {
TMP_SCRIPT=$(mktemp)
echo "source '$COMMON_SCRIPT'; ask_user 'Titel' 'Frage?'" > "$TMP_SCRIPT"
run bash -c "echo 'n' | env PATH='$STUBS_DIR:$PATH' bash '$TMP_SCRIPT'"
rm -f "$TMP_SCRIPT"
[ "$status" -eq 1 ]
}