#!/usr/bin/env bats # Tests for scripts/roam-sync.sh — the git auto-sync loop the roam KB timer runs. # Each test builds a throwaway clone + bare remote pair under $BATS_TEST_TMPDIR. setup() { SCRIPT="$BATS_TEST_DIRNAME/../roam-sync.sh" export GIT_CONFIG_GLOBAL=/dev/null GIT_CONFIG_SYSTEM=/dev/null export GIT_AUTHOR_NAME=test GIT_AUTHOR_EMAIL=t@t GIT_COMMITTER_NAME=test GIT_COMMITTER_EMAIL=t@t REMOTE="$BATS_TEST_TMPDIR/remote.git" REPO="$BATS_TEST_TMPDIR/repo" OTHER="$BATS_TEST_TMPDIR/other" git init -q --bare -b main "$REMOTE" git init -q -b main "$REPO" (cd "$REPO" && echo seed > seed.org && git add -A && git commit -qm seed \ && git remote add origin "$REMOTE" && git push -qu origin main) } clone_other() { git clone -q "$REMOTE" "$OTHER" 2>/dev/null } @test "clean tree, current remote: exits 0 with no new commit" { before=$(git -C "$REPO" rev-parse HEAD) run "$SCRIPT" "$REPO" [ "$status" -eq 0 ] [ "$(git -C "$REPO" rev-parse HEAD)" = "$before" ] } @test "dirty tree: commits and pushes to the remote" { echo "new fact" > "$REPO/fact.org" run "$SCRIPT" "$REPO" [ "$status" -eq 0 ] [ -z "$(git -C "$REPO" status --porcelain)" ] git -C "$REMOTE" log --format=%s main | grep -q "auto-sync" } @test "remote ahead: pulls the remote commit" { clone_other (cd "$OTHER" && echo upstream > up.org && git add -A && git commit -qm upstream && git push -q) run "$SCRIPT" "$REPO" [ "$status" -eq 0 ] [ -f "$REPO/up.org" ] } @test "local dirty and remote ahead, disjoint files: both land" { clone_other (cd "$OTHER" && echo upstream > up.org && git add -A && git commit -qm upstream && git push -q) echo "local fact" > "$REPO/local.org" run "$SCRIPT" "$REPO" [ "$status" -eq 0 ] [ -f "$REPO/up.org" ] git -C "$REMOTE" log --format=%s main | grep -q "auto-sync" } @test "conflicting rebase: exits nonzero and leaves no rebase in progress" { clone_other (cd "$OTHER" && echo theirs > seed.org && git add -A && git commit -qm theirs && git push -q) echo mine > "$REPO/seed.org" run "$SCRIPT" "$REPO" [ "$status" -ne 0 ] [ ! -d "$REPO/.git/rebase-merge" ] [ ! -d "$REPO/.git/rebase-apply" ] # the local change survives as a commit for the human to resolve later git -C "$REPO" log --format=%s | grep -q "auto-sync" } @test "missing repo path: exits nonzero with a message" { run "$SCRIPT" "$BATS_TEST_TMPDIR/nonexistent" [ "$status" -ne 0 ] [[ "$output" == *"not a git repo"* ]] }