#!/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 } # --- Bestehende Tests (echter Sync via --execute) --- @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 rsync fehlschlaegt" { run_with_stubs env SSH_STUB_FAIL=0 RSYNC_STUB_FAIL=1 bash "$SYNC_SCRIPT" --execute [ "$status" -eq 1 ] [ -f "$CONFIG_DIR/sync_pending" ] } @test "DB-Backup wird vor Download 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" ] } # --- Neue Tests: 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 \ RSYNC_STUB_DRY_LINES=">f+++++++++ foto.jpg" bash "$SYNC_SCRIPT" [ "$status" -eq 0 ] [[ "$output" == *"neu"* ]] } # --- Tests: --delete und Backup-Verhalten --- @test "Upload-rsync enthaelt --delete Flag" { ARGS_FILE=$(mktemp) run_with_stubs env SSH_STUB_FAIL=0 RSYNC_STUB_ARGS_FILE="$ARGS_FILE" bash "$SYNC_SCRIPT" --execute [ "$status" -eq 0 ] grep -q -- "--delete" "$ARGS_FILE" rm -f "$ARGS_FILE" } @test "Download-rsync enthaelt --backup und --backup-dir" { ARGS_FILE=$(mktemp) run_with_stubs env SSH_STUB_FAIL=0 RSYNC_STUB_ARGS_FILE="$ARGS_FILE" bash "$SYNC_SCRIPT" --execute [ "$status" -eq 0 ] grep -q -- "--backup" "$ARGS_FILE" grep -q -- "--backup-dir=" "$ARGS_FILE" rm -f "$ARGS_FILE" } @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 \ RSYNC_STUB_DRY_LINES="*deleting foto.jpg" bash "$SYNC_SCRIPT" [ "$status" -eq 0 ] [[ "$output" == *"Backup"* ]] }