Files
Charon/scripts/setup-e2e-env.sh
2026-03-04 18:34:49 +00:00

228 lines
6.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
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
# E2E Test Environment Setup Script
# Sets up the local environment for running Playwright E2E tests
#
# Usage: ./scripts/setup-e2e-env.sh
#
# This script:
# 1. Checks prerequisites (docker, node, npx)
# 2. Installs npm dependencies
# 3. Installs Playwright browsers (firefox only for CI alignment)
# 4. Creates .env.test if not exists
# 5. Starts the Docker test environment
# 6. Waits for health check
# 7. Outputs success message with URLs
#
# Rebuild note:
# For CI-aligned E2E container rebuilds, prefer:
# .github/skills/scripts/skill-runner.sh docker-rebuild-e2e
set -euo pipefail
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuration
COMPOSE_FILE=".docker/compose/docker-compose.test.yml"
HEALTH_URL="http://localhost:8080/api/v1/health"
HEALTH_TIMEOUT=60
# Get script directory and project root
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
# Change to project root
cd "${PROJECT_ROOT}"
echo -e "${BLUE}🚀 Setting up E2E test environment...${NC}"
echo ""
# Function to check if a command exists
check_command() {
local cmd="$1"
local name="${2:-$1}"
if command -v "${cmd}" >/dev/null 2>&1; then
echo -e " ${GREEN}${NC} ${name} found: $(command -v "${cmd}")"
return 0
else
echo -e " ${RED}${NC} ${name} not found"
return 1
fi
}
# Function to wait for health check
wait_for_health() {
local url="$1"
local timeout="$2"
local start_time
start_time=$(date +%s)
echo -e "${BLUE}⏳ Waiting for service to be healthy (timeout: ${timeout}s)...${NC}"
while true; do
local current_time
current_time=$(date +%s)
local elapsed=$((current_time - start_time))
if [[ ${elapsed} -ge ${timeout} ]]; then
echo -e "${RED}❌ Health check timed out after ${timeout}s${NC}"
echo ""
echo "Container logs:"
docker compose -f "${COMPOSE_FILE}" logs --tail=50
return 1
fi
if curl -sf "${url}" >/dev/null 2>&1; then
echo -e "${GREEN}✅ Service is healthy!${NC}"
return 0
fi
printf " Checking... (%ds elapsed)\r" "${elapsed}"
sleep 2
done
}
# Step 1: Check prerequisites
echo -e "${BLUE}📋 Step 1: Checking prerequisites...${NC}"
PREREQS_OK=true
if ! check_command "docker" "Docker"; then
PREREQS_OK=false
fi
if ! check_command "node" "Node.js"; then
PREREQS_OK=false
else
NODE_VERSION=$(node --version)
echo -e " Version: ${NODE_VERSION}"
fi
if ! check_command "npx" "npx"; then
PREREQS_OK=false
fi
if ! check_command "npm" "npm"; then
PREREQS_OK=false
fi
if [[ "${PREREQS_OK}" != "true" ]]; then
echo ""
echo -e "${RED}❌ Prerequisites check failed. Please install missing dependencies.${NC}"
exit 1
fi
# Check Docker daemon is running
if ! docker info >/dev/null 2>&1; then
echo -e "${RED}❌ Docker daemon is not running. Please start Docker.${NC}"
exit 1
fi
echo -e " ${GREEN}${NC} Docker daemon is running"
echo ""
# Step 2: Install npm dependencies
echo -e "${BLUE}📦 Step 2: Installing npm dependencies...${NC}"
npm ci --silent
echo -e "${GREEN}✅ Dependencies installed${NC}"
echo ""
# Step 3: Install Playwright browsers
echo -e "${BLUE}🎭 Step 3: Installing Playwright browsers (firefox only)...${NC}"
npx playwright install firefox --with-deps
echo -e "${GREEN}✅ Playwright browsers installed${NC}"
echo ""
# Step 4: Create .env.test if not exists
echo -e "${BLUE}📝 Step 4: Setting up environment configuration...${NC}"
ENV_TEST_FILE=".env.test"
if [[ ! -f "${ENV_TEST_FILE}" ]]; then
if [[ -f ".env.test.example" ]]; then
cp ".env.test.example" "${ENV_TEST_FILE}"
echo -e " ${GREEN}${NC} Created ${ENV_TEST_FILE} from .env.test.example"
else
# Create minimal .env.test
cat > "${ENV_TEST_FILE}" <<EOF
# E2E Test Environment Configuration
# Generated by setup-e2e-env.sh
NODE_ENV=test
DATABASE_URL=sqlite:./data/charon_test.db
BASE_URL=http://localhost:8080
PLAYWRIGHT_BASE_URL=http://localhost:8080
TEST_USER_EMAIL=test-admin@charon.local
TEST_USER_PASSWORD=TestPassword123!
DOCKER_HOST=unix:///var/run/docker.sock
ENABLE_CROWDSEC=false
ENABLE_WAF=false
LOG_LEVEL=warn
EOF
echo -e " ${GREEN}${NC} Created ${ENV_TEST_FILE} with default values"
fi
else
echo -e " ${YELLOW}${NC} ${ENV_TEST_FILE} already exists, skipping"
fi
# Check for encryption key
if [[ -z "${CHARON_ENCRYPTION_KEY:-}" ]]; then
if ! grep -q "CHARON_ENCRYPTION_KEY" "${ENV_TEST_FILE}" 2>/dev/null; then
# Generate a random encryption key for testing
RANDOM_KEY=$(openssl rand -base64 32 2>/dev/null || head -c 32 /dev/urandom | base64)
echo "CHARON_ENCRYPTION_KEY=${RANDOM_KEY}" >> "${ENV_TEST_FILE}"
echo -e " ${GREEN}${NC} Generated test encryption key"
fi
fi
echo ""
# Step 5: Start Docker test environment
echo -e "${BLUE}🐳 Step 5: Starting Docker test environment...${NC}"
# Stop any existing containers first
if docker compose -f "${COMPOSE_FILE}" ps -q 2>/dev/null | grep -q .; then
echo " Stopping existing containers..."
docker compose -f "${COMPOSE_FILE}" down --volumes --remove-orphans 2>/dev/null || true
fi
# Build and start
echo " Building and starting containers..."
if [[ -f "${ENV_TEST_FILE}" ]]; then
# shellcheck source=/dev/null
set -a
source "${ENV_TEST_FILE}"
set +a
fi
docker compose -f "${COMPOSE_FILE}" up -d --build
echo -e "${GREEN}✅ Docker containers started${NC}"
echo ""
# Step 6: Wait for health check
wait_for_health "${HEALTH_URL}" "${HEALTH_TIMEOUT}"
echo ""
# Step 7: Success message
echo -e "${GREEN}════════════════════════════════════════════════════════════${NC}"
echo -e "${GREEN}✅ E2E test environment is ready!${NC}"
echo -e "${GREEN}════════════════════════════════════════════════════════════${NC}"
echo ""
echo -e " ${BLUE}📍 Application:${NC} http://localhost:8080"
echo -e " ${BLUE}📍 Health Check:${NC} http://localhost:8080/api/v1/health"
echo ""
echo -e " ${BLUE}🧪 Run tests:${NC}"
echo " npm run test:e2e # All tests"
echo " cd /projects/Charon npx playwright test --project=firefox # Firefox only"
echo " npx playwright test --ui # Interactive UI mode"
echo ""
echo -e " ${BLUE}🛑 Stop environment:${NC}"
echo " docker compose -f ${COMPOSE_FILE} down"
echo ""
echo -e " ${BLUE}📋 View logs:${NC}"
echo " docker compose -f ${COMPOSE_FILE} logs -f"
echo ""