#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" SCRIPT="$SCRIPT_DIR/../scripts/unreflected-logs" RED='\033[0;31m' GREEN='\033[0;32m' RESET='\033[0m' PASS=0 FAIL=0 assert_exit() { local desc="$1" expected="$2" shift 2 local actual set +e "$@" >/dev/null 2>&1 actual=$? set -e if [[ "$actual" -eq "$expected" ]]; then echo -e "${GREEN}PASS${RESET}: $desc" PASS=$((PASS + 1)) else echo -e "${RED}FAIL${RESET}: $desc (expected exit $expected, got $actual)" FAIL=$((FAIL + 1)) fi } assert_contains() { local desc="$1" pattern="$2" shift 2 local output set +e output=$("$@" 2>&1) set -e if echo "$output" | grep -qF "$pattern"; then echo -e "${GREEN}PASS${RESET}: $desc" PASS=$((PASS + 1)) else echo -e "${RED}FAIL${RESET}: $desc (output missing: '$pattern')" echo " Got: $output" FAIL=$((FAIL + 1)) fi } # Setup temp directory structure TMPDIR="$(mktemp -d)" trap 'rm -rf "$TMPDIR"' EXIT # Project with all logs reflected mkdir -p "$TMPDIR/proj-a/memory/log" echo "# log 1" > "$TMPDIR/proj-a/memory/log/2026-03-12.100000.md" cat > "$TMPDIR/proj-a/.reflection-state.json" <<'JSON' {"version": 1, "processed": {"log/2026-03-12.100000.md": "abc123"}} JSON # Project with unreflected logs mkdir -p "$TMPDIR/proj-b/memory/log" echo "# log 1" > "$TMPDIR/proj-b/memory/log/2026-03-12.100000.md" echo "# log 2" > "$TMPDIR/proj-b/memory/log/2026-03-13.100000.md" cat > "$TMPDIR/proj-b/.reflection-state.json" <<'JSON' {"version": 1, "processed": {"log/2026-03-12.100000.md": "abc123"}} JSON # Project with no reflection state file mkdir -p "$TMPDIR/proj-c/memory/log" echo "# log 1" > "$TMPDIR/proj-c/memory/log/2026-03-14.100000.md" # Project with empty log dir mkdir -p "$TMPDIR/proj-d/memory/log" # --- Tests --- echo "=== unreflected-logs tests ===" echo # Help flag assert_exit "--help exits 0" 0 "$SCRIPT" --help assert_contains "--help shows usage" "Usage:" "$SCRIPT" --help # Dryrun assert_contains "--dryrun lists projects" "[dryrun]" "$SCRIPT" --dryrun "$TMPDIR" assert_exit "--dryrun always exits 0" 0 "$SCRIPT" --dryrun "$TMPDIR" # Detects unreflected logs assert_exit "exits 1 when unreflected logs exist" 1 "$SCRIPT" "$TMPDIR" assert_contains "shows unreflected log filename" "2026-03-13.100000.md" "$SCRIPT" "$TMPDIR" # Shows project with no state file as unreflected assert_contains "missing state file = unreflected" "2026-03-14.100000.md" "$SCRIPT" "$TMPDIR" # Shows reflected project count assert_contains "shows reflected project count" "1 projects have all logs reflected" "$SCRIPT" "$TMPDIR" # No projects found EMPTY="$(mktemp -d)" assert_contains "no projects message" "No projects with session logs" "$SCRIPT" "$EMPTY" assert_exit "no projects exits 0" 0 "$SCRIPT" "$EMPTY" rmdir "$EMPTY" # All reflected (only proj-a) assert_exit "all reflected exits 0" 0 "$SCRIPT" "$TMPDIR/proj-a" echo echo "---" echo -e "Results: ${GREEN}$PASS passed${RESET}, ${RED}$FAIL failed${RESET}" [[ $FAIL -eq 0 ]]