206 lines
6 KiB
Bash
206 lines
6 KiB
Bash
|
|
#!/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"
|