name: coverage

on:
  push:
    branches:
      - "main"
  pull_request:

jobs:
  coverage:
    strategy:
      matrix:
        os: [ubuntu-latest] # TODO: add macos & windows
    services:
      postgres:
        image: postgres
        ports:
          - 5432:5432
        env:
          POSTGRES_PASSWORD: postgres
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v6

      - name: Set up Go
        uses: actions/setup-go@v6
        with:
          go-version: ^1

      - name: Test
        run: |
          # We collect coverage data from two sources,
          # 1) unit tests 2) integration tests
          #
          # https://go.dev/testing/coverage/
          # https://dustinspecker.com/posts/go-combined-unit-integration-code-coverage/
          # https://github.com/golang/go/issues/51430#issuecomment-1344711300
          mkdir -p coverage/unit
          mkdir -p coverage/int
          mkdir -p coverage/int2

          # Collect unit tests coverage
          go test -failfast -race -timeout 5m -skip=^TestScript -cover ./... -args -test.gocoverdir=$PWD/coverage/unit

          # Collect integration tests coverage
          GOCOVERDIR=$PWD/coverage/int go test -failfast -race -timeout 5m -run=^TestScript ./...
          SOFT_SERVE_DB_DRIVER=postgres \
            SOFT_SERVE_DB_DATA_SOURCE=postgres://postgres:postgres@localhost/postgres?sslmode=disable \
            GOCOVERDIR=$PWD/coverage/int2 go test -failfast -race -timeout 5m -run=^TestScript ./...

          # Convert coverage data to legacy textfmt format to upload
          go tool covdata textfmt -i=coverage/unit,coverage/int,coverage/int2 -o=coverage.txt
      - uses: codecov/codecov-action@v5
        with:
          file: ./coverage.txt
