Feat todo comment #13
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Comprehensive Testing Pipeline | ||
|
Check failure on line 1 in .github/workflows/comprehensive-testing.yml
|
||
| 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." | ||