name: CI on: push: pull_request: jobs: # ─── Unit & Browser Component Tests ────────────────────────────────────────── # No backend needed — Vitest runs in Node (utils) and headless Chromium (components). unit-tests: name: Unit & Component Tests runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 cache: npm cache-dependency-path: frontend/package-lock.json - name: Install dependencies run: npm ci working-directory: frontend - name: Install Playwright Chromium (used by vitest browser mode) run: npx playwright install chromium --with-deps working-directory: frontend - name: Run unit and component tests run: npm test working-directory: frontend - name: Upload screenshots if: always() uses: actions/upload-artifact@v4 with: name: unit-test-screenshots path: frontend/test-results/screenshots/ # ─── E2E Tests ──────────────────────────────────────────────────────────────── # Needs: PostgreSQL + MinIO (via docker-compose) + Spring Boot + SvelteKit dev server. # Test data is seeded by DataInitializer on first startup (admin user + e2e profile data). e2e-tests: name: E2E Tests runs-on: ubuntu-latest # These env vars are picked up by docker-compose (overrides .env file) env: POSTGRES_USER: archive_user POSTGRES_PASSWORD: ci_db_password POSTGRES_DB: family_archive_db MINIO_ROOT_USER: minio_admin MINIO_ROOT_PASSWORD: ci_minio_password MINIO_DEFAULT_BUCKETS: archive-documents PORT_DB: 5432 PORT_MINIO_API: 9000 PORT_MINIO_CONSOLE: 9001 PORT_BACKEND: 8080 PORT_FRONTEND: 3000 steps: - uses: actions/checkout@v4 # ── Infrastructure ────────────────────────────────────────────────────── - name: Start DB and MinIO run: docker-compose up -d db minio create-buckets - name: Wait for DB to be ready run: | timeout 30 bash -c \ 'until docker-compose exec -T db pg_isready -U archive_user; do sleep 2; done' # ── Backend ───────────────────────────────────────────────────────────── - uses: actions/setup-java@v4 with: java-version: '21' distribution: temurin cache: maven - name: Build backend (skip tests — covered by separate Java test job) run: | chmod +x mvnw ./mvnw clean package -DskipTests working-directory: backend - name: Start backend run: | java -jar backend/target/*.jar \ --spring.profiles.active=e2e \ --SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/family_archive_db \ --SPRING_DATASOURCE_USERNAME=archive_user \ --SPRING_DATASOURCE_PASSWORD=ci_db_password \ --S3_ENDPOINT=http://localhost:9000 \ --S3_ACCESS_KEY=minio_admin \ --S3_SECRET_KEY=ci_minio_password \ --S3_BUCKET_NAME=archive-documents \ --S3_REGION=us-east-1 \ --APP_ADMIN_USERNAME=admin \ --APP_ADMIN_PASSWORD=admin123 \ & echo "Waiting for backend..." timeout 90 bash -c \ 'until curl -sf http://localhost:8080/actuator/health | grep -q "UP"; do sleep 3; done' echo "Backend is up." # ── Frontend ───────────────────────────────────────────────────────────── - uses: actions/setup-node@v4 with: node-version: 20 cache: npm cache-dependency-path: frontend/package-lock.json - name: Install frontend dependencies run: npm ci working-directory: frontend - name: Install Playwright Chromium run: npx playwright install chromium --with-deps working-directory: frontend # ── Tests ──────────────────────────────────────────────────────────────── - name: Run E2E tests run: npm run test:e2e working-directory: frontend env: E2E_BASE_URL: http://localhost:3000 E2E_USERNAME: admin E2E_PASSWORD: admin123 - name: Upload E2E results if: always() uses: actions/upload-artifact@v4 with: name: e2e-results path: frontend/test-results/e2e/