---
name: Tests
concurrency:
  cancel-in-progress: true
  group: ${{ github.workflow }}-${{ github.ref }}
on:
  pull_request:
    branches:
      - main
    paths-ignore:
      - "docs/**"
  push:
    branches:
      - main
    paths-ignore:
      - "docs/**"
permissions:
  contents: read
env:
  GOTOOLCHAIN: local
  GOEXPERIMENT: cgocheck2
jobs:
  tests-linux:
    name: Tests (Linux, PHP ${{ matrix.php-versions }})
    runs-on: ubuntu-latest
    continue-on-error: false
    strategy:
      fail-fast: false
      matrix:
        include:
          - php-versions: "8.2"
          - php-versions: "8.3"
          - php-versions: "8.4"
          - php-versions: "8.5"
    env:
      GOMAXPROCS: 10
      LIBRARY_PATH: ${{ github.workspace }}/watcher/target/lib
    steps:
      - uses: actions/checkout@v6
        with:
          persist-credentials: false
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25"
          cache-dependency-path: |
            go.sum 
            caddy/go.sum
      - uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-versions }}
          ini-file: development
          coverage: none
          tools: none
        env:
          phpts: ts
          debug: true
      - name: Install e-dant/watcher
        uses: ./.github/actions/watcher
      - name: Set CGO flags
        run: echo "CGO_CFLAGS=-I${PWD}/watcher/target/include $(php-config --includes)" >> "${GITHUB_ENV}"
      - name: Build
        run: go build
      - name: Build testcli binary
        working-directory: internal/testcli/
        run: go build
      - name: Compile library tests
        run: go test -race -v -x -c
      - name: Run library tests
        run: ./frankenphp.test -test.v
      - name: Run Caddy module tests
        working-directory: caddy/
        run: go test -tags nobadger,nomysql,nopgx -race -v ./...
      - name: Run Fuzzing Tests
        working-directory: caddy/
        run: go test -fuzz FuzzRequest -fuzztime 20s
      - name: Build the server
        working-directory: caddy/frankenphp/
        run: go build
      - name: Start the server
        working-directory: testdata/
        run: sudo ../caddy/frankenphp/frankenphp start
      - name: Run integrations tests
        run: ./reload_test.sh
      - name: Lint Go code
        uses: golangci/golangci-lint-action@v9
        if: matrix.php-versions == '8.5'
        with:
          version: latest
      - name: Ensure go.mod is tidy
        if: matrix.php-versions == '8.5'
        run: go mod tidy -diff
      - name: Ensure caddy/go.mod is tidy
        if: matrix.php-versions == '8.5'
        run: go mod tidy -diff
        working-directory: caddy/
  tests-mac:
    name: Tests (macOS, PHP 8.5)
    runs-on: macos-latest
    env:
      HOMEBREW_NO_AUTO_UPDATE: 1
    steps:
      - uses: actions/checkout@v6
        with:
          persist-credentials: false
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25"
          cache-dependency-path: |
            go.sum 
            caddy/go.sum
      - uses: shivammathur/setup-php@v2
        with:
          php-version: 8.5
          ini-file: development
          coverage: none
          tools: none
        env:
          phpts: ts
          debug: true
      - name: Set Set CGO flags
        run: |
          {
           echo "CGO_CFLAGS=-I/opt/homebrew/include/ $(php-config --includes)"
           echo "CGO_LDFLAGS=-L/opt/homebrew/lib/ $(php-config --ldflags) $(php-config --libs)"
          } >> "${GITHUB_ENV}"
      - name: Build
        run: go build -tags nowatcher
      - name: Run library tests
        run: go test -tags nowatcher -race -v ./...
      - name: Run Caddy module tests
        working-directory: caddy/
        run: go test -tags nowatcher,nobadger,nomysql,nopgx -race -v ./...
