Christoph Wagner b2df8786ca
All checks were successful
CI Pipeline / Code Linting (pull_request) Successful in 15s
CI Pipeline / Run Unit Tests (pull_request) Successful in 20s
CI Pipeline / Run E2E Tests (Playwright) (pull_request) Successful in 47s
CI Pipeline / Build Verification (pull_request) Successful in 13s
CI Pipeline / Generate Quality Report (pull_request) Successful in 19s
feat: integrate Playwright for E2E UI testing
Add comprehensive Playwright integration for end-to-end UI testing with
full CI/CD pipeline support.

Changes:
---------

1. **Playwright Installation & Configuration**
   - Installed @playwright/test and http-server
   - Created playwright.config.js with optimized settings
   - Configured to use Chromium browser in headless mode
   - Auto-starts local web server on port 8080 for testing

2. **E2E Test Suite**
   Created tests/e2e/ directory with comprehensive tests:

   - **status-message.spec.js** (5 tests)
     ✓ Status message element exists in DOM
     ✓ Status message is hidden by default
     ✓ New game shows status message
     ✓ Status message has correct CSS classes

   - **layout-stability.spec.js** (5 tests)
     ✓ Chess board has fixed 600x600px dimensions
     ✓ Board squares are exactly 75px × 75px
     ✓ Column widths remain stable when pieces are captured
     ✓ Row heights remain stable when highlighting moves
     ✓ Last-move highlighting does not change layout

3. **Package.json Scripts**
   - test: Runs both unit and E2E tests
   - test:unit: Jest unit tests only
   - test:e2e: Playwright E2E tests
   - test:e2e:headed: Run with browser visible
   - test:e2e:ui: Interactive UI mode

4. **CI Pipeline Updates (.gitea/workflows/ci.yml)**
   - Split test job into test-unit and test-e2e
   - Added Playwright browser installation step
   - Configured artifact upload for Playwright reports
   - Updated job dependencies to include E2E tests

Test Results:
-------------
 9/9 Playwright E2E tests passing
 124/124 Jest unit tests passing
 Total: 133 tests passing

CI Configuration:
-----------------
- Runs Playwright in CI mode (retries: 2, workers: 1)
- Uses GitHub reporter for CI, list reporter for local
- Captures screenshots on failure
- Traces on first retry for debugging
- Artifacts retained for 30 days

Usage:
------
npm run test          # All tests (unit + E2E)
npm run test:unit     # Jest unit tests only
npm run test:e2e      # Playwright E2E tests
npm run test:e2e:ui   # Interactive UI mode

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 21:49:28 +01:00

192 lines
5.9 KiB
YAML

name: CI Pipeline
on:
push:
branches:
- main
- master
- develop
pull_request:
branches:
- main
- master
jobs:
lint:
name: Code Linting
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: false
test-unit:
name: Run Unit 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 with coverage
run: npm run test:coverage
- name: Check coverage threshold
run: |
echo "Checking test coverage meets minimum threshold of 70%..."
COVERAGE=$(cat coverage/coverage-summary.json | grep -o '"lines":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)
echo "Current coverage: ${COVERAGE}%"
if (( $(echo "$COVERAGE < 70" | bc -l) )); then
echo "❌ Coverage ${COVERAGE}% is below minimum threshold of 70%"
exit 1
else
echo "✅ Coverage ${COVERAGE}% meets threshold"
fi
- name: Archive test results
if: always()
uses: actions/upload-artifact@v3
with:
name: unit-test-results
path: coverage/
retention-days: 30
test-e2e:
name: Run E2E Tests (Playwright)
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 chromium
- name: Run Playwright tests
run: npm run test:e2e
- name: Upload Playwright Report
if: always()
uses: actions/upload-artifact@v3
with:
name: playwright-report
path: playwright-report/
retention-days: 30
build-verification:
name: Build Verification
runs-on: ubuntu-latest
needs: [lint, test-unit, test-e2e]
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: Verify package.json
run: |
echo "Verifying package.json structure..."
node -e "const pkg = require('./package.json'); console.log('✅ Package name:', pkg.name); console.log('✅ Version:', pkg.version);"
- name: Check for JavaScript syntax errors
run: |
echo "Checking JavaScript files for syntax errors..."
find js -name "*.js" -type f -exec node --check {} \;
echo "✅ All JavaScript files are valid"
- name: Verify critical files exist
run: |
echo "Verifying critical project files..."
test -f index.html || { echo "❌ index.html not found"; exit 1; }
test -d js || { echo "❌ js directory not found"; exit 1; }
test -f js/main.js || { echo "❌ js/main.js not found"; exit 1; }
echo "✅ All critical files present"
quality-report:
name: Generate Quality Report
runs-on: ubuntu-latest
needs: [lint, test-unit, test-e2e, build-verification]
if: always()
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: Generate full coverage report
run: npm run test:coverage
continue-on-error: true
- name: Generate quality summary
run: |
echo "# Quality Report" > quality-report.md
echo "" >> quality-report.md
echo "## Test Results" >> quality-report.md
if [ -f coverage/coverage-summary.json ]; then
echo "- Lines: $(cat coverage/coverage-summary.json | grep -o '"lines":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md
echo "- Statements: $(cat coverage/coverage-summary.json | grep -o '"statements":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md
echo "- Functions: $(cat coverage/coverage-summary.json | grep -o '"functions":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md
echo "- Branches: $(cat coverage/coverage-summary.json | grep -o '"branches":{"total":[0-9]*,"covered":[0-9]*,"skipped":[0-9]*,"pct":[0-9.]*' | grep -o 'pct":[0-9.]*' | cut -d':' -f2)%" >> quality-report.md
fi
echo "" >> quality-report.md
echo "## Build Info" >> quality-report.md
echo "- Node Version: $(node --version)" >> quality-report.md
echo "- NPM Version: $(npm --version)" >> quality-report.md
echo "- Commit: ${{ github.sha }}" >> quality-report.md
echo "- Branch: ${{ github.ref_name }}" >> quality-report.md
cat quality-report.md
- name: Upload quality report
uses: actions/upload-artifact@v3
with:
name: quality-report
path: quality-report.md
retention-days: 90