Rimuove link al portale Stripe in area cliente, aggiunge flusso admin per PDF fattura e email, blocca checkout senza dati di fatturazione, allinea prezzi a €4,90/€39,90 e €9,90/€69,90, locale italiano e documentazione deploy. Co-authored-by: Cursor <cursoragent@cursor.com>
84 lines
3.4 KiB
Bash
Executable File
84 lines
3.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Test scelta mensile/annuale + redirect Checkout con price id corretto
|
|
set -euo pipefail
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
COMPOSE="docker compose -f $ROOT/infra/docker-compose.yml"
|
|
BASE="${BASE_URL:-http://localhost:3000}"
|
|
COOKIES=$(mktemp)
|
|
trap 'rm -f "$COOKIES"' EXIT
|
|
|
|
pass=0
|
|
fail=0
|
|
ok() { echo "OK $1"; pass=$((pass+1)); }
|
|
ko() { echo "FAIL $1"; fail=$((fail+1)); }
|
|
|
|
read_env() {
|
|
grep -E "^$1=" "$ROOT/infra/.env" 2>/dev/null | head -1 | cut -d= -f2- | tr -d '\r' || true
|
|
}
|
|
|
|
YEARLY_LIGHT=$(read_env STRIPE_PREMIUM_LIGHT_YEARLY_PRICE_ID)
|
|
[[ -z "$YEARLY_LIGHT" ]] && YEARLY_LIGHT=$(read_env STRIPE_PREMIUM_LIGHT_PRICE_ID)
|
|
MONTHLY_LIGHT=$(read_env STRIPE_PREMIUM_LIGHT_MONTHLY_PRICE_ID)
|
|
|
|
login() {
|
|
curl -sf -c "$COOKIES" "$BASE/login" -o /tmp/mltv_login.html
|
|
T=$(grep -oP 'name="authenticity_token" value="\K[^"]+' /tmp/mltv_login.html | head -1)
|
|
curl -sf -c "$COOKIES" -b "$COOKIES" -X POST "$BASE/login" \
|
|
-d "authenticity_token=$T" -d "email=coach@matchlivetv.test" -d "password=password123" -o /dev/null
|
|
}
|
|
|
|
echo "== Test intervalli billing =="
|
|
|
|
$COMPOSE exec -T rails bundle exec rails db:migrate >/dev/null 2>&1 || true
|
|
|
|
$COMPOSE exec -T rails bundle exec rails runner "
|
|
club = Club.first
|
|
club.update!(
|
|
billing_legal_name: 'ASD Test', billing_email: 'bill@test.it',
|
|
billing_address_line: 'Via 1', billing_city: 'Milano', billing_postal_code: '20100',
|
|
billing_vat_number: '12345678901', billing_recipient_code: 'ABCDEFG'
|
|
)
|
|
sub = club.subscription || club.create_subscription!(plan: Plan['free'], status: 'active')
|
|
sub.update!(plan: Plan['free'], stripe_subscription_id: nil, billing_interval: nil)
|
|
puts club.id
|
|
" >/dev/null 2>&1 && ok "setup club billing" || ko "setup club billing"
|
|
|
|
CLUB_ID=$($COMPOSE exec -T rails bundle exec rails runner "puts Club.first.id" 2>/dev/null | tail -1)
|
|
|
|
login && ok "login" || ko "login"
|
|
|
|
BODY=$(curl -sf -b "$COOKIES" "$BASE/clubs/$CLUB_ID/billing")
|
|
echo "$BODY" | grep -q "Attiva Premium Light — €40/anno" && ok "UI bottone annuale Light" || ko "UI bottone annuale Light"
|
|
if [[ -n "$MONTHLY_LIGHT" ]]; then
|
|
echo "$BODY" | grep -q "Attiva Premium Light — €5/mese" && ok "UI bottone mensile Light" || ko "UI bottone mensile Light"
|
|
else
|
|
echo "$BODY" | grep -q "€5/mese" && ko "UI mensile assente se non configurato" || ok "UI mensile nascosto (price id mancante)"
|
|
fi
|
|
|
|
if [[ -n "$YEARLY_LIGHT" ]]; then
|
|
HEADERS=$(curl -s -D - -o /dev/null -b "$COOKIES" "$BASE/clubs/$CLUB_ID/checkout?plan=premium_light&interval=yearly" | tr -d '\r')
|
|
if echo "$HEADERS" | grep -qi "location:.*checkout\.stripe\.com"; then
|
|
ok "redirect checkout annuale"
|
|
else
|
|
ko "redirect checkout annuale"
|
|
fi
|
|
|
|
PRICE_USED=$($COMPOSE exec -T rails bundle exec rails runner "
|
|
puts Billing::Stripe::PriceCatalog.price_id(plan_slug: 'premium_light', interval: 'yearly')
|
|
" 2>/dev/null | tail -1)
|
|
[[ "$PRICE_USED" == "$YEARLY_LIGHT" ]] && ok "price id annuale corretto ($PRICE_USED)" || ko "price id annuale ($PRICE_USED vs $YEARLY_LIGHT)"
|
|
fi
|
|
|
|
$COMPOSE exec -T rails bundle exec rspec \
|
|
spec/services/billing/stripe/price_catalog_spec.rb \
|
|
spec/services/billing/stripe/checkout_session_spec.rb \
|
|
spec/services/billing/stripe/change_plan_spec.rb \
|
|
spec/helpers/public/billing_helper_spec.rb \
|
|
--format progress 2>&1 | tail -3
|
|
RS=$?
|
|
[[ $RS -eq 0 ]] && ok "RSpec billing intervals" || ko "RSpec billing intervals"
|
|
|
|
echo ""
|
|
echo "Risultato: $pass OK, $fail FAIL"
|
|
[[ "$fail" -eq 0 ]]
|