#!/usr/bin/env bash # Gemeinsame Helfer der End-zu-Ende-Skripte von quick-261008-mzu (wird mit `source` geladen, # hat keine Nebenwirkungen beim Laden). Alles gegen den lokalen Stack und die Test-Nextcloud # aus nc-test-setup.sh. Nur Testwerte; liest keine .env-Dateien. # # Aufgabe 2 ergaenzt hier die Helfer "anna verbinden" (e2e_connect_anna) auf Basis dieser Datei. API=${API:-http://localhost:3001} WEB=${WEB:-http://localhost:3000/api-proxy} NC_BASE=${NC_BASE:-http://172.17.0.1:18080} E2E_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" E2E_TMP=${E2E_TMP:-$(mktemp -d)} # Stoppt mit Meldung, wenn eine Erwartung nicht stimmt. e2e_fail() { echo "E2E FAIL: $*" >&2; exit 1; } # e2e_login [benutzer] [passwort] — meldet an, Cookies landen im . e2e_login() { local jar=$1 user=${2:-admin} pass=${3:-admin123} code code=$(curl -s -o "$E2E_TMP/login.out" -w '%{http_code}' -c "$jar" -H 'Content-Type: application/json' \ -d "{\"username\":\"$user\",\"password\":\"$pass\"}" "$API/auth/login") [ "$code" = "200" ] || [ "$code" = "201" ] || e2e_fail "login $user -> $code" } # e2e_status [json-body] [ausgabedatei] — gibt den HTTP-Status aus, # der Antwortkoerper landet in (Vorgabe $E2E_TMP/body.out). e2e_status() { local jar=$1 method=$2 url=$3 body=${4:-} out=${5:-$E2E_TMP/body.out} if [ -n "$body" ]; then curl -s -o "$out" -w '%{http_code}' -b "$jar" -X "$method" -H 'Content-Type: application/json' -d "$body" "$url" else curl -s -o "$out" -w '%{http_code}' -b "$jar" -X "$method" "$url" fi } # e2e_expect e2e_expect() { [ "$1" = "$2" ] || e2e_fail "$3: erwartet $1, war $2"; } # e2e_contains e2e_contains() { grep -q -- "$2" "$1" || { echo "--- Antwort:" >&2; cat "$1" >&2; echo >&2; e2e_fail "$3: '$2' fehlt"; }; } # e2e_activate [slug] — aktiviert das Modul, falls noch nicht aktiv. e2e_activate() { local jar=$1 slug=${2:-nextcloud-files} id active e2e_status "$jar" GET "$API/modules/catalog" "" "$E2E_TMP/catalog.out" >/dev/null id=$(python3 -I -c 'import json,sys slug=sys.argv[1] for m in json.load(open(sys.argv[2])): if m["slug"]==slug: print(m["id"]); break' "$slug" "$E2E_TMP/catalog.out") [ -n "$id" ] || e2e_fail "Modul $slug nicht im Katalog" active=$(python3 -I -c 'import json,sys slug=sys.argv[1] print([str(m.get("isActiveForTenant")) for m in json.load(open(sys.argv[2])) if m["slug"]==slug][0])' "$slug" "$E2E_TMP/catalog.out") if [ "$active" != "True" ]; then local code code=$(e2e_status "$jar" POST "$API/modules/$id/activate") case "$code" in 200|201) ;; *) e2e_fail "Aktivierung $slug -> $code" ;; esac fi } # e2e_set_address [adresse] — setzt die Nextcloud-Adresse (mit Bestaetigung bei Wechsel). e2e_set_address() { local jar=$1 base=${2:-$NC_BASE} code code=$(e2e_status "$jar" PUT "$API/modules/nextcloud-files/settings" "{\"baseUrl\":\"$base\",\"confirmReconnect\":true}") e2e_expect 200 "$code" "Adresse setzen" } # e2e_second_user — legt (als admin) einen Benutzer mit Rolle USER an, # setzt sein Passwort auf "-Pass-12345" (Pflicht-Passwortwechsel) und meldet ihn an. e2e_second_user() { local name=$1 jar=$2 admin_jar="$E2E_TMP/admin-second.jar" code first="Start-Pass-12345" final="${1}-Pass-12345" e2e_login "$admin_jar" code=$(e2e_status "$admin_jar" POST "$API/users" \ "{\"username\":\"$name\",\"email\":\"$name@example.com\",\"password\":\"$first\",\"displayName\":\"$name\",\"role\":\"USER\"}") case "$code" in 200|201|409) ;; *) e2e_fail "Benutzer $name anlegen -> $code" ;; esac if [ "$code" = "409" ]; then e2e_login "$jar" "$name" "$final" return 0 fi e2e_login "$jar" "$name" "$first" code=$(e2e_status "$jar" POST "$API/auth/change-password" "{\"currentPassword\":\"$first\",\"newPassword\":\"$final\"}") e2e_expect 200 "$code" "Passwortwechsel $name" e2e_login "$jar" "$name" "$final" }