62 lines
2.6 KiB
Bash
62 lines
2.6 KiB
Bash
#!/usr/bin/env bash
|
|
# Verifies the clusev host CLI template renders and behaves. No docker needed — only the
|
|
# help / version / unknown-command paths are exercised. Run from the repo root:
|
|
# bash tests/scripts/test-clusev-cli.sh
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")/../.."
|
|
REPO="$(pwd)"
|
|
TMP="$(mktemp -d)"
|
|
trap 'rm -rf "$TMP"' EXIT
|
|
|
|
fail() { printf 'FAIL: %s\n' "$1" >&2; exit 1; }
|
|
|
|
# Render the template the way install.sh does.
|
|
sed "s|__CLUSEV_DIR__|${REPO}|g" docker/clusev/clusev > "${TMP}/clusev"
|
|
chmod +x "${TMP}/clusev"
|
|
CLI="${TMP}/clusev"
|
|
|
|
# 1. Valid bash syntax.
|
|
bash -n "$CLI" || fail "syntax error in rendered clusev"
|
|
|
|
# 2. help lists the key subcommands.
|
|
out="$("$CLI" help)"
|
|
for needle in "clusev update" "clusev reset-admin" "clusev logs" "clusev ps" "clusev migrate"; do
|
|
printf '%s' "$out" | grep -qF "$needle" || fail "help missing: $needle"
|
|
done
|
|
|
|
# 3. bare invocation and --help also show usage.
|
|
"$CLI" | grep -qF "clusev reset-admin" || fail "bare invocation did not show usage"
|
|
"$CLI" --help | grep -qF "clusev reset-admin" || fail "--help did not show usage"
|
|
|
|
# 4. unknown command exits 64 and warns on stderr.
|
|
set +e
|
|
"$CLI" definitely-not-a-command >/dev/null 2>"${TMP}/err"; rc=$?
|
|
set -e
|
|
[ "$rc" -eq 64 ] || fail "unknown command exit = $rc (want 64)"
|
|
grep -qF "Unbekannter Befehl" "${TMP}/err" || fail "unknown command did not warn"
|
|
|
|
# 5. version reads config/clusev.php (no docker).
|
|
want="$(grep -oE "'version' => '[^']+'" config/clusev.php | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n1)"
|
|
got="$("$CLI" version)"
|
|
[ "$got" = "$want" ] || fail "version = '$got' (want '$want')"
|
|
|
|
# 6. install.sh wires the CLI into PATH.
|
|
grep -qF "/usr/local/bin/clusev" install.sh || fail "install.sh does not install /usr/local/bin/clusev"
|
|
|
|
# 7. usage text must NOT leak the long compose filename.
|
|
printf '%s' "$out" | grep -qF "docker-compose.prod.yml" && fail "usage leaks docker-compose.prod.yml"
|
|
|
|
# 8. A hostile install path (shell syntax) must not inject code into the rendered CLI.
|
|
# install.sh escapes the path with printf %q before substituting it; mimic that here and
|
|
# confirm running the rendered script does NOT execute the embedded command.
|
|
evil="/tmp/x \$(touch ${TMP}/PWNED) y"
|
|
esc="$(printf '%q' "$evil")"
|
|
tmpl="$(cat docker/clusev/clusev)"
|
|
printf '%s' "${tmpl//__CLUSEV_DIR__/$esc}" > "${TMP}/clusev-evil"
|
|
chmod +x "${TMP}/clusev-evil"
|
|
bash -n "${TMP}/clusev-evil" || fail "rendered evil-path CLI has bad syntax"
|
|
"${TMP}/clusev-evil" help >/dev/null 2>&1 || true
|
|
[ ! -e "${TMP}/PWNED" ] || fail "hostile install path injected code into the rendered CLI"
|
|
|
|
printf 'ok — clusev CLI checks passed\n'
|