#!/usr/bin/env bash set -euo pipefail DRAWER=./target/debug/drawer TEST_DIR="$(cd "$(dirname "$0")/tests/testcontents" && pwd)" WORK="$TMPDIR/drawer_test_$$" mkdir -p "$WORK" pass() { echo "PASS: $1"; } fail() { echo "FAIL: $1"; exit 1; } # Expect a command to succeed ok() { local label="$1"; shift local rc=0 "$@" 2>/dev/null || rc=$? if [ "$rc" -eq 0 ]; then pass "$label" else fail "$label (exited $rc)" fi } # Expect a command to fail err() { local label="$1"; shift local rc=0 "$@" 2>/dev/null || rc=$? if [ "$rc" -eq 0 ]; then fail "$label (expected failure but succeeded)" else pass "$label" fi } cargo build -q # ── key ────────────────────────────────────────────────────────────────────── KEY="$WORK/test.key" ok "key: generate" $DRAWER key "$KEY" err "key: refuse existing file" $DRAWER key "$KEY" err "key: refuse missing parent" $DRAWER key "$WORK/nosuchdir/test.key" # ── close ──────────────────────────────────────────────────────────────────── DRAWER_FILE="$WORK/test.drawer" ok "close: pack test dir" $DRAWER close -i "$KEY" "$TEST_DIR" "$DRAWER_FILE" err "close: refuse without key" DRAWER_KEY="" $DRAWER close "$TEST_DIR" "$DRAWER_FILE" err "close: refuse bad key" $DRAWER close -i "$WORK/notakey" "$TEST_DIR" "$DRAWER_FILE" err "close: refuse bad extension" $DRAWER close -i "$KEY" "$TEST_DIR" "$WORK/test.notadrawer" # ── open ───────────────────────────────────────────────────────────────────── OUT="$WORK/out" mkdir -p "$OUT" ok "open: unpack drawer" $DRAWER open -i "$KEY" "$DRAWER_FILE" "$OUT" ok "open: file1.md present" test -f "$OUT/file1.md" ok "open: file2.md present" test -f "$OUT/file2.md" ok "open: contents match file1.md" diff "$TEST_DIR/file1.md" "$OUT/file1.md" ok "open: contents match file2.md" diff "$TEST_DIR/file2.md" "$OUT/file2.md" err "open: refuse non-empty target" $DRAWER open -i "$KEY" "$DRAWER_FILE" "$OUT" ok "open: force into non-empty" $DRAWER open -i "$KEY" -f "$DRAWER_FILE" "$OUT" err "open: refuse bad extension" $DRAWER open -i "$KEY" "$WORK/test.notadrawer" "$OUT" err "open: refuse missing drawer" $DRAWER open -i "$KEY" "$WORK/nosuch.drawer" "$OUT" err "open: refuse without key" $DRAWER open "$DRAWER_FILE" "$OUT" err "open: refuse bad key" $DRAWER open -i "$WORK/notakey" "$DRAWER_FILE" "$OUT" # ── open: inferred target path ─────────────────────────────────────────────── INFER_DRAWER="$WORK/inferred.drawer" INFER_OUT="$WORK/inferred" ok "close: inferred source" $DRAWER close -i "$KEY" "$TEST_DIR" "$INFER_DRAWER" mkdir -p "$INFER_OUT" ok "open: inferred target" $DRAWER open -i "$KEY" "$INFER_DRAWER" "$INFER_OUT" ok "open: inferred file1.md" test -f "$INFER_OUT/file1.md" # ── close: inferred drawer file ────────────────────────────────────────────── INFER_CLOSE_SRC="$WORK/myproject" INFER_CLOSE_DRAWER="$WORK/myproject.drawer" cp -r "$TEST_DIR" "$INFER_CLOSE_SRC" ok "close: inferred drawer file" $DRAWER close -i "$KEY" "$INFER_CLOSE_SRC" ok "close: drawer file created" test -f "$INFER_CLOSE_DRAWER" INFER_CLOSE_OUT="$WORK/myproject_out" mkdir -p "$INFER_CLOSE_OUT" ok "close: inferred round-trip open" $DRAWER open -i "$KEY" "$INFER_CLOSE_DRAWER" "$INFER_CLOSE_OUT" ok "close: inferred round-trip file1" test -f "$INFER_CLOSE_OUT/file1.md" # ── info ───────────────────────────────────────────────────────────────────── $DRAWER info -i "$KEY" "$DRAWER_FILE" 2>/dev/null | grep -q "folder, 2 files" \ && pass "info: reports folder" || fail "info: reports folder" err "info: refuse bad extension" $DRAWER info -i "$KEY" "$WORK/test.notadrawer" err "info: refuse missing drawer" $DRAWER info -i "$KEY" "$WORK/nosuch.drawer" err "info: refuse without key" $DRAWER info "$DRAWER_FILE" # ── single-file drawer ─────────────────────────────────────────────────────── SINGLE_SRC="$TEST_DIR/file1.md" SINGLE_DRAWER="$WORK/file1.drawer" SINGLE_OUT_DIR="$WORK/single_out" mkdir -p "$SINGLE_OUT_DIR" ok "close: single file" $DRAWER close -i "$KEY" "$SINGLE_SRC" "$SINGLE_DRAWER" $DRAWER info -i "$KEY" "$SINGLE_DRAWER" 2>/dev/null | grep -q "file, " \ && pass "info: reports single file" || fail "info: reports single file" ok "open: single file" $DRAWER open -i "$KEY" "$SINGLE_DRAWER" "$SINGLE_OUT_DIR/file1.md" ok "open: single file contents" diff "$SINGLE_SRC" "$SINGLE_OUT_DIR/file1.md" # ── close: drawer-inside-target guard ──────────────────────────────────────── err "close: refuse drawer inside target" $DRAWER close -i "$KEY" "$TEST_DIR" "$TEST_DIR/test.drawer" # ── env var key ────────────────────────────────────────────────────────────── ENV_OUT="$WORK/env_out" mkdir -p "$ENV_OUT" ok "open: key from DRAWER_KEY env" env DRAWER_KEY="$KEY" $DRAWER open "$DRAWER_FILE" "$ENV_OUT" ok "open: env key file1.md" test -f "$ENV_OUT/file1.md" # ───────────────────────────────────────────────────────────────────────────── rm -rf "$WORK" echo "" echo "All tests passed."