| #!/usr/bin/env bash |
| set -euo pipefail |
|
|
| |
| |
|
|
| |
| source "$(dirname "$0")/setup-go-workspace.sh" |
|
|
| echo "π§ͺ Running E2E UI tests..." |
|
|
| CONFIGS_DIR=".github/workflows/configs" |
|
|
| |
| cleanup() { |
| echo "π§Ή Cleaning up..." |
| if [ -n "${SERVER_PID:-}" ]; then |
| kill "$SERVER_PID" 2>/dev/null || true |
| wait "$SERVER_PID" 2>/dev/null || true |
| fi |
| rm -f "${SERVER_LOG:-}" |
| docker compose -f "$CONFIGS_DIR/docker-compose.yml" down 2>/dev/null || true |
| } |
|
|
| |
| trap cleanup EXIT |
|
|
| |
| echo "π¨ Building UI..." |
| make build-ui |
|
|
| |
| echo "π¨ Building bifrost-http binary..." |
| mkdir -p tmp |
| cd transports/bifrost-http |
| go build -o ../../tmp/bifrost-http . |
| cd ../.. |
|
|
| |
| echo "π³ Starting Docker services (PostgreSQL, Redis, etc.)..." |
| docker compose -f "$CONFIGS_DIR/docker-compose.yml" up -d |
|
|
| |
| echo "β³ Waiting for Docker services to be ready..." |
| MAX_WAIT=300 |
| ELAPSED=0 |
| SERVICES_READY=false |
|
|
| |
| EXPECTED_SERVICES=$(docker compose -f "$CONFIGS_DIR/docker-compose.yml" config --services 2>/dev/null | wc -l | tr -d ' ') |
|
|
| while [ $ELAPSED -lt $MAX_WAIT ]; do |
| |
| RUNNING_COUNT=$(docker compose -f "$CONFIGS_DIR/docker-compose.yml" ps --status running -q 2>/dev/null | wc -l | tr -d ' ') |
|
|
| |
| HEALTH_OUTPUT=$(docker compose -f "$CONFIGS_DIR/docker-compose.yml" ps --format "{{.Name}}:{{.Health}}" 2>/dev/null) |
| HEALTHY_COUNT=$(echo "$HEALTH_OUTPUT" | grep -c ":healthy") || HEALTHY_COUNT=0 |
| UNHEALTHY_COUNT=$(echo "$HEALTH_OUTPUT" | grep -cE ":(starting|unhealthy)") || UNHEALTHY_COUNT=0 |
|
|
| |
| |
| |
| if [ "$RUNNING_COUNT" -eq "$EXPECTED_SERVICES" ] && [ "$UNHEALTHY_COUNT" -eq "0" ]; then |
| SERVICES_READY=true |
| echo "β
All Docker services are ready ($HEALTHY_COUNT with healthchecks, ${ELAPSED}s)" |
| break |
| fi |
|
|
| sleep 2 |
| ELAPSED=$((ELAPSED + 2)) |
| echo " β³ Waiting for services... ($RUNNING_COUNT/$EXPECTED_SERVICES running, $HEALTHY_COUNT healthy, $UNHEALTHY_COUNT starting, ${ELAPSED}s/${MAX_WAIT}s)" |
| done |
|
|
| if [ "$SERVICES_READY" = false ]; then |
| echo "β Docker services failed to become healthy within ${MAX_WAIT}s" |
| echo " Current service status:" |
| docker compose -f "$CONFIGS_DIR/docker-compose.yml" ps |
| exit 1 |
| fi |
|
|
| |
| echo "π§Ή Resetting PostgreSQL database..." |
| docker exec -e PGPASSWORD=bifrost_password "$(docker compose -f "$CONFIGS_DIR/docker-compose.yml" ps -q postgres)" \ |
| psql -U bifrost -d postgres \ |
| -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'bifrost' AND pid <> pg_backend_pid();" \ |
| -c "DROP DATABASE IF EXISTS bifrost;" \ |
| -c "CREATE DATABASE bifrost;" |
|
|
| |
| SERVER_LOG=$(mktemp) |
| echo "π Starting bifrost-http server..." |
| ./tmp/bifrost-http --app-dir "$CONFIGS_DIR/default" --port 18080 --log-level debug 2>&1 | tee "$SERVER_LOG" & |
| SERVER_PID=$! |
|
|
| |
| echo "β³ Waiting for server to start..." |
| MAX_WAIT=60 |
| ELAPSED=0 |
| SERVER_READY=false |
|
|
| while [ $ELAPSED -lt $MAX_WAIT ]; do |
| if grep -q "successfully started bifrost, serving UI on http://localhost:18080" "$SERVER_LOG" 2>/dev/null; then |
| SERVER_READY=true |
| echo "β
Server started successfully" |
| break |
| fi |
|
|
| |
| if ! kill -0 $SERVER_PID 2>/dev/null; then |
| echo "β Server process died before starting" |
| exit 1 |
| fi |
|
|
| sleep 1 |
| ELAPSED=$((ELAPSED + 1)) |
| done |
|
|
| if [ "$SERVER_READY" = false ]; then |
| echo "β Server failed to start within ${MAX_WAIT}s" |
| exit 1 |
| fi |
|
|
| |
| echo "π¦ Installing Playwright dependencies..." |
| cd tests/e2e |
| npm ci |
| npx playwright install --with-deps chromium |
|
|
| |
| |
| echo "π Running Playwright E2E tests..." |
| CI=true SKIP_WEB_SERVER=1 BASE_URL=http://localhost:18080 BIFROST_BASE_URL=http://localhost:18080 \ |
| MCP_SSE_HEADERS="${MCP_SSE_HEADERS:-}" \ |
| npx playwright test --workers=4 |
| PLAYWRIGHT_EXIT=$? |
|
|
| cd ../.. |
|
|
| echo "β
E2E UI tests completed" |
| exit $PLAYWRIGHT_EXIT |
|
|