#!/usr/bin/env bash # # test-promotion-flow.sh — End-to-end integration test for promotion flows # # Tests: register → onboarding → growth-tasks → share → invite → # milestone → leaderboard → coupon # # Usage: # BASE_URL=http://localhost:9082 ./test-promotion-flow.sh # set -euo pipefail BASE_URL="${BASE_URL:-http://localhost:9082}" PASS=0 FAIL=0 # ── helpers ────────────────────────────────────────────────────────── header() { echo ""; echo "===== $1 ====="; } api() { local ep="$1" tok="$2" body="${3:-{}}" curl -s -X POST "${BASE_URL}${ep}" \ -H "Content-Type: application/json" \ $( [ -n "$tok" ] && echo "-H Authorization: Bearer ${tok}" ) \ -d "$body" } json_get() { python3 -c " import sys, json d = json.load(sys.stdin) parts = '$2'.split('.') v = d for p in parts: if isinstance(v, dict): v = v.get(p, '') elif isinstance(v, list): try: idx = int(p) v = v[idx] if idx < len(v) else '' except ValueError: v = '' else: v = '' if v == '': break print(v if v != '' else '') " <<< "$1" 2>/dev/null || echo "" } passert() { local tn="$1" json="$2" if echo "$json" | python3 -c " import sys,json d=json.load(sys.stdin) exit(0 if d.get('code')==200 else 1) " 2>/dev/null; then echo " PASS: $tn" ((PASS++)) else local msg msg=$(echo "$json" | python3 -c " import sys,json d=json.load(sys.stdin) print(d.get('message','no message')) " 2>/dev/null) echo " FAIL: $tn — $msg" ((FAIL++)) fi } header "0. Health Check" R=$(api "/api/auth/check-phone" "" '{"phone":"13800000001"}') passert "Server reachable" "$R" header "1. Register User1 (parent)" PHONE1="138$(printf '%08d' $((RANDOM%100000000)))" R=$(api "/api/auth/direct-register" "" \ "{\"phone\":\"$PHONE1\",\"nickname\":\"TestParent\",\"role\":\"parent\"}") passert "Register user1" "$R" TOKEN1=$(json_get "$R" "data.token") echo " user1: $PHONE1 id=$(json_get "$R" "data.userId")" # ── 2. Onboarding progress ─────────────────────────────────────────── header "2. Onboarding Progress" R=$(api "/api/onboarding/progress" "$TOKEN1") passert "Onboarding progress" "$R" header "3. Claim REGISTER Reward" R=$(api "/api/onboarding/claim" "$TOKEN1" '{"taskType":"REGISTER"}') passert "Claim REGISTER reward" "$R" header "4. List Daily Growth Tasks" R=$(api "/api/growth-task/list" "$TOKEN1" '{"type":"DAILY"}') passert "List daily growth tasks" "$R" header "5. Get Referral Code" R=$(api "/api/invite/code" "$TOKEN1") passert "Get referral code" "$R" CODE=$(json_get "$R" "data") echo " referral code: $CODE" header "6. Register User2 + Bind Referral" PHONE2="138$(printf '%08d' $((RANDOM%100000000)))" R=$(api "/api/auth/direct-register" "" \ "{\"phone\":\"$PHONE2\",\"nickname\":\"TestReferral\",\"role\":\"parent\"}") passert "Register user2" "$R" TOKEN2=$(json_get "$R" "data.token") echo " user2: $PHONE2 id=$(json_get "$R" "data.userId")" R=$(api "/api/invite/bind" "$TOKEN2" "{\"referralCode\":\"$CODE\"}") passert "Bind referral" "$R" # ── 7. Invite milestones ───────────────────────────────────────────── header "7. Invite Milestones" R=$(api "/api/invite/milestone/list" "$TOKEN1") passert "List milestones" "$R" # ── 8. Leaderboard ─────────────────────────────────────────────────── header "8. Leaderboard" R=$(api "/api/leaderboard/top" "") passert "Leaderboard top 20" "$R" R=$(api "/api/leaderboard/my-rank" "$TOKEN1") passert "My rank" "$R" # ── 9. Coupon flow ─────────────────────────────────────────────────── header "9. Coupon Flow" R=$(api "/api/coupon/list" "$TOKEN1") passert "List available coupons" "$R" CID=$(json_get "$R" "data.0.id") if [ -n "$CID" ]; then R=$(api "/api/coupon/claim" "$TOKEN1" "{\"couponId\":$CID}") passert "Claim coupon #$CID" "$R" UID=$(json_get "$R" "data") echo " userCouponId: $UID" if [[ "$UID" =~ ^[0-9]+$ ]]; then R=$(api "/api/coupon/apply" "$TOKEN1" \ "{\"userCouponId\":$UID,\"orderType\":\"PRODUCT\",\"orderAmount\":10000}") passert "Apply coupon" "$R" fi else echo " INFO: no coupons available — claim skipped (expected on fresh system)" echo " PASS: coupon list returned (no coupons to claim)" ((PASS++)) fi # ── Summary ────────────────────────────────────────────────────────── header "Results" TOTAL=$((PASS + FAIL)) echo " Total: $TOTAL | Passed: $PASS | Failed: $FAIL" [ "$FAIL" -eq 0 ] && echo " ✅ ALL TESTS PASSED" || echo " ❌ $FAIL TEST(S) FAILED" exit $(( FAIL > 0 ))