name: 'Test: Unit' on: workflow_call: inputs: ref: description: GitHub ref to test. required: false type: string default: '' nodeVersion: description: Version of node to use. required: false type: string default: 24.13.1 collectCoverage: required: false default: false type: boolean secrets: CODECOV_TOKEN: description: 'Codecov upload token.' required: false BUILD_STATS_WEBHOOK_URL: description: 'Webhook URL for test stats.' required: false BUILD_STATS_WEBHOOK_USER: description: 'Basic auth username for test stats webhook.' required: false BUILD_STATS_WEBHOOK_PASSWORD: description: 'Basic auth password for test stats webhook.' required: false env: NODE_OPTIONS: --max-old-space-size=7168 jobs: unit-test-backend: name: Backend Unit Tests runs-on: ${{ vars.RUNNER_PROVIDER == 'github' && 'ubuntu-latest' || 'blacksmith-4vcpu-ubuntu-2204' }} env: COVERAGE_ENABLED: ${{ inputs.collectCoverage }} # Coverage collected when true steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ inputs.ref }} - name: Build uses: ./.github/actions/setup-nodejs with: node-version: ${{ inputs.nodeVersion }} - name: Test Unit run: pnpm test:ci:backend:unit --summarize - name: Send Test Stats if: ${{ !cancelled() }} run: node .github/scripts/send-build-stats.mjs || true env: BUILD_STATS_WEBHOOK_URL: ${{ secrets.BUILD_STATS_WEBHOOK_URL }} BUILD_STATS_WEBHOOK_USER: ${{ secrets.BUILD_STATS_WEBHOOK_USER }} BUILD_STATS_WEBHOOK_PASSWORD: ${{ secrets.BUILD_STATS_WEBHOOK_PASSWORD }} - name: Upload test results to Codecov if: ${{ !cancelled() }} uses: codecov/test-results-action@47f89e9acb64b76debcd5ea40642d25a4adced9f # v1.1.1 with: token: ${{ secrets.CODECOV_TOKEN }} name: backend-unit - name: Upload coverage to Codecov if: env.COVERAGE_ENABLED == 'true' uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3 with: token: ${{ secrets.CODECOV_TOKEN }} flags: backend-unit name: backend-unit integration-test-backend: name: Backend Integration Tests runs-on: ${{ vars.RUNNER_PROVIDER == 'github' && 'ubuntu-latest' || 'blacksmith-4vcpu-ubuntu-2204' }} env: COVERAGE_ENABLED: ${{ inputs.collectCoverage }} # Coverage collected when true steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ inputs.ref }} - name: Build uses: ./.github/actions/setup-nodejs with: node-version: ${{ inputs.nodeVersion }} - name: Test Integration run: pnpm test:ci:backend:integration --summarize - name: Send Test Stats if: ${{ !cancelled() }} run: node .github/scripts/send-build-stats.mjs || true env: BUILD_STATS_WEBHOOK_URL: ${{ secrets.BUILD_STATS_WEBHOOK_URL }} BUILD_STATS_WEBHOOK_USER: ${{ secrets.BUILD_STATS_WEBHOOK_USER }} BUILD_STATS_WEBHOOK_PASSWORD: ${{ secrets.BUILD_STATS_WEBHOOK_PASSWORD }} - name: Upload test results to Codecov if: ${{ !cancelled() }} uses: codecov/test-results-action@47f89e9acb64b76debcd5ea40642d25a4adced9f # v1.1.1 with: token: ${{ secrets.CODECOV_TOKEN }} name: backend-integration - name: Upload coverage to Codecov if: env.COVERAGE_ENABLED == 'true' uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3 with: token: ${{ secrets.CODECOV_TOKEN }} flags: backend-integration name: backend-integration unit-test-nodes: name: Nodes Unit Tests runs-on: ${{ vars.RUNNER_PROVIDER == 'github' && 'ubuntu-latest' || 'blacksmith-4vcpu-ubuntu-2204' }} env: COVERAGE_ENABLED: ${{ inputs.collectCoverage }} # Coverage collected when true steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ inputs.ref }} - name: Build uses: ./.github/actions/setup-nodejs with: node-version: ${{ inputs.nodeVersion }} - name: Test Nodes run: pnpm turbo test --filter=n8n-nodes-base --summarize - name: Send Test Stats if: ${{ !cancelled() }} run: node .github/scripts/send-build-stats.mjs || true env: BUILD_STATS_WEBHOOK_URL: ${{ secrets.BUILD_STATS_WEBHOOK_URL }} BUILD_STATS_WEBHOOK_USER: ${{ secrets.BUILD_STATS_WEBHOOK_USER }} BUILD_STATS_WEBHOOK_PASSWORD: ${{ secrets.BUILD_STATS_WEBHOOK_PASSWORD }} - name: Upload test results to Codecov if: ${{ !cancelled() }} uses: codecov/test-results-action@47f89e9acb64b76debcd5ea40642d25a4adced9f # v1.1.1 with: token: ${{ secrets.CODECOV_TOKEN }} name: nodes-unit - name: Upload coverage to Codecov if: env.COVERAGE_ENABLED == 'true' uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3 with: token: ${{ secrets.CODECOV_TOKEN }} flags: nodes-unit name: nodes-unit unit-test-frontend: name: Frontend (${{ matrix.shard }}/2) runs-on: ${{ vars.RUNNER_PROVIDER == 'github' && 'ubuntu-latest' || 'blacksmith-4vcpu-ubuntu-2204' }} strategy: fail-fast: false matrix: shard: [1, 2] env: COVERAGE_ENABLED: ${{ inputs.collectCoverage }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ inputs.ref }} - name: Build uses: ./.github/actions/setup-nodejs with: node-version: ${{ inputs.nodeVersion }} - name: Test run: pnpm test:ci:frontend --summarize -- --shard=${{ matrix.shard }}/2 env: VITEST_SHARD: ${{ matrix.shard }}/2 - name: Send Test Stats if: ${{ !cancelled() }} run: node .github/scripts/send-build-stats.mjs || true env: BUILD_STATS_WEBHOOK_URL: ${{ secrets.BUILD_STATS_WEBHOOK_URL }} BUILD_STATS_WEBHOOK_USER: ${{ secrets.BUILD_STATS_WEBHOOK_USER }} BUILD_STATS_WEBHOOK_PASSWORD: ${{ secrets.BUILD_STATS_WEBHOOK_PASSWORD }} - name: Upload test results to Codecov if: ${{ !cancelled() }} uses: codecov/test-results-action@47f89e9acb64b76debcd5ea40642d25a4adced9f # v1.1.1 with: token: ${{ secrets.CODECOV_TOKEN }} name: frontend-shard-${{ matrix.shard }} - name: Upload coverage to Codecov if: env.COVERAGE_ENABLED == 'true' uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3 with: token: ${{ secrets.CODECOV_TOKEN }} flags: frontend name: frontend-shard-${{ matrix.shard }} unit-test: name: Unit tests runs-on: ubuntu-latest needs: [unit-test-backend, integration-test-backend, unit-test-nodes, unit-test-frontend] if: always() steps: - name: Fail if tests failed if: needs.unit-test-backend.result == 'failure' || needs.integration-test-backend.result == 'failure' || needs.unit-test-nodes.result == 'failure' || needs.unit-test-frontend.result == 'failure' run: exit 1