name: ReportTestResults
on:
  workflow_run:
    workflows:
      - PullRequest
    types:
      - completed
permissions:
  contents: read
  actions: read
  checks: write
jobs:
  Report:
    runs-on: ubuntu-latest
    steps:
      - name: 'Add default settings to node calls'
        shell: bash
        run: |
          #
          # The later used dorny/test-reporter@v1 action can throw the following exception when enough tests have been
          # executed:
          #     RangeError: Maximum call stack size exceeded
          #
          # We explicitly increase the stack max. stack size here to work around this issue.
          #
          
          which node
          node --version
          
          mv /usr/local/bin/node /usr/local/bin/node_org
          echo '#!/bin/bash' >> /usr/local/bin/node
          echo '/usr/local/bin/node_org --stack-size=4096 $@' >> /usr/local/bin/node
          cat /usr/local/bin/node
          chmod +x /usr/local/bin/node

          which node
          node --version
      - name: Checkout
        uses: actions/checkout@v4
        with:
          repository: ${{ github.event.workflow_run.head_repository.full_name }}
          ref: ${{ github.event.workflow_run.head_branch }}
          fetch-depth: 1
      # The dorny/test-reporter@v1 action doesn't support actions/upload-artifact@v4 yet.
      # We therefore download the artifact manually and feed it to dorny/test-reporter@v1 as local files.
      - name: 'Download Test Results'
        id: DownloadTestResults
        uses: actions/github-script@v7
        with:
          script: |
            var allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
               owner: context.repo.owner,
               repo: context.repo.repo,
               run_id: context.payload.workflow_run.id,
            });
            
            console.log('context.repo.owner = ' + context.repo.owner);
            console.log('context.repo.repo = ' + context.repo.repo);
            
            var artifacts = allArtifacts.data.artifacts.filter((artifact) => {
              return artifact.name == "test-results";
            });
            
            if (artifacts.length > 0) {
              var download = await github.rest.actions.downloadArtifact({
                 owner: context.repo.owner,
                 repo: context.repo.repo,
                 artifact_id: artifacts[0].id,
                 archive_format: 'zip',
              });
            
              var fs = require('fs');
              fs.writeFileSync('${{ github.workspace }}/test-results.zip', Buffer.from(download.data));
            
              core.setOutput('hasTestResultsArtifact', 'true');
            }
      - name: 'Extract Artifact'
        id: ExtractArtifact
        if: steps.DownloadTestResults.outputs.hasTestResultsArtifact == 'true'
        shell: pwsh
        run: |
          Expand-Archive test-results.zip -DestinationPath './test-results' -Force
          dir -Recurse | Select-Object -ExpandProperty FullName
      - name: 'Publish Test Report'
        if: steps.ExtractArtifact.conclusion == 'success'
        uses: dorny/test-reporter@v1
        env:
          #
          # Can throw the following exception, when enough tests have been executed:
          #     FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
          #
          # We explicitly increase the max. heap size here to work around this issue.
          #
          NODE_OPTIONS: --max-old-space-size=8192
        with:
          name: 'All Tests'
          # artifact: test-results
          # use '**/*.trx' for artifact and 'test-results/**/*.trx' for local files
          path: 'test-results/**/*.trx'
          reporter: dotnet-trx
          only-summary: 'true'
          fail-on-error: 'false'
          fail-on-empty: 'true'
