diff --git a/tests/scripts/run-all-tests.sh b/tests/scripts/run-all-tests.sh new file mode 100755 index 00000000..05f6b0bb --- /dev/null +++ b/tests/scripts/run-all-tests.sh @@ -0,0 +1,197 @@ +#!/usr/bin/env bash +# ============================================================================ +# run-all-tests.sh — Orchestrateur de tests TC-01 à TC-31 +# Usage: ./run-all-tests.sh [OPTIONS] +# Env: URL, PASS (admin password) +# +# Options: +# --navigate Démarrer le monde (login admin) avant les tests +# --tests LIST Liste de tests à exécuter (ex: "01,02,08-10,15" ou "all") +# --no-report Ne pas afficher le rapport final +# --help Afficher l'aide +# ============================================================================ +set -uo pipefail +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +source "$SCRIPT_DIR/tc-header.sh" + +# All available TC scripts (excluding tc-header.sh and run-all-tests.sh) +TC_SCRIPTS=() +for f in "$SCRIPT_DIR"/tc-[0-9][0-9]-*.sh; do + [ -f "$f" ] || continue + TC_SCRIPTS+=("$(basename "$f")") +done +TC_SCRIPTS=($(printf '%s\n' "${TC_SCRIPTS[@]}" | sort)) + +NAVIGATE="" +TESTS_FILTER="" +SHOW_REPORT=1 + +usage() { + cat < list of numbers) +expand_filter() { + local filter="$1" out=() + IFS=',' read -ra parts <<< "$filter" + for part in "${parts[@]}"; do + if [[ "$part" =~ ^([0-9]+)-([0-9]+)$ ]]; then + local from=$((10#${BASH_REMATCH[1]})) to=$((10#${BASH_REMATCH[2]})) + for ((i=from; i<=to; i++)); do out+=("$(printf '%02d' "$i")"); done + elif [[ "$part" =~ ^[0-9]+$ ]]; then + out+=("$(printf '%02d' $((10#$part)))") + fi + done + printf '%s\n' "${out[@]}" +} + +# Select tests +if [ -z "$TESTS_FILTER" ] || [ "$TESTS_FILTER" = "all" ]; then + SELECTED=() + for f in "${TC_SCRIPTS[@]}"; do + SELECTED+=("$f") + done +else + SELECTED=() + for num in $(expand_filter "$TESTS_FILTER"); do + for f in "${TC_SCRIPTS[@]}"; do + if [[ "$f" == "tc-${num}-"* ]]; then + SELECTED+=("$f") + break + fi + done + done +fi + +[ ${#SELECTED[@]} -eq 0 ] && die "Aucun test sélectionné" + +echo "" +echo "╔══════════════════════════════════════════════════════════════════════╗" +echo "║ Rêve de Dragon — Suite de Tests Automatisés ║" +echo "╚══════════════════════════════════════════════════════════════════════╝" +echo "" +echo " Tests sélectionnés (${#SELECTED[@]}):" +for f in "${SELECTED[@]}"; do + echo " • $f" +done +echo "" +echo " URL: $URL" +echo "" + +# ============================================================================ +# Step 1: Ask user to start the world, then wait for game.ready +# ============================================================================ +echo "→ Vérification session..." +R=$(jse_wait_ready 3 2) +if [ "$R" != "ready" ]; then + echo "" + echo " ⚠ Le monde n'est pas démarré dans chrome-devtools." + echo "" + echo " Instructions:" + echo " 1. Ouvrez https://localhost:31000 dans le navigateur chrome-devtools" + echo " 2. Sélectionnez le monde 'Reve de Dragon' et connectez-vous" + echo " 3. Attendez que la page /game soit chargée (game.ready=true)" + echo "" + read -p " Appuyez sur ENTRÉE quand le monde est démarré et game.ready=true... " + echo "" + echo "→ Attente de game.ready..." + R=$(jse_wait_ready 120 2) +fi +[ "$R" != "ready" ] && die "Game not ready (timeout 120s)" +echo " ✓ Game ready" +echo "" + +# ============================================================================ +# Step 2: Run tests +# ============================================================================ +RESULTS=() +TOTAL_PASS=0 +TOTAL_FAIL=0 +TOTAL_ERRORS=0 + +for script in "${SELECTED[@]}"; do + path="$SCRIPT_DIR/$script" + [ ! -x "$path" ] && { echo " ✘ $script non exécutable"; continue; } + + echo "────────────────────────────────────────────────────────────────" + echo " ▶ $script" + echo "────────────────────────────────────────────────────────────────" + + # Run WITHOUT --navigate (we're already logged in) + output=$("$path" 2>&1) + rc=$? + echo "$output" | grep -E '^[║╔╚]|✔|✘|passed|---' + + # Parse pass/fail from summary line + summary=$(echo "$output" | grep 'passed' | tail -1) + p=$(echo "$summary" | grep -oP '\d+(?= /)' || echo "0") + f=$(echo "$summary" | grep -oP '(?<=, )\d+(?= failed)' || echo "0") + + TOTAL_PASS=$((TOTAL_PASS + p)) + TOTAL_FAIL=$((TOTAL_FAIL + f)) + [ $rc -ne 0 ] && TOTAL_ERRORS=$((TOTAL_ERRORS + 1)) + + RESULTS+=("$script|$p|$f|$rc") + + echo "" +done + +# ============================================================================ +# Step 3: Final report +# ============================================================================ +if [ "$SHOW_REPORT" -eq 1 ]; then + echo "" + echo "╔══════════════════════════════════════════════════════════════════════╗" + echo "║ RAPPORT FINAL ║" + echo "╠══════════════════════════════════════════════════════════════════════╣" + printf "║ %-40s %4s %4s %4s %-6s ║\n" "Test" "Pass" "Fail" "RC" "Status" + echo "╠══════════════════════════════════════════════════════════════════════╣" + for r in "${RESULTS[@]}"; do + IFS='|' read -r name p f rc <<< "$r" + status="✔" + [ "$f" -gt 0 ] && status="✘" + [ "$rc" -ne 0 ] && status="⚠" + printf "║ %-40s %4s %4s %4s %-6s ║\n" "$name" "$p" "$f" "$rc" "$status" + done + echo "╠══════════════════════════════════════════════════════════════════════╣" + TOTAL=$((TOTAL_PASS + TOTAL_FAIL)) + printf "║ %-40s %4s %4s %4s %-6s ║\n" "TOTAL" "$TOTAL_PASS" "$TOTAL_FAIL" "$TOTAL_ERRORS" "" + echo "╠══════════════════════════════════════════════════════════════════════╣" + if [ "$TOTAL_FAIL" -eq 0 ] && [ "$TOTAL_ERRORS" -eq 0 ]; then + echo "║ ✔ TOUS LES TESTS PASSENT ║" + else + printf "║ ✘ %d/%d tests échouent, %d scripts en erreur ║\n" "$TOTAL_FAIL" "$TOTAL" "$TOTAL_ERRORS" + fi + echo "╚══════════════════════════════════════════════════════════════════════╝" + echo "" +fi + +[ "$TOTAL_FAIL" -gt 0 ] || [ "$TOTAL_ERRORS" -gt 0 ] && exit 1 || exit 0 \ No newline at end of file