Files
tessera-ctl/.planning/quick/261008-w5w-modul-changelog-und-modulversionen-nacht/e2e/e2e-changelog.sh
T
schalli 79210d7966 feat(quick-261008-w5w): Modul-Changelog Durchstich mit Nextcloud-Status
- Typen, Register, Route GET /modules/changelog/:slug, Waechter-Test
- Seed liest die Version per latestVersion aus dem Changelog
- Marktplatz-Detailseite zeigt den Abschnitt Aenderungen

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-08 23:25:02 +02:00

58 lines
2.6 KiB
Bash
Executable File

#!/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"