#!/bin/bash # Test FossFLOW deployment at different base paths # This simulates how the app will be served on GitHub Pages or other platforms with subpaths set -e echo "Testing FossFLOW at multiple base paths..." # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Base paths to test BASE_PATHS=("/" "/fossflow" "/apps/fossflow" "/my-org/projects/fossflow") # Function to cleanup cleanup() { echo -e "\n${YELLOW}Cleaning up...${NC}" # Stop any running containers docker stop nginx-test 2>/dev/null || true docker rm nginx-test 2>/dev/null || true docker stop selenium-test 2>/dev/null || true docker rm selenium-test 2>/dev/null || true # Kill any local servers if [ -f /tmp/server.pid ]; then kill $(cat /tmp/server.pid) 2>/dev/null || true rm /tmp/server.pid fi } # Set trap to cleanup on exit trap cleanup EXIT # Function to test a specific base path test_base_path() { local BASE_PATH=$1 echo -e "\n${YELLOW}Testing base path: ${BASE_PATH}${NC}" # Clean up any previous test docker stop nginx-test 2>/dev/null || true docker rm nginx-test 2>/dev/null || true # Build the app with the specific PUBLIC_URL echo "Building app with PUBLIC_URL=${BASE_PATH}..." (cd .. && PUBLIC_URL="${BASE_PATH}" npm run build:app) # Create nginx config for this base path if [ "$BASE_PATH" = "/" ]; then LOCATION_PATH="/" ALIAS_PATH="/usr/share/nginx/html/" else LOCATION_PATH="${BASE_PATH%/}/" ALIAS_PATH="/usr/share/nginx/html/" fi cat > /tmp/nginx.conf < /dev/null; then echo -e "${GREEN}✓ App accessible at http://localhost:3001${BASE_PATH}${NC}" else echo -e "${RED}✗ App NOT accessible at http://localhost:3001${BASE_PATH}${NC}" echo "Nginx logs:" docker logs nginx-test return 1 fi # Run E2E tests if Selenium is available if docker ps | grep selenium-test > /dev/null; then echo "Running E2E tests..." FOSSFLOW_TEST_URL="http://localhost:3001${BASE_PATH}" \ FOSSFLOW_BASE_PATH="${BASE_PATH}" \ WEBDRIVER_URL="http://localhost:4444" \ pytest tests/test_base_path_routing.py -v --tb=short || { echo -e "${RED}✗ E2E tests failed for base path: ${BASE_PATH}${NC}" return 1 } echo -e "${GREEN}✓ E2E tests passed for base path: ${BASE_PATH}${NC}" else echo -e "${YELLOW}Selenium not running, skipping E2E tests${NC}" echo "To run E2E tests, start Selenium first:" echo " docker run -d --name selenium-test --network host selenium/standalone-chrome:latest" fi # Clean up this test's nginx docker stop nginx-test 2>/dev/null || true docker rm nginx-test 2>/dev/null || true return 0 } # Main execution echo "Setting up test environment..." # Ensure we're in the e2e-tests directory cd "$(dirname "$0")" # Check if Selenium is running, offer to start it if ! docker ps | grep selenium > /dev/null; then echo -e "${YELLOW}Selenium is not running. Would you like to start it for E2E tests? (y/n)${NC}" read -r response if [[ "$response" == "y" ]]; then echo "Starting Selenium..." docker run -d \ --name selenium-test \ --network host \ --shm-size=2g \ selenium/standalone-chrome:latest echo "Waiting for Selenium to be ready..." timeout 30 bash -c 'until curl -sf http://localhost:4444/status > /dev/null 2>&1; do sleep 2; done' || { echo -e "${RED}Selenium failed to start${NC}" exit 1 } echo -e "${GREEN}✓ Selenium is ready${NC}" fi fi # Test each base path FAILED_PATHS=() for BASE_PATH in "${BASE_PATHS[@]}"; do if ! test_base_path "$BASE_PATH"; then FAILED_PATHS+=("$BASE_PATH") fi done # Summary echo -e "\n=========================================" echo "Test Summary:" echo "=========================================" if [ ${#FAILED_PATHS[@]} -eq 0 ]; then echo -e "${GREEN}✓ All base paths tested successfully!${NC}" echo "Tested paths: ${BASE_PATHS[*]}" else echo -e "${RED}✗ Some base paths failed:${NC}" for path in "${FAILED_PATHS[@]}"; do echo " - $path" done echo -e "\n${YELLOW}This indicates the app may not work correctly when deployed to GitHub Pages or other subpath deployments.${NC}" exit 1 fi