241 lines
8.1 KiB
Bash
Executable File
241 lines
8.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# End-to-End test script for Insforge Backend
|
|
|
|
# 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"
|
|
|
|
# Test variables
|
|
TEST_EMAIL="${TEST_USER_EMAIL_PREFIX}e2e_$(date +%s)@example.com"
|
|
TEST_PASSWORD="TestPassword123!"
|
|
USER_TOKEN=""
|
|
API_KEY=""
|
|
USER_ID=""
|
|
TEST_TABLE="test_todos_$(date +%s)"
|
|
TEST_BUCKET="test-bucket-$(date +%s)"
|
|
|
|
# Export API_KEY so cleanup can use it
|
|
export ACCESS_API_KEY=""
|
|
|
|
# Register test resources for cleanup
|
|
register_test_user "$TEST_EMAIL"
|
|
register_test_table "$TEST_TABLE"
|
|
register_test_bucket "$TEST_BUCKET"
|
|
|
|
echo "Starting End-to-End Tests for Insforge Backend"
|
|
echo "=================================="
|
|
|
|
# Function to test endpoint
|
|
test_endpoint() {
|
|
local test_name=$1
|
|
local response=$2
|
|
local expected_status=$3
|
|
local actual_status=$(echo "$response" | tail -n 1)
|
|
|
|
if [ "$actual_status" == "$expected_status" ]; then
|
|
print_success "$test_name"
|
|
return 0
|
|
else
|
|
print_fail "$test_name - Expected $expected_status, got $actual_status"
|
|
echo "Response: $(echo "$response" | sed '$d')"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# 1. Test Health Check
|
|
print_info "1. Testing Health Check"
|
|
response=$(curl -s -w "\n%{http_code}" "$TEST_API_BASE/health")
|
|
test_endpoint "Health check" "$response" "200"
|
|
|
|
# 2. Test User Registration
|
|
print_info "2. Testing User Registration"
|
|
response_with_code=$(register_user "$TEST_EMAIL" "$TEST_PASSWORD" "Test User" && echo -e "\n201")
|
|
test_endpoint "User registration" "$response_with_code" "201"
|
|
|
|
# Extract token from response
|
|
response=$(echo "$response_with_code" | sed '$d')
|
|
USER_TOKEN=$(echo "$response" | grep -o '"accessToken":"[^"]*' | grep -o '[^"]*$')
|
|
USER_ID=$(echo "$response" | grep -o '"user":{[^}]*' | grep -o '"id":"[^"]*' | grep -o '[^"]*$')
|
|
|
|
if [ -z "$USER_TOKEN" ]; then
|
|
print_fail "Failed to extract user token"
|
|
else
|
|
echo "User ID: $USER_ID"
|
|
echo "Token: ${USER_TOKEN:0:20}..."
|
|
fi
|
|
|
|
# 3. Test User Login
|
|
print_info "3. Testing User Login"
|
|
response_with_code=$(login_user "$TEST_EMAIL" "$TEST_PASSWORD" && echo -e "\n200")
|
|
test_endpoint "User login" "$response_with_code" "200"
|
|
|
|
# 4. Test Get Profile (with auth)
|
|
print_info "4. Testing Get Profile"
|
|
response_with_code=$(get_user_profile "$USER_TOKEN" && echo -e "\n200")
|
|
test_endpoint "Get profile" "$response_with_code" "200"
|
|
|
|
# Get admin token for table operations and API key
|
|
admin_token=$(get_admin_token)
|
|
if [ -z "$admin_token" ]; then
|
|
print_fail "Could not get admin token for table operations"
|
|
else
|
|
print_success "Got admin token for table operations"
|
|
fi
|
|
|
|
# 5. Get API Key
|
|
print_info "5. Getting API Key"
|
|
# First try environment variable or docker logs
|
|
API_KEY=$(get_admin_api_key)
|
|
|
|
# If that fails, try to get it via the API endpoint
|
|
if [ -z "$API_KEY" ] && [ -n "$admin_token" ]; then
|
|
api_key_response=$(curl -s "$TEST_API_BASE/metadata/api-key" \
|
|
-H "Authorization: Bearer $admin_token")
|
|
API_KEY=$(echo "$api_key_response" | grep -o '"apiKey":"[^"]*' | cut -d'"' -f4)
|
|
fi
|
|
|
|
if [ -n "$API_KEY" ]; then
|
|
print_success "Got API key"
|
|
echo "API Key: ${API_KEY:0:20}..."
|
|
# Export for cleanup
|
|
export ACCESS_API_KEY="$API_KEY"
|
|
else
|
|
print_fail "Failed to get API key - remaining tests will be skipped"
|
|
fi
|
|
|
|
# Continue only if we have an API key
|
|
if [ -z "$API_KEY" ]; then
|
|
print_info "Skipping remaining tests - no API key available"
|
|
exit 0
|
|
fi
|
|
|
|
# 6. Test Create Table
|
|
print_info "6. Testing Create Table"
|
|
response=$(curl -s -w "\n%{http_code}" -X POST "$TEST_API_BASE/database/tables" \
|
|
-H "Authorization: Bearer $admin_token" \
|
|
-H "Content-Type: application/json" \
|
|
-d "{
|
|
\"tableName\": \"$TEST_TABLE\",
|
|
\"rlsEnabled\": false,
|
|
\"columns\": [
|
|
{\"columnName\": \"title\", \"type\": \"string\", \"isNullable\": false, \"isUnique\": false},
|
|
{\"columnName\": \"completed\", \"type\": \"boolean\", \"isNullable\": false, \"isUnique\": false, \"defaultValue\": \"false\"},
|
|
{\"columnName\": \"user_id\", \"type\": \"string\", \"isNullable\": false, \"isUnique\": false}
|
|
]
|
|
}")
|
|
test_endpoint "Create table" "$response" "201"
|
|
|
|
# Wait a bit for table creation to propagate
|
|
sleep 1
|
|
|
|
# 7. Test Insert Record
|
|
print_info "7. Testing Insert Record"
|
|
response=$(curl -s -w "\n%{http_code}" -X POST "$TEST_API_BASE/database/records/$TEST_TABLE" \
|
|
-H "Authorization: Bearer $admin_token" \
|
|
-H "Content-Type: application/json" \
|
|
-d "[{
|
|
\"title\": \"Test Todo Item\",
|
|
\"completed\": false,
|
|
\"user_id\": \"$USER_ID\"
|
|
}]")
|
|
test_endpoint "Insert record" "$response" "201"
|
|
|
|
# Extract record ID
|
|
# PostgREST returns an empty array on successful insert, so we need to query the table
|
|
sleep 1 # Give PostgREST time to sync
|
|
query_response=$(curl -s "$TEST_API_BASE/database/records/$TEST_TABLE?limit=1&order=created_at.desc" \
|
|
-H "Authorization: Bearer $admin_token")
|
|
RECORD_ID=$(echo "$query_response" | jq -r '.[0].id' 2>/dev/null || echo "")
|
|
if [ -z "$RECORD_ID" ] || [ "$RECORD_ID" == "null" ]; then
|
|
# Try alternative parsing
|
|
RECORD_ID=$(echo "$query_response" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
fi
|
|
echo "Record ID: $RECORD_ID"
|
|
|
|
# 8. Test Get Records
|
|
print_info "8. Testing Get Records"
|
|
response=$(curl -s -w "\n%{http_code}" "$TEST_API_BASE/database/records/$TEST_TABLE" \
|
|
-H "Authorization: Bearer $admin_token")
|
|
test_endpoint "Get records" "$response" "200"
|
|
|
|
# 9. Test Update Record
|
|
if [ -n "$RECORD_ID" ]; then
|
|
print_info "9. Testing Update Record"
|
|
response=$(curl -s -w "\n%{http_code}" -X PATCH "$TEST_API_BASE/database/records/$TEST_TABLE?id=eq.$RECORD_ID" \
|
|
-H "Authorization: Bearer $admin_token" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"completed": true
|
|
}')
|
|
test_endpoint "Update record" "$response" "204"
|
|
else
|
|
print_info "9. Skipping Update Record test - no record ID"
|
|
fi
|
|
|
|
# 10. Test Storage - Create Bucket
|
|
print_info "10. Testing Create Storage Bucket"
|
|
response=$(curl -s -w "\n%{http_code}" -X POST "$TEST_API_BASE/storage/buckets" \
|
|
-H "Authorization: Bearer $API_KEY" \
|
|
-H "Content-Type: application/json" \
|
|
-d "{
|
|
\"bucketName\": \"$TEST_BUCKET\",
|
|
\"isPublic\": false
|
|
}")
|
|
test_endpoint "Create bucket" "$response" "201"
|
|
|
|
# 11. Test Upload File
|
|
print_info "11. Testing Upload File"
|
|
echo "Test file content" > /tmp/test-upload.txt
|
|
response=$(curl -s -w "\n%{http_code}" -X PUT "$TEST_API_BASE/storage/buckets/$TEST_BUCKET/objects/test-file.txt" \
|
|
-H "Authorization: Bearer $API_KEY" \
|
|
-F "file=@/tmp/test-upload.txt")
|
|
test_endpoint "Upload file" "$response" "201"
|
|
|
|
# 12. Test Download File
|
|
print_info "12. Testing Download File"
|
|
response=$(curl -s -L -w "\n%{http_code}" "$TEST_API_BASE/storage/buckets/$TEST_BUCKET/objects/test-file.txt" \
|
|
-H "Authorization: Bearer $API_KEY" \
|
|
-o /tmp/test-download.txt)
|
|
test_endpoint "Download file" "$response" "200"
|
|
|
|
# Verify file content
|
|
if [ -f /tmp/test-download.txt ]; then
|
|
downloaded_content=$(cat /tmp/test-download.txt)
|
|
if [ "$downloaded_content" == "Test file content" ]; then
|
|
print_success "File content verified"
|
|
else
|
|
print_fail "File content mismatch"
|
|
fi
|
|
rm -f /tmp/test-download.txt
|
|
else
|
|
print_fail "Downloaded file not found"
|
|
fi
|
|
|
|
# 13. Test Delete Record
|
|
if [ -n "$RECORD_ID" ]; then
|
|
print_info "13. Testing Delete Record"
|
|
response=$(curl -s -w "\n%{http_code}" -X DELETE "$TEST_API_BASE/database/records/$TEST_TABLE?id=eq.$RECORD_ID" \
|
|
-H "Authorization: Bearer $admin_token")
|
|
test_endpoint "Delete record" "$response" "204"
|
|
else
|
|
print_info "13. Skipping Delete Record test - no record ID"
|
|
fi
|
|
|
|
# 14. Test Delete File
|
|
print_info "14. Testing Delete File"
|
|
response=$(curl -s -w "\n%{http_code}" -X DELETE "$TEST_API_BASE/storage/buckets/$TEST_BUCKET/objects/test-file.txt" \
|
|
-H "Authorization: Bearer $API_KEY")
|
|
test_endpoint "Delete file" "$response" "200"
|
|
|
|
# Clean up temp files
|
|
rm -f /tmp/test-upload.txt
|
|
|
|
echo ""
|
|
echo "=================================="
|
|
print_success "End-to-End tests completed!"
|
|
echo "=================================="
|
|
|
|
# Note: All test resources will be cleaned up automatically on exit |