name: Test

on:
  push:
  pull_request:
  schedule:
    # Run weekly on Saturday
    - cron: '37 3 * * SAT'

jobs:
  mysql:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      max-parallel: 5
      matrix:
        python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']

    services:
      mariadb:
        image: mariadb
        env:
          MARIADB_ROOT_PASSWORD: debug_toolbar
        options: >-
          --health-cmd "mariadb-admin ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
        - 3306:3306

    steps:
    - uses: actions/checkout@v5

    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v6
      with:
        python-version: ${{ matrix.python-version }}
        allow-prereleases: true

    - name: Get pip cache dir
      id: pip-cache
      run: |
        echo "dir=$(pip cache dir)" >> $GITHUB_OUTPUT

    - name: Cache
      uses: actions/cache@v4
      with:
        path: ${{ steps.pip-cache.outputs.dir }}
        key:
          ${{ matrix.python-version }}-v1-${{ hashFiles('**/pyproject.toml') }}-${{ hashFiles('**/tox.ini') }}
        restore-keys: |
          ${{ matrix.python-version }}-v1-

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        python -m pip install --upgrade tox tox-gh-actions

    - name: Test with tox
      run: tox
      env:
        DB_BACKEND: mysql
        DB_USER: root
        DB_PASSWORD: debug_toolbar
        DB_HOST: 127.0.0.1
        DB_PORT: 3306


  postgres:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      max-parallel: 5
      matrix:
        python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
        database: [postgresql, postgis, psycopg3]
        exclude:
            - python-version: '3.9'
              database: psycopg3
            - python-version: '3.13'
              database: postgis
            - python-version: '3.13'
              database: postgresql
            - python-version: '3.14'
              database: postgis
            - python-version: '3.14'
              database: postgresql
        # Add postgis3 to our matrix for modern Python versions
        include:
            - python-version: '3.13'
              database: postgis3
            - python-version: '3.13'
              database: psycopg3
              env:
                DJANGO_SELENIUM_TESTS=true
            - python-version: '3.14'
              database: postgis3
            - python-version: '3.14'
              database: psycopg3
              env:
                DJANGO_SELENIUM_TESTS=true

    services:
      postgres:
        image: postgis/postgis:17-3.5
        env:
          POSTGRES_DB: debug_toolbar
          POSTGRES_USER: debug_toolbar
          POSTGRES_PASSWORD: debug_toolbar
        ports:
        - 5432:5432
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
    - uses: actions/checkout@v5

    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v6
      with:
        python-version: ${{ matrix.python-version }}
        allow-prereleases: true

    - name: Get pip cache dir
      id: pip-cache
      run: |
        echo "dir=$(pip cache dir)" >> $GITHUB_OUTPUT

    - name: Cache
      uses: actions/cache@v4
      with:
        path: ${{ steps.pip-cache.outputs.dir }}
        key:
          ${{ matrix.python-version }}-v1-${{ hashFiles('**/pyproject.toml') }}-${{ hashFiles('**/tox.ini') }}
        restore-keys: |
          ${{ matrix.python-version }}-v1-

    - name: Install gdal-bin (for postgis)
      run: |
        sudo apt-get -qq update
        sudo apt-get -y install gdal-bin

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        python -m pip install --upgrade tox tox-gh-actions

    - name: Test with tox
      run: tox
      env:
        DB_BACKEND: ${{ matrix.database }}
        DB_HOST: localhost
        DB_PORT: 5432
        DJANGO_SELENIUM_TESTS: ${{ matrix.env.DJANGO_SELENIUM_TESTS }}

  sqlite:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      max-parallel: 5
      matrix:
        python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']

    steps:
    - uses: actions/checkout@v5

    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v6
      with:
        python-version: ${{ matrix.python-version }}
        allow-prereleases: true

    - name: Get pip cache dir
      id: pip-cache
      run: |
        echo "dir=$(pip cache dir)" >> $GITHUB_OUTPUT

    - name: Cache
      uses: actions/cache@v4
      with:
        path: ${{ steps.pip-cache.outputs.dir }}
        key:
          ${{ matrix.python-version }}-v1-${{ hashFiles('**/pyproject.toml') }}-${{ hashFiles('**/tox.ini') }}
        restore-keys: |
          ${{ matrix.python-version }}-v1-

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        python -m pip install --upgrade tox tox-gh-actions

    - name: Test with tox
      run: tox
      env:
        DB_BACKEND: sqlite3
        DB_NAME: ":memory:"

  lint:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false

    steps:
    - uses: actions/checkout@v5

    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v6
      with:
        python-version: 3.9

    - name: Get pip cache dir
      id: pip-cache
      run: |
        echo "dir=$(pip cache dir)" >> $GITHUB_OUTPUT

    - name: Cache
      uses: actions/cache@v4
      with:
        path: ${{ steps.pip-cache.outputs.dir }}
        key:
          ${{ matrix.python-version }}-v1-${{ hashFiles('**/pyproject.toml') }}-${{ hashFiles('**/tox.ini') }}
        restore-keys: |
          ${{ matrix.python-version }}-v1-

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        python -m pip install --upgrade tox

    - name: Test with tox
      run: tox -e docs,packaging
