← 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 }}"