2026-05-14 19:07:48 -05:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
|
|
|
|
DRAWER=./target/debug/drawer
|
2026-05-14 23:57:58 -05:00
|
|
|
TEST_DIR="$(cd "$(dirname "$0")/tests/testcontents" && pwd)"
|
2026-05-14 19:07:48 -05:00
|
|
|
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"
|
|
|
|
|
|
2026-05-15 00:42:39 -05:00
|
|
|
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"
|
2026-05-14 19:07:48 -05:00
|
|
|
|
|
|
|
|
# ── 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"
|
|
|
|
|
|
2026-05-15 00:42:39 -05:00
|
|
|
ok "close: inferred source" $DRAWER close -i "$KEY" "$TEST_DIR" "$INFER_DRAWER"
|
2026-05-14 19:07:48 -05:00
|
|
|
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"
|
|
|
|
|
|
2026-05-15 00:42:39 -05:00
|
|
|
# ── 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"
|
|
|
|
|
|
2026-05-14 19:07:48 -05:00
|
|
|
# ── 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"
|
|
|
|
|
|
2026-05-15 00:42:39 -05:00
|
|
|
ok "close: single file" $DRAWER close -i "$KEY" "$SINGLE_SRC" "$SINGLE_DRAWER"
|
2026-05-14 19:07:48 -05:00
|
|
|
$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 ────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
# Pending
|
|
|
|
|
# err "close: refuse drawer inside target" $DRAWER close -i "$KEY" "$TEST_DIR/../test.drawer" "$TEST_DIR"
|
|
|
|
|
|
|
|
|
|
# ── 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."
|