111 lines
4.1 KiB
Bash
Executable File
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!"
|