Skip to main content
EVOKORE// WORKFLOWS / py.test.yml
ComposioHQ/composioworkflow · 222 lines

workflows/py.test.yml

CI / automation

View on GitHub →
# REFERENCE-ONLY: GitHub Actions secrets referenced below are illustrative.
# Do not inject real credentials. See your CI/CD provider for proper secret management.
name: Test Python SDK

on:
  push:
    branches: [master, next]
    paths:
      - "python/**/*.py"
      - ".github/workflows/py.test.yml"
      - "python/pyproject.toml"
      - "python/requirements*.txt"
  pull_request:
    branches: [master, next]
    paths:
      - "python/**/*.py"
      - ".github/workflows/py.test.yml"
      - "python/pyproject.toml"
      - "python/requirements*.txt"

jobs:
  test:
    name: Test Python SDK
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ["3.10", "3.11", "3.12"]

    steps:
      - name: Checkout Code
        uses: actions/checkout@v6

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - name: Cache pip dependencies
        uses: actions/cache@v4
        with:
          path: ~/.cache/pip
          key: pip-${{ matrix.python-version }}-${{ hashFiles('python/pyproject.toml') }}
          restore-keys: |
            pip-${{ matrix.python-version }}-

      - name: Install UV
        run: pip install uv

      - name: Install Dependencies
        run: |
          cd python/
          uv venv --python ${{ matrix.python-version }}
          source .venv/bin/activate
          uv pip install -e .
          uv pip install -e providers/langchain
          uv pip install pytest pytest-mock

      - name: Run Import Tests
        run: |
          cd python/
          source .venv/bin/activate
          python -c "from composio import Composio; print('✓ Basic import successful')"

      - name: Run Unit Tests
        run: |
          cd python/
          source .venv/bin/activate
          python -m pytest tests/ -v --tb=short

      - name: Test Package Installation
        run: |
          cd python/
          # Test that the package can be installed and imported in a fresh environment
          uv venv test-env --python ${{ matrix.python-version }}
          source test-env/bin/activate
          uv pip install -e .
          python -c "
          from composio import Composio, ToolkitVersionParam
          from composio.types import Modifiers
          from composio.core.types import ToolkitVersion
          print('✓ All critical imports successful')
          "

  test-circular-imports:
    name: Test Circular Import Prevention
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Code
        uses: actions/checkout@v6

      - name: Setup Python with UV
        uses: ./.github/actions/setup-python-uv

      - name: Install Dependencies
        run: |
          cd python/
          uv venv
          source .venv/bin/activate
          uv pip install -e .

      - name: Test Circular Import Prevention
        run: |
          cd python/
          source .venv/bin/activate
          python -c "
          # Test various import combinations that previously caused circular imports
          import sys
          
          # Test 1: Basic imports
          from composio import Composio
          print('✓ Basic Composio import')
          
          # Test 2: Import toolkit version types
          from composio import ToolkitVersionParam
          from composio.core.types import ToolkitVersion
          print('✓ Toolkit version types import')
          
          # Test 3: Import from types module
          from composio.types import Modifiers
          print('✓ Types module import')
          
          # Test 4: Import core models
          from composio.core.models.tools import Tools
          print('✓ Core models import')
          
          # Test 5: Cross-module imports that caused the original circular import
          from composio.core.models.tools import Modifiers as CoreModifiers
          from composio.types import Modifiers as TypesModifiers
          assert CoreModifiers is TypesModifiers
          print('✓ Cross-module import consistency')
          
          print('✓ All circular import prevention tests passed!')
          "

  lint-and-format:
    name: Lint and Format Check
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Code
        uses: actions/checkout@v6

      - name: Setup Python with UV
        uses: ./.github/actions/setup-python-uv

      - name: Install Dependencies
        run: |
          cd python/
          uv venv
          source .venv/bin/activate
          uv pip install -e .
          uv pip install ruff

      - name: Run Ruff Linter
        run: |
          cd python/
          source .venv/bin/activate
          ruff check --config config/ruff.toml composio/ tests/

      - name: Run Ruff Formatter Check
        run: |
          cd python/
          source .venv/bin/activate
          ruff format --check --config config/ruff.toml composio/ tests/

  integration-tests:
    name: Integration Tests
    runs-on: ubuntu-22.04  # Use Ubuntu 22.04 for stability
    permissions: read-all
    env:
      COMPOSIO_API_KEY: ${{ secrets.COMPOSIO_API_KEY }}

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Install UV
        uses: astral-sh/setup-uv@v6
        with:
          version: '0.8.19'

      - name: Cache UV dependencies
        uses: actions/cache@v4
        with:
          path: ~/.cache/uv
          key: uv-0.8.19-py3.12-${{ hashFiles('python/pyproject.toml') }}
          restore-keys: |
            uv-0.8.19-py3.12-

      - name: Install Python Dependencies
        working-directory: ./python
        run: |
          # Let UV manage Python version to satisfy workspace requirements
          uv sync --group dev

      - name: Verify API Key
        run: |
          if [ -z "$COMPOSIO_API_KEY" ]; then
            echo "::error::COMPOSIO_API_KEY is not set"
            exit 1
          fi
          echo "✅ COMPOSIO_API_KEY is configured"

      - name: Run Integration Tests
        working-directory: ./python
        run: |
          echo "🧪 Running Integration Tests..."
          # Run with per-test timeout of 2 minutes and overall timeout
          # pytest-timeout should be installed via pyproject.toml dev dependencies
          uv run pytest composio/integration_test/ -v --tb=short --maxfail=3 --timeout=120 --timeout-method=thread
        timeout-minutes: 10

      - name: Upload Test Results
        if: always()
        uses: actions/upload-artifact@v6
        with:
          name: integration-test-results
          path: |
            python/composio/integration_test/
          retention-days: 7