name: go-tests

on: [push]

env:
  TEST_RESULTS: /tmp/test-results

jobs:

  go-tests:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        go-version: [ 1.15.3, 1.19 ]
    
    steps:
      - name: Setup go
        uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0
        with:
          go-version: ${{ matrix.go-version }}
      
      - name: Checkout code
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Create test directory
        run: |
          mkdir -p ${{ env.TEST_RESULTS }}

      - name: Download go modules
        run: go mod download
      
      - name: Cache / restore go modules
        uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0
        with:
          path: |
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-
      
      # Check go fmt output because it does not report non-zero when there are fmt changes
      - name: Run gofmt
        run: |
          go fmt ./...
          files=$(go fmt ./...)
            if [ -n "$files" ]; then
              echo "The following file(s) do not conform to go fmt:"
              echo "$files"
              exit 1
            fi
        
      # Install gotestsum with go get for 1.15.3; otherwise default to go install 
      - name: Install gotestsum
        run: |
          GTS="gotest.tools/gotestsum@v1.8.2"
          # We use the same error message prefix in either failure case, so just define it once here.
          ERROR="Failed to install $GTS"
          # First try to 'go install', if that fails try 'go get'...
          go install "$GTS" || go get "$GTS" || { echo "$ERROR: both 'go install' and 'go get' failed"; exit 1; }
          # Check that the gotestsum command was actually installed in the path...
          command -v gotestsum > /dev/null 2>&1 || { echo "$ERROR: gotestsum command not installed"; exit 1; }
          echo "OK: Command 'gotestsum' installed ($GTS)"
      
      - name: Run go tests
        run: |
          PACKAGE_NAMES=$(go list ./...)
          gotestsum --format=short-verbose --junitfile $TEST_RESULTS/gotestsum-report.xml -- $PACKAGE_NAMES
      
      # Save coverage report parts
      - name: Upload and save artifacts
        uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
        with:
          name: Test Results
          path: ${{ env.TEST_RESULTS }}