Trainer_LLM/llm-api/test_wiki_router.sh

111 lines
4.1 KiB
Bash
Executable File

#!/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:-<unset>}, 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:-<none>}"
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!"