Files
wehub-resource-sync 7a0da7932b
OSV-Scanner (Scheduled) / scan-scheduled (push) Failing after 0s
Create Release / test-gate (push) Has been cancelled
Create Release / release-gate (push) Has been cancelled
Create Release / ci-gate (push) Has been cancelled
Create Release / version-check (push) Has been cancelled
Create Release / e2e-test-gate (push) Has been cancelled
Create Release / responsive-test-gate (push) Has been cancelled
Create Release / compat-test-gate (push) Has been cancelled
Create Release / compose-integration-gate (push) Has been cancelled
Create Release / vulture-gate (push) Has been cancelled
Create Release / build (push) Has been cancelled
Create Release / provenance (push) Has been cancelled
Create Release / prerelease-docker (push) Has been cancelled
Create Release / publish-docker (push) Has been cancelled
Create Release / create-release (push) Has been cancelled
Create Release / cleanup-changelog (push) Has been cancelled
Create Release / trigger-pypi (push) Has been cancelled
Create Release / monitor-pypi (push) Has been cancelled
Create Release / Clean up orphan prerelease tags and signatures (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-form] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-metrics] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-workflow] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-core] (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [history-news] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [library] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [link-analytics] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-core] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-lifecycle] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [error-benchmark] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-pages] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) (push) Has been cancelled
Docker Tests (Consolidated) / Accessibility Tests (push) Has been cancelled
Docker Tests (Consolidated) / LLM Unit Tests (push) Has been cancelled
Docker Tests (Consolidated) / LLM Example Tests (push) Has been cancelled
Docker Tests (Consolidated) / Production Image Smoke Test (push) Has been cancelled
Docker Tests (Consolidated) / Infrastructure Tests (push) Has been cancelled
OSSF Scorecard / OSSF Security Scorecard Analysis (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [mobile] (push) Has been cancelled
Backwards Compatibility / Verify Encryption Constants (push) Has been cancelled
Backwards Compatibility / PyPI Version Compatibility (push) Has been cancelled
Backwards Compatibility / Database Migration Tests (push) Has been cancelled
CodeQL Advanced / Analyze (python) (push) Has been cancelled
Docker Tests (Consolidated) / detect-changes (push) Has been cancelled
Docker Tests (Consolidated) / Build Test Image (push) Has been cancelled
Docker Tests (Consolidated) / All Pytest Tests + Coverage (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [accessibility] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [api-crud] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-login] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-pages] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-register] (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:08:55 +08:00

331 lines
13 KiB
Python

"""
Tests for embeddings/providers/implementations/sentence_transformers.py
Tests cover:
- SentenceTransformersProvider.create_embeddings()
- SentenceTransformersProvider.is_available()
- SentenceTransformersProvider.get_available_models()
- Class attributes and metadata
"""
from unittest.mock import patch, MagicMock
class TestSentenceTransformersProviderMetadata:
"""Tests for SentenceTransformersProvider class metadata."""
def test_provider_name(self):
"""Test provider name is set correctly."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
assert (
SentenceTransformersProvider.provider_name
== "Sentence Transformers"
)
def test_provider_key(self):
"""Test provider key is set correctly."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
assert (
SentenceTransformersProvider.provider_key == "SENTENCE_TRANSFORMERS"
)
def test_requires_api_key(self):
"""Test that Sentence Transformers does not require API key."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
assert SentenceTransformersProvider.requires_api_key is False
def test_supports_local(self):
"""Test that Sentence Transformers supports local."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
assert SentenceTransformersProvider.supports_local is True
def test_default_model(self):
"""Test default model is set."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
assert SentenceTransformersProvider.default_model == "all-MiniLM-L6-v2"
class TestSentenceTransformersProviderAvailableModels:
"""Tests for AVAILABLE_MODELS constant."""
def test_available_models_has_expected_models(self):
"""Test that AVAILABLE_MODELS contains expected models."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
models = SentenceTransformersProvider.AVAILABLE_MODELS
assert "all-MiniLM-L6-v2" in models
assert "all-mpnet-base-v2" in models
assert "multi-qa-MiniLM-L6-cos-v1" in models
assert "paraphrase-multilingual-MiniLM-L12-v2" in models
def test_available_models_have_dimensions(self):
"""Test that all models have dimensions metadata."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
for (
model_name,
model_info,
) in SentenceTransformersProvider.AVAILABLE_MODELS.items():
assert "dimensions" in model_info
assert isinstance(model_info["dimensions"], int)
def test_available_models_have_description(self):
"""Test that all models have description metadata."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
for (
model_name,
model_info,
) in SentenceTransformersProvider.AVAILABLE_MODELS.items():
assert "description" in model_info
assert isinstance(model_info["description"], str)
def test_available_models_have_max_seq_length(self):
"""Test that all models have max_seq_length metadata."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
for (
model_name,
model_info,
) in SentenceTransformersProvider.AVAILABLE_MODELS.items():
assert "max_seq_length" in model_info
assert isinstance(model_info["max_seq_length"], int)
class TestSentenceTransformersProviderCreateEmbeddings:
"""Tests for SentenceTransformersProvider.create_embeddings method."""
def test_create_embeddings_default_model(self):
"""Test creating embeddings with default model."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
mock_embeddings = MagicMock()
def mock_get_setting(key, default=None, settings_snapshot=None):
# Return None to use default model
return default
with patch(
"local_deep_research.embeddings.providers.implementations.sentence_transformers.get_setting_from_snapshot",
side_effect=mock_get_setting,
):
with patch(
"langchain_community.embeddings.SentenceTransformerEmbeddings",
return_value=mock_embeddings,
) as mock_class:
result = SentenceTransformersProvider.create_embeddings()
assert result is mock_embeddings
mock_class.assert_called_once()
call_kwargs = mock_class.call_args[1]
# Default model should be used
assert call_kwargs["model_name"] == "all-MiniLM-L6-v2"
# CPU is default device
assert call_kwargs["model_kwargs"]["device"] == "cpu"
def test_create_embeddings_with_custom_model(self):
"""Test creating embeddings with custom model."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
mock_embeddings = MagicMock()
with patch(
"langchain_community.embeddings.SentenceTransformerEmbeddings",
return_value=mock_embeddings,
) as mock_class:
SentenceTransformersProvider.create_embeddings(
model="all-mpnet-base-v2"
)
call_kwargs = mock_class.call_args[1]
assert call_kwargs["model_name"] == "all-mpnet-base-v2"
def test_create_embeddings_with_device(self):
"""Test creating embeddings with specific device."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
mock_embeddings = MagicMock()
with patch(
"local_deep_research.embeddings.providers.implementations.sentence_transformers.get_setting_from_snapshot",
return_value=None,
):
with patch(
"langchain_community.embeddings.SentenceTransformerEmbeddings",
return_value=mock_embeddings,
) as mock_class:
SentenceTransformersProvider.create_embeddings(device="cuda")
call_kwargs = mock_class.call_args[1]
assert call_kwargs["model_kwargs"]["device"] == "cuda"
def test_create_embeddings_default_device_cpu(self):
"""Test that default device is CPU."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
mock_embeddings = MagicMock()
def mock_get_setting(key, default=None, settings_snapshot=None):
if key == "embeddings.sentence_transformers.device":
return "cpu"
return default
with patch(
"local_deep_research.embeddings.providers.implementations.sentence_transformers.get_setting_from_snapshot",
side_effect=mock_get_setting,
):
with patch(
"langchain_community.embeddings.SentenceTransformerEmbeddings",
return_value=mock_embeddings,
) as mock_class:
SentenceTransformersProvider.create_embeddings()
call_kwargs = mock_class.call_args[1]
assert call_kwargs["model_kwargs"]["device"] == "cpu"
def test_create_embeddings_with_settings_snapshot(self):
"""Test creating embeddings with settings snapshot."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
mock_embeddings = MagicMock()
# search.tool present => a public primary resolves PUBLIC_ONLY
# => require_local stays off, so this model-reading test is not
# diverted into the require-local download guard.
settings = {
"embeddings.sentence_transformers.model": "custom-model",
"search.tool": "searxng",
}
def mock_get_setting(key, default=None, settings_snapshot=None):
if key == "embeddings.sentence_transformers.model":
return "custom-model"
if key == "embeddings.sentence_transformers.device":
return "cpu"
return default
with patch(
"local_deep_research.embeddings.providers.implementations.sentence_transformers.get_setting_from_snapshot",
side_effect=mock_get_setting,
):
with patch(
"langchain_community.embeddings.SentenceTransformerEmbeddings",
return_value=mock_embeddings,
) as mock_class:
SentenceTransformersProvider.create_embeddings(
settings_snapshot=settings
)
call_kwargs = mock_class.call_args[1]
assert call_kwargs["model_name"] == "custom-model"
class TestSentenceTransformersProviderIsAvailable:
"""Tests for SentenceTransformersProvider.is_available method."""
def test_is_available_always_true(self):
"""Test that Sentence Transformers is always available."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
assert SentenceTransformersProvider.is_available() is True
def test_is_available_with_settings_snapshot(self):
"""Test that is_available works with settings snapshot."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
assert (
SentenceTransformersProvider.is_available(
settings_snapshot={"some": "settings"}
)
is True
)
class TestSentenceTransformersProviderGetAvailableModels:
"""Tests for SentenceTransformersProvider.get_available_models method."""
def test_get_available_models_returns_list(self):
"""Test that get_available_models returns a list."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
models = SentenceTransformersProvider.get_available_models()
assert isinstance(models, list)
def test_get_available_models_has_correct_structure(self):
"""Test that models have value and label keys."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
models = SentenceTransformersProvider.get_available_models()
for model in models:
assert "value" in model
assert "label" in model
assert isinstance(model["value"], str)
assert isinstance(model["label"], str)
def test_get_available_models_includes_dimensions_in_label(self):
"""Test that labels include dimension info."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
models = SentenceTransformersProvider.get_available_models()
for model in models:
assert "d)" in model["label"] # Dimensions indicator like "384d)"
def test_get_available_models_matches_available_models_constant(self):
"""Test that returned models match AVAILABLE_MODELS."""
from local_deep_research.embeddings.providers.implementations.sentence_transformers import (
SentenceTransformersProvider,
)
models = SentenceTransformersProvider.get_available_models()
model_values = [m["value"] for m in models]
for (
expected_model
) in SentenceTransformersProvider.AVAILABLE_MODELS.keys():
assert expected_model in model_values