Files
qdrant/openapi/tests/openapi_integration/test_fts.py
Tim Visée 1e4ce145a2 Parameterize integration tests (#2375)
* Clean up imports

* Clean up whitespace

* Use drop collection function from helpers

* Use parameterized integration tests to test on_disk variations

* Promote on_disk_vectors parameter into dedicated fixture

* Merge basic retrieve test with parameterization

* Flatten functions

* Split validation test functions

* Don't parameterize on_disk states when testing validation

* Parameterize init_from_collection test sequence

* Parameterize on_disk_payload in tests with fixture

* Parameterize new batch update tests

* Fix integration test collection setup distance after incorrect merge
2023-08-09 12:32:27 +02:00

278 lines
6.8 KiB
Python

import random
import pytest
from .helpers.collection_setup import drop_collection
from .helpers.fixtures import on_disk_vectors, on_disk_payload
from .helpers.helpers import request_with_validation
collection_name = 'test_collection_fts'
texts = [
"2430 A.D.",
"The Acquisitive Chuckle",
"Author! Author!",
"The Bicentennial Man",
"Big Game",
"The Billiard Ball",
"Birth of a Notion",
"Black Friar of the Flame",
"Blank!",
"Blind Alley",
"Breeds There a Man...?",
"Button, Button",
"Buy Jupiter",
"C-Chute",
"Cal",
"The Callistan Menace",
"Catch That Rabbit",
"Christmas on Ganymede",
"Darwinian Pool Room",
"Day of the Hunters",
"Death Sentence",
"Does a Bee Care?",
"Dreaming Is a Private Thing",
"The Dust of Death",
"The Dying Night",
"Each an Explorer",
"Escape!",
"Everest",
"Evidence",
"The Evitable Conflict",
"Exile to Hell",
"Eyes Do More Than See",
"The Feeling of Power",
"Feminine Intuition",
"First Law",
"Flies",
"For the Birds",
"Founding Father",
"The Fun They Had",
"Galley Slave",
"The Gentle Vultures",
"Getting Even",
"Gimmicks Three",
"Gold",
"Good Taste",
"The Greatest Asset",
"Green Patches",
"Half-Breed",
"Half-Breeds on Venus",
"Hallucination",
"The Hazing",
"Hell-Fire",
"Heredity",
"History",
"Homo Sol",
"Hostess",
"I Just Make Them Up, See!",
"I'm in Marsport Without Hilda",
"The Imaginary",
"The Immortal Bard",
"In a Good Cause—",
"Insert Knob A in Hole B",
"The Instability",
"It's Such a Beautiful Day",
"The Key",
"Kid Stuff",
"The Last Answer",
"The Last Question",
"The Last Trump",
"Left to Right",
"Legal Rites",
"Lenny",
"Lest We Remember",
"Let's Not",
"Liar!",
"Light Verse",
"Little Lost Robot",
"The Little Man on the Subway",
"Living Space",
"A Loint of Paw",
"The Magnificent Possession",
"Marching In",
"Marooned off Vesta",
"The Message",
"Mirror Image",
"Mother Earth",
"My Son, the Physicist",
"No Connection",
"No Refuge Could Save",
"Nobody Here But—",
"Not Final!",
"Obituary",
"Old-fashioned",
"Pâté de Foie Gras",
"The Pause",
"Ph as in Phony",
"The Portable Star",
"The Proper Study",
"Rain, Rain, Go Away",
"Reason",
"The Red Queen's Race",
"Rejection Slips",
"Ring Around the Sun",
"Risk",
"Robot AL-76 Goes Astray",
"Robot Dreams",
"Runaround",
"Sally",
"Satisfaction Guaranteed",
"The Secret Sense",
"Shah Guido G.",
"Silly Asses",
"The Singing Bell",
"Sixty Million Trillion Combinations",
"Spell My Name with an S",
"Star Light",
"A Statue for Father",
"Strikebreaker",
"Super-Neutron",
"Take a Match",
"The Talking Stone",
". . . That Thou Art Mindful of Him",
"Thiotimoline",
"Time Pussy",
"Trends",
"Truth to Tell",
"The Ugly Little Boy",
"The Ultimate Crime",
"Unto the Fourth Generation",
"The Up-to-Date Sorcerer",
"Waterclap",
"The Watery Place",
"The Weapon",
"The Weapon Too Dreadful to Use",
"What If—",
"What Is This Thing Called Love?",
"What's in a Name?",
"The Winnowing",
]
def basic_collection_setup(
collection_name='test_collection',
on_disk_vectors=False,
on_disk_payload=False,
):
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": {
"size": 4,
"distance": "Dot",
"on_disk": on_disk_vectors,
},
"on_disk_payload": on_disk_payload,
}
)
assert response.ok
# Create index
response = request_with_validation(
api='/collections/{collection_name}/index',
method="PUT",
path_params={'collection_name': collection_name},
query_params={'wait': 'true'},
body={
"field_name": "title",
"field_schema": {
"type": "text",
"tokenizer": "prefix",
}
}
)
assert response.ok
response = request_with_validation(
api='/collections/{collection_name}',
method="GET",
path_params={'collection_name': collection_name},
)
assert response.ok
response = request_with_validation(
api='/collections/{collection_name}/points',
method="PUT",
path_params={'collection_name': collection_name},
query_params={'wait': 'true'},
body={
"points": [
{
"id": idx,
"vector": [random.random() for _ in range(4)],
"payload": {"title": title}
} for idx, title in enumerate(texts)
]
}
)
assert response.ok
@pytest.fixture(autouse=True, scope='module')
def setup(on_disk_vectors, on_disk_payload):
basic_collection_setup(collection_name=collection_name, on_disk_vectors=on_disk_vectors, on_disk_payload=on_disk_payload)
yield
drop_collection(collection_name=collection_name)
def test_scroll_with_prefix():
response = request_with_validation(
api='/collections/{collection_name}/points/scroll',
method="POST",
path_params={'collection_name': collection_name},
body={
"offset": None,
"limit": 10,
"with_payload": True,
"with_vector": False,
"filter": {
"should": [
{
"key": "title",
"match": {
"text": "ROBO",
}
}
]
}
}
)
assert response.ok
assert len(response.json()['result']['points']) == 3
response = request_with_validation(
api='/collections/{collection_name}/points/search',
method="POST",
path_params={'collection_name': collection_name},
body={
"vector": [1., 1., 1., 1.],
"limit": 10,
"with_payload": True,
"with_vector": False,
"filter": {
"should": [
{
"key": "title",
"match": {
"text": "ROBO",
}
}
]
}
}
)
assert response.ok
assert len(response.json()['result']) == 3