#!/bin/bash set -uo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" RESTORE="$HERE/../restore.sh" FAILURES=0 assert_eq() { local expected="$1" actual="$2" msg="$3" if [[ "$expected" != "$actual" ]]; then echo "FAIL: $msg (expected '$expected', got '$actual')" FAILURES=$((FAILURES + 1)) else echo "PASS: $msg" fi } assert_contains() { local haystack="$1" needle="$2" msg="$3" if [[ "$haystack" != *"$needle"* ]]; then echo "FAIL: $msg (expected to contain '$needle', got '$haystack')" FAILURES=$((FAILURES + 1)) else echo "PASS: $msg" fi } test_help_exits_zero() { local out rc out="$(bash "$RESTORE" -h)" rc=$? assert_eq "0" "$rc" "help exits 0" assert_contains "$out" "Usage:" "help prints usage" } test_no_args_exits_one() { local rc bash "$RESTORE" >/dev/null 2>&1 rc=$? assert_eq "1" "$rc" "no args exits 1" } test_unknown_command_exits_one() { local rc bash "$RESTORE" bogus >/dev/null 2>&1 rc=$? assert_eq "1" "$rc" "unknown command exits 1" } source "$HERE/lib/setup_mocks.sh" test_list_archives() { local mockdir out mockdir="$(mktemp -d)" setup_mock_bin "$mockdir" out="$(PATH="$mockdir:$PATH" bash "$RESTORE" --list-archives)" assert_contains "$out" "host-2026-01-01T00-00-00" "list-archives shows first archive" assert_contains "$out" "host-2026-06-01T00-00-00" "list-archives shows latest archive" rm -rf "$mockdir" } test_file_restore_extracts_to_dest() { local mockdir dest out final mockdir="$(mktemp -d)" dest="$(mktemp -d)" setup_mock_bin "$mockdir" out="$(PATH="$mockdir:$PATH" bash "$RESTORE" file photos/img.jpg --dest "$dest")" final="$dest/home/srv/files/content/photos/img.jpg" assert_contains "$out" "Restored file available at: $final" "file mode reports final path" if [[ -f "$final" ]]; then echo "PASS: extracted file exists on disk" else echo "FAIL: extracted file missing at $final" FAILURES=$((FAILURES + 1)) fi rm -rf "$mockdir" "$dest" } test_file_restore_dry_run_makes_no_borg_call() { local mockdir dest mockdir="$(mktemp -d)" dest="$(mktemp -d)" setup_mock_bin "$mockdir" PATH="$mockdir:$PATH" bash "$RESTORE" file photos/img.jpg --dest "$dest" --dry-run >/dev/null if [[ -s "$mockdir/mock.log" ]] && grep -q "^borg extract" "$mockdir/mock.log"; then echo "FAIL: dry-run invoked borg extract" FAILURES=$((FAILURES + 1)) else echo "PASS: dry-run made no borg extract call" fi rm -rf "$mockdir" "$dest" } test_help_exits_zero test_no_args_exits_one test_unknown_command_exits_one test_list_archives test_file_restore_extracts_to_dest test_file_restore_dry_run_makes_no_borg_call echo "-----" if [[ "$FAILURES" -gt 0 ]]; then echo "$FAILURES failure(s)" exit 1 fi echo "All tests passed"