gwoe-antragspruefer/scripts/smoke-test.sh
Dotty Dotter 553e99d14e feat(v2): globaler BL-Selector im Header + Auth-gated Sidebar + Queue-Widget
Bundesland-Auswahl:
- Topbar: einziger BL-Selektor mit localStorage.gwoe.bl-Persistenz
- BL-Felder entfernt aus durchsuchen.html, landtag_suche.html, neu.html, auswertungen.html
- Screens hoeren auf v2-bl-changed CustomEvent + initial via window.v2GetGlobalBl()

Sichtbarkeit (Sidebar):
- Durchsuchen + Tags: immer
- Merkliste / Neuer Antrag / Landtag-Suche / Auswertungen / Export / Feed: nur eingeloggt
- Cluster + Batch-Analyse + Administration: nur Admin

Server-Side Schutz:
- _v2_template_context()-Helper liefert is_authenticated, is_admin, v2_bundeslaender
- HTML-Routen mit Depends(require_auth) bzw. require_admin
- 401/403-Browser-Requests redirecten auf /?login=1 statt JSON-Error

Queue-Widget (#149):
- Neues Component-Partial v2/components/queue_widget.html
- Statusbar unten links + Hover-Tooltip mit den letzten 20 Jobs
- 5s-Polling auf /api/queue/status, blendet sich aus wenn keine Jobs

Smoke-Test angepasst an neue Auth-Erwartungen (302 fuer auth-protected Routen).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 21:50:36 +02:00

116 lines
4.8 KiB
Bash
Executable File

#!/bin/bash
# Gesamt-Funktionsprüfung — Smoke-Test für GWÖ-Antragsprüfer Live-System.
# Usage: ./scripts/smoke-test.sh [base-url]
# Default: https://gwoe.toppyr.de
set -uo pipefail
BASE="${1:-https://gwoe.toppyr.de}"
PASS=0; FAIL=0; TOTAL=0
check() {
local name="$1" expected="$2" url="$3" extra="${4:-}"
TOTAL=$((TOTAL+1))
local code
code=$(curl -s -o /dev/null -w "%{http_code}" $extra "$BASE$url" 2>&1 || echo "000")
if [[ "$code" == "$expected" ]]; then
printf " ✓ %-40s %s\n" "$name" "$code"
PASS=$((PASS+1))
else
printf " ✗ %-40s expected=%s got=%s\n" "$name" "$expected" "$code"
FAIL=$((FAIL+1))
fi
}
contains() {
local name="$1" pattern="$2" url="$3"
TOTAL=$((TOTAL+1))
local body
body=$(curl -s "$BASE$url" 2>&1)
if echo "$body" | grep -qE "$pattern"; then
printf " ✓ %-40s pattern=%s\n" "$name" "$pattern"
PASS=$((PASS+1))
else
printf " ✗ %-40s pattern=%s NOT FOUND\n" "$name" "$pattern"
FAIL=$((FAIL+1))
fi
}
echo "================================================================"
echo " GWÖ-Antragsprüfer Smoke-Test gegen $BASE"
echo " $(date -Iseconds)"
echo "================================================================"
echo
echo "[1] Public-Seiten (200 ohne Auth)"
check "v2 Default /" "200" "/"
check "v2 Detail (echte DS)" "200" "/antrag/21/754S"
check "Classic /classic" "200" "/classic"
check "/methodik" "200" "/methodik"
check "/quellen" "200" "/quellen"
check "/impressum" "200" "/impressum"
check "/datenschutz" "200" "/datenschutz"
check "/v2/tags" "200" "/v2/tags"
check "/health" "200" "/health"
echo
echo "[1b] Auth-Routen (302/401 ohne Auth — Redirect zu Login)"
check "/auswertungen (auth)" "302" "/auswertungen"
check "/v2/merkliste (auth)" "302" "/v2/merkliste"
check "/v2/landtag-suche (auth)" "302" "/v2/landtag-suche"
check "/v2/neu (auth)" "302" "/v2/neu"
check "/v2/cluster (admin)" "302" "/v2/cluster"
check "/v2/batch (admin)" "302" "/v2/batch"
echo
echo "[2] API-Endpoints (öffentlich)"
check "/api/assessments" "200" "/api/assessments"
check "/api/bundeslaender" "200" "/api/bundeslaender"
check "/api/clusters" "200" "/api/clusters"
check "/api/queue/status" "200" "/api/queue/status"
check "/api/programme" "200" "/api/programme"
check "/api/feed.xml" "200" "/api/feed.xml"
check "/api/search?q=klima" "200" "/api/search?q=klima"
check "/api/auswertungen/matrix" "200" "/api/auswertungen/matrix"
check "/api/auswertungen/export.csv" "200" "/api/auswertungen/export.csv"
check "/api/auth/me (unauth)" "200" "/api/auth/me"
echo
echo "[3] API-Endpoints (Auth-Schutz)"
check "POST analyze-drucksache (no auth)" "401" "/api/analyze-drucksache" "-X POST -d ''"
check "POST bookmark (no auth)" "401" "/api/bookmark" "-X POST"
check "POST comment (no auth)" "401" "/api/comment" "-X POST"
check "POST vote (no auth)" "401" "/api/vote" "-X POST"
echo
echo "[4] Statics (CSS, Fonts, Icons)"
check "v2 tokens.css" "200" "/static/v2/tokens.css"
check "v2 v2.css" "200" "/static/v2/v2.css"
check "Nunito-Sans woff2" "200" "/static/v2/fonts/nunito-sans-latin-variable.woff2"
check "Phosphor magnifying-glass" "200" "/static/v2/icons/phosphor/magnifying-glass.svg"
echo
echo "[5] Inhalts-Checks"
contains "v2 rendert AppShell" 'v2-shell' "/"
contains "v2 Sidebar vorhanden" 'v2-sidebar' "/"
contains "v2 hat Login-Button" 'v2-auth-control' "/"
contains "Detail rendert ScoreHero" 'big-num' "/antrag/21/754S"
contains "Detail rendert MatrixMini" 'matrix-mini' "/antrag/21/754S"
contains "Detail rendert Programm-Treue" 'Programm-Treue' "/antrag/21/754S"
contains "Detail rendert Voting" 'castVote|v2DetailCastVote' "/antrag/21/754S"
contains "Detail rendert Kommentare" 'v2-comments|loadComments' "/antrag/21/754S"
contains "Detail OG-Meta-Tags" 'og:image' "/antrag/21/754S"
contains "Cluster-API liefert JSON" 'clusters' "/api/clusters"
contains "Auswertungen-Matrix JSON" 'bundeslaender' "/api/auswertungen/matrix"
contains "Feed ist Atom" '<feed|application' "/api/feed.xml"
echo
echo "[6] Live-Suche NRW (durchlauf)"
check "/api/search-landtag (NRW)" "200" "/api/search-landtag?q=schule&bundesland=NRW"
echo
echo "================================================================"
echo " Ergebnis: $PASS/$TOTAL bestanden, $FAIL Fehler"
echo "================================================================"
exit $FAIL