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@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
        with:
          go-version: ${{ matrix.go-version }}
      
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      - 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@0400d5f644dc74513175e3cd8d07132dd4860809  # v4.2.4
        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

      - name: Run golangci-lint
        uses: golangci/golangci-lint-action@4afd733a84b1f43292c63897423277bb7f4313a9
        
      # 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 -- -p 2 -cover -coverprofile=coverage.out $PACKAGE_NAMES
      
      # Save coverage report parts
      - name: Upload and save artifacts
        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4
        with:
          name: Test Results-${{matrix.go-version}}
          path: ${{ env.TEST_RESULTS }}

      - name: Upload coverage report
        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4
        with:
          path: coverage.out
          name: Coverage-report-${{matrix.go-version}}

      - name: Display coverage report 
        run: go tool cover -func=coverage.out 
