99 lines
2.8 KiB
Bash
Executable File
99 lines
2.8 KiB
Bash
Executable File
#!/bin/sh
|
|
# Staging / production smoke. Verifies CR-98 acceptance criteria (curl-able checks).
|
|
# See docs/guides/ops-backend-deploy.md §10.
|
|
#
|
|
# Usage:
|
|
# ./scripts/staging-smoke.sh
|
|
# ./scripts/staging-smoke.sh communityrule.info
|
|
# EMAIL=you@example.com ./scripts/staging-smoke.sh staging.communityrule.info
|
|
#
|
|
# Manual follow-up (not automated here): click magic link in inbox, publish a rule,
|
|
# optional upload with UPLOAD_ROOT set.
|
|
|
|
set -eu
|
|
|
|
HOST="${1:-staging.communityrule.info}"
|
|
BASE="https://${HOST}"
|
|
FAIL=0
|
|
|
|
pass() {
|
|
printf 'PASS %s\n' "$1"
|
|
}
|
|
|
|
fail() {
|
|
printf 'FAIL %s\n' "$1"
|
|
FAIL=1
|
|
}
|
|
|
|
check_http() {
|
|
name="$1"
|
|
url="$2"
|
|
expected_status="$3"
|
|
|
|
status="$(curl -sS -o /tmp/staging-smoke-body.$$ -w '%{http_code}' "$url" || echo '000')"
|
|
if [ "$status" = "$expected_status" ]; then
|
|
pass "$name (HTTP $status)"
|
|
else
|
|
fail "$name (expected HTTP $expected_status, got $status)"
|
|
if [ -f "/tmp/staging-smoke-body.$$" ]; then
|
|
head -c 500 "/tmp/staging-smoke-body.$$" 1>&2 || true
|
|
printf '\n' 1>&2
|
|
fi
|
|
fi
|
|
}
|
|
|
|
check_json_contains() {
|
|
name="$1"
|
|
pattern="$2"
|
|
if grep -Fq "$pattern" "/tmp/staging-smoke-body.$$" 2>/dev/null; then
|
|
pass "$name"
|
|
else
|
|
fail "$name (body missing pattern: $pattern)"
|
|
head -c 500 "/tmp/staging-smoke-body.$$" 1>&2 || true
|
|
printf '\n' 1>&2
|
|
fi
|
|
}
|
|
|
|
printf 'Smoke target: %s\n\n' "$BASE"
|
|
|
|
check_http "GET /api/health" "$BASE/api/health" "200"
|
|
check_json_contains 'health ok + database connected' '"ok":true'
|
|
check_json_contains 'health database connected' '"database":"connected"'
|
|
|
|
check_http "GET /api/templates" "$BASE/api/templates" "200"
|
|
check_json_contains 'templates response shape' '"templates":['
|
|
check_json_contains 'templates seeded (non-empty)' '"slug":'
|
|
|
|
check_http "GET /api/rules" "$BASE/api/rules" "200"
|
|
check_json_contains 'rules list shape' '"rules":['
|
|
|
|
if [ -n "${EMAIL:-}" ]; then
|
|
status="$(curl -sS -o /tmp/staging-smoke-body.$$ -w '%{http_code}' \
|
|
-X POST "$BASE/api/auth/magic-link/request" \
|
|
-H 'Content-Type: application/json' \
|
|
-d "{\"email\":\"$EMAIL\"}" || echo '000')"
|
|
if [ "$status" = "200" ]; then
|
|
check_json_contains 'magic-link request ok' '"ok":true'
|
|
pass "POST /api/auth/magic-link/request (HTTP 200)"
|
|
printf ' Check inbox for %s — link host must be %s\n' "$EMAIL" "$HOST"
|
|
else
|
|
fail "POST /api/auth/magic-link/request (expected HTTP 200, got $status)"
|
|
head -c 500 "/tmp/staging-smoke-body.$$" 1>&2 || true
|
|
printf '\n' 1>&2
|
|
fi
|
|
else
|
|
printf 'SKIP POST /api/auth/magic-link/request (set EMAIL= to run)\n'
|
|
fi
|
|
|
|
rm -f "/tmp/staging-smoke-body.$$"
|
|
|
|
printf '\n'
|
|
if [ "$FAIL" -eq 0 ]; then
|
|
printf 'All automated checks passed.\n'
|
|
printf 'Manual: click magic link, publish a rule, load public detail.\n'
|
|
exit 0
|
|
fi
|
|
|
|
printf 'One or more checks failed.\n'
|
|
exit 1
|