From 9538e4d26d43a7aa5ab84a77876da9bd9a567b52 Mon Sep 17 00:00:00 2001 From: Brian Bjarke Jensen Date: Mon, 6 Jul 2026 22:02:35 +0200 Subject: [PATCH] Split CI into parallel unit, integration, and coverage report jobs. Run test jobs in parallel and merge coverage artifacts for an accurate full-suite PR report. Co-authored-by: Cursor --- .gitea/workflows/test.yml | 90 +++++++++++++++++++++++++++++++++++++-- README.md | 2 + 2 files changed, 88 insertions(+), 4 deletions(-) diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index c456ad6..0528f38 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -7,7 +7,7 @@ on: pull_request: jobs: - test: + unit-tests: runs-on: ubuntu-latest steps: - name: Checkout code @@ -26,10 +26,92 @@ jobs: UV_LINK_MODE: copy run: uv sync --all-extras - - name: Run pytest + - name: Run unit tests + run: | + uv run pytest tests/unit/ -m "not integration" \ + --cov=python_repositories \ + --cov-report= + + - name: Upload unit coverage + uses: actions/upload-artifact@v4 + with: + name: coverage-unit + path: .coverage + retention-days: 1 + + integration-tests: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version-file: .python-version + + - name: Install uv + run: pip install uv + + - name: Install dependencies env: - PYTHONPATH: . - run: uv run pytest --cov=python_repositories --cov-report=term-missing > coverage.txt + UV_LINK_MODE: copy + run: uv sync --all-extras + + - name: Verify Docker + run: docker info + + - name: Run integration tests + run: | + uv run pytest -m integration \ + --cov=python_repositories \ + --cov-report= + + - name: Upload integration coverage + uses: actions/upload-artifact@v4 + with: + name: coverage-integration + path: .coverage + retention-days: 1 + + coverage-report: + needs: [unit-tests, integration-tests] + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' || github.event_name == 'push' + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version-file: .python-version + + - name: Install uv + run: pip install uv + + - name: Install dependencies + env: + UV_LINK_MODE: copy + run: uv sync --all-extras + + - name: Download unit coverage + uses: actions/download-artifact@v4 + with: + name: coverage-unit + path: coverage-unit + + - name: Download integration coverage + uses: actions/download-artifact@v4 + with: + name: coverage-integration + path: coverage-integration + + - name: Combine coverage report + run: | + uv run coverage combine coverage-unit/.coverage coverage-integration/.coverage + uv run coverage report -m --include='python_repositories/*' > coverage.txt + cat coverage.txt - name: Post coverage summary to PR if: github.event_name == 'pull_request' diff --git a/README.md b/README.md index 6976771..8cc4587 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,8 @@ uv run pytest -v # full suite (requires Doc Integration tests are marked with `@pytest.mark.integration` and require Docker (testcontainers). Run unit tests alone for quick local feedback. +CI runs unit and integration tests in parallel, then merges coverage into a single report (see [`.gitea/workflows/test.yml`](.gitea/workflows/test.yml)). + `pre-commit` is included in the dev dependency group. `uv sync` installs the CLI, but git does not run hooks until you install them with `pre-commit install` (one time per clone). After that, commits run the checks defined in [`.pre-commit-config.yaml`](.pre-commit-config.yaml) (ruff, mypy, pyupgrade, prettier, and general file hygiene). To run all hooks manually without committing: