name: Python Tests

on:
  push:
    # Exclude beta and main: those branches re-trigger this workflow via
    # workflow_call from beta-release.yml / release.yml. Without the exclusion,
    # a push to beta that touches Server/** fires this workflow twice for the
    # same SHA, and GitHub auto-cancels the duplicate.
    branches-ignore: [beta, main]
    paths:
      - Server/**
      - tools/**
      - .github/workflows/python-tests.yml
  pull_request:
    branches: [main, beta]
    paths:
      - Server/**
      - tools/**
      - .github/workflows/python-tests.yml
  workflow_dispatch: {}
  workflow_call:
    inputs:
      ref:
        description: "Git ref to test (defaults to the triggering ref)."
        type: string
        required: false
        default: ""

jobs:
  test:
    name: Run Python Tests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          ref: ${{ inputs.ref || github.ref }}

      - name: Install uv
        uses: astral-sh/setup-uv@v4
        with:
          version: "latest"

      - name: Set up Python
        run: uv python install 3.10

      - name: Install dependencies
        run: |
          cd Server
          uv sync
          uv pip install -e ".[dev]"

      - name: Run tests with coverage
        run: |
          cd Server
          uv run pytest tests/ -v --tb=short --cov --cov-report=xml --cov-report=html --cov-report=term

      - name: Run local harness unit tests (hermetic, no Unity)
        run: |
          cd Server
          uv run python -m pytest "$GITHUB_WORKSPACE/tools/tests/" -v --tb=short

      - name: Upload coverage reports
        uses: codecov/codecov-action@v4
        if: always()
        with:
          files: ./Server/coverage.xml
          flags: python
          name: python-coverage
          fail_ci_if_error: false

      - name: Upload test results
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: pytest-results
          path: |
            Server/.pytest_cache/
            Server/tests/
            Server/coverage.xml
            Server/htmlcov/
