name: CI - Python

on:
  workflow_call:
  workflow_dispatch:

jobs:
  build:
    name: Build
    uses: ./.github/workflows/bazel.yml
    with:
      name: Build
      cache-key: py-build
      run: bazel build //py:selenium-wheel //py:selenium-sdist

  docs:
    name: Documentation
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout source tree
        uses: actions/checkout@v4
      - name: Set up Python 3.9
        uses: actions/setup-python@v4
        with:
          python-version: 3.9
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install tox==4.6.4
      - name: Test with tox
        run: tox -c py/tox.ini
        env:
          TOXENV: docs

  lint:
    name: Lint
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout source tree
        uses: actions/checkout@v4
      - name: Set up Python 3.9
        uses: actions/setup-python@v4
        with:
          python-version: 3.9
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install tox==4.6.4
      - name: Test with tox
        run: tox -c py/tox.ini
        env:
          # If this fails, it will exit. Local work should be using `tox -e linting` prior to committing.
          # the linting-ci recipe exists solely for CI and will not attempt to rewrite any files in-place etc.
          TOXENV: linting-ci

  mypy:
    name: Mypy
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout source tree
        uses: actions/checkout@v4
      - name: Set up Python 3.9
        uses: actions/setup-python@v4
        with:
          python-version: 3.9
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install tox==4.6.4
      - name: Test with tox
        run: |
          tox -c py/tox.ini -- --cobertura-xml-report ci || true
          bash <(curl -s https://codecov.io/bash) -f py/ci/cobertura.xml
        env:
          TOXENV: mypy

  remote-tests:
    name: Remote Tests
    needs: build
    uses: ./.github/workflows/bazel.yml
    strategy:
      fail-fast: false
      matrix:
        include:
          - browser: firefox
    with:
      name: Integration Tests (remote, ${{ matrix.browser }})
      browser: ${{ matrix.browser }}
      cache-key: py-remote-${{ matrix.browser }}
      run: bazel test --local_test_jobs 1 --flaky_test_attempts 3 //py:test-remote

  browser-tests:
    name: Browser Tests
    needs: build
    uses: ./.github/workflows/bazel.yml
    strategy:
      fail-fast: false
      matrix:
        include:
          - browser: chrome
            os: ubuntu
          - browser: edge
            os: ubuntu
          - browser: firefox
            os: ubuntu
    with:
      name: Integration Tests (${{ matrix.browser }}, ${{ matrix.os }})
      browser: ${{ matrix.browser }}
      os: ${{ matrix.os }}
      cache-key: py-browser-${{ matrix.browser }}
      run: |
        bazel test --local_test_jobs 1 --flaky_test_attempts 3 //py:common-${{ matrix.browser }}-bidi
        bazel test --local_test_jobs 1 --flaky_test_attempts 3 //py:test-${{ matrix.browser }}

  safari-tests:
    name: Browser Tests
    needs: build
    uses: ./.github/workflows/bazel.yml
    strategy:
      fail-fast: false
      matrix:
        include:
          - browser: safari
            os: macos
    with:
      name: Integration Tests (${{ matrix.browser }}, ${{ matrix.os }})
      browser: ${{ matrix.browser }}
      os: ${{ matrix.os }}
      cache-key: py-browser-${{ matrix.browser }}
      run: |
        bazel test --local_test_jobs 1 --flaky_test_attempts 3 //py:test-${{ matrix.browser }}
