#!/usr/bin/env bats load helpers/setup SYNC_SCRIPT="$BATS_TEST_DIRNAME/../scripts/darktable_sync.sh" setup() { create_valid_env mkdir -p "$HOME/.config/darktable" touch "$HOME/.config/darktable/library.db" touch "$HOME/.config/darktable/data.db" rm -f "$HOME/.config/darktable/"*.bak mkdir -p "$HOME/Pictures" touch "$HOME/Pictures/test.jpg" export DISPLAY=:99 } # --- Grundlegende Sync-Verhaltenstests --- @test "sync_pending wird gesetzt wenn Server nicht erreichbar" { run_with_stubs env SSH_STUB_FAIL=1 bash "$SYNC_SCRIPT" --execute [ "$status" -eq 0 ] [ -f "$CONFIG_DIR/sync_pending" ] } @test "sync_pending wird entfernt bei erfolgreichem Sync" { touch "$CONFIG_DIR/sync_pending" run_with_stubs env SSH_STUB_FAIL=0 bash "$SYNC_SCRIPT" --execute [ "$status" -eq 0 ] [ ! -f "$CONFIG_DIR/sync_pending" ] } @test "sync_pending wird gesetzt wenn unison fehlschlaegt" { run_with_stubs env SSH_STUB_FAIL=0 UNISON_STUB_FAIL=1 bash "$SYNC_SCRIPT" --execute [ "$status" -eq 1 ] [ -f "$CONFIG_DIR/sync_pending" ] } @test "DB-Backup wird vor Sync erstellt" { run_with_stubs env SSH_STUB_FAIL=0 bash "$SYNC_SCRIPT" --execute [ "$status" -eq 0 ] [ -f "$HOME/.config/darktable/library.db.bak" ] [ -f "$HOME/.config/darktable/data.db.bak" ] } @test "Versionskonflikt: gleiche Major.Minor gibt kein Exit 1" { run_with_stubs env SSH_STUB_FAIL=0 SSH_STUB_OUTPUT="this is darktable 5.0.1" \ DARKTABLE_STUB_VERSION="5.0.1" DRY_RUN_SKIP_CONFIRM=1 bash "$SYNC_SCRIPT" [ "$status" -eq 0 ] } @test "Versionskonflikt: andere Major.Minor gibt Exit 1" { run_with_stubs env SSH_STUB_FAIL=0 SSH_STUB_OUTPUT="this is darktable 4.8.0" \ DARKTABLE_STUB_VERSION="5.0.0" DRY_RUN_SKIP_CONFIRM=1 bash "$SYNC_SCRIPT" [ "$status" -eq 1 ] [ -f "$CONFIG_DIR/sync_pending" ] } @test "Lockdir wird nach Abschluss entfernt" { run_with_stubs env SSH_STUB_FAIL=0 bash "$SYNC_SCRIPT" --execute [ "$status" -eq 0 ] [ ! -d "$CONFIG_DIR/sync.lock" ] } # --- Dry-Run-Verhalten --- @test "Trockenlauf ist Standard ohne --execute" { run_with_stubs env SSH_STUB_FAIL=0 DRY_RUN_SKIP_CONFIRM=1 bash "$SYNC_SCRIPT" [ "$status" -eq 0 ] [[ "$output" == *"TROCKENLAUF"* ]] } @test "Trockenlauf erstellt kein Backup" { run_with_stubs env SSH_STUB_FAIL=0 DRY_RUN_SKIP_CONFIRM=1 bash "$SYNC_SCRIPT" [ "$status" -eq 0 ] [ ! -f "$HOME/.config/darktable/library.db.bak" ] [ ! -f "$HOME/.config/darktable/data.db.bak" ] } @test "Trockenlauf loescht sync_pending nicht" { touch "$CONFIG_DIR/sync_pending" run_with_stubs env SSH_STUB_FAIL=0 DRY_RUN_SKIP_CONFIRM=1 bash "$SYNC_SCRIPT" [ "$status" -eq 0 ] [ -f "$CONFIG_DIR/sync_pending" ] } @test "--execute fuehrt echten Sync durch und erstellt Backup" { run_with_stubs env SSH_STUB_FAIL=0 bash "$SYNC_SCRIPT" --execute [ "$status" -eq 0 ] [ -f "$HOME/.config/darktable/library.db.bak" ] } @test "-e ist Kurzform fuer --execute" { run_with_stubs env SSH_STUB_FAIL=0 bash "$SYNC_SCRIPT" -e [ "$status" -eq 0 ] [ -f "$HOME/.config/darktable/library.db.bak" ] } @test "Trockenlauf zeigt Ergebnis-Zusammenfassung" { run_with_stubs env SSH_STUB_FAIL=0 DRY_RUN_SKIP_CONFIRM=1 bash "$SYNC_SCRIPT" [ "$status" -eq 0 ] [[ "$output" == *"Trockenlauf-Ergebnis"* ]] [[ "$output" == *"Upload:"* ]] [[ "$output" == *"Download:"* ]] } @test "Trockenlauf zaehlt neue Dateien korrekt" { run_with_stubs env SSH_STUB_FAIL=0 DRY_RUN_SKIP_CONFIRM=1 \ UNISON_STUB_DRY_LINES="new file ----> foto.jpg" bash "$SYNC_SCRIPT" [ "$status" -eq 0 ] [[ "$output" == *"neu"* ]] } # --- Backup-Verhalten --- @test "Backup-Verzeichnisse werden bei echtem Sync angelegt" { run_with_stubs env SSH_STUB_FAIL=0 bash "$SYNC_SCRIPT" --execute [ "$status" -eq 0 ] [ -d "$HOME/Pictures-bak" ] [ -d "$HOME/.config/darktable-bak" ] } @test "Trockenlauf legt keine Backup-Verzeichnisse an" { run_with_stubs env SSH_STUB_FAIL=0 DRY_RUN_SKIP_CONFIRM=1 bash "$SYNC_SCRIPT" [ "$status" -eq 0 ] [ ! -d "$HOME/Pictures-bak" ] [ ! -d "$HOME/.config/darktable-bak" ] } @test "Upload bricht ab wenn Foto-Quellverzeichnis leer ist" { rm -f "$HOME/Pictures/"* run_with_stubs env SSH_STUB_FAIL=0 bash "$SYNC_SCRIPT" --execute [ "$status" -eq 1 ] [[ "$output" == *"leer"* ]] [ -f "$CONFIG_DIR/sync_pending" ] } @test "Trockenlauf-Ergebnis zeigt Backup-Hinweis bei Loeschungen" { run_with_stubs env SSH_STUB_FAIL=0 DRY_RUN_SKIP_CONFIRM=1 \ UNISON_STUB_DRY_LINES="<---- deleted foto.jpg" bash "$SYNC_SCRIPT" [ "$status" -eq 0 ] [[ "$output" == *"Backup"* ]] } # --- Unison-spezifische Tests --- @test "Unison-Versionsmismatch gibt Exit 1 und setzt sync_pending" { run_with_stubs env SSH_STUB_FAIL=0 \ UNISON_SERVER_VERSION="unison version 2.51.0" DRY_RUN_SKIP_CONFIRM=1 \ bash "$SYNC_SCRIPT" [ "$status" -eq 1 ] [ -f "$CONFIG_DIR/sync_pending" ] } @test "DB-Sync verwendet -force local bei Upload-Entscheidung" { echo "999" > "$CONFIG_DIR/sync_token" ARGS_FILE=$(mktemp) run_with_stubs env SSH_STUB_FAIL=0 UNISON_STUB_ARGS_FILE="$ARGS_FILE" \ DARKTABLE_SYNC_CONFLICT_RESPONSE="upload" bash "$SYNC_SCRIPT" --execute grep -q -- "-force" "$ARGS_FILE" || grep -q -- "force" "$ARGS_FILE" rm -f "$ARGS_FILE" } @test "Foto-Sync verwendet -prefer newer ohne Konflikt" { ARGS_FILE=$(mktemp) run_with_stubs env SSH_STUB_FAIL=0 UNISON_STUB_ARGS_FILE="$ARGS_FILE" \ bash "$SYNC_SCRIPT" --execute [ "$status" -eq 0 ] grep -q -- "-prefer" "$ARGS_FILE" rm -f "$ARGS_FILE" }