Files

89 lines
3.2 KiB
Bash

#!/usr/bin/env bash
# Seed verified users for IFT stress hot-path (ift-users.csv).
# Usage (from EventHubBack root or anywhere):
# COUNT=400 bash test/tsung/seed-ift-users.sh
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
ENV_FILE="${ENV_FILE:-$ROOT/docker/.env.ift}"
OUT="${OUT:-$ROOT/test/tsung/ift-users.csv}"
COUNT="${COUNT:-400}"
PASSWORD="${SEED_PASSWORD:-testpassword123}"
API="${API_BASE:-https://api.ift.eventhub.local}"
ADMIN_API="${ADMIN_API_BASE:-https://admin-api.ift.eventhub.local}"
PREFIX="${SEED_PREFIX:-lt_stress_$(date +%Y%m%d%H%M%S)}"
if [[ ! -f "$ENV_FILE" ]]; then
echo "Missing $ENV_FILE" >&2
exit 1
fi
set -a
# shellcheck disable=SC1091
source <(sed $'s/\xEF\xBB\xBF//' "$ENV_FILE" | tr -d '\r' | grep -E '^(ADMIN_SUPER_|ADMIN_EMAIL|ADMIN_PASSWORD|SMOKE_ADMIN_)')
set +a
ADMIN_EMAIL_V="${SMOKE_ADMIN_EMAIL:-${ADMIN_SUPER_EMAIL:-$ADMIN_EMAIL}}"
ADMIN_PASS_V="${SMOKE_ADMIN_PASSWORD:-${ADMIN_SUPER_PASSWORD:-$ADMIN_PASSWORD}}"
if [[ -z "${ADMIN_EMAIL_V:-}" || -z "${ADMIN_PASS_V:-}" ]]; then
echo "No admin credentials in $ENV_FILE" >&2
exit 1
fi
echo "=== admin login ==="
ADMIN_JSON=$(curl -skf --connect-timeout 15 -X POST "$ADMIN_API/v1/admin/login" \
-H 'Content-Type: application/json' \
-d "{\"email\":\"${ADMIN_EMAIL_V}\",\"password\":\"${ADMIN_PASS_V}\"}")
ADMIN_TOKEN=$(printf '%s' "$ADMIN_JSON" | python3 -c 'import json,sys; print(json.load(sys.stdin)["token"])')
: > "$OUT"
OK=0
FAIL=0
for i in $(seq 1 "$COUNT"); do
EMAIL="${PREFIX}_${i}@loadtest.local"
REG=$(curl -sk --connect-timeout 15 -w '\n%{http_code}' -X POST "$API/v1/register" \
-H 'Content-Type: application/json' \
-d "{\"email\":\"${EMAIL}\",\"password\":\"${PASSWORD}\"}" || true)
BODY=$(printf '%s' "$REG" | head -n -1)
CODE=$(printf '%s' "$REG" | tail -n 1)
if [[ "$CODE" != "201" && "$CODE" != "200" ]]; then
echo "register fail i=$i code=$CODE body=$BODY" >&2
FAIL=$((FAIL + 1))
continue
fi
USER_ID=$(printf '%s' "$BODY" | python3 -c 'import json,sys; print(json.load(sys.stdin)["user"]["id"])')
VT=$(curl -sk --connect-timeout 15 -w '\n%{http_code}' -X GET \
"$ADMIN_API/v1/admin/users/${USER_ID}/verification-token" \
-H "Authorization: Bearer ${ADMIN_TOKEN}" || true)
VT_BODY=$(printf '%s' "$VT" | head -n -1)
VT_CODE=$(printf '%s' "$VT" | tail -n 1)
if [[ "$VT_CODE" != "200" ]]; then
echo "vtoken fail i=$i code=$VT_CODE" >&2
FAIL=$((FAIL + 1))
continue
fi
VTOKEN=$(printf '%s' "$VT_BODY" | python3 -c 'import json,sys; print(json.load(sys.stdin)["token"])')
VER_CODE=$(curl -sk --connect-timeout 15 -o /dev/null -w '%{http_code}' -X POST "$API/v1/verify" \
-H 'Content-Type: application/json' \
-d "{\"token\":\"${VTOKEN}\"}" || true)
if [[ "$VER_CODE" != "200" && "$VER_CODE" != "201" && "$VER_CODE" != "204" ]]; then
echo "verify fail i=$i code=$VER_CODE" >&2
FAIL=$((FAIL + 1))
continue
fi
printf '%s;%s\n' "$EMAIL" "$PASSWORD" >> "$OUT"
OK=$((OK + 1))
if (( i % 25 == 0 )); then
echo " seeded $i/$COUNT (ok=$OK fail=$FAIL)"
fi
done
chmod 600 "$OUT"
echo "=== done ok=$OK fail=$FAIL out=$OUT prefix=$PREFIX ==="
if (( OK < 10 )); then
echo "Too few users seeded" >&2
exit 1
fi