← back to Wine Finder Next

.github/workflows/test-automation.yml

203 lines

name: Test Automation Pipeline

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  unit-and-integration-tests:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: '18'
        cache: 'npm'

    - name: Install dependencies
      run: npm ci

    - name: Run unit tests
      run: npm run test:unit -- --ci --coverage

    - name: Run integration tests
      run: npm run test:integration -- --ci

    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v3
      with:
        file: ./coverage/lcov.info
        flags: unittests
        name: codecov-umbrella

    - name: Comment coverage on PR
      if: github.event_name == 'pull_request'
      uses: romeovs/lcov-reporter-action@v0.3.1
      with:
        github-token: ${{ secrets.GITHUB_TOKEN }}
        lcov-file: ./coverage/lcov.info

  security-tests:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: '18'
        cache: 'npm'

    - name: Install dependencies
      run: npm ci

    - name: Run security tests
      run: npm run test:security -- --ci

    - name: Run npm audit
      run: npm audit --production --audit-level moderate
      continue-on-error: true

    - name: OWASP Dependency Check
      uses: dependency-check/Dependency-Check_Action@main
      with:
        project: 'wine-finder-next'
        path: '.'
        format: 'HTML'
      continue-on-error: true

    - name: Upload security test results
      uses: actions/upload-artifact@v3
      if: always()
      with:
        name: security-test-results
        path: |
          coverage/
          dependency-check-report.html

  performance-tests:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: '18'
        cache: 'npm'

    - name: Install dependencies
      run: npm ci

    - name: Build application
      run: npm run build

    - name: Start application
      run: npm run start &
      env:
        PORT: 3000

    - name: Wait for application
      run: npx wait-on http://localhost:3000 --timeout 60000

    - name: Run performance tests
      run: npm run test:performance -- --ci

    - name: Upload performance results
      uses: actions/upload-artifact@v3
      with:
        name: performance-results
        path: performance-results/

  e2e-tests:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: '18'
        cache: 'npm'

    - name: Install dependencies
      run: npm ci

    - name: Install Playwright browsers
      run: npx playwright install --with-deps

    - name: Build application
      run: npm run build

    - name: Run E2E tests
      run: npm run test:e2e
      env:
        CI: true

    - name: Upload test results
      uses: actions/upload-artifact@v3
      if: always()
      with:
        name: playwright-report
        path: playwright-report/
        retention-days: 30

    - name: Upload test videos
      uses: actions/upload-artifact@v3
      if: failure()
      with:
        name: test-videos
        path: test-results/

  code-quality:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: '18'
        cache: 'npm'

    - name: Install dependencies
      run: npm ci

    - name: Run ESLint
      run: npm run lint
      continue-on-error: true

    - name: Run TypeScript check
      run: npx tsc --noEmit
      continue-on-error: true

  test-summary:
    runs-on: ubuntu-latest
    needs: [unit-and-integration-tests, security-tests, performance-tests, e2e-tests, code-quality]
    if: always()

    steps:
    - name: Test Summary
      run: |
        echo "Test Suite Summary"
        echo "=================="
        echo "Unit & Integration: ${{ needs.unit-and-integration-tests.result }}"
        echo "Security: ${{ needs.security-tests.result }}"
        echo "Performance: ${{ needs.performance-tests.result }}"
        echo "E2E: ${{ needs.e2e-tests.result }}"
        echo "Code Quality: ${{ needs.code-quality.result }}"