name: main

on: [push, pull_request]

permissions:
  contents: read

concurrency:
  group: main-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

env:
  FORCE_COLOR: 3

jobs:
  test:
    runs-on: ${{ matrix.os }}
    needs: [check-integration-test-trigger]
    env:
      DISPLAY: :99
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest]
        pyodide-version: ["0.28.0a2"]
        test-config: [
            # FIXME: recent version of chrome gets timeout
            { runner: selenium, runtime: chrome, runtime-version: "125" },
            { runner: selenium, runtime: node, runtime-version: "22" },
          ]

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          submodules: recursive

      - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
        with:
          python-version: 3.13

      - uses: pyodide/pyodide-actions/download-pyodide@012fa537869d343726d01863a34b773fc4d96a14 # v2
        with:
          version: ${{ matrix.pyodide-version }}
          to: dist

      - uses: pyodide/pyodide-actions/install-browser@012fa537869d343726d01863a34b773fc4d96a14 # v2
        with:
          runner: ${{ matrix.test-config.runner }}
          browser: ${{ matrix.test-config.runtime }}
          browser-version: ${{ matrix.test-config.runtime-version }}

      - name: Install requirements
        shell: bash -l {0}
        run: |
          python3 -m pip install -e .[test]

      - name: Run tests
        shell: bash -l {0}
        run: |
          pytest -v tests \
            --cov=micropip \
            --durations=10 \
            --dist-dir=./dist/ \
            --maxfail=15 \
            --runner=${{ matrix.test-config.runner }} \
            --rt ${{ matrix.test-config.runtime }}

      - name: Run integration tests
        if: needs.check-integration-test-trigger.outputs.run-integration-test
        shell: bash -l {0}
        run: |
          pytest -v tests/integration \
            --integration \
            --cov=micropip \
            --durations=10 \
            --dist-dir=./dist/ \
            --maxfail=15 \
            --runner=${{ matrix.test-config.runner }} \
            --rt ${{ matrix.test-config.runtime }}

      - uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
        if: ${{ github.event.repo.name == 'pyodide/micropip' || github.event_name == 'pull_request' }}
        with:
          fail_ci_if_error: false

  check-integration-test-trigger:
    name: test-integration-test-trigger
    runs-on: ubuntu-latest
    outputs:
      run-integration-test: ${{ steps.check-integration-test-trigger.outputs.trigger }}

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          ref: ${{ github.event.pull_request.head.sha }}
          submodules: recursive

      - id: check-integration-test-trigger
        name: Check integration test trigger
        shell: bash
        run: |
          set -e -x

          COMMIT_MSG=$(git log --no-merges -1 --oneline)

          # The integration tests will be triggered on push or on pull_request when the commit
          # message contains "[integration]" or if it is pushed to main branch.
          if [[ "$GITHUB_EVENT_NAME" == push && "$GITHUB_REF" == refs/heads/main ||
                "$COMMIT_MSG" =~ \[integration\] ]]; then
              echo "trigger=true" >> "$GITHUB_OUTPUT"
          fi
