From 769eeea2b913c3590e77ac6b2ba99bba6431ecc8 Mon Sep 17 00:00:00 2001 From: Kevin Bataille Date: Sat, 25 Jul 2026 18:57:21 +0200 Subject: [PATCH] feat: add archive listing and resolution to restore.sh --- restore.sh | 13 +++++++ tests/lib/setup_mocks.sh | 79 ++++++++++++++++++++++++++++++++++++++++ tests/test_restore.sh | 13 +++++++ 3 files changed, 105 insertions(+) create mode 100644 tests/lib/setup_mocks.sh diff --git a/restore.sh b/restore.sh index 57c2594..42864f3 100755 --- a/restore.sh +++ b/restore.sh @@ -52,6 +52,19 @@ run_cmd() { "$@" } +resolve_archive() { + if [[ -n "$ARCHIVE_OVERRIDE" ]]; then + RESOLVED_ARCHIVE="$ARCHIVE_OVERRIDE" + return 0 + fi + RESOLVED_ARCHIVE="$(borg list --short --lock-wait 60 2>/dev/null | tail -n1)" + [[ -n "$RESOLVED_ARCHIVE" ]] || die "no archives found in repo $REPO" +} + +list_archives() { + borg list --lock-wait 60 +} + usage() { cat <<'EOF' Usage: diff --git a/tests/lib/setup_mocks.sh b/tests/lib/setup_mocks.sh new file mode 100644 index 0000000..0951703 --- /dev/null +++ b/tests/lib/setup_mocks.sh @@ -0,0 +1,79 @@ +#!/bin/bash +# Builds fake borg/docker/mysql/mariadb executables into $1 so restore.sh +# can be exercised without real infrastructure. Each mock logs its +# invocation to $1/mock.log. + +setup_mock_bin() { + local dir="$1" + mkdir -p "$dir" + local mocklog="$dir/mock.log" + : > "$mocklog" + + cat > "$dir/borg" <> "$mocklog" +case "\$1" in + list) + echo "host-2026-01-01T00-00-00" + echo "host-2026-06-01T00-00-00" + ;; + extract) + shift + paths=() + for a in "\$@"; do + case "\$a" in + -*) ;; + *::*) ;; + *) paths+=("\$a") ;; + esac + done + for p in "\${paths[@]}"; do + if [[ "\$p" == *.* ]]; then + mkdir -p "\$(dirname "\$p")" + printf 'mock-content\n' > "\$p" + else + mkdir -p "\$p" + touch "\$p/RESTORED_MARKER" + fi + done + ;; + *) ;; +esac +exit 0 +EOF + + cat > "$dir/docker" <> "$mocklog" +case "\$1" in + inspect) + if [[ "\$*" == *"State.Running"* ]]; then + echo true + else + echo healthy + fi + ;; + start|stop) + exit 0 + ;; + exec) + case "\$*" in + *"command -v mariadb"*) exit 0 ;; + *) cat >/dev/null 2>&1 || true; exit 0 ;; + esac + ;; + *) ;; +esac +exit 0 +EOF + + cat > "$dir/mysql" <> "$mocklog" +cat >/dev/null 2>&1 || true +exit 0 +EOF + cp "$dir/mysql" "$dir/mariadb" + + chmod +x "$dir/borg" "$dir/docker" "$dir/mysql" "$dir/mariadb" +} diff --git a/tests/test_restore.sh b/tests/test_restore.sh index e618000..8aa3d2e 100755 --- a/tests/test_restore.sh +++ b/tests/test_restore.sh @@ -47,9 +47,22 @@ test_unknown_command_exits_one() { 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_help_exits_zero test_no_args_exits_one test_unknown_command_exits_one +test_list_archives echo "-----" if [[ "$FAILURES" -gt 0 ]]; then