name: Test Python Package on: push: branches: - main pull_request: jobs: unit-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: UV_LINK_MODE: copy run: uv sync --all-extras - name: Run unit tests run: | uv run pytest tests/unit/ -m "not integration" \ --cov=python_repositories \ --cov-report= - name: Upload unit coverage uses: https://github.com/christopherHX/gitea-upload-artifact@v4 with: name: coverage-unit path: .coverage retention-days: 1 compression-level: 0 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: 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: https://github.com/christopherHX/gitea-upload-artifact@v4 with: name: coverage-integration path: .coverage retention-days: 1 compression-level: 0 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: https://github.com/christopherHX/gitea-download-artifact@v4 with: name: coverage-unit path: coverage-unit - name: Download integration coverage uses: https://github.com/christopherHX/gitea-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' env: API_URL: ${{ vars.API_URL }} REPO_OWNER: ${{ github.repository_owner }} REPO_NAME: ${{ github.event.repository.name }} PR_NUMBER: ${{ github.event.pull_request.number }} CI_RUNNER_TOKEN: ${{ secrets.CI_RUNNER_TOKEN }} run: | PAYLOAD=$(python3 -c ' import json import pathlib coverage = pathlib.Path("coverage.txt").read_text() print( json.dumps( { "body": f"**Test Coverage Report:**\n```\n{coverage}\n```", } ) ) ') curl -sf -X POST "$API_URL/repos/$REPO_OWNER/$REPO_NAME/issues/$PR_NUMBER/comments" \ -H "Authorization: token $CI_RUNNER_TOKEN" \ -H "Content-Type: application/json" \ -d "$PAYLOAD"