* Remove integration markers from database tests Removed @pytest.mark.integration from database tests to allow them to run while excluding API integration tests that call external services. Database tests (now run): - tests/test_edge_int.py - tests/test_graphiti_int.py - tests/test_node_int.py - tests/test_entity_exclusion_int.py - tests/cross_encoder/test_bge_reranker_client_int.py - tests/driver/test_falkordb_driver.py API integration tests (excluded): - tests/llm_client/test_anthropic_client_int.py - tests/utils/maintenance/test_temporal_operations_int.py 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Apply ruff formatting to falkordb driver and node queries - Quote style fixes in falkordb_driver.py - Trailing whitespace cleanup in node_db_queries.py - Update uv.lock 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Remove api-integration-tests job from CI workflow The api-integration-tests job has been removed since API integration tests are now excluded via @pytest.mark.integration marker. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix database-integration-tests to run all database tests Previously only ran test_graphiti_mock.py, now runs all database tests: - tests/test_graphiti_mock.py - tests/test_graphiti_int.py - tests/test_node_int.py - tests/test_edge_int.py - tests/test_entity_exclusion_int.py - tests/cross_encoder/test_bge_reranker_client_int.py - tests/driver/test_falkordb_driver.py The -m "not integration" filter excludes API integration tests that call external services (Anthropic, OpenAI, etc). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Restore integration markers for tests that call LLM APIs test_graphiti_int.py and test_entity_exclusion_int.py call graphiti.add_episode() and graphiti.search_() which require LLM API calls, so they are API integration tests, not pure database tests. Final categorization: Pure unit tests (no external dependencies): - tests/llm_client/test_*.py (except test_anthropic_client_int.py) - tests/embedder/test_*.py - tests/utils/maintenance/test_*.py (except test_temporal_operations_int.py) - tests/utils/search/search_utils_test.py - tests/test_text_utils.py Database tests (require Neo4j/FalkorDB, no API calls): - tests/test_graphiti_mock.py - tests/test_node_int.py - tests/test_edge_int.py - tests/cross_encoder/test_bge_reranker_client_int.py - tests/driver/test_falkordb_driver.py API integration tests (excluded via @pytest.mark.integration): - tests/test_graphiti_int.py - tests/test_entity_exclusion_int.py - tests/llm_client/test_anthropic_client_int.py - tests/utils/maintenance/test_temporal_operations_int.py 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
78 lines
2.3 KiB
Python
78 lines
2.3 KiB
Python
"""
|
|
Copyright 2024, Zep Software, Inc.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
"""
|
|
|
|
import pytest
|
|
|
|
from graphiti_core.cross_encoder.bge_reranker_client import BGERerankerClient
|
|
|
|
|
|
@pytest.fixture
|
|
def client():
|
|
return BGERerankerClient()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_rank_basic_functionality(client):
|
|
query = 'What is the capital of France?'
|
|
passages = [
|
|
'Paris is the capital and most populous city of France.',
|
|
'London is the capital city of England and the United Kingdom.',
|
|
'Berlin is the capital and largest city of Germany.',
|
|
]
|
|
|
|
ranked_passages = await client.rank(query, passages)
|
|
|
|
# Check if the output is a list of tuples
|
|
assert isinstance(ranked_passages, list)
|
|
assert all(isinstance(item, tuple) for item in ranked_passages)
|
|
|
|
# Check if the output has the correct length
|
|
assert len(ranked_passages) == len(passages)
|
|
|
|
# Check if the scores are floats and passages are strings
|
|
for passage, score in ranked_passages:
|
|
assert isinstance(passage, str)
|
|
assert isinstance(score, float)
|
|
|
|
# Check if the results are sorted in descending order
|
|
scores = [score for _, score in ranked_passages]
|
|
assert scores == sorted(scores, reverse=True)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_rank_empty_input(client):
|
|
query = 'Empty test'
|
|
passages = []
|
|
|
|
ranked_passages = await client.rank(query, passages)
|
|
|
|
# Check if the output is an empty list
|
|
assert ranked_passages == []
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_rank_single_passage(client):
|
|
query = 'Test query'
|
|
passages = ['Single test passage']
|
|
|
|
ranked_passages = await client.rank(query, passages)
|
|
|
|
# Check if the output has one item
|
|
assert len(ranked_passages) == 1
|
|
|
|
# Check if the passage is correct and the score is a float
|
|
assert ranked_passages[0][0] == passages[0]
|
|
assert isinstance(ranked_passages[0][1], float)
|