11from unittest .mock import MagicMock , patch
22
33import pytest
4+ from openai import AsyncOpenAI
5+ from ragas .embeddings .base import embedding_factory
6+ from ragas .llms import llm_factory
47from ragas .metrics .base import SimpleBaseMetric
58from ragas .metrics .result import MetricResult
69
@@ -22,69 +25,36 @@ def score(self, **kwargs) -> MetricResult:
2225 return MetricResult (value = 1.0 , reason = "test" )
2326
2427
25- def make_llm_mock (model : str = "gpt-4o-mini" , provider : str = "openai" ) -> MagicMock :
26- llm = MagicMock ()
27- llm .model = model
28- llm .provider = provider
29- return llm
30-
31-
32- def make_emb_mock (model : str = "text-embedding-3-small" , provider : str = "openai" ) -> MagicMock :
33- emb = MagicMock ()
34- emb .model = model
35- emb .PROVIDER_NAME = provider
36- return emb
37-
38-
39- class TestSerializeMetric :
40- def test_stores_type_path (self ):
41- result = _serialize_metric (ConcreteMetric ())
42- assert "type" in result
43- assert result ["type" ].endswith (".ConcreteMetric" )
44-
45- def test_stores_name (self ):
46- result = _serialize_metric (ConcreteMetric (name = "my_metric" ))
47- assert result ["name" ] == "my_metric"
48-
49- def test_stores_llm (self ):
50- metric = ConcreteMetric (llm = make_llm_mock ("gpt-4o-mini" , "openai" ))
51- result = _serialize_metric (metric )
52- assert result ["llm" ] == {"model" : "gpt-4o-mini" , "provider" : "openai" }
53-
54- def test_stores_embeddings (self ):
55- metric = ConcreteMetric (embeddings = make_emb_mock ("text-embedding-3-small" , "openai" ))
56- result = _serialize_metric (metric )
57- assert result ["embeddings" ] == {"model" : "text-embedding-3-small" , "provider" : "openai" }
58-
59- def test_omits_llm_when_none (self ):
60- assert "llm" not in _serialize_metric (ConcreteMetric ())
61-
62- def test_omits_embeddings_when_none (self ):
63- assert "embeddings" not in _serialize_metric (ConcreteMetric ())
28+ def test_serialization (monkeypatch ):
29+ monkeypatch .setenv ("OPENAI_API_KEY" , "test" )
30+ result = _serialize_metric (
31+ ConcreteMetric (
32+ llm = llm_factory ("gpt-4o-mini" , client = AsyncOpenAI ()),
33+ embeddings = embedding_factory ("openai" , model = "text-embedding-3-small" , client = AsyncOpenAI ()),
34+ )
35+ )
36+ assert result == {
37+ "type" : "tests.test_utils.ConcreteMetric" ,
38+ "name" : "concrete_metric" ,
39+ "llm" : {"model" : "gpt-4o-mini" , "provider" : "openai" },
40+ "embeddings" : {"model" : "text-embedding-3-small" , "provider" : "openai" },
41+ }
6442
6543
6644class TestDeserializeMetric :
67- def test_reconstructs_instance (self , monkeypatch ):
45+ def test_deserialization (self , monkeypatch ):
6846 monkeypatch .setenv ("OPENAI_API_KEY" , "test" )
69- fake_llm = make_llm_mock ()
70- data = _serialize_metric (ConcreteMetric (name = "concrete_metric" , llm = fake_llm ))
71-
72- with patch ("haystack_integrations.components.evaluators.ragas.utils.llm_factory" , return_value = fake_llm ):
73- result = _deserialize_metric (data )
74-
47+ data = {
48+ "type" : "tests.test_utils.ConcreteMetric" ,
49+ "name" : "concrete_metric" ,
50+ "llm" : {"model" : "gpt-4o-mini" , "provider" : "openai" },
51+ "embeddings" : {"model" : "text-embedding-3-small" , "provider" : "openai" },
52+ }
53+ result = _deserialize_metric (data )
7554 assert isinstance (result , ConcreteMetric )
7655 assert result .name == "concrete_metric"
77- assert result .llm is fake_llm
78-
79- def test_reconstructs_embeddings (self , monkeypatch ):
80- monkeypatch .setenv ("OPENAI_API_KEY" , "test" )
81- fake_emb = make_emb_mock ()
82- data = _serialize_metric (ConcreteMetric (name = "concrete_metric" , embeddings = fake_emb ))
83-
84- with patch ("haystack_integrations.components.evaluators.ragas.utils.embedding_factory" , return_value = fake_emb ):
85- result = _deserialize_metric (data )
86-
87- assert result .embeddings is fake_emb
56+ assert result .llm .model == "gpt-4o-mini"
57+ assert result .embeddings .model == "text-embedding-3-small"
8858
8959 def test_raises_for_unsupported_llm_provider (self ):
9060 data = {
0 commit comments