diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index cf1053a1..6f22737b 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -1,4 +1,4 @@ -name: Unit Tests +name: Tests on: push: @@ -10,8 +10,102 @@ permissions: contents: read jobs: - test: + 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 external dependencies) + 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/test_temporal_operations_int.py \ + --ignore=tests/cross_encoder/test_bge_reranker_client_int.py \ + --ignore=tests/evals/ + + database-integration-tests: + runs-on: depot-ubuntu-22.04 + 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 driver tests + env: + PYTHONPATH: ${{ github.workspace }} + FALKORDB_HOST: localhost + FALKORDB_PORT: 6379 + DISABLE_NEO4J: 1 + DISABLE_NEPTUNE: 1 + run: | + uv run pytest tests/driver/test_falkordb_driver.py + - name: Run database integration tests + 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 + + api-integration-tests: + runs-on: depot-ubuntu-22.04 + # Only run API 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: @@ -43,30 +137,13 @@ jobs: run: sudo apt-get update && sudo apt-get install -y redis-tools - name: Install dependencies run: uv sync --all-extras - - name: Run non-integration tests - env: - PYTHONPATH: ${{ github.workspace }} - NEO4J_URI: bolt://localhost:7687 - NEO4J_USER: neo4j - NEO4J_PASSWORD: testpass - DISABLE_NEPTUNE: 1 - run: | - uv run pytest -m "not integration" - 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 Neo4j integration tests + - name: Run API integration tests (requires API keys) env: PYTHONPATH: ${{ github.workspace }} NEO4J_URI: bolt://localhost:7687 @@ -75,5 +152,9 @@ jobs: 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 -k "neo4j" + uv run pytest tests/ -k "_int" \ + --ignore=tests/driver/ \ + --ignore=tests/test_graphiti_mock.py diff --git a/pyproject.toml b/pyproject.toml index 07ca5ec0..55f1840d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ Repository = "https://github.com/getzep/graphiti" anthropic = ["anthropic>=0.49.0"] groq = ["groq>=0.2.0"] google-genai = ["google-genai>=1.8.0"] -kuzu = ["kuzu>=0.11.2"] +kuzu = ["kuzu>=0.11.3"] falkordb = ["falkordb>=1.1.2,<2.0.0"] voyageai = ["voyageai>=0.2.3"] neo4j-opensearch = ["boto3>=1.39.16", "opensearch-py>=3.0.0"] @@ -42,7 +42,7 @@ dev = [ "anthropic>=0.49.0", "google-genai>=1.8.0", "falkordb>=1.1.2,<2.0.0", - "kuzu>=0.11.2", + "kuzu>=0.11.3", "boto3>=1.39.16", "opensearch-py>=3.0.0", "langchain-aws>=0.2.29", diff --git a/tests/cross_encoder/test_bge_reranker_client.py b/tests/cross_encoder/test_bge_reranker_client_int.py similarity index 100% rename from tests/cross_encoder/test_bge_reranker_client.py rename to tests/cross_encoder/test_bge_reranker_client_int.py diff --git a/tests/utils/maintenance/test_temporal_operations_int.py b/tests/utils/maintenance/test_temporal_operations_int.py index 6b3b53d4..9d23178d 100644 --- a/tests/utils/maintenance/test_temporal_operations_int.py +++ b/tests/utils/maintenance/test_temporal_operations_int.py @@ -112,6 +112,7 @@ async def test_get_edge_contradictions_no_contradictions(): assert len(invalidated_edges) == 0 +@pytest.mark.skip(reason='Flaky LLM-based test with non-deterministic results') @pytest.mark.asyncio @pytest.mark.integration async def test_get_edge_contradictions_multiple_existing(): @@ -243,6 +244,7 @@ async def test_get_edge_contradictions_no_effect(): assert len(invalidated_edges) == 0 +@pytest.mark.skip(reason='Flaky LLM-based test with non-deterministic results') @pytest.mark.asyncio @pytest.mark.integration async def test_invalidate_edges_partial_update():