fix(api,ci): remove type-only imports for DI and isolate CI ports from dev
- Remove `type` keyword from NestJS injectable class imports across all modules to fix runtime DI resolution (330+ handler/listener files) - Offset CI docker-compose ports (5433/6380/8109/9002) to avoid conflicts with running dev containers - Update .env.test, playwright.config.ts, and e2e workflow to use isolated CI ports with configurable overrides - Fix prisma/seed.ts to use deterministic IDs for Prisma 7 upsert compatibility (phoneHash replaced phone as unique index) - Add dedicated Docker bridge network for CI service containers Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
This commit is contained in:
127
scripts/e2e-ci.sh
Executable file
127
scripts/e2e-ci.sh
Executable file
@@ -0,0 +1,127 @@
|
||||
#!/usr/bin/env bash
|
||||
# =============================================================================
|
||||
# scripts/e2e-ci.sh — Run E2E tests against docker-compose.ci.yml services
|
||||
#
|
||||
# This script orchestrates the full CI-like E2E test flow locally:
|
||||
# 1. Starts CI containers (postgres, redis, typesense, minio)
|
||||
# 2. Waits for all healthchecks to pass
|
||||
# 3. Runs Prisma generate + migrate + seed
|
||||
# 4. Executes the Playwright E2E suite
|
||||
# 5. Tears down containers
|
||||
#
|
||||
# Usage:
|
||||
# ./scripts/e2e-ci.sh # run all E2E tests
|
||||
# ./scripts/e2e-ci.sh --api # run only API tests
|
||||
# ./scripts/e2e-ci.sh --web # run only Web tests
|
||||
# ./scripts/e2e-ci.sh --keep # keep containers running after tests
|
||||
# =============================================================================
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
COMPOSE_FILE="$ROOT_DIR/docker-compose.ci.yml"
|
||||
ENV_CI_FILE="$ROOT_DIR/.env.ci"
|
||||
ENV_TEST_FILE="$ROOT_DIR/.env.test"
|
||||
COMPOSE_CMD="docker compose --env-file $ENV_CI_FILE -f $COMPOSE_FILE"
|
||||
KEEP_CONTAINERS=false
|
||||
PROJECT_FLAG=""
|
||||
|
||||
# Parse arguments
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
--api) PROJECT_FLAG="--project=api" ;;
|
||||
--web) PROJECT_FLAG="--project=web" ;;
|
||||
--keep) KEEP_CONTAINERS=true ;;
|
||||
--help|-h)
|
||||
echo "Usage: $0 [--api|--web] [--keep]"
|
||||
echo " --api Run only API E2E tests"
|
||||
echo " --web Run only Web E2E tests"
|
||||
echo " --keep Keep CI containers running after tests"
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Colors
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
info() { echo -e "${CYAN}[e2e-ci]${NC} $*"; }
|
||||
success() { echo -e "${GREEN}[e2e-ci]${NC} $*"; }
|
||||
warn() { echo -e "${YELLOW}[e2e-ci]${NC} $*"; }
|
||||
error() { echo -e "${RED}[e2e-ci]${NC} $*"; }
|
||||
|
||||
cleanup() {
|
||||
if [ "$KEEP_CONTAINERS" = true ]; then
|
||||
warn "Keeping CI containers running (use '$COMPOSE_CMD down -v' to stop)"
|
||||
else
|
||||
info "Stopping CI containers..."
|
||||
$COMPOSE_CMD down -v --remove-orphans 2>/dev/null || true
|
||||
fi
|
||||
}
|
||||
|
||||
# Always clean up on exit (unless --keep)
|
||||
trap cleanup EXIT
|
||||
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
# Step 1: Load test env vars
|
||||
info "Loading test environment from $ENV_TEST_FILE..."
|
||||
if [ ! -f "$ENV_TEST_FILE" ]; then
|
||||
error ".env.test not found. Please create it first."
|
||||
exit 1
|
||||
fi
|
||||
set -a
|
||||
# shellcheck source=/dev/null
|
||||
source "$ENV_TEST_FILE"
|
||||
set +a
|
||||
|
||||
# Step 2: Start CI containers
|
||||
info "Starting CI containers..."
|
||||
$COMPOSE_CMD down -v --remove-orphans 2>/dev/null || true
|
||||
$COMPOSE_CMD up -d --wait
|
||||
|
||||
# Verify services are healthy
|
||||
info "Verifying service health..."
|
||||
SERVICES=("goodgo-ci-postgres" "goodgo-ci-redis" "goodgo-ci-typesense" "goodgo-ci-minio")
|
||||
for svc in "${SERVICES[@]}"; do
|
||||
STATUS=$(docker inspect --format='{{.State.Health.Status}}' "$svc" 2>/dev/null || echo "missing")
|
||||
if [ "$STATUS" = "healthy" ]; then
|
||||
success " ✓ $svc is healthy"
|
||||
else
|
||||
error " ✗ $svc status: $STATUS"
|
||||
docker logs "$svc" --tail 20 2>/dev/null
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# Step 3: Generate Prisma client
|
||||
info "Generating Prisma client..."
|
||||
pnpm db:generate
|
||||
|
||||
# Step 4: Run migrations
|
||||
info "Running database migrations..."
|
||||
pnpm db:migrate:deploy
|
||||
|
||||
# Step 5: Seed database
|
||||
info "Seeding test database..."
|
||||
pnpm db:seed
|
||||
|
||||
success "Database ready."
|
||||
|
||||
# Step 6: Run E2E tests
|
||||
info "Running Playwright E2E tests..."
|
||||
# Set CI=true so Playwright config uses CI settings (retries, single worker, etc.)
|
||||
# but globalSetup skips migrations since we already ran them above.
|
||||
CI=true pnpm test:e2e $PROJECT_FLAG
|
||||
TEST_EXIT=$?
|
||||
|
||||
if [ $TEST_EXIT -eq 0 ]; then
|
||||
success "All E2E tests passed! ✓"
|
||||
else
|
||||
error "Some E2E tests failed (exit code: $TEST_EXIT)"
|
||||
fi
|
||||
|
||||
exit $TEST_EXIT
|
||||
Reference in New Issue
Block a user