Steuerkram/scripts/run-tests.sh

123 lines
4.8 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# ============================================================
# Steuerkram Test-Runner mit automatischer Issue-Erstellung
#
# Verwendung:
# ./scripts/run-tests.sh [ISSUE_NUMMER]
#
# Parameter:
# ISSUE_NUMMER (optional) Nummer des aktuell bearbeiteten Issues,
# auf das bei neu erstellten Bug-Issues verwiesen wird.
#
# Umgebungsvariablen:
# CODEBERG_TOKEN Codeberg-API-Token (für Issue-Erstellung)
#
# Exit-Code: 0 = alle Tests OK, 1 = Fehler gefunden
# ============================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
CURRENT_ISSUE="${1:-}"
REPO="fds2610/Steuerkram"
API_BASE="https://codeberg.org/api/v1"
cd "$PROJECT_DIR"
# ── Tests ausführen ──────────────────────────────────────────
echo ""
echo "Führe Tests aus..."
JSON_OUTPUT=$(php tests/run.php --json 2>&1) || true
EXIT_CODE=$?
# Auch die lesbare Ausgabe zeigen
php tests/run.php || true
# ── Ergebnis auswerten ───────────────────────────────────────
FAILED=$(echo "$JSON_OUTPUT" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('failed',0))" 2>/dev/null || echo "0")
FAILURES_JSON=$(echo "$JSON_OUTPUT" | python3 -c "import json,sys; d=json.load(sys.stdin); print(json.dumps(d.get('failures',[])))" 2>/dev/null || echo "[]")
if [ "$FAILED" = "0" ] || [ "$FAILED" = "" ]; then
echo ""
echo "✓ Alle Tests bestanden. Commit kann fortgesetzt werden."
exit 0
fi
echo ""
echo "✗ ${FAILED} Test(s) fehlgeschlagen."
# ── Issues erstellen (nur wenn Token vorhanden) ──────────────
if [ -z "${CODEBERG_TOKEN:-}" ]; then
echo ""
echo "Hinweis: CODEBERG_TOKEN nicht gesetzt – keine automatischen Issues erstellt."
echo "Fehlgeschlagene Tests:"
echo "$FAILURES_JSON" | python3 -c "import json,sys; [print(' •', f) for f in json.load(sys.stdin)]" 2>/dev/null || true
exit 1
fi
echo ""
echo "Erstelle automatische Bug-Issues auf Codeberg..."
CREATED_ISSUES=()
# Jede Fehlermeldung als eigenes Issue anlegen
while IFS= read -r failure; do
[ -z "$failure" ] && continue
# Titel kürzen (max. 100 Zeichen)
TITLE="[BUG] Test fehlgeschlagen: ${failure:0:80}"
# Body zusammenbauen
BODY="## Automatisch erkannter Testfehler\n\n"
BODY+="**Fehlermeldung:** \`${failure}\`\n\n"
BODY+="**Erkannt am:** $(date '+%Y-%m-%d %H:%M:%S')\n\n"
BODY+="**Commit:** $(git rev-parse --short HEAD 2>/dev/null || echo 'unbekannt')\n\n"
if [ -n "$CURRENT_ISSUE" ]; then
BODY+="Dieser Fehler wurde beim Bearbeiten von Issue #${CURRENT_ISSUE} entdeckt.\n\n"
fi
BODY+="### Schritte zur Reproduktion\n"
BODY+="1. \`php tests/run.php\` ausführen\n"
BODY+="2. Fehler tritt im oben genannten Test auf\n\n"
BODY+="_Dieser Issue wurde automatisch durch den Test-Runner erstellt._\n"
BODY+="_Das Label 'automate' wurde bewusst NICHT gesetzt (Human-in-the-loop)._"
RESPONSE=$(curl -s -X POST \
-H "Authorization: token $CODEBERG_TOKEN" \
-H "Content-Type: application/json" \
-d "$(python3 -c "import json; print(json.dumps({'title': '${TITLE}', 'body': '${BODY}', 'labels': []}))")" \
"${API_BASE}/repos/${REPO}/issues")
ISSUE_NR=$(echo "$RESPONSE" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('number','?'))" 2>/dev/null || echo "?")
CREATED_ISSUES+=("#${ISSUE_NR}")
echo " → Issue #${ISSUE_NR} erstellt: ${failure:0:60}..."
done < <(echo "$FAILURES_JSON" | python3 -c "import json,sys; [print(f) for f in json.load(sys.stdin)]" 2>/dev/null)
# ── Kommentar im aktuellen Issue hinterlassen ─────────────────
if [ -n "$CURRENT_ISSUE" ] && [ ${#CREATED_ISSUES[@]} -gt 0 ]; then
ISSUE_LINKS=$(printf '%s, ' "${CREATED_ISSUES[@]}")
ISSUE_LINKS="${ISSUE_LINKS%, }"
COMMENT="### Automatische Testläufe\n\n"
COMMENT+="Beim Bearbeiten dieses Issues wurden **${FAILED} Test(s)** fehlgeschlagen.\n\n"
COMMENT+="Folgende Bug-Issues wurden automatisch erstellt (ohne 'automate'-Label – bitte manuell prüfen):\n\n"
for issue in "${CREATED_ISSUES[@]}"; do
COMMENT+="- ${issue}\n"
done
COMMENT+="\n_Commit: $(git rev-parse --short HEAD 2>/dev/null || echo 'unbekannt')_"
curl -s -X POST \
-H "Authorization: token $CODEBERG_TOKEN" \
-H "Content-Type: application/json" \
-d "$(python3 -c "import json; print(json.dumps({'body': '${COMMENT}'}))")" \
"${API_BASE}/repos/${REPO}/issues/${CURRENT_ISSUE}/comments" > /dev/null
echo ""
echo "Kommentar mit Links zu Bug-Issues in Issue #${CURRENT_ISSUE} hinterlassen."
fi
exit 1