#!/bin/bash # Test Traditional REST Response Format # This script tests various API endpoints to ensure they follow traditional REST conventions # Get the directory where this script is located SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Source the test configuration source "$SCRIPT_DIR/../test-config.sh" # Check requirements check_requirements print_blue "🧪 Testing Traditional REST Response Format..." # API Configuration API_BASE="$TEST_API_BASE" TEST_USER_EMAIL="testuser_rest_$(date +%s)@example.com" TEST_USER_PASSWORD="TestPass123!" AUTH_TOKEN="" ANON_KEY=$(get_anon_key) # Function to test response format test_response_format() { local test_name="$1" local response="$2" local expected_pattern="$3" local should_not_exist="${4:-false}" if [ "$should_not_exist" == "true" ]; then # Check that pattern does NOT exist if ! echo "$response" | grep -q "$expected_pattern"; then print_success "$test_name" return 0 else print_fail "$test_name - found unwanted pattern: $expected_pattern" track_test_failure return 1 fi else # Check that pattern exists if echo "$response" | grep -q "$expected_pattern"; then print_success "$test_name" return 0 else print_fail "$test_name - missing pattern: $expected_pattern" echo " Response: $(echo "$response" | head -c 200)..." track_test_failure return 1 fi fi } # 1. Test Health Endpoint print_info "1. Testing Health Endpoint (Success Response)" response=$(curl -s "$API_BASE/health") test_response_format "Direct data response" "$response" '"status":"ok"' test_response_format "No success wrapper" "$response" '"success":true' "true" test_response_format "No data wrapper" "$response" '"data":{' "true" # 2. Test Authentication Errors print_info "2. Testing Authentication Errors" response=$(curl -s "$API_BASE/auth/sessions/current") test_response_format "Error format" "$response" '"error":"AUTH_INVALID_CREDENTIALS"' test_response_format "Message field" "$response" '"message":"No token provided"' # JWT auth includes error and message fields # 3. Test Login Endpoint (Missing Credentials) print_info "3. Testing Login Endpoint (Missing Credentials)" response=$(curl -s -X POST "$API_BASE/auth/sessions" \ -H "Content-Type: application/json" \ -d '{}') test_response_format "Error response" "$response" '"error":"INVALID_INPUT"' test_response_format "Message field" "$response" '"message":"email: Required, password: Required"' # 4. Test Invalid Endpoint (404) print_info "4. Testing Invalid Endpoint (404)" response=$(curl -s "$API_BASE/nonexistent") test_response_format "404 error" "$response" '"statusCode":404' test_response_format "Not found message" "$response" '"error":"NOT_FOUND"' ADMIN_TOKEN=$(get_admin_token) # 5. Test with Authentication print_info "5. Creating test user for authenticated tests" auth_response=$(curl -s -X POST "$API_BASE/auth/users" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ANON_KEY" \ -d "{ \"email\": \"$TEST_USER_EMAIL\", \"password\": \"$TEST_USER_PASSWORD\", \"name\": \"Test User\" }") # Check if registration was successful if echo "$auth_response" | grep -q '"accessToken"'; then AUTH_TOKEN=$(echo "$auth_response" | grep -o '"accessToken":"[^"]*' | cut -d'"' -f4) print_success "User registered successfully" register_test_user "$TEST_USER_EMAIL" # Test authenticated endpoints print_info "6. Testing Database Tables List (Authenticated)" response=$(curl -s "$API_BASE/database/tables" \ -H "Authorization: Bearer $ADMIN_TOKEN") test_response_format "Direct array response" "$response" '^\[' test_response_format "No wrapper object" "$response" '"data":\[' "true" # Test table creation print_info "7. Testing Create Table (Success Response)" TABLE_NAME="test_rest_table_$(date +%s)" response=$(curl -s -X POST "$API_BASE/database/tables" \ -H "Authorization: Bearer $ADMIN_TOKEN" \ -H "Content-Type: application/json" \ -d "{ \"tableName\": \"$TABLE_NAME\", \"rlsEnabled\": false, \"columns\": [ {\"columnName\": \"id\", \"type\": \"uuid\", \"isNullable\": false, \"isUnique\": false, \"defaultValue\": \"gen_random_uuid()\"}, {\"columnName\": \"title\", \"type\": \"string\", \"isNullable\": false, \"isUnique\": false} ] }") if echo "$response" | grep -q '"tableName"'; then print_success "Table created" register_test_table "$TABLE_NAME" test_response_format "Direct object response" "$response" "\"tableName\":\"$TABLE_NAME\"" test_response_format "No success wrapper" "$response" '"success":true' "true" else print_fail "Table creation failed" echo "Response: $response" track_test_failure fi # Test pagination headers print_info "8. Testing Pagination Headers" # Use -I for headers, but we need both headers and body full_response=$(curl -s -i "$API_BASE/logs/audits?limit=10" \ -H "Authorization: Bearer $ADMIN_TOKEN") # Extract headers (everything before empty line) headers=$(echo "$full_response" | awk 'BEGIN{RS="\r\n\r\n"} NR==1') # Test for PostgREST-style Content-Range header (format: start-end/total) test_response_format "Content-Range header" "$headers" 'Content-Range:' test_response_format "Preference-Applied header" "$headers" 'Preference-Applied:' else print_fail "Failed to register user" echo "Response: $auth_response" track_test_failure fi # 9. Test Storage API (requires API key) print_info "9. Testing Storage API Format" # First get admin token if we don't have it if [ -z "$AUTH_TOKEN" ]; then admin_token=$(get_admin_token) else admin_token="$AUTH_TOKEN" fi # Try to get API key from the API endpoint first if [ -n "$admin_token" ]; then api_key_response=$(curl -s "$API_BASE/metadata/api-key" \ -H "Authorization: Bearer $admin_token") API_KEY=$(echo "$api_key_response" | grep -o '"apiKey":"[^"]*' | cut -d'"' -f4) fi # If that fails, try the helper function if [ -z "$API_KEY" ]; then API_KEY=$(get_admin_api_key) fi # Export for cleanup if [ -n "$API_KEY" ]; then export ACCESS_API_KEY="$API_KEY" # List buckets response=$(curl -s "$API_BASE/storage/buckets" \ -H "Authorization: Bearer $API_KEY") test_response_format "Direct array for buckets" "$response" '^\[' # Create a test bucket BUCKET_NAME="test-rest-bucket-$(date +%s)" response=$(curl -s -X POST "$API_BASE/storage/buckets" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $API_KEY" \ -d "{\"bucketName\": \"$BUCKET_NAME\", \"isPublic\": true}") if echo "$response" | grep -q '"bucketName"'; then print_success "Bucket created" register_test_bucket "$BUCKET_NAME" test_response_format "Success message field" "$response" '"message":"Bucket created successfully"' test_response_format "NextAction guidance" "$response" '"nextActions":' else print_fail "Bucket creation failed" echo "Response: $response" track_test_failure fi else print_info "Skipping storage tests (no API key available)" fi # Summary echo "" print_blue "==========================================" print_blue "Traditional REST Format Test Complete" print_blue "==========================================" # Exit with proper status exit_with_status