server-tests.yml 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. name: Server Tests
  2. on:
  3. push:
  4. branches: [ main, develop ]
  5. paths:
  6. - 'packages/server/**'
  7. - '.github/workflows/server-tests.yml'
  8. pull_request:
  9. branches: [ main ]
  10. paths:
  11. - 'packages/server/**'
  12. - '.github/workflows/server-tests.yml'
  13. workflow_dispatch:
  14. jobs:
  15. server-tests:
  16. runs-on: ubuntu-latest
  17. timeout-minutes: 15
  18. services:
  19. postgres:
  20. image: postgres:17
  21. env:
  22. POSTGRES_DB: test_d8dai
  23. POSTGRES_USER: postgres
  24. POSTGRES_PASSWORD: test_password
  25. options: >-
  26. --health-cmd="pg_isready -U postgres"
  27. --health-interval=10s
  28. --health-timeout=5s
  29. --health-retries=3
  30. ports:
  31. - 5432:5432
  32. steps:
  33. - name: Checkout code
  34. uses: actions/checkout@v4
  35. - name: Setup Node.js
  36. uses: actions/setup-node@v4
  37. with:
  38. node-version: '20'
  39. cache: 'pnpm'
  40. - name: Install pnpm
  41. uses: pnpm/action-setup@v2
  42. with:
  43. version: 8
  44. - name: Install dependencies
  45. run: pnpm install --frozen-lockfile
  46. - name: Setup test environment
  47. run: |
  48. cp .env.test.example .env.test
  49. echo "TEST_DATABASE_URL=postgresql://postgres:test_password@localhost:5432/test_d8dai" >> .env.test
  50. echo "NODE_ENV=test" >> .env.test
  51. echo "JWT_SECRET=test_jwt_secret_1234567890" >> .env.test
  52. - name: Run database migrations
  53. run: |
  54. export NODE_ENV=test
  55. cd packages/server
  56. pnpm db:migrate
  57. - name: Run server unit tests
  58. run: |
  59. export NODE_ENV=test
  60. cd packages/server
  61. pnpm test:unit
  62. - name: Run server integration tests
  63. run: |
  64. export NODE_ENV=test
  65. cd packages/server
  66. pnpm test:integration
  67. - name: Generate server test coverage
  68. run: |
  69. export NODE_ENV=test
  70. cd packages/server
  71. pnpm test:coverage
  72. - name: Upload test results
  73. if: always()
  74. uses: actions/upload-artifact@v4
  75. with:
  76. name: server-test-results
  77. path: |
  78. packages/server/coverage/
  79. packages/server/test-results/
  80. retention-days: 7
  81. - name: Upload coverage to Codecov
  82. if: success()
  83. uses: codecov/codecov-action@v3
  84. with:
  85. file: ./packages/server/coverage/coverage-final.json
  86. flags: server-tests
  87. - name: Generate test summary
  88. if: always()
  89. uses: test-summary/action@v2
  90. with:
  91. paths: packages/server/test-results/junit.xml
  92. - name: Notify on failure
  93. if: failure()
  94. uses: 8398a7/action-slack@v3
  95. with:
  96. status: ${{ job.status }}
  97. channel: '#ci-notifications'
  98. webhook_url: ${{ secrets.SLACK_WEBHOOK }}
  99. env:
  100. SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
  101. - name: Send test results to GitHub
  102. if: always()
  103. uses: dorny/test-reporter@v1
  104. with:
  105. name: Server Tests
  106. path: packages/server/test-results/junit.xml
  107. reporter: jest-junit
  108. fail-on-error: false