309 lines
8.2 KiB
Python
309 lines
8.2 KiB
Python
# Copyright (c) Microsoft. All rights reserved.
|
|
|
|
from _pytest.mark.structures import ParameterSet
|
|
from pytest import fixture, param
|
|
|
|
from semantic_kernel.exceptions.vector_store_exceptions import VectorStoreOperationException
|
|
|
|
|
|
@fixture()
|
|
def mongodb_atlas_unit_test_env(monkeypatch, exclude_list, override_env_param_dict):
|
|
"""Fixture to set environment variables for MongoDB Atlas Unit Tests."""
|
|
if exclude_list is None:
|
|
exclude_list = []
|
|
|
|
if override_env_param_dict is None:
|
|
override_env_param_dict = {}
|
|
|
|
env_vars = {"MONGODB_ATLAS_CONNECTION_STRING": "mongodb://test", "MONGODB_ATLAS_DATABASE_NAME": "test-database"}
|
|
|
|
env_vars.update(override_env_param_dict)
|
|
|
|
for key, value in env_vars.items():
|
|
if key not in exclude_list:
|
|
monkeypatch.setenv(key, value)
|
|
else:
|
|
monkeypatch.delenv(key, raising=False)
|
|
|
|
return env_vars
|
|
|
|
|
|
@fixture
|
|
def postgres_unit_test_env(monkeypatch, exclude_list, override_env_param_dict):
|
|
"""Fixture to set environment variables for Postgres connector."""
|
|
if exclude_list is None:
|
|
exclude_list = []
|
|
|
|
if override_env_param_dict is None:
|
|
override_env_param_dict = {}
|
|
|
|
env_vars = {"POSTGRES_CONNECTION_STRING": "host=localhost port=5432 dbname=postgres user=testuser password=example"}
|
|
|
|
env_vars.update(override_env_param_dict)
|
|
|
|
for key, value in env_vars.items():
|
|
if key not in exclude_list:
|
|
monkeypatch.setenv(key, value)
|
|
else:
|
|
monkeypatch.delenv(key, raising=False)
|
|
|
|
return env_vars
|
|
|
|
|
|
@fixture
|
|
def qdrant_unit_test_env(monkeypatch, exclude_list, override_env_param_dict):
|
|
"""Fixture to set environment variables for QdrantConnector."""
|
|
if exclude_list is None:
|
|
exclude_list = []
|
|
|
|
if override_env_param_dict is None:
|
|
override_env_param_dict = {}
|
|
|
|
env_vars = {"QDRANT_LOCATION": "http://localhost:6333"}
|
|
|
|
env_vars.update(override_env_param_dict)
|
|
|
|
for key, value in env_vars.items():
|
|
if key not in exclude_list:
|
|
monkeypatch.setenv(key, value)
|
|
else:
|
|
monkeypatch.delenv(key, raising=False)
|
|
|
|
return env_vars
|
|
|
|
|
|
@fixture
|
|
def redis_unit_test_env(monkeypatch, exclude_list, override_env_param_dict):
|
|
"""Fixture to set environment variables for Redis."""
|
|
if exclude_list is None:
|
|
exclude_list = []
|
|
|
|
if override_env_param_dict is None:
|
|
override_env_param_dict = {}
|
|
|
|
env_vars = {"REDIS_CONNECTION_STRING": "redis://localhost:6379"}
|
|
|
|
env_vars.update(override_env_param_dict)
|
|
|
|
for key, value in env_vars.items():
|
|
if key not in exclude_list:
|
|
monkeypatch.setenv(key, value)
|
|
else:
|
|
monkeypatch.delenv(key, raising=False)
|
|
|
|
return env_vars
|
|
|
|
|
|
@fixture
|
|
def pinecone_unit_test_env(monkeypatch, exclude_list, override_env_param_dict):
|
|
"""Fixture to set environment variables for Pinecone."""
|
|
if exclude_list is None:
|
|
exclude_list = []
|
|
|
|
if override_env_param_dict is None:
|
|
override_env_param_dict = {}
|
|
|
|
env_vars = {"PINECONE_API_KEY": "test_key"}
|
|
|
|
env_vars.update(override_env_param_dict)
|
|
|
|
for key, value in env_vars.items():
|
|
if key not in exclude_list:
|
|
monkeypatch.setenv(key, value)
|
|
else:
|
|
monkeypatch.delenv(key, raising=False)
|
|
|
|
return env_vars
|
|
|
|
|
|
@fixture
|
|
def sql_server_unit_test_env(monkeypatch, exclude_list, override_env_param_dict):
|
|
"""Fixture to set environment variables for SQL Server."""
|
|
if exclude_list is None:
|
|
exclude_list = []
|
|
|
|
if override_env_param_dict is None:
|
|
override_env_param_dict = {}
|
|
|
|
env_vars = {
|
|
"SQL_SERVER_CONNECTION_STRING": "Driver={ODBC Driver 18 for SQL Server};Server=localhost;Database=testdb;User Id=testuser;Password=example;" # noqa: E501
|
|
}
|
|
|
|
env_vars.update(override_env_param_dict)
|
|
|
|
for key, value in env_vars.items():
|
|
if key not in exclude_list:
|
|
monkeypatch.setenv(key, value)
|
|
else:
|
|
monkeypatch.delenv(key, raising=False)
|
|
|
|
return env_vars
|
|
|
|
|
|
def filter_lambda_list(store: str) -> list[ParameterSet]:
|
|
"""Fixture to provide a list of filter lambdas for testing."""
|
|
sets = [
|
|
(
|
|
lambda x: x.content == "value",
|
|
{
|
|
"ai_search": "content eq 'value'",
|
|
},
|
|
"equal with string",
|
|
),
|
|
(
|
|
lambda x: x.id == 0,
|
|
{
|
|
"ai_search": "id eq 0",
|
|
},
|
|
"equal with int",
|
|
),
|
|
(
|
|
lambda x: x.content != "value",
|
|
{
|
|
"ai_search": "content ne 'value'",
|
|
},
|
|
"not equal",
|
|
),
|
|
(
|
|
lambda x: x.id > 0,
|
|
{
|
|
"ai_search": "id gt 0",
|
|
},
|
|
"greater than",
|
|
),
|
|
(
|
|
lambda x: x.id >= 0,
|
|
{
|
|
"ai_search": "id ge 0",
|
|
},
|
|
"greater than or equal",
|
|
),
|
|
(
|
|
lambda x: x.id == +0,
|
|
{
|
|
"ai_search": "id eq +0",
|
|
},
|
|
"equal with explicit positive",
|
|
),
|
|
(
|
|
lambda x: x.id < 0,
|
|
{
|
|
"ai_search": "id lt 0",
|
|
},
|
|
"less than",
|
|
),
|
|
(
|
|
lambda x: x.id <= 0,
|
|
{
|
|
"ai_search": "id le 0",
|
|
},
|
|
"less than or equal",
|
|
),
|
|
(
|
|
lambda x: -10 <= x.id <= 0,
|
|
{
|
|
"ai_search": "(-10 le id and id le 0)",
|
|
},
|
|
"between inclusive",
|
|
),
|
|
(
|
|
lambda x: -10 < x.id < 0,
|
|
{
|
|
"ai_search": "(-10 lt id and id lt 0)",
|
|
},
|
|
"between exclusive",
|
|
),
|
|
(
|
|
lambda x: x.content == "value" and x.id == 0,
|
|
{
|
|
"ai_search": "(content eq 'value' and id eq 0)",
|
|
},
|
|
"and",
|
|
),
|
|
(
|
|
lambda x: x.content == "value" or x.id == 0,
|
|
{
|
|
"ai_search": "(content eq 'value' or id eq 0)",
|
|
},
|
|
"or",
|
|
),
|
|
(
|
|
lambda x: not x.content,
|
|
{
|
|
"ai_search": "not content",
|
|
},
|
|
"not with truthy",
|
|
),
|
|
(
|
|
lambda x: not (x.content == "value"), # noqa: SIM201
|
|
{
|
|
"ai_search": "not content eq 'value'",
|
|
},
|
|
"not with equal",
|
|
),
|
|
(
|
|
lambda x: not (x.content != "value"), # noqa: SIM202
|
|
{
|
|
"ai_search": "not content ne 'value'",
|
|
},
|
|
"not with not equal",
|
|
),
|
|
(
|
|
lambda x: "value" in x.content,
|
|
{
|
|
"ai_search": "search.ismatch('value', 'content')",
|
|
},
|
|
"contains",
|
|
),
|
|
(
|
|
lambda x: "value" not in x.content,
|
|
{
|
|
"ai_search": "not search.ismatch('value', 'content')",
|
|
},
|
|
"not contains",
|
|
),
|
|
(
|
|
lambda x: (x.id > 0 and x.id < 3) or (x.id > 7 and x.id < 10),
|
|
{
|
|
"ai_search": "((id gt 0 and id lt 3) or (id gt 7 and id lt 10))",
|
|
},
|
|
"complex",
|
|
),
|
|
(
|
|
lambda x: x.unknown_field == "value",
|
|
{
|
|
"ai_search": VectorStoreOperationException,
|
|
},
|
|
"fail unknown field",
|
|
),
|
|
(
|
|
lambda x: any(x == "a" for x in x.content),
|
|
{
|
|
"ai_search": NotImplementedError,
|
|
},
|
|
"comprehension",
|
|
),
|
|
(
|
|
lambda x: ~x.id,
|
|
{
|
|
"ai_search": NotImplementedError,
|
|
},
|
|
"invert",
|
|
),
|
|
(
|
|
lambda x: constant, # noqa: F821
|
|
{
|
|
"ai_search": NotImplementedError,
|
|
},
|
|
"constant",
|
|
),
|
|
(
|
|
lambda x: x.content.city == "Seattle",
|
|
{
|
|
"ai_search": "content/city eq 'Seattle'",
|
|
},
|
|
"nested property",
|
|
),
|
|
]
|
|
return [param(s[0], s[1][store], id=s[2]) for s in sets if store in s[1]]
|