name: Coverage Tests on: pull_request: types: [labeled, synchronize, opened, reopened] paths-ignore: - 'docs/**' concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true permissions: contents: read jobs: coverage: if: contains(github.event.pull_request.labels.*.name, 'coverage') runs-on: ubuntu-latest name: Coverage Tests (PostgreSQL) timeout-minutes: 60 services: postgres: image: postgres:18-alpine env: POSTGRES_DB: django POSTGRES_USER: user POSTGRES_PASSWORD: postgres ports: - 5432:5432 options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 steps: - name: Checkout uses: actions/checkout@v6 with: fetch-depth: 0 persist-credentials: false - name: Set up Python uses: actions/setup-python@v6 with: python-version: '3.14' cache: 'pip' cache-dependency-path: 'tests/requirements/py3.txt' - name: Update apt repo run: sudo apt update - name: Install libmemcached-dev for pylibmc run: sudo apt install -y libmemcached-dev - name: Install dependencies run: | python -m pip install --upgrade pip wheel python -m pip install -r tests/requirements/py3.txt -r tests/requirements/postgres.txt -e . python -m pip install 'coverage[toml]' diff-cover - name: Create PostgreSQL settings file run: mv ./.github/workflows/data/test_postgres.py.tpl ./tests/test_postgres.py - name: Run tests with coverage env: PYTHONPATH: ${{ github.workspace }}/tests COVERAGE_PROCESS_START: ${{ github.workspace }}/tests/.coveragerc RUNTESTS_DIR: ${{ github.workspace }}/tests run: | python -Wall tests/runtests.py --settings=test_postgres -v2 - name: Generate coverage report if: success() env: COVERAGE_RCFILE: ${{ github.workspace }}/tests/.coveragerc RUNTESTS_DIR: ${{ github.workspace }}/tests run: | python -m coverage combine python -m coverage report --show-missing python -m coverage xml -o tests/coverage.xml - name: Generate diff coverage report if: success() run: | if [ -f tests/coverage.xml ]; then diff-cover tests/coverage.xml --compare-branch=origin/main --fail-under=0 > diff-cover-report.md else echo "No coverage data available." > diff-cover-report.md fi - name: Save PR number if: success() run: echo "${{ github.event.pull_request.number }}" > pr_number.txt - name: Upload artifacts if: success() uses: actions/upload-artifact@v4 with: name: coverage-artifacts path: | diff-cover-report.md pr_number.txt retention-days: 1