name: unit-tests

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.id }}
  cancel-in-progress: true

on:
  push:
    branches: ["main"]
    paths-ignore:
      - "**/*.md"
  pull_request:
    branches: ["main"]
    paths-ignore:
      - "**/*.md"

permissions:
  contents: read

defaults:
  run:
    shell: bash

jobs:
  unit-tests:
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest]
        python-version: ["3.10", "3.11", "3.12", "3.13"]
    runs-on: ${{ matrix.os }}

    # Service containers to run with `runner-job`
    services:
      # Label used to access the service container
      redis:
        image: ${{ matrix.os == 'ubuntu-latest' && 'redis' || '' }}
        # Set health checks to wait until redis has started
        options: >-
          --health-cmd "redis-cli ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          # Maps port 6379 on service container to the host
          - 6379:6379
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup_build_env
        with:
          python-version: ${{ matrix.python-version }}
          run-uv-sync: true

      - name: Run unit tests
        run: |
          export PYTHONUNBUFFERED=1
          uv run pytest tests/units --cov --no-cov-on-fail --cov-report=
      - name: Run unit tests w/ redis
        if: ${{ matrix.os == 'ubuntu-latest' }}
        run: |
          export PYTHONUNBUFFERED=1
          export REDIS_URL=redis://localhost:6379
          uv run pytest tests/units --cov --no-cov-on-fail --cov-report=
      # Change to explicitly install v1 when reflex-hosting-cli is compatible with v2
      - name: Run unit tests w/ pydantic v1
        run: |
          export PYTHONUNBUFFERED=1
          uv pip install "pydantic~=1.10"
          uv run pytest tests/units --cov --no-cov-on-fail --cov-report=
      - name: Generate coverage report
        run: uv run coverage html

  unit-tests-macos:
    timeout-minutes: 30
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.10", "3.11", "3.12", "3.13"]
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup_build_env
        with:
          python-version: ${{ matrix.python-version }}
          run-uv-sync: true

      - name: Run unit tests
        run: |
          export PYTHONUNBUFFERED=1
          uv run pytest tests/units --cov --no-cov-on-fail --cov-report=
      - name: Run unit tests w/ pydantic v1
        run: |
          export PYTHONUNBUFFERED=1
          uv pip install "pydantic~=1.10"
          uv run pytest tests/units --cov --no-cov-on-fail --cov-report=
