Skip to content

Feat todo comment

Feat todo comment #13

name: Comprehensive Testing Pipeline

Check failure on line 1 in .github/workflows/comprehensive-testing.yml

View workflow run for this annotation

GitHub Actions / .github/workflows/comprehensive-testing.yml

Invalid workflow file

(Line: 452, Col: 14): The expression is not closed. An unescaped ${{ sequence was found, but the closing }} sequence was not found.
on:
push:
branches: [ main, develop, 'feature/*' ]
pull_request:
branches: [ main, develop ]
env:
NODE_VERSION: '18'
DATABASE_URL: 'postgresql://test:test@localhost:5432/propchain_test'
REDIS_URL: 'redis://localhost:6379/1'
jobs:
# Code Quality and Linting
quality:
name: Code Quality Checks
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run ESLint
run: npm run lint -- --max-warnings 0
- name: Run Prettier check
run: npm run format -- --check
- name: TypeScript compilation check
run: npm run build
# Unit Tests with Coverage
unit-tests:
name: Unit Tests
runs-on: ubuntu-latest
needs: quality
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run unit tests with coverage
run: npm run test:unit -- --coverage --ci
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
file: ./coverage/lcov.info
flags: unit-tests
name: unit-test-coverage
- name: Check coverage thresholds
run: |
COVERAGE=$(npm run test:coverage:badge)
if [ "$COVERAGE" -lt 80 ]; then
echo "Coverage $COVERAGE% is below 80% threshold"
exit 1
fi
# Integration Tests
integration-tests:
name: Integration Tests
runs-on: ubuntu-latest
needs: quality
services:
postgres:
image: postgres:15
env:
POSTGRES_PASSWORD: test
POSTGRES_USER: test
POSTGRES_DB: propchain_integration
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
redis:
image: redis:7
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 6379:6379
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Wait for services
run: |
timeout 60 bash -c 'until nc -z localhost 5432; do sleep 1; done'
timeout 60 bash -c 'until nc -z localhost 6379; do sleep 1; done'
- name: Run database migrations
run: |
npm run db:generate
npm run migrate:deploy
env:
DATABASE_URL: postgresql://test:test@localhost:5432/propchain_integration
- name: Run integration tests
run: npm run test:integration
env:
DATABASE_URL: postgresql://test:test@localhost:5432/propchain_integration
REDIS_URL: redis://localhost:6379/2
# End-to-End Tests
e2e-tests:
name: End-to-End Tests
runs-on: ubuntu-latest
needs: [unit-tests, integration-tests]
services:
postgres:
image: postgres:15
env:
POSTGRES_PASSWORD: test
POSTGRES_USER: test
POSTGRES_DB: propchain_e2e
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
redis:
image: redis:7
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 6379:6379
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Wait for services
run: |
timeout 60 bash -c 'until nc -z localhost 5432; do sleep 1; done'
timeout 60 bash -c 'until nc -z localhost 6379; do sleep 1; done'
- name: Run database migrations
run: |
npm run db:generate
npm run migrate:deploy
env:
DATABASE_URL: postgresql://test:test@localhost:5432/propchain_e2e
- name: Build application
run: npm run build
- name: Start application
run: npm start &
env:
DATABASE_URL: postgresql://test:test@localhost:5432/propchain_e2e
REDIS_URL: redis://localhost:6379/3
NODE_ENV: production
- name: Wait for application
run: timeout 60 bash -c 'until curl -f http://localhost:3000/health; do sleep 2; done'
- name: Run E2E tests
run: npm run test:e2e
env:
DATABASE_URL: postgresql://test:test@localhost:5432/propchain_e2e
REDIS_URL: redis://localhost:6379/3
# Performance Tests
performance-tests:
name: Performance Tests
runs-on: ubuntu-latest
needs: unit-tests
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
services:
postgres:
image: postgres:15
env:
POSTGRES_PASSWORD: test
POSTGRES_USER: test
POSTGRES_DB: propchain_performance
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
redis:
image: redis:7
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 6379:6379
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Wait for services
run: |
timeout 60 bash -c 'until nc -z localhost 5432; do sleep 1; done'
timeout 60 bash -c 'until nc -z localhost 6379; do sleep 1; done'
- name: Run database migrations
run: |
npm run db:generate
npm run migrate:deploy
env:
DATABASE_URL: postgresql://test:test@localhost:5432/propchain_performance
- name: Run performance tests
run: npm run test:performance
env:
DATABASE_URL: postgresql://test:test@localhost:5432/propchain_performance
REDIS_URL: redis://localhost:6379/4
- name: Upload performance results
uses: actions/upload-artifact@v3
with:
name: performance-results
path: test-results/performance/
# Security Tests
security-tests:
name: Security Tests
runs-on: ubuntu-latest
needs: unit-tests
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run security tests
run: npm run test:security
- name: Run npm audit
run: npm audit --audit-level=moderate
continue-on-error: true
- name: Run Snyk security scan
run: |
npx snyk test --severity-threshold=high
continue-on-error: true
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
- name: Run CodeQL Analysis
uses: github/codeql-action/init@v2
with:
languages: javascript
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
# Load Testing
load-tests:
name: Load Testing
runs-on: ubuntu-latest
needs: integration-tests
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
services:
postgres:
image: postgres:15
env:
POSTGRES_PASSWORD: test
POSTGRES_USER: test
POSTGRES_DB: propchain_load
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
redis:
image: redis:7
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 6379:6379
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Install k6
run: |
sudo gpg -k
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/debian-archive-keyring.gpg --import <(curl -sSL 'https://dl.k6.io/key.gpg')
echo "deb [signed-by=/usr/share/keyrings/debian-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update
sudo apt-get install k6
- name: Wait for services
run: |
timeout 60 bash -c 'until nc -z localhost 5432; do sleep 1; done'
timeout 60 bash -c 'until nc -z localhost 6379; do sleep 1; done'
- name: Run database migrations
run: |
npm run db:generate
npm run migrate:deploy
env:
DATABASE_URL: postgresql://test:test@localhost:5432/propchain_load
- name: Build application
run: npm run build
- name: Start application
run: npm start &
env:
DATABASE_URL: postgresql://test:test@localhost:5432/propchain_load
REDIS_URL: redis://localhost:6379/5
NODE_ENV: production
- name: Wait for application
run: timeout 60 bash -c 'until curl -f http://localhost:3000/health; do sleep 2; done'
- name: Run load tests
run: npm run test:load
env:
DATABASE_URL: postgresql://test:test@localhost:5432/propchain_load
REDIS_URL: redis://localhost:6379/5
- name: Upload load test results
uses: actions/upload-artifact@v3
with:
name: load-test-results
path: test-results/load/
# Build and Deploy
build:
name: Build and Deploy
runs-on: ubuntu-latest
needs: [unit-tests, integration-tests, e2e-tests, security-tests]
if: github.ref == 'refs/heads/main'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build application
run: npm run build
- name: Create deployment artifact
run: |
tar -czf deployment.tar.gz dist/ package.json package-lock.json
- name: Upload deployment artifact
uses: actions/upload-artifact@v3
with:
name: deployment-artifact
path: deployment.tar.gz
# Test Results Summary
test-summary:
name: Test Summary
runs-on: ubuntu-latest
needs: [unit-tests, integration-tests, e2e-tests, performance-tests, security-tests, load-tests]
if: always()
steps:
- name: Download all artifacts
uses: actions/download-artifact@v3
- name: Generate test summary
run: |
echo "# Test Results Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Test Type | Status | Details |" >> $GITHUB_STEP_SUMMARY
echo "|-----------|--------|---------|" >> $GITHUB_STEP_SUMMARY
echo "| Unit Tests | ${{ needs.unit-tests.result }} | Coverage: $(npm run test:coverage:badge 2>/dev/null || echo 'N/A')% |" >> $GITHUB_STEP_SUMMARY
echo "| Integration Tests | ${{ needs.integration-tests.result }} | Database integration |" >> $GITHUB_STEP_SUMMARY
echo "| E2E Tests | ${{ needs.e2e-tests.result }} | Full application flow |" >> $GITHUB_STEP_SUMMARY
echo "| Performance Tests | ${{ needs.performance-tests.result || 'skipped' }} | Load and performance |" >> $GITHUB_STEP_SUMMARY
echo "| Security Tests | ${{ needs.security-tests.result }} | Security scanning |" >> $GITHUB_STEP_SUMMARY
echo "| Load Tests | ${{ needs.load-tests.result || 'skipped' }} | Stress testing |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "## Coverage Report" >> $GITHUB_STEP_SUMMARY
echo "- [View detailed coverage report](https://codecov.io/gh/${{ github.repository })" >> $GITHUB_STEP_SUMMARY
# Notification
notify:
name: Notify Results
runs-on: ubuntu-latest
needs: [unit-tests, integration-tests, e2e-tests, security-tests]
if: always()
steps:
- name: Notify on success
if: needs.unit-tests.result == 'success' && needs.integration-tests.result == 'success' && needs.e2e-tests.result == 'success' && needs.security-tests.result == 'success'
run: |
echo "✅ All tests passed successfully!"
echo "Ready for deployment."
- name: Notify on failure
if: needs.unit-tests.result == 'failure' || needs.integration-tests.result == 'failure' || needs.e2e-tests.result == 'failure' || needs.security-tests.result == 'failure'
run: |
echo "❌ Some tests failed!"
echo "Please check the logs and fix the issues before deployment."