name: Test

on:
  workflow_call:
    secrets:
      CACHIX_AUTH_TOKEN:
        required: false
      CODECOV_TOKEN:
        required: false
  pull_request:
    branches:
      - main
      - v[0-9]+
    paths:
      - .github/workflows/test.yaml
      - .github/workflows/report.yaml
      - .github/actions/setup-nix/**
      - default.nix
      - nix/**
      - .stylish-haskell.yaml
      - cabal.project
      - postgrest.cabal
      - '**.hs'
      - test/**
      - '!**.md'

concurrency:
  # Terminate all previous runs of the same workflow for pull requests
  group: test-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

jobs:
  coverage:
    name: Coverage
    runs-on: ubuntu-24.04
    defaults:
      run:
        # Hack for enabling color output, see:
        # https://github.com/actions/runner/issues/241#issuecomment-842566950
        shell: script -qec "bash --noprofile --norc -eo pipefail {0}"
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - name: Setup Nix Environment
        uses: ./.github/actions/setup-nix
        with:
          authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
          tools: tests.coverage.bin tests.testDoctests.bin tests.testSpecIdempotence.bin cabalTools.update.bin

      - run: postgrest-cabal-update

      - name: Run coverage (IO tests and Spec tests against latest supported PostgreSQL)
        run: postgrest-coverage
      - name: Upload coverage to codecov
        uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
        with:
          files: ./coverage/codecov.json
          token: ${{ secrets.CODECOV_TOKEN }}

      - name: Run doctests
        if: always()
        run: postgrest-test-doctests

      - name: Check the spec tests for idempotence
        if: always()
        run: postgrest-test-spec-idempotence


  postgres:
    strategy:
      fail-fast: false
      matrix:
        pgVersion: [13, 14, 15, 16, 17]
    name: PG ${{ matrix.pgVersion }}
    runs-on: ubuntu-24.04
    defaults:
      run:
        # Hack for enabling color output, see:
        # https://github.com/actions/runner/issues/241#issuecomment-842566950
        shell: script -qec "bash --noprofile --norc -eo pipefail {0}"
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - name: Setup Nix Environment
        uses: ./.github/actions/setup-nix
        with:
          authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
          tools: tests.testSpec.bin tests.testIO.bin tests.testBigSchema.bin withTools.pg-${{ matrix.pgVersion }}.bin cabalTools.update.bin

      - run: postgrest-cabal-update

      - name: Run spec tests
        if: always()
        run: postgrest-with-pg-${{ matrix.pgVersion }} postgrest-test-spec

      - name: Run IO tests
        if: always()
        run: postgrest-with-pg-${{ matrix.pgVersion }} postgrest-test-io -vv

      - name: Run IO tests on a big schema
        if: always()
        run: postgrest-with-pg-${{ matrix.pgVersion }} postgrest-test-big-schema -vv


  memory:
    name: Memory
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
      - name: Setup Nix Environment
        uses: ./.github/actions/setup-nix
        with:
          authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
          tools: tests.testMemory.bin cabalTools.update.bin

      - run: postgrest-cabal-update

      - name: Run memory tests
        run: postgrest-test-memory


  loadtest:
    strategy:
      matrix:
        kind: ['mixed', 'errors', 'jwt-hs', 'jwt-hs-cache', 'jwt-hs-cache-worst', 'jwt-rsa', 'jwt-rsa-cache', 'jwt-rsa-cache-worst']
    name: Loadtest
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          fetch-depth: 0
      - name: Setup Nix Environment
        uses: ./.github/actions/setup-nix
        with:
          authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
          tools: loadtest.loadtestAgainst.bin loadtest.report.bin cabalTools.update.bin

      - run: postgrest-cabal-update

      - name: Run loadtest
        env:
          TARGET_BRANCH: ${{ github.base_ref || github.ref_name }}
        run: |
          if [ "$TARGET_BRANCH" = "main" ]; then
            latest_tag=$(git tag --sort=-creatordate --list "v*" | head -n1)
          else
            latest_tag=$(git tag --merged HEAD --sort=-creatordate "v*" | head -n1)
          fi
          postgrest-loadtest-against -k ${{ matrix.kind }} "$TARGET_BRANCH" "$latest_tag"
          postgrest-loadtest-report -g ${{ matrix.kind }} >> "$GITHUB_STEP_SUMMARY"

  flake:
    strategy:
      fail-fast: false
      matrix:
        runs-on:
          - macos-14 # aarch64-darwin
          - ubuntu-24.04 # x86_64-linux
          - ubuntu-24.04-arm # aarch64-linux
    name: Flake Check
    runs-on: ${{ matrix.runs-on }}
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          fetch-depth: 0
      - name: Setup Nix Environment
        uses: ./.github/actions/setup-nix
        with:
          authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
      - name: Run flake check
        run: |
          nix flake check
