# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/test-go-task.md
name: Test Go

env:
  # See: https://github.com/actions/setup-go/tree/main#supported-version-syntax
  GO_VERSION: "1.20"

# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows
on:
  create:
  push:
    paths:
      - ".github/workflows/test-go-task.ya?ml"
      - ".github/.?codecov.ya?ml"
      - "dev/.?codecov.ya?ml"
      - ".?codecov.ya?ml"
      - "**/go.mod"
      - "**/go.sum"
      - "Taskfile.ya?ml"
      - "**.go"
      - "**/testdata/**"
  pull_request:
    paths:
      - ".github/workflows/test-go-task.ya?ml"
      - ".github/.?codecov.ya?ml"
      - "dev/.?codecov.ya?ml"
      - ".?codecov.ya?ml"
      - "**/go.mod"
      - "**/go.sum"
      - "Taskfile.ya?ml"
      - "**.go"
      - "**/testdata/**"
  schedule:
    # Run periodically to catch breakage caused by external changes.
    - cron: "0 11 * * WED"
  workflow_dispatch:
  repository_dispatch:

jobs:
  run-determination:
    runs-on: ubuntu-latest
    outputs:
      result: ${{ steps.determination.outputs.result }}
    permissions: {}
    steps:
      - name: Determine if the rest of the workflow should run
        id: determination
        run: |
          RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x"
          # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead.
          if [[
            "${{ github.event_name }}" != "create" ||
            "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX
          ]]; then
            # Run the other jobs.
            RESULT="true"
          else
            # There is no need to run the other jobs.
            RESULT="false"
          fi

          echo "result=$RESULT" >> $GITHUB_OUTPUT

  test:
    name: test (${{ matrix.module.path }} - ${{ matrix.operating-system }})
    needs: run-determination
    if: needs.run-determination.outputs.result == 'true'
    permissions:
      contents: read

    strategy:
      fail-fast: false

      matrix:
        operating-system:
          - ubuntu-latest
          - windows-latest
          - macos-latest
        module:
          # TODO: add paths of all Go modules here
          - path: ./
            codecov-flags: unit

    runs-on: ${{ matrix.operating-system }}

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Install Go
        uses: actions/setup-go@v5
        with:
          go-version: ${{ env.GO_VERSION }}

      - name: Install Task
        uses: arduino/setup-task@v2
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          version: 3.x

      - name: Run tests
        env:
          GO_MODULE_PATH: ${{ matrix.module.path }}
        run: task go:test

      - name: Send unit tests coverage to Codecov
        if: runner.os == 'Linux'
        uses: codecov/codecov-action@v3
        with:
          file: ${{ matrix.module.path }}coverage_unit.txt
          flags: ${{ matrix.module.codecov-flags }}
          fail_ci_if_error: ${{ github.repository == 'arduino/uno-r4-wifi-fwuploader-plugin' }}
