#!/bin/bash set -euo pipefail # Configuration API_PORT=8080 API_URL="http://localhost:$API_PORT/api/v1" # Unique user data based on timestamp TIMESTAMP=$(date +%s) EMAIL="usera_${TIMESTAMP}@example.com" USERNAME="usera_${TIMESTAMP}" PASSWORD="Password123!" # Colors BLUE='\033[0;34m' GREEN='\033[0;32m' RED='\033[0;31m' NC='\033[0m' log() { echo -e "${BLUE}[USER A] $1${NC}" } success() { echo -e "${GREEN} ✅ $1${NC}" } error() { echo -e "${RED}[ERROR] $1${NC}" exit 1 } # Ensure jq is installed if ! command -v jq &> /dev/null; then error "jq is required but not installed." fi # 1. Inscription log "1. Registering User A ($EMAIL)..." REGISTER_RES=$(curl -s -X POST "$API_URL/auth/register" \ -H "Content-Type: application/json" \ -d "{ \"email\": \"$EMAIL\", \"username\": \"$USERNAME\", \"password\": \"$PASSWORD\", \"password_confirm\": \"$PASSWORD\" }") # Auto-verify email in DB (for testing purposes) log " Verifying user email in DB..." if docker compose exec -T postgres psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "UPDATE users SET is_verified = true WHERE email = '$EMAIL';"; then success "Email verified in DB" else error "Failed to verify email in DB" fi # Save for debugging echo "$REGISTER_RES" > /tmp/veza_user_a_register.json # Check for error if echo "$REGISTER_RES" | jq -e '.error' > /dev/null; then ERR_MSG=$(echo "$REGISTER_RES" | jq -r '.error') error "Registration failed: $ERR_MSG" fi success "Registration OK" # 2. Connexion log "2. Logging in..." LOGIN_RES=$(curl -s -X POST "$API_URL/auth/login" \ -H "Content-Type: application/json" \ -d "{ \"email\": \"$EMAIL\", \"password\": \"$PASSWORD\" }") ACCESS_A=$(echo "$LOGIN_RES" | jq -r '.token.access_token') REFRESH_A=$(echo "$LOGIN_RES" | jq -r '.token.refresh_token') if [ "$ACCESS_A" == "null" ] || [ -z "$ACCESS_A" ]; then error "Login failed, no access_token found. Response: $LOGIN_RES" fi # Save tokens for other scripts echo "ACCESS_A=$ACCESS_A" > .user_a_env echo "USER_ID_A=$(echo "$LOGIN_RES" | jq -r '.user.id')" >> .user_a_env success "Login OK (Token extracted)" # 3. Profil utilisateur log "3. Checking profile..." PROFILE_RES=$(curl -s -H "Authorization: Bearer $ACCESS_A" "$API_URL/auth/me") PROFILE_EMAIL=$(echo "$PROFILE_RES" | jq -r '.email') if [ "$PROFILE_EMAIL" != "$EMAIL" ]; then error "Profile mismatch. Expected $EMAIL, got $PROFILE_EMAIL" fi success "Profile verified ($PROFILE_EMAIL)" # 4. Upload d’un track log "4. Uploading track..." mkdir -p tests/audio # Generate dummy wav if not exists if [ ! -f tests/audio/test_track.wav ]; then # Header only WAV echo -n -e '\x52\x49\x46\x46\x24\x00\x00\x00\x57\x41\x56\x45\x66\x6d\x74\x20\x10\x00\x00\x00\x01\x00\x01\x00\x44\xac\x00\x00\x88\x58\x01\x00\x02\x00\x10\x00\x64\x61\x74\x61\x00\x00\x00\x00' > tests/audio/test_track.wav fi UPLOAD_RES=$(curl -s -H "Authorization: Bearer $ACCESS_A" \ -F "file=@tests/audio/test_track.wav" \ -F "title=My Test Track" \ -F "genre=Electronic" \ "$API_URL/tracks") TRACK_ID_A=$(echo "$UPLOAD_RES" | jq -r '.track.id') if [ "$TRACK_ID_A" == "null" ] || [ -z "$TRACK_ID_A" ]; then error "Upload failed. Response: $UPLOAD_RES" fi success "Track uploaded (ID: $TRACK_ID_A)" # 5. Statut streaming log "5. Polling track status..." MAX_RETRIES=10 COUNT=0 STREAM_READY=false while [ $COUNT -lt $MAX_RETRIES ]; do STATUS_RES=$(curl -s -H "Authorization: Bearer $ACCESS_A" "$API_URL/tracks/$TRACK_ID_A") # Assuming the API returns the track object directly or status field # Adjust field name based on API implementation. # Here we check if we can retrieve it. Since we don't know the exact status field name for "ready" # (could be .status, .processingStatus, etc), we verify we get a 200 and the ID matches. RETRIEVED_ID=$(echo "$STATUS_RES" | jq -r '.track.id') if [ "$RETRIEVED_ID" == "$TRACK_ID_A" ]; then # In a real scenario, we would check a specific status field like: # STATUS=$(echo "$STATUS_RES" | jq -r '.status') # if [ "$STATUS" == "ready" ]; then ... fi # For this smoke test, retrieving the metadata successfully after upload is a good pass. STREAM_READY=true success "Track metadata available" break fi echo " ... waiting for track (attempt $((COUNT+1))/$MAX_RETRIES)" sleep 2 COUNT=$((COUNT+1)) done if [ "$STREAM_READY" = false ]; then error "Track status polling timed out." fi # 6. Création d’une playlist log "6. Creating playlist..." PLAYLIST_RES=$(curl -s -X POST "$API_URL/playlists" \ -H "Authorization: Bearer $ACCESS_A" \ -H "Content-Type: application/json" \ -d '{ "title": "Playlist A", "description": "My awesome playlist", "is_public": true }') PLAYLIST_ID_A=$(echo "$PLAYLIST_RES" | jq -r '.playlist.id') if [ "$PLAYLIST_ID_A" == "null" ]; then error "Playlist creation failed. Response: $PLAYLIST_RES" fi success "Playlist created (ID: $PLAYLIST_ID_A)" # 7. Ajout du track à la playlist log "7. Adding track to playlist..." ADD_RES=$(curl -s -X POST "$API_URL/playlists/$PLAYLIST_ID_A/tracks" \ -H "Authorization: Bearer $ACCESS_A" \ -H "Content-Type: application/json" \ -d "{ \"track_id\": $TRACK_ID_A }") # Note: integer ID usually, no quotes if number # Check if successful (usually 200 or 201) # curl -s does not show HTTP code, checking response content implicitly via next step success "Track add request sent" # 8. Vérification de la playlist log "8. Verifying playlist content..." GET_PLAYLIST_RES=$(curl -s -H "Authorization: Bearer $ACCESS_A" "$API_URL/playlists/$PLAYLIST_ID_A") # Check if track ID is present in the response if echo "$GET_PLAYLIST_RES" | grep -q "$TRACK_ID_A"; then success "Track $TRACK_ID_A found in playlist $PLAYLIST_ID_A" else error "Track not found in playlist. Response: $GET_PLAYLIST_RES" fi # Save playlist ID for other scripts/manual check echo "PLAYLIST_ID_A=$PLAYLIST_ID_A" >> .user_a_env log "✅ User A flow OK"