Initial commit: monorepo Match Live TV.
Rails API, app Flutter, infrastruttura Docker/MediaMTX, sito marketing e documentazione di deploy. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
72
scripts/e2e_api.sh
Executable file
72
scripts/e2e_api.sh
Executable file
@@ -0,0 +1,72 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
API="${API:-http://localhost:3000}"
|
||||
PLATFORM="${PLATFORM:-matchlivetv}"
|
||||
|
||||
echo "== Login =="
|
||||
LOGIN=$(curl -sf -X POST "$API/api/v1/auth/login" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"email":"coach@matchlivetv.test","password":"password123"}')
|
||||
TOKEN=$(echo "$LOGIN" | python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])")
|
||||
echo "OK token received"
|
||||
|
||||
AUTH="Authorization: Bearer $TOKEN"
|
||||
|
||||
echo "== Teams =="
|
||||
TEAMS=$(curl -sf -H "$AUTH" "$API/api/v1/teams")
|
||||
TEAM_ID=$(echo "$TEAMS" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['id'])")
|
||||
echo "Team: $TEAM_ID"
|
||||
|
||||
echo "== Matches =="
|
||||
MATCHES=$(curl -sf -H "$AUTH" "$API/api/v1/teams/$TEAM_ID/matches")
|
||||
MATCH_ID=$(echo "$MATCHES" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['id'])")
|
||||
echo "Match: $MATCH_ID"
|
||||
|
||||
echo "== Create session (platform=$PLATFORM) =="
|
||||
SESSION=$(curl -sf -X POST -H "$AUTH" -H "Content-Type: application/json" \
|
||||
"$API/api/v1/matches/$MATCH_ID/sessions" \
|
||||
-d "{\"platform\":\"$PLATFORM\",\"privacy_status\":\"unlisted\",\"quality_preset\":\"720p_30_2.5mbps\"}")
|
||||
SESSION_ID=$(echo "$SESSION" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
|
||||
echo "Session: $SESSION_ID"
|
||||
|
||||
python3 -c "
|
||||
import sys, json
|
||||
s = json.loads('''$SESSION''')
|
||||
assert s.get('platform') == '$PLATFORM', s
|
||||
if '$PLATFORM' == 'matchlivetv':
|
||||
assert s.get('hls_playback_url'), 'missing hls_playback_url'
|
||||
assert s.get('watch_page_url'), 'missing watch_page_url'
|
||||
assert not s.get('youtube_broadcast_id'), s
|
||||
print('Session fields OK')
|
||||
"
|
||||
|
||||
echo "== Start session =="
|
||||
curl -sf -X PATCH -H "$AUTH" "$API/api/v1/sessions/$SESSION_ID/start" > /dev/null
|
||||
echo "Started"
|
||||
|
||||
echo "== Webhook disconnect =="
|
||||
SECRET="${MEDIAMTX_WEBHOOK_SECRET:-mediamtx_webhook_dev_secret}"
|
||||
BODY="{\"session_id\":\"$SESSION_ID\"}"
|
||||
SIG=$(echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}')
|
||||
curl -sf -X POST "$API/webhooks/mediamtx/disconnect" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-MediaMTX-Signature: $SIG" \
|
||||
-d "$BODY"
|
||||
echo "Disconnect OK"
|
||||
|
||||
STATUS=$(curl -sf -H "$AUTH" "$API/api/v1/sessions/$SESSION_ID" | python3 -c "import sys,json; print(json.load(sys.stdin)['status'])")
|
||||
echo "Status after disconnect: $STATUS (expected reconnecting)"
|
||||
|
||||
echo "== Webhook connect =="
|
||||
curl -sf -X POST "$API/webhooks/mediamtx/connect" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-MediaMTX-Signature: $SIG" \
|
||||
-d "$BODY"
|
||||
STATUS=$(curl -sf -H "$AUTH" "$API/api/v1/sessions/$SESSION_ID" | python3 -c "import sys,json; print(json.load(sys.stdin)['status'])")
|
||||
echo "Status after reconnect: $STATUS (expected live)"
|
||||
|
||||
echo "== Validate publish token =="
|
||||
curl -sf -X POST "$API/internal/validate_publish" \
|
||||
-d "session_id=$SESSION_ID&token=fake" | grep -q '"valid":false' && echo "Invalid token rejected OK"
|
||||
|
||||
echo "== All E2E API checks passed =="
|
||||
Reference in New Issue
Block a user