#!/usr/bin/env bash # E2E quick-261008-w5w: Modul-Changelog gegen den lokalen Stack. # Aufruf: e2e-changelog.sh [slug ...] # Mit Argumenten MUESSEN genau diese Slugs einen nicht leeren Changelog haben; # ohne Argumente gilt das fuer JEDEN Slug im Katalog. # Nur Testwerte (admin/admin123), liest keine .env-Dateien. set -u API=${API:-http://localhost:3001} TMP=$(mktemp -d) JAR="$TMP/jar" fail() { echo "E2E FAIL: $*" >&2; exit 1; } # (1) ohne Anmeldung -> 401 (Route existiert, ist geschuetzt) code=$(curl -s -o /dev/null -w '%{http_code}' "$API/modules/changelog/nextcloud-status") [ "$code" = "401" ] || fail "ohne Anmeldung erwartet 401, war $code" # (2) anmelden code=$(curl -s -o "$TMP/login.out" -w '%{http_code}' -c "$JAR" -H 'Content-Type: application/json' \ -d '{"username":"admin","password":"admin123"}' "$API/auth/login") { [ "$code" = "200" ] || [ "$code" = "201" ]; } || fail "login -> $code" # (3) unbekannte Kennungen und Prototyp-Namen -> 200 und genau [] for slug in does-not-exist __proto__ constructor toString; do code=$(curl -s -o "$TMP/body.out" -w '%{http_code}' -b "$JAR" "$API/modules/changelog/$slug") [ "$code" = "200" ] || fail "$slug erwartet 200, war $code" [ "$(tr -d ' \n' < "$TMP/body.out")" = "[]" ] || fail "$slug erwartet [], war $(head -c 200 "$TMP/body.out")" done # (4)+(5) Katalog laden, je Slug Changelog holen und Versionen vergleichen code=$(curl -s -o "$TMP/catalog.out" -w '%{http_code}' -b "$JAR" "$API/modules/catalog") [ "$code" = "200" ] || fail "Katalog -> $code" slugs=$(node -e 'const c=JSON.parse(require("fs").readFileSync(process.argv[1],"utf8"));console.log(c.map(m=>m.slug+"="+m.version).join(" "))' "$TMP/catalog.out") [ -n "$slugs" ] || fail "Katalog leer" required="$*" checked=0 for entry in $slugs; do slug=${entry%%=*} version=${entry#*=} code=$(curl -s -o "$TMP/cl.out" -w '%{http_code}' -b "$JAR" "$API/modules/changelog/$slug") [ "$code" = "200" ] || fail "$slug: Changelog -> $code" latest=$(node -e 'const c=JSON.parse(require("fs").readFileSync(process.argv[1],"utf8"));console.log(Array.isArray(c)&&c.length?c[0].version:"")' "$TMP/cl.out") if [ -z "$latest" ]; then if [ -z "$required" ] || [[ " $required " == *" $slug "* ]]; then fail "$slug: Changelog ist leer, wird aber verlangt" fi continue fi [ "$latest" = "$version" ] || fail "$slug: Katalog-Version $version ungleich Changelog $latest" checked=$((checked + 1)) echo " $slug $version" done for slug in $required; do [[ " $slugs " == *" $slug="* ]] || fail "$slug nicht im Katalog" done [ "$checked" -gt 0 ] || fail "kein Modul mit Changelog gefunden" echo "e2e-changelog ok"