Skip to content

Refactor E2E tests to use Cucumber.js and update test workflow #85

Refactor E2E tests to use Cucumber.js and update test workflow

Refactor E2E tests to use Cucumber.js and update test workflow #85

Workflow file for this run

name: Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
backend-tests:
name: Backend Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: backend/package-lock.json
- name: Install backend dependencies
run: |
cd backend
npm ci
- name: Generate Prisma client
run: |
cd backend
npx prisma generate
- name: Run backend tests
run: |
cd backend
npm test
frontend-unit-tests:
name: Frontend Unit Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: frontend/package-lock.json
- name: Install frontend dependencies
run: |
cd frontend
npm ci
- name: Run frontend tests
run: |
cd frontend
npm test
e2e-tests:
name: E2E Browser Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install backend dependencies
run: |
cd backend
npm ci
- name: Generate Prisma client
run: |
cd backend
npx prisma generate
- name: Setup backend database
run: |
cd backend
npx prisma db push
env:
DATABASE_URL: file:${{ github.workspace }}/backend/prisma/e2e-test.db
- name: Install frontend dependencies
run: |
cd frontend
npm ci
- name: Install E2E test dependencies
run: |
cd e2e
npm ci
- name: Install Playwright browsers
run: |
cd e2e
npx playwright install chromium --with-deps
- name: Start servers and run E2E tests
run: |
# Start backend server in background
cd backend
NODE_ENV="test" \
DATABASE_URL="file:${{ github.workspace }}/backend/prisma/e2e-test.db" \
FRONTEND_URL="http://127.0.0.1:5173" \
AUTH_SESSION_SECRET="e2e-test-secret" \
AUTH_USERNAME="admin" \
AUTH_PASSWORD="admin123" \
LOGIN_MAX_FAILURES="2" \
LOGIN_RATE_LIMIT_MAX="1000" \
CSRF_MAX_REQUESTS="10000" \
RATE_LIMIT_MAX_REQUESTS="20000" \
npm run dev &
BACKEND_PID=$!
cd ..
# Wait for backend to be ready
echo "Waiting for backend server..."
for i in {1..30}; do
if curl -s http://localhost:8000/health > /dev/null; then
echo "Backend is ready!"
break
fi
echo "Attempt $i: Backend not ready yet..."
sleep 2
done
# Start frontend server in background
cd frontend
VITE_API_URL="http://127.0.0.1:8000" npm run dev -- --host &
FRONTEND_PID=$!
cd ..
# Wait for frontend to be ready
echo "Waiting for frontend server..."
for i in {1..30}; do
if curl -s http://localhost:5173 > /dev/null; then
echo "Frontend is ready!"
break
fi
echo "Attempt $i: Frontend not ready yet..."
sleep 2
done
# Run E2E tests
cd e2e
NO_SERVER=true CI=true API_URL="http://127.0.0.1:8000" BASE_URL="http://127.0.0.1:5173" npm test
TEST_EXIT_CODE=$?
# Cleanup
kill $BACKEND_PID $FRONTEND_PID 2>/dev/null || true
exit $TEST_EXIT_CODE
env:
AUTH_USERNAME: admin
AUTH_PASSWORD: admin123
DATABASE_URL: file:${{ github.workspace }}/backend/prisma/e2e-test.db
START_SERVER_IN_TEST: "true"
CSRF_MAX_REQUESTS: "10000"
RATE_LIMIT_MAX_REQUESTS: "20000"
LOGIN_MAX_FAILURES: "2"
LOGIN_RATE_LIMIT_MAX: "1000"
- name: Upload Cucumber report
uses: actions/upload-artifact@v4
if: always()
with:
name: cucumber-report
path: e2e/reports/
retention-days: 7
# Security tests for data sanitization
security-tests:
name: Security Sanitization Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: backend/package-lock.json
- name: Install backend dependencies
run: |
cd backend
npm ci
- name: Generate Prisma client
run: |
cd backend
npx prisma generate
- name: Run security tests
run: |
cd backend
npx ts-node src/securityTest.ts