#!/usr/bin/env bash set -euo pipefail BASE_URL="${1:-http://localhost:8080}" PASS=0 FAIL=0 USER_COOKIE="$(mktemp)" ADMIN_COOKIE="$(mktemp)" WORK_DIR="$(mktemp -d)" SLUG="psmoke$(date +%s)${RANDOM}" cleanup() { rm -f "$USER_COOKIE" "$ADMIN_COOKIE" rm -rf "$WORK_DIR" } trap cleanup EXIT pass() { echo "PASS: $1" PASS=$((PASS + 1)) } fail() { echo "FAIL: $1" FAIL=$((FAIL + 1)) } csrf_token() { local cookie_file="$1" awk '$6 == "XSRF-TOKEN" { print $7 }' "$cookie_file" | tail -n 1 } bootstrap_csrf() { local cookie_file="$1" local user_id="$2" curl -s -c "$cookie_file" -H "X-Mock-User-Id: $user_id" "$BASE_URL/api/v1/auth/providers" >/dev/null } json_field() { local json="$1" local expr="$2" JSON_INPUT="$json" python3 - "$expr" <<'PY' import json import os import sys expr = sys.argv[1] value = json.loads(os.environ["JSON_INPUT"]) for part in expr.split("."): if part.isdigit(): value = value[int(part)] else: value = value[part] if isinstance(value, (dict, list)): print(json.dumps(value, ensure_ascii=False)) else: print(value) PY } assert_code() { local description="$1" local json="$2" local expected="$3" local actual actual="$(json_field "$json" "code")" if [[ "$actual" == "$expected" ]]; then pass "$description" else fail "$description (expected code $expected, got $actual)" fi } echo "=== Promotion Workflow Smoke Test ===" echo "Target: $BASE_URL" echo "Slug: $SLUG" echo bootstrap_csrf "$USER_COOKIE" "local-user" bootstrap_csrf "$ADMIN_COOKIE" "local-admin" USER_CSRF="$(csrf_token "$USER_COOKIE")" ADMIN_CSRF="$(csrf_token "$ADMIN_COOKIE")" if [[ -z "$USER_CSRF" || -z "$ADMIN_CSRF" ]]; then echo "Could not bootstrap CSRF tokens" exit 1 fi GLOBAL_RESPONSE="$(curl -sS -H "X-Mock-User-Id: local-admin" -b "$ADMIN_COOKIE" -c "$ADMIN_COOKIE" \ "$BASE_URL/api/web/namespaces/global")" assert_code "Global namespace detail is available" "$GLOBAL_RESPONSE" "0" GLOBAL_NAMESPACE_ID="$(json_field "$GLOBAL_RESPONSE" "data.id")" CREATE_NAMESPACE_RESPONSE="$(curl -sS -H "X-Mock-User-Id: local-admin" -b "$ADMIN_COOKIE" -c "$ADMIN_COOKIE" \ -H "X-XSRF-TOKEN: $ADMIN_CSRF" \ -H "Content-Type: application/json" \ -X POST "$BASE_URL/api/web/namespaces" \ -d "{\"slug\":\"$SLUG\",\"displayName\":\"Promotion Smoke $SLUG\",\"description\":\"promotion smoke test\"}")" assert_code "Admin can create promotion smoke namespace" "$CREATE_NAMESPACE_RESPONSE" "0" NAMESPACE_ID="$(json_field "$CREATE_NAMESPACE_RESPONSE" "data.id")" ADD_MEMBER_RESPONSE="$(curl -sS -H "X-Mock-User-Id: local-admin" -b "$ADMIN_COOKIE" -c "$ADMIN_COOKIE" \ -H "X-XSRF-TOKEN: $ADMIN_CSRF" \ -H "Content-Type: application/json" \ -X POST "$BASE_URL/api/web/namespaces/$SLUG/members" \ -d '{"userId":"local-user","role":"MEMBER"}')" assert_code "Admin can add the regular user as a namespace member" "$ADD_MEMBER_RESPONSE" "0" cat > "$WORK_DIR/SKILL.md" <