#!/usr/bin/env bash # test_wiki_router.sh — End-to-end Tests für wiki_router-Endpunkte (Health, Login, SMW-Ask, Page Info/Parse/Detail) # Voraussetzungen: # - laufende FastAPI (uvicorn) unter http://localhost:8000 # - jq installiert # - optional: .env im selben Verzeichnis mit WIKI_BOT_USER / WIKI_BOT_PASSWORD set -euo pipefail export LC_ALL=C.UTF-8 LANG=C.UTF-8 API_BASE="http://localhost:8000/import/wiki" CATEGORY_DEFAULT="Übungen" CATEGORY="${WIKI_CATEGORY:-$CATEGORY_DEFAULT}" # --- Hilfsfunktionen --- die() { echo " ❌ $*" >&2; exit 1; } ok() { echo " ✅ $*"; } info(){ echo " → $*"; } # .env laden (falls vorhanden) if [[ -f .env ]]; then set -o allexport; source .env; set +o allexport fi # Debug: Maskiertes Echo der ENV echo "DBG: User=${WIKI_BOT_USER:-}, Pass=$( [[ -n "${WIKI_BOT_PASSWORD:-}" ]] && echo set || echo unset )" echo "1) Health-Check" HC_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$API_BASE/health" | tr -d '\r') [[ "$HC_CODE" == "200" ]] || die "Health failed (HTTP $HC_CODE)" ok "Health OK" echo echo "2) Login" [[ -n "${WIKI_BOT_USER:-}" && -n "${WIKI_BOT_PASSWORD:-}" ]] || die "ENV nicht gesetzt (WIKI_BOT_USER / WIKI_BOT_PASSWORD)" # JSON sicher bauen LOGIN_JSON=$(jq -nc --arg u "$WIKI_BOT_USER" --arg p "$WIKI_BOT_PASSWORD" '{username:$u, password:$p}') # Request ausführen (mit klarer Fehleranzeige) RAW_LOGIN_RESP=$(curl -sS -X POST "$API_BASE/login" -H 'Content-Type: application/json' -d "$LOGIN_JSON" | tr -d '\r' || true) # Prüfen, ob es valides JSON ist if ! echo "$RAW_LOGIN_RESP" | jq . >/dev/null 2>&1; then echo "$RAW_LOGIN_RESP" die "Login-Response ist kein valides JSON (oben roh ausgegeben)" fi echo "$RAW_LOGIN_RESP" | jq . STATUS=$(echo "$RAW_LOGIN_RESP" | jq -r '.status // empty') [[ "$STATUS" == "success" ]] || die "Login failed: $(echo "$RAW_LOGIN_RESP" | jq -r '.message // "Login fehlgeschlagen"')" ok "Login successful" echo echo "3) SMW-Ask: Alle Übungen zählen" COUNT_JSON=$(curl -s -G "$API_BASE/semantic/pages" --data-urlencode "category=$CATEGORY" | tr -d '\r' || true) if ! echo "$COUNT_JSON" | jq . >/dev/null 2>&1; then echo "$COUNT_JSON" die "SMW-Ask Count: Response ist kein valides JSON" fi EXERCISE_COUNT=$(echo "$COUNT_JSON" | jq 'keys | length') info "$EXERCISE_COUNT Übungen gefunden" echo echo "4) SMW-Ask: Erste 5 Übungstitel" FIRST5_JSON=$(curl -s -G "$API_BASE/semantic/pages" --data-urlencode "category=$CATEGORY" | tr -d '\r' || true) if ! echo "$FIRST5_JSON" | jq . >/dev/null 2>&1; then echo "$FIRST5_JSON" die "SMW-Ask Titel: Response ist kein valides JSON" fi echo "$FIRST5_JSON" | jq -r 'keys[0:5][]' | sed 's/^/ • /' TITLE="Affenklatschen" echo echo "5) Core-API Info für \"$TITLE\"" INFO_RESP=$(curl -s -G "$API_BASE/info" --data-urlencode "title=$TITLE" | tr -d '\r' || true) if ! echo "$INFO_RESP" | jq . >/dev/null 2>&1; then echo "$INFO_RESP" die "Info: Response ist kein valides JSON" fi echo "$INFO_RESP" | jq PAGEID=$(echo "$INFO_RESP" | jq -r '.pageid') FULLURL=$(echo "$INFO_RESP" | jq -r '.fullurl // empty') [[ "$PAGEID" =~ ^[0-9]+$ ]] || die "Info failed: pageid ungültig" ok "pageid=$PAGEID, url=${FULLURL:-}" echo echo "6) Parse-Endpoint für pageid=$PAGEID" PARSE_RESP=$(curl -s -G "$API_BASE/parsepage" --data-urlencode "pageid=$PAGEID" --data-urlencode "title=$TITLE" | tr -d '\r' || true) if ! echo "$PARSE_RESP" | jq . >/dev/null 2>&1; then echo "$PARSE_RESP" die "Parse: Response ist kein valides JSON" fi # Wikitext-Auszug (falls vorhanden) WT=$(echo "$PARSE_RESP" | jq -r '.wikitext // ""') printf '%s\n' "${WT:0:200}…" ok "Wikitext (erster Ausschnitt) geladen" echo echo "7) Detail-Endpoint für \"$TITLE\"" DETAIL_RESP=$(curl -s -G "$API_BASE/semantic/page" --data-urlencode "category=$CATEGORY" --data-urlencode "title=$TITLE" | tr -d '\r' || true) if ! echo "$DETAIL_RESP" | jq . >/dev/null 2>&1; then echo "$DETAIL_RESP" die "Detail: Response ist kein valides JSON" fi echo "$DETAIL_RESP" | jq '{title: .title, pageid: .pageid, fullurl: .fullurl, printouts: .printouts, wikitext_length: (.wikitext|length)}' ok "Detail-Endpoint liefert erwartete Felder" echo echo "🎉 Alle Tests erfolgreich abgeschlossen!"