137 lines
4.2 KiB
Python
137 lines
4.2 KiB
Python
from __future__ import annotations
|
|
|
|
import builtins
|
|
from unittest.mock import MagicMock
|
|
|
|
import pytest
|
|
|
|
|
|
def test_missing_haystack_llmwrapper(monkeypatch):
|
|
real_import = builtins.__import__
|
|
|
|
def mocked_import(name, *args, **kwargs):
|
|
if name.startswith("haystack"):
|
|
raise ImportError("No module named 'haystack'")
|
|
return real_import(name, *args, **kwargs)
|
|
|
|
# Replace the built-in import function with our mock
|
|
monkeypatch.setattr(builtins, "__import__", mocked_import)
|
|
|
|
# Test: Non-Haystack wrappers still work fine
|
|
from langchain_openai.llms import OpenAI
|
|
|
|
from ragas.llms import LangchainLLMWrapper
|
|
|
|
langchain_mocked_llm = MagicMock(spec=OpenAI)
|
|
langchain_mocked_llm.model_name = "gpt-3.5-turbo-instruct"
|
|
|
|
langchain_wrapper = LangchainLLMWrapper(langchain_llm=langchain_mocked_llm)
|
|
|
|
assert langchain_wrapper.langchain_llm.model_name == "gpt-3.5-turbo-instruct" # type: ignore
|
|
|
|
# Test: Importing HaystackLLMWrapper fails
|
|
with pytest.raises(ImportError, match="Haystack is not installed"):
|
|
from ragas.llms import HaystackLLMWrapper
|
|
|
|
HaystackLLMWrapper(haystack_generator=None)
|
|
|
|
|
|
@pytest.mark.filterwarnings(
|
|
"ignore:LangchainEmbeddingsWrapper is deprecated:DeprecationWarning"
|
|
)
|
|
@pytest.mark.filterwarnings(
|
|
"ignore:LlamaIndexEmbeddingsWrapper is deprecated:DeprecationWarning"
|
|
)
|
|
@pytest.mark.filterwarnings("ignore:.*coroutine.*was never awaited:RuntimeWarning")
|
|
def test_wrappers_with_missing_haystack(monkeypatch):
|
|
"""Simulate missing 'haystack' and verify that:
|
|
- Non-Haystack wrappers import and instantiate without error.
|
|
- Importing HaystackEmbeddingsWrapper fails with an ImportError.
|
|
"""
|
|
|
|
real_import = builtins.__import__
|
|
|
|
# Define our mock import function that raises ImportError if "haystack" is imported
|
|
def mocked_import(name, *args, **kwargs):
|
|
if name.startswith("haystack"):
|
|
raise ImportError("No module named 'haystack'")
|
|
return real_import(name, *args, **kwargs)
|
|
|
|
# Replace the built-in import with our mock
|
|
monkeypatch.setattr(builtins, "__import__", mocked_import)
|
|
|
|
# Test: Non-Haystack wrappers still work fine
|
|
from langchain_openai.embeddings import OpenAIEmbeddings
|
|
from llama_index.core.base.embeddings.base import BaseEmbedding
|
|
|
|
from ragas.embeddings import LangchainEmbeddingsWrapper, LlamaIndexEmbeddingsWrapper
|
|
|
|
langchain_mocked_embedding = MagicMock(spec=OpenAIEmbeddings)
|
|
langchain_mocked_embedding.model = "text-embedding-ada-002"
|
|
llama_index_mocked_embedding = MagicMock(spec=BaseEmbedding)
|
|
|
|
langchain_wrapper = LangchainEmbeddingsWrapper(
|
|
embeddings=langchain_mocked_embedding
|
|
)
|
|
llama_index_wrapper = LlamaIndexEmbeddingsWrapper(
|
|
embeddings=llama_index_mocked_embedding
|
|
)
|
|
|
|
assert langchain_wrapper.embeddings.model == "text-embedding-ada-002" # type: ignore
|
|
assert llama_index_wrapper.embeddings is llama_index_mocked_embedding
|
|
|
|
# Test: Importing HaystackEmbeddingsWrapper fails
|
|
with pytest.raises(ImportError, match="Haystack is not installed"):
|
|
from ragas.embeddings import HaystackEmbeddingsWrapper
|
|
|
|
HaystackEmbeddingsWrapper(embedder=None)
|
|
|
|
|
|
def test_import_module():
|
|
import ragas.metrics
|
|
import ragas.metrics._aspect_critic
|
|
|
|
test_metrics = [
|
|
"answer_correctness",
|
|
"answer_relevancy",
|
|
"answer_similarity",
|
|
"context_recall",
|
|
"context_precision",
|
|
"faithfulness",
|
|
]
|
|
|
|
aspect_critics = [
|
|
"harmfulness",
|
|
"maliciousness",
|
|
"coherence",
|
|
"correctness",
|
|
"conciseness",
|
|
]
|
|
|
|
assert ragas.metrics is not None, "module is not imported"
|
|
|
|
for metric in test_metrics:
|
|
assert hasattr(ragas.metrics, metric)
|
|
|
|
for metric in aspect_critics:
|
|
assert hasattr(ragas.metrics._aspect_critic, metric)
|
|
|
|
|
|
def test_import_in_debug_mode():
|
|
"""
|
|
if `RAGAS_DEBUG` is set to `True`, the module should be imported with
|
|
logging level set to `DEBUG`
|
|
"""
|
|
import os
|
|
|
|
from ragas.utils import get_debug_mode
|
|
|
|
get_debug_mode.cache_clear()
|
|
|
|
os.environ["RAGAS_DEBUG"] = "True"
|
|
|
|
assert get_debug_mode() is True
|
|
|
|
del os.environ["RAGAS_DEBUG"]
|
|
get_debug_mode.cache_clear()
|