79210d7966
- 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>
58 lines
2.6 KiB
Bash
Executable File
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"
|