| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- #!/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 ))
|