graphiti/.github/workflows/unit_tests.yml
Daniel Chalef 8a6b72a909 Separate unit and integration tests to allow external contributors
This change addresses the issue where external contributor PRs fail unit
tests because GitHub secrets (API keys) are unavailable to external PRs
for security reasons.

Changes:
- Split GitHub Actions workflow into two jobs:
  - unit-tests: Runs without API keys or database connections (all PRs)
  - integration-tests: Runs only for internal contributors with API keys
- Renamed test_bge_reranker_client.py to test_bge_reranker_client_int.py
  to follow naming convention for integration tests
- Unit tests now skip all tests requiring databases or API keys
- Integration tests properly separated into:
  - Database integration tests (no API keys)
  - API integration tests (requires OPENAI_API_KEY, etc.)

The unit-tests job now:
- Runs for all PRs (internal and external)
- Requires no GitHub secrets
- Disables all database drivers
- Excludes all integration test files
- Passes 93 tests successfully

The integration-tests job:
- Only runs for internal contributors (same repo PRs or pushes to main)
- Has access to GitHub secrets
- Tests database operations and API integrations
- Uses conditional: github.event.pull_request.head.repo.full_name == github.repository

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 16:43:29 -07:00

119 lines
4.3 KiB
YAML

name: Unit Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
permissions:
contents: read
jobs:
unit-tests:
runs-on: depot-ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Install uv
uses: astral-sh/setup-uv@v3
with:
version: "latest"
- name: Install dependencies
run: uv sync --all-extras
- name: Run unit tests (no API keys required)
env:
PYTHONPATH: ${{ github.workspace }}
DISABLE_NEPTUNE: 1
DISABLE_NEO4J: 1
DISABLE_FALKORDB: 1
DISABLE_KUZU: 1
run: |
uv run pytest tests/ -m "not integration" \
--ignore=tests/test_graphiti_int.py \
--ignore=tests/test_graphiti_mock.py \
--ignore=tests/test_node_int.py \
--ignore=tests/test_edge_int.py \
--ignore=tests/test_entity_exclusion_int.py \
--ignore=tests/driver/ \
--ignore=tests/llm_client/test_anthropic_client_int.py \
--ignore=tests/utils/maintenance/ \
--ignore=tests/cross_encoder/test_bge_reranker_client_int.py \
--ignore=tests/evals/
integration-tests:
runs-on: depot-ubuntu-22.04
# Only run integration tests for internal contributors (push to main or PRs from same repo)
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository
environment:
name: development
services:
falkordb:
image: falkordb/falkordb:latest
ports:
- 6379:6379
options: --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5
neo4j:
image: neo4j:5.26-community
ports:
- 7687:7687
- 7474:7474
env:
NEO4J_AUTH: neo4j/testpass
NEO4J_PLUGINS: '["apoc"]'
options: --health-cmd "cypher-shell -u neo4j -p testpass 'RETURN 1'" --health-interval 10s --health-timeout 5s --health-retries 10
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Install uv
uses: astral-sh/setup-uv@v3
with:
version: "latest"
- name: Install redis-cli for FalkorDB health check
run: sudo apt-get update && sudo apt-get install -y redis-tools
- name: Install dependencies
run: uv sync --all-extras
- name: Wait for FalkorDB
run: |
timeout 60 bash -c 'until redis-cli -h localhost -p 6379 ping; do sleep 1; done'
- name: Wait for Neo4j
run: |
timeout 60 bash -c 'until wget -O /dev/null http://localhost:7474 >/dev/null 2>&1; do sleep 1; done'
- name: Run FalkorDB integration tests
env:
PYTHONPATH: ${{ github.workspace }}
FALKORDB_HOST: localhost
FALKORDB_PORT: 6379
DISABLE_NEO4J: 1
run: |
uv run pytest tests/driver/test_falkordb_driver.py
- name: Run database integration tests (no API keys required)
env:
PYTHONPATH: ${{ github.workspace }}
NEO4J_URI: bolt://localhost:7687
NEO4J_USER: neo4j
NEO4J_PASSWORD: testpass
FALKORDB_HOST: localhost
FALKORDB_PORT: 6379
DISABLE_NEPTUNE: 1
run: |
uv run pytest tests/test_graphiti_mock.py tests/utils/maintenance/test_bulk_utils.py tests/utils/maintenance/test_edge_operations.py tests/utils/maintenance/test_node_operations.py
- name: Run API integration tests (requires API keys)
env:
PYTHONPATH: ${{ github.workspace }}
NEO4J_URI: bolt://localhost:7687
NEO4J_USER: neo4j
NEO4J_PASSWORD: testpass
FALKORDB_HOST: localhost
FALKORDB_PORT: 6379
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
run: |
uv run pytest tests/test_*_int.py tests/llm_client/test_anthropic_client_int.py tests/utils/maintenance/test_temporal_operations_int.py tests/cross_encoder/test_bge_reranker_client_int.py