name: Core Tests
on:
  push:
    paths:
      - .github/**
      - devscripts/**
      - test/**
      - yt_dlp/**.py
      - '!yt_dlp/extractor/**.py'
      - yt_dlp/extractor/youtube/**.py
      - yt_dlp/extractor/__init__.py
      - yt_dlp/extractor/common.py
      - yt_dlp/extractor/extractors.py
  pull_request:
    paths:
      - .github/**
      - devscripts/**
      - test/**
      - yt_dlp/**.py
      - '!yt_dlp/extractor/**.py'
      - yt_dlp/extractor/youtube/**.py
      - yt_dlp/extractor/__init__.py
      - yt_dlp/extractor/common.py
      - yt_dlp/extractor/extractors.py

permissions: {}

concurrency:
  group: core-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
  tests:
    name: Core Tests
    if: "!contains(github.event.head_commit.message, 'ci skip')"
    permissions:
      contents: read
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest]
        # CPython 3.10 is in quick-test
        python-version: ['3.11', '3.12', '3.13', '3.14', pypy-3.11]
        include:
        # atleast one of each CPython/PyPy tests must be in windows
        - os: windows-latest
          python-version: '3.10'
        - os: windows-latest
          python-version: '3.11'
        - os: windows-latest
          python-version: '3.12'
        - os: windows-latest
          python-version: '3.13'
        - os: windows-latest
          python-version: '3.14'
        - os: windows-latest
          python-version: pypy-3.11
    steps:
    - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8  # v6.0.1
      with:
        fetch-depth: 0
        persist-credentials: false
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548  # v6.1.0
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install test requirements
      run: python ./devscripts/install_deps.py --include-extra test --include-extra curl-cffi
    - name: Run tests
      timeout-minutes: 15
      continue-on-error: False
      env:
        source: ${{ (github.event_name == 'push' && github.event.before) || 'origin/master' }}
        target: ${{ (github.event_name == 'push' && github.event.after) || 'HEAD' }}
      shell: bash
      run: |
        flags=()
        # Check if a networking file is involved
        patterns="\
        ^yt_dlp/networking/
        ^yt_dlp/utils/networking\.py$
        ^test/test_http_proxy\.py$
        ^test/test_networking\.py$
        ^test/test_networking_utils\.py$
        ^test/test_socks\.py$
        ^test/test_websockets\.py$
        ^pyproject\.toml$
        "
        if git diff --name-only "${source}" "${target}" | grep -Ef <(printf '%s' "${patterns}"); then
          flags+=(--flaky)
        fi
        python3 -m yt_dlp -v || true  # Print debug head
        python3 -m devscripts.run_tests "${flags[@]}" --pytest-args '--reruns 2 --reruns-delay 3.0' core
