Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
277 changes: 277 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,277 @@
name: Test Suite

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

jobs:
# Unit Tests Job
unit-tests:
name: 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: '22'
cache: 'npm'

- name: Install dependencies
run: npm ci

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

- name: Generate coverage report
run: npm run test:coverage

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./coverage/unit/*.json
flags: unit
name: codecov-umbrella

# Type Check Job
type-check:
name: Type Check
runs-on: ubuntu-latest

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

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

- name: Install dependencies
run: npm ci

- name: Run type check
run: npm run typecheck

# Lint Job
lint:
name: Lint
runs-on: ubuntu-latest

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

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

- name: Install dependencies
run: npm ci

- name: Run ESLint
run: npm run lint

# Integration Tests Job
integration-tests:
name: 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: '22'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Install Firebase CLI
run: npm install -g firebase-tools

- name: Start Firebase Emulator
run: firebase emulators:start --background
timeout-minutes: 5

- name: Wait for emulators to be ready
run: npx wait-on http://localhost:4000

- name: Run integration tests
run: firebase emulators:exec "vitest run tests/integration/"

- name: Upload integration test coverage
uses: codecov/codecov-action@v4
with:
files: ./coverage/integration/*.json
flags: integration
name: codecov-umbrella

# E2E Tests Job
e2e-tests:
name: 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: '22'
cache: 'npm'

- name: Install dependencies
run: npm ci

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

- name: Install Firebase CLI
run: npm install -g firebase-tools

- name: Start Firebase Emulator
run: firebase emulators:start --background
timeout-minutes: 5

- name: Wait for emulators to be ready
run: npx wait-on http://localhost:4000

- name: Build application
run: npm run build

- name: Run E2E tests
run: npm run test:e2e

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

# Security Audit Job
security-audit:
name: Security Audit
runs-on: ubuntu-latest

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

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

- name: Install dependencies
run: npm ci

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

- name: Check for vulnerabilities
run: |
echo "Checking for high/critical vulnerabilities..."
npm audit --production --audit-level=high || echo "No high/critical vulnerabilities found"

# Build Test Job
build-test:
name: Build Test
runs-on: ubuntu-latest

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

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

- name: Install dependencies
run: npm ci

- name: Build application
run: npm run build

- name: Check build output
run: |
if [ ! -d "dist" ]; then
echo "Build output not found"
exit 1
fi
echo "Build successful"
ls -la dist/

- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: build-artifacts
path: dist/
retention-days: 7

# Firebase Rules Test Job
firestore-rules-test:
name: Firestore Security Rules Test
runs-on: ubuntu-latest

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

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

- name: Install dependencies
run: npm ci

- name: Install Firebase CLI
run: npm install -g firebase-tools

- name: Run Firestore rules tests
run: |
firebase emulators:exec "vitest run tests/firestore/firestore.rules.test.ts"

# Test Summary Job
test-summary:
name: Test Summary
runs-on: ubuntu-latest
needs: [unit-tests, type-check, lint, integration-tests, e2e-tests]
if: always()

steps:
- name: Display test results
run: |
echo "## Test Results Summary"
echo "Unit Tests: ${{ needs.unit-tests.result }}"
echo "Type Check: ${{ needs.type-check.result }}"
echo "Lint: ${{ needs.lint.result }}"
echo "Integration Tests: ${{ needs.integration-tests.result }}"
echo "E2E Tests: ${{ needs.e2e-tests.result }}"

# Exit with error if any job failed
if [ "${{ needs.unit-tests.result }}" != "success" ] || [ "${{ needs.type-check.result }}" != "success" ] || [ "${{ needs.lint.result }}" != "success" ] || [ "${{ needs.integration-tests.result }}" != "success" ] || [ "${{ needs.e2e-tests.result }}" != "success" ]; then
echo "Some tests failed"
exit 1
fi

echo "All tests passed successfully!"
Loading
Loading