Visual-Image / tests /test_qdrant_singleton.py
VesperAI's picture
addede a Production Branch
60444f3
import pytest
import uuid
from pathlib import Path
import shutil
from qdrant_singleton import QdrantClientSingleton, CURRENT_SCHEMA_VERSION
from qdrant_client.http import models
@pytest.fixture(autouse=True)
def setup_teardown():
"""Setup and teardown for each test"""
# Store original state
original_path = QdrantClientSingleton._storage_path
original_instance = QdrantClientSingleton._instance
# Create temporary storage
temp_path = Path("test_qdrant_data")
QdrantClientSingleton._storage_path = temp_path
QdrantClientSingleton._instance = None
yield
# Cleanup
if QdrantClientSingleton._instance:
QdrantClientSingleton._instance.close()
# Restore original state
QdrantClientSingleton._instance = original_instance
QdrantClientSingleton._storage_path = original_path
# Remove test directory if it exists
if temp_path.exists():
shutil.rmtree(temp_path)
def test_singleton_pattern():
"""Test that get_instance returns the same instance"""
instance1 = QdrantClientSingleton.get_instance()
instance2 = QdrantClientSingleton.get_instance()
assert instance1 is instance2
def test_storage_path_creation():
"""Test that storage path is created if it doesn't exist"""
assert not QdrantClientSingleton._storage_path.exists()
QdrantClientSingleton.get_instance()
assert QdrantClientSingleton._storage_path.exists()
def test_collection_creation():
"""Test collection creation"""
client = QdrantClientSingleton.get_instance()
collection_name = "test_collection"
# Create collection
QdrantClientSingleton.initialize_collection(collection_name)
# Check collection exists
collections = client.get_collections().collections
collection_names = [collection.name for collection in collections]
assert collection_name in collection_names
def test_schema_version_check():
"""Test schema version checking and updating"""
client = QdrantClientSingleton.get_instance()
collection_name = "test_schema_collection"
# Create collection
QdrantClientSingleton.initialize_collection(collection_name)
# Add a point with current schema version
point_id = str(uuid.uuid4())
client.upsert(
collection_name=collection_name,
points=[
models.PointStruct(
id=point_id,
vector=[0.0] * 512, # VECTOR_SIZE
payload={
"path": "test.jpg",
"absolute_path": "/test/test.jpg",
"schema_version": CURRENT_SCHEMA_VERSION,
"indexed_at": 123456789
}
)
]
)
# Verify point was added
search_result = client.scroll(
collection_name=collection_name,
limit=1
)
assert len(search_result[0]) == 1
assert search_result[0][0].id == point_id
assert search_result[0][0].payload["schema_version"] == CURRENT_SCHEMA_VERSION
def test_payload_indexes():
"""Test that payload indexes are created correctly"""
client = QdrantClientSingleton.get_instance()
collection_name = "test_indexes"
# Create collection
QdrantClientSingleton.initialize_collection(collection_name)
# Get collection info
collection_info = client.get_collection(collection_name)
# Check that collection exists and has correct vector size
assert collection_info.config.params.vectors.size == 512
assert collection_info.config.params.vectors.distance == models.Distance.COSINE
def test_empty_collection_schema_check():
"""Test schema check behavior with empty collection"""
client = QdrantClientSingleton.get_instance()
collection_name = "test_empty_collection"
# Create collection
QdrantClientSingleton.initialize_collection(collection_name)
# Verify collection exists
collections = client.get_collections().collections
collection_names = [collection.name for collection in collections]
assert collection_name in collection_names