magic-building/test-api.sh

286 lines
8.3 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Magic Building Image Generation API Test Script
# Usage: ./test-api.sh [server_url]
SERVER_URL=${1:-"http://localhost:3000"}
TEST_DIR="./test-images"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_FILE="./logs/test-api-${TIMESTAMP}.log"
# Colors for output
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Ensure directories exist
mkdir -p logs test-images
# Logging function
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Success/error output functions
success() {
echo -e "${GREEN}$1${NC}" | tee -a "$LOG_FILE"
}
error() {
echo -e "${RED}$1${NC}" | tee -a "$LOG_FILE"
}
warning() {
echo -e "${YELLOW}⚠️ $1${NC}" | tee -a "$LOG_FILE"
}
info() {
echo -e "${BLUE} $1${NC}" | tee -a "$LOG_FILE"
}
# Test functions
test_health_check() {
info "Testing health check endpoint..."
response=$(curl -s -o /tmp/health.json -w "%{http_code}" "$SERVER_URL/health")
if [ "$response" -eq 200 ]; then
success "Health check passed (HTTP $response)"
log "Response: $(cat /tmp/health.json)"
else
error "Health check failed (HTTP $response)"
return 1
fi
}
test_api_info() {
info "Testing API info endpoint..."
response=$(curl -s -o /tmp/api-info.json -w "%{http_code}" "$SERVER_URL/api/info")
if [ "$response" -eq 200 ]; then
success "API info endpoint passed (HTTP $response)"
log "Response: $(cat /tmp/api-info.json)"
else
error "API info endpoint failed (HTTP $response)"
return 1
fi
}
test_text_to_image() {
info "Testing text-to-image generation..."
response=$(curl -s -o /tmp/text-to-image.json -w "%{http_code}" \
-X POST "$SERVER_URL/api/generate" \
-F "prompt=A majestic dragon soaring through clouds above a medieval castle" \
-F "filename=dragon_castle_${TIMESTAMP}")
if [ "$response" -eq 200 ]; then
success "Text-to-image generation passed (HTTP $response)"
log "Response: $(cat /tmp/text-to-image.json)"
# Check if image file was created
filename=$(jq -r '.data.filename' /tmp/text-to-image.json 2>/dev/null)
if [ "$filename" != "null" ] && [ -f "src/results/$filename" ]; then
success "Generated image file found: $filename"
log "Image size: $(ls -lh src/results/$filename | awk '{print $5}')"
else
warning "Generated image file not found or response malformed"
fi
else
error "Text-to-image generation failed (HTTP $response)"
log "Error response: $(cat /tmp/text-to-image.json)"
return 1
fi
}
test_validation_errors() {
info "Testing validation error handling..."
# Test missing prompt
response=$(curl -s -o /tmp/validation1.json -w "%{http_code}" \
-X POST "$SERVER_URL/api/generate" \
-F "filename=test")
if [ "$response" -eq 400 ]; then
success "Missing prompt validation works (HTTP $response)"
else
error "Missing prompt validation failed (HTTP $response)"
fi
# Test missing filename
response=$(curl -s -o /tmp/validation2.json -w "%{http_code}" \
-X POST "$SERVER_URL/api/generate" \
-F "prompt=Test prompt")
if [ "$response" -eq 400 ]; then
success "Missing filename validation works (HTTP $response)"
else
error "Missing filename validation failed (HTTP $response)"
fi
# Test invalid filename characters
response=$(curl -s -o /tmp/validation3.json -w "%{http_code}" \
-X POST "$SERVER_URL/api/generate" \
-F "prompt=Test prompt" \
-F "filename=invalid/filename*with?bad&chars")
if [ "$response" -eq 200 ]; then
success "Filename sanitization works (HTTP $response)"
log "Sanitized filename response: $(cat /tmp/validation3.json)"
else
warning "Filename sanitization test had unexpected result (HTTP $response)"
fi
}
test_404_endpoint() {
info "Testing 404 error handling..."
response=$(curl -s -o /tmp/404.json -w "%{http_code}" "$SERVER_URL/api/nonexistent")
if [ "$response" -eq 404 ]; then
success "404 error handling works (HTTP $response)"
else
error "404 error handling failed (HTTP $response)"
fi
}
create_test_image() {
info "Creating test reference image..."
# Create a simple test image using ImageMagick (if available) or skip
if command -v convert &> /dev/null; then
convert -size 300x200 xc:lightblue -pointsize 24 -fill black \
-gravity center -annotate 0 "Test Reference Image" \
"$TEST_DIR/test-reference.png"
success "Test reference image created"
else
warning "ImageMagick not available, skipping reference image test"
return 1
fi
}
test_image_with_reference() {
if [ ! -f "$TEST_DIR/test-reference.png" ]; then
warning "No reference image available, skipping reference image test"
return 0
fi
info "Testing image generation with reference image..."
response=$(curl -s -o /tmp/with-reference.json -w "%{http_code}" \
-X POST "$SERVER_URL/api/generate" \
-F "prompt=Add magical sparkles and glowing effects to this image" \
-F "filename=sparkled_reference_${TIMESTAMP}" \
-F "referenceFiles=@${TEST_DIR}/test-reference.png")
if [ "$response" -eq 200 ]; then
success "Reference image generation passed (HTTP $response)"
log "Response: $(cat /tmp/with-reference.json)"
# Check if image file was created
filename=$(jq -r '.data.filename' /tmp/with-reference.json 2>/dev/null)
if [ "$filename" != "null" ] && [ -f "src/results/$filename" ]; then
success "Generated image with reference found: $filename"
else
warning "Generated image with reference not found"
fi
else
error "Reference image generation failed (HTTP $response)"
log "Error response: $(cat /tmp/with-reference.json)"
return 1
fi
}
# Performance test
test_concurrent_requests() {
info "Testing concurrent requests (performance test)..."
# Start 3 concurrent requests
for i in {1..3}; do
(
response=$(curl -s -o "/tmp/concurrent-$i.json" -w "%{http_code}" \
-X POST "$SERVER_URL/api/generate" \
-F "prompt=Concurrent test image $i - fantasy landscape with mountains" \
-F "filename=concurrent_test_${i}_${TIMESTAMP}")
if [ "$response" -eq 200 ]; then
log "Concurrent request $i succeeded (HTTP $response)"
else
log "Concurrent request $i failed (HTTP $response)"
fi
) &
done
# Wait for all background jobs
wait
success "Concurrent requests test completed"
}
# Main test execution
main() {
info "🚀 Starting Magic Building API Test Suite"
info "Server URL: $SERVER_URL"
info "Test log: $LOG_FILE"
# Check if server is running
if ! curl -s "$SERVER_URL/health" > /dev/null; then
error "Server is not responding at $SERVER_URL"
error "Please start the server with: pnpm server"
exit 1
fi
# Run tests
tests_passed=0
tests_total=0
run_test() {
((tests_total++))
if $1; then
((tests_passed++))
fi
}
run_test test_health_check
run_test test_api_info
run_test test_text_to_image
run_test test_validation_errors
run_test test_404_endpoint
# Optional tests
if create_test_image; then
run_test test_image_with_reference
fi
run_test test_concurrent_requests
# Summary
echo
info "📊 Test Results Summary"
success "Passed: $tests_passed/$tests_total tests"
if [ "$tests_passed" -eq "$tests_total" ]; then
success "🎉 All tests passed!"
else
warning "⚠️ Some tests failed. Check the logs for details."
fi
info "Generated images are in: src/results/"
info "Test logs saved to: $LOG_FILE"
}
# Check dependencies
check_dependencies() {
if ! command -v curl &> /dev/null; then
error "curl is required for testing"
exit 1
fi
if ! command -v jq &> /dev/null; then
warning "jq not found - JSON response parsing will be limited"
fi
}
# Run the tests
check_dependencies
main "$@"