name: E2E Tests on: push: branches: [ main, master ] pull_request: branches: [ main, master ] schedule: # Run E2E tests nightly at 2 AM UTC - cron: '0 2 * * *' jobs: e2e-tests: name: End-to-End Tests runs-on: ubuntu-latest timeout-minutes: 30 services: postgres: image: postgres:16 env: POSTGRES_USER: basil POSTGRES_PASSWORD: basil POSTGRES_DB: basil options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Install dependencies run: npm ci - name: Install Playwright browsers run: npx playwright install --with-deps - name: Build packages run: npm run build - name: Run database migrations working-directory: packages/api env: DATABASE_URL: postgresql://basil:basil@localhost:5432/basil run: npm run prisma:migrate - name: Start application env: DATABASE_URL: postgresql://basil:basil@localhost:5432/basil PORT: 3001 NODE_ENV: test run: | npm run dev & sleep 10 - name: Run E2E tests run: npm run test:e2e - name: Upload Playwright report uses: actions/upload-artifact@v4 if: always() with: name: playwright-report path: playwright-report/ retention-days: 14 - name: Upload test results uses: actions/upload-artifact@v4 if: always() with: name: playwright-results path: test-results/ retention-days: 7 e2e-mobile: name: E2E Tests (Mobile) runs-on: ubuntu-latest timeout-minutes: 30 if: github.event_name == 'push' && github.ref == 'refs/heads/main' services: postgres: image: postgres:16 env: POSTGRES_USER: basil POSTGRES_PASSWORD: basil POSTGRES_DB: basil options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Install dependencies run: npm ci - name: Install Playwright browsers run: npx playwright install --with-deps - name: Build packages run: npm run build - name: Run database migrations working-directory: packages/api env: DATABASE_URL: postgresql://basil:basil@localhost:5432/basil run: npm run prisma:migrate - name: Start application env: DATABASE_URL: postgresql://basil:basil@localhost:5432/basil PORT: 3001 NODE_ENV: test run: | npm run dev & sleep 10 - name: Run E2E tests on mobile run: npx playwright test --project="Mobile Chrome" --project="Mobile Safari" - name: Upload mobile test results uses: actions/upload-artifact@v4 if: always() with: name: playwright-mobile-results path: test-results/ retention-days: 7