228 lines
8.7 KiB
Bash
Executable File
228 lines
8.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# RTK Smoke Tests — Aristote Project (Vite + React + TS + ESLint)
|
|
# Tests RTK commands in a real JS/TS project context.
|
|
# Usage: bash scripts/test-aristote.sh
|
|
#
|
|
set -euo pipefail
|
|
|
|
ARISTOTE="/Users/florianbruniaux/Sites/MethodeAristote/aristote-school-boost"
|
|
|
|
PASS=0
|
|
FAIL=0
|
|
SKIP=0
|
|
FAILURES=()
|
|
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[0;33m'
|
|
CYAN='\033[0;36m'
|
|
BOLD='\033[1m'
|
|
NC='\033[0m'
|
|
|
|
assert_ok() {
|
|
local name="$1"; shift
|
|
local output
|
|
if output=$("$@" 2>&1); then
|
|
PASS=$((PASS + 1))
|
|
printf " ${GREEN}PASS${NC} %s\n" "$name"
|
|
else
|
|
FAIL=$((FAIL + 1))
|
|
FAILURES+=("$name")
|
|
printf " ${RED}FAIL${NC} %s\n" "$name"
|
|
printf " cmd: %s\n" "$*"
|
|
printf " out: %s\n" "$(echo "$output" | head -3)"
|
|
fi
|
|
}
|
|
|
|
assert_contains() {
|
|
local name="$1"; local needle="$2"; shift 2
|
|
local output
|
|
if output=$("$@" 2>&1) && echo "$output" | grep -q "$needle"; then
|
|
PASS=$((PASS + 1))
|
|
printf " ${GREEN}PASS${NC} %s\n" "$name"
|
|
else
|
|
FAIL=$((FAIL + 1))
|
|
FAILURES+=("$name")
|
|
printf " ${RED}FAIL${NC} %s\n" "$name"
|
|
printf " expected: '%s'\n" "$needle"
|
|
printf " got: %s\n" "$(echo "$output" | head -3)"
|
|
fi
|
|
}
|
|
|
|
# Allow non-zero exit but check output
|
|
assert_output() {
|
|
local name="$1"; local needle="$2"; shift 2
|
|
local output
|
|
output=$("$@" 2>&1) || true
|
|
if echo "$output" | grep -q "$needle"; then
|
|
PASS=$((PASS + 1))
|
|
printf " ${GREEN}PASS${NC} %s\n" "$name"
|
|
else
|
|
FAIL=$((FAIL + 1))
|
|
FAILURES+=("$name")
|
|
printf " ${RED}FAIL${NC} %s\n" "$name"
|
|
printf " expected: '%s'\n" "$needle"
|
|
printf " got: %s\n" "$(echo "$output" | head -3)"
|
|
fi
|
|
}
|
|
|
|
skip_test() {
|
|
local name="$1"; local reason="$2"
|
|
SKIP=$((SKIP + 1))
|
|
printf " ${YELLOW}SKIP${NC} %s (%s)\n" "$name" "$reason"
|
|
}
|
|
|
|
section() {
|
|
printf "\n${BOLD}${CYAN}── %s ──${NC}\n" "$1"
|
|
}
|
|
|
|
# ── Preamble ─────────────────────────────────────────
|
|
|
|
RTK=$(command -v rtk || echo "")
|
|
if [[ -z "$RTK" ]]; then
|
|
echo "rtk not found in PATH. Run: cargo install --path ."
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -d "$ARISTOTE" ]]; then
|
|
echo "Aristote project not found at $ARISTOTE"
|
|
exit 1
|
|
fi
|
|
|
|
printf "${BOLD}RTK Smoke Tests — Aristote Project${NC}\n"
|
|
printf "Binary: %s (%s)\n" "$RTK" "$(rtk --version)"
|
|
printf "Project: %s\n" "$ARISTOTE"
|
|
printf "Date: %s\n\n" "$(date '+%Y-%m-%d %H:%M')"
|
|
|
|
# ── 1. File exploration ──────────────────────────────
|
|
|
|
section "Ls & Find"
|
|
|
|
assert_ok "rtk ls project root" rtk ls "$ARISTOTE"
|
|
assert_ok "rtk ls src/" rtk ls "$ARISTOTE/src"
|
|
assert_ok "rtk ls --depth 3" rtk ls --depth 3 "$ARISTOTE/src"
|
|
assert_contains "rtk ls shows components/" "components" rtk ls "$ARISTOTE/src"
|
|
assert_ok "rtk find *.tsx" rtk find "*.tsx" "$ARISTOTE/src"
|
|
assert_ok "rtk find *.ts" rtk find "*.ts" "$ARISTOTE/src"
|
|
assert_contains "rtk find finds App.tsx" "App.tsx" rtk find "*.tsx" "$ARISTOTE/src"
|
|
|
|
# ── 2. Read ──────────────────────────────────────────
|
|
|
|
section "Read"
|
|
|
|
assert_ok "rtk read tsconfig.json" rtk read "$ARISTOTE/tsconfig.json"
|
|
assert_ok "rtk read package.json" rtk read "$ARISTOTE/package.json"
|
|
assert_ok "rtk read App.tsx" rtk read "$ARISTOTE/src/App.tsx"
|
|
assert_ok "rtk read --level aggressive" rtk read --level aggressive "$ARISTOTE/src/App.tsx"
|
|
assert_ok "rtk read --max-lines 10" rtk read --max-lines 10 "$ARISTOTE/src/App.tsx"
|
|
|
|
# ── 3. Grep ──────────────────────────────────────────
|
|
|
|
section "Grep"
|
|
|
|
assert_ok "rtk grep import" rtk grep "import" "$ARISTOTE/src"
|
|
assert_ok "rtk grep with type filter" rtk grep "useState" "$ARISTOTE/src" -t tsx
|
|
assert_contains "rtk grep finds components" "import" rtk grep "import" "$ARISTOTE/src"
|
|
|
|
# ── 4. Git ───────────────────────────────────────────
|
|
|
|
section "Git (in Aristote repo)"
|
|
|
|
# rtk git doesn't support -C, use git -C via subshell
|
|
assert_ok "rtk git status" bash -c "cd $ARISTOTE && rtk git status"
|
|
assert_ok "rtk git log" bash -c "cd $ARISTOTE && rtk git log"
|
|
assert_ok "rtk git branch" bash -c "cd $ARISTOTE && rtk git branch"
|
|
|
|
# ── 5. Deps ──────────────────────────────────────────
|
|
|
|
section "Deps"
|
|
|
|
assert_ok "rtk deps" rtk deps "$ARISTOTE"
|
|
assert_contains "rtk deps shows package.json" "package.json" rtk deps "$ARISTOTE"
|
|
|
|
# ── 6. Json ──────────────────────────────────────────
|
|
|
|
section "Json"
|
|
|
|
assert_ok "rtk json tsconfig" rtk json "$ARISTOTE/tsconfig.json"
|
|
assert_ok "rtk json package.json" rtk json "$ARISTOTE/package.json"
|
|
|
|
# ── 7. Env ───────────────────────────────────────────
|
|
|
|
section "Env"
|
|
|
|
assert_ok "rtk env" rtk env
|
|
assert_ok "rtk env --filter NODE" rtk env --filter NODE
|
|
|
|
# ── 8. Tsc ───────────────────────────────────────────
|
|
|
|
section "TypeScript (tsc)"
|
|
|
|
if command -v npx >/dev/null 2>&1 && [[ -d "$ARISTOTE/node_modules" ]]; then
|
|
assert_output "rtk tsc (in aristote)" "error\|✅\|TS" rtk tsc --project "$ARISTOTE"
|
|
else
|
|
skip_test "rtk tsc" "node_modules not installed"
|
|
fi
|
|
|
|
# ── 9. ESLint ────────────────────────────────────────
|
|
|
|
section "ESLint (lint)"
|
|
|
|
if command -v npx >/dev/null 2>&1 && [[ -d "$ARISTOTE/node_modules" ]]; then
|
|
assert_output "rtk lint (in aristote)" "error\|warning\|✅\|violations\|clean" rtk lint --project "$ARISTOTE"
|
|
else
|
|
skip_test "rtk lint" "node_modules not installed"
|
|
fi
|
|
|
|
# ── 10. Build (Vite) ─────────────────────────────────
|
|
|
|
section "Build (Vite via rtk next)"
|
|
|
|
if [[ -d "$ARISTOTE/node_modules" ]]; then
|
|
# Aristote uses Vite, not Next — but rtk next wraps the build script
|
|
# Test with a timeout since builds can be slow
|
|
skip_test "rtk next build" "Vite project, not Next.js — use npm run build directly"
|
|
else
|
|
skip_test "rtk next build" "node_modules not installed"
|
|
fi
|
|
|
|
# ── 11. Diff ─────────────────────────────────────────
|
|
|
|
section "Diff"
|
|
|
|
# Diff two config files that exist in the project
|
|
assert_ok "rtk diff tsconfigs" rtk diff "$ARISTOTE/tsconfig.json" "$ARISTOTE/tsconfig.app.json"
|
|
|
|
# ── 12. Summary & Err ────────────────────────────────
|
|
|
|
section "Summary & Err"
|
|
|
|
assert_ok "rtk summary ls" rtk summary ls "$ARISTOTE/src"
|
|
assert_ok "rtk err ls" rtk err ls "$ARISTOTE/src"
|
|
|
|
# ── 13. Gain ─────────────────────────────────────────
|
|
|
|
section "Gain (after above commands)"
|
|
|
|
assert_ok "rtk gain" rtk gain
|
|
assert_ok "rtk gain --history" rtk gain --history
|
|
|
|
# ══════════════════════════════════════════════════════
|
|
# Report
|
|
# ══════════════════════════════════════════════════════
|
|
|
|
printf "\n${BOLD}══════════════════════════════════════${NC}\n"
|
|
printf "${BOLD}Results: ${GREEN}%d passed${NC}, ${RED}%d failed${NC}, ${YELLOW}%d skipped${NC}\n" "$PASS" "$FAIL" "$SKIP"
|
|
|
|
if [[ ${#FAILURES[@]} -gt 0 ]]; then
|
|
printf "\n${RED}Failures:${NC}\n"
|
|
for f in "${FAILURES[@]}"; do
|
|
printf " - %s\n" "$f"
|
|
done
|
|
fi
|
|
|
|
printf "${BOLD}══════════════════════════════════════${NC}\n"
|
|
|
|
exit "$FAIL"
|