Files
qdrant/tests/openapi/test_sparse_vector_persistence.py
Leo Henon d1cc51bcd8 Fix empty sparse vector name validation (#8194)
* Fix empty sparse vector name validation

* Reorder validation to check empty sparse name before duplicate name

---------

Co-authored-by: leohenon <77656081+lhenon999@users.noreply.github.com>
2026-05-08 13:46:38 +02:00

144 lines
4.3 KiB
Python

import pytest
from .helpers.collection_setup import drop_collection
from .helpers.helpers import request_with_validation
@pytest.fixture(autouse=True)
def setup(collection_name):
sparse_collection_setup(collection_name=collection_name)
yield
drop_collection(collection_name=collection_name)
def sparse_collection_setup(collection_name='test_collection'):
response = request_with_validation(
api='/collections/{collection_name}',
method="DELETE",
path_params={'collection_name': collection_name},
)
assert response.ok
response = request_with_validation(
api='/collections/{collection_name}',
method="PUT",
path_params={'collection_name': collection_name},
body={
"sparse_vectors": {
"text": {}
},
}
)
assert response.ok
response = request_with_validation(
api='/collections/{collection_name}',
method="GET",
path_params={'collection_name': collection_name},
)
assert response.ok
def test_sparse_vector_persisted_sorted(collection_name):
response = request_with_validation(
api='/collections/{collection_name}/points',
method="PUT",
path_params={'collection_name': collection_name},
query_params={'wait': 'true'},
body={
"points": [
{
"id": 1,
"vector": {
"text": {"indices": [3, 2, 1], "values": [0.3, 0.2, 0.1]}
}
},
{
"id": 2,
"vector": {
"text": {"indices": [1, 3, 2], "values": [0.1, 0.3, 0.2]}
}
},
{
"id": 3,
"vector": {
"text": {"indices": [1, 2, 3], "values": [0.1, 0.2, 0.3]}
}
},
]
}
)
assert response.ok
response = request_with_validation(
api='/collections/{collection_name}/points/scroll',
method="POST",
path_params={'collection_name': collection_name},
body={"limit": 10, "with_vector": True}
)
assert response.ok
assert len(response.json()['result']['points']) == 3
results = response.json()['result']['points']
for i in range(3):
assert results[i]['id'] == i + 1
assert results[i]['vector']['text']['indices'] == [1, 2, 3] # sorted by indices
assert results[i]['vector']['text']['values'] == [0.1, 0.2, 0.3] # aligned to respective indices
def test_sparse_dense_vector_naming_validations(collection_name):
response = request_with_validation(
api='/collections/{collection_name}',
method="DELETE",
path_params={'collection_name': collection_name},
)
assert response.ok
response = request_with_validation(
api='/collections/{collection_name}',
method="PUT",
path_params={'collection_name': collection_name},
body={
"vectors": {
"image": {
"size": 2,
"distance": "Euclid"
}
},
"sparse_vectors": {
"image": {}
}
}
)
assert not response.ok
assert 'Dense and sparse vector names must be unique - duplicate found with \'image\'' in response.json()["status"]["error"]
response = request_with_validation(
api='/collections/{collection_name}',
method="PUT",
path_params={'collection_name': collection_name},
body={
"vectors": {
"size": 2,
"distance": "Euclid"
},
"sparse_vectors": {
"": {}
}
}
)
assert not response.ok
assert 'Sparse vector name cannot be empty' in response.json()["status"]["error"]
response = request_with_validation(
api='/collections/{collection_name}',
method="PUT",
path_params={'collection_name': collection_name},
body={
"sparse_vectors": {
"": {}
}
}
)
assert not response.ok
assert 'Sparse vector name cannot be empty' in response.json()["status"]["error"]