77from unittest .mock import Mock , patch
88
99import pytest
10- from haystack import AsyncPipeline , Document , Pipeline
10+ from haystack import Document , Pipeline
1111from haystack .components .embedders import SentenceTransformersTextEmbedder
1212from haystack .components .joiners .document_joiner import JoinMode
1313from haystack .core .component import component
@@ -23,12 +23,6 @@ class MockedTextEmbedder:
2323 def run (self , text : str , param_a : str = "default" , param_b : str = "another_default" ) -> dict [str , Any ]:
2424 return {"embedding" : [0.1 , 0.2 , 0.3 ], "metadata" : {"text" : text , "param_a" : param_a , "param_b" : param_b }}
2525
26- @component .output_types (embedding = list [float ])
27- async def run_async (
28- self , text : str , param_a : str = "default" , param_b : str = "another_default"
29- ) -> dict [str , Any ]:
30- return {"embedding" : [0.1 , 0.2 , 0.3 ], "metadata" : {"text" : text , "param_a" : param_a , "param_b" : param_b }}
31-
3226
3327class TestElasticsearchHybridRetriever :
3428 serialised = { # noqa: RUF012
@@ -309,105 +303,3 @@ def test_run_in_pipeline(self, mock_embedder):
309303 top_k = 10 ,
310304 num_candidates = None ,
311305 )
312-
313- @pytest .mark .asyncio
314- async def test_run_async (self , mock_embedder ):
315- mock_store = Mock (spec = ElasticsearchDocumentStore )
316- mock_store ._bm25_retrieval_async .return_value = [Document (content = "Test doc BM25" )]
317- mock_store ._embedding_retrieval_async .return_value = [Document (content = "Test doc Embedding" )]
318-
319- retriever = ElasticsearchHybridRetriever (document_store = mock_store , embedder = mock_embedder )
320- result = await retriever .run_async (query = "test query" )
321-
322- assert len (result ) == 1
323- assert len (result ["documents" ]) == 2
324- assert any (doc .content == "Test doc BM25" for doc in result ["documents" ])
325- assert any (doc .content == "Test doc Embedding" for doc in result ["documents" ])
326-
327- @pytest .mark .asyncio
328- async def test_run_async_with_extra_arg (self , mock_embedder ):
329- mock_store = Mock (spec = ElasticsearchDocumentStore )
330- mock_store ._bm25_retrieval_async .return_value = [Document (content = "Test doc BM25" )]
331- mock_store ._embedding_retrieval_async .return_value = [Document (content = "Test doc Embedding" )]
332-
333- retriever = ElasticsearchHybridRetriever (
334- document_store = mock_store ,
335- embedder = mock_embedder ,
336- bm25_retriever = {"filters" : {"source" : "bm25_init" }},
337- embedding_retriever = {"num_candidates" : 42 , "filters" : {"source" : "embedding_init" }},
338- )
339- result = await retriever .run_async (query = "test query" )
340-
341- mock_store ._bm25_retrieval_async .assert_called_once_with (
342- query = "test query" ,
343- filters = {"source" : "bm25_init" },
344- top_k = 10 ,
345- fuzziness = "AUTO" ,
346- scale_score = False ,
347- )
348- mock_store ._embedding_retrieval_async .assert_called_once_with (
349- query_embedding = [0.1 , 0.2 , 0.3 ],
350- filters = {"source" : "embedding_init" },
351- top_k = 10 ,
352- num_candidates = 42 ,
353- )
354-
355- assert len (result ) == 1
356- assert len (result ["documents" ]) == 2
357- assert any (doc .content == "Test doc BM25" for doc in result ["documents" ])
358- assert any (doc .content == "Test doc Embedding" for doc in result ["documents" ])
359-
360- @pytest .mark .asyncio
361- async def test_run_async_with_extra_runtime_params (self , mock_embedder ):
362- mock_store = Mock (spec = ElasticsearchDocumentStore )
363- mock_store ._bm25_retrieval_async .return_value = [Document (content = "Test doc BM25" )]
364- mock_store ._embedding_retrieval_async .return_value = [Document (content = "Test doc Embedding" )]
365-
366- retriever = ElasticsearchHybridRetriever (document_store = mock_store , embedder = mock_embedder )
367- await retriever .run_async (
368- query = "test query" ,
369- filters_bm25 = {"key" : "value" },
370- filters_embedding = {"key" : "value" },
371- top_k_bm25 = 1 ,
372- top_k_embedding = 1 ,
373- )
374-
375- mock_store ._bm25_retrieval_async .assert_called_once_with (
376- query = "test query" ,
377- filters = {"key" : "value" },
378- top_k = 1 ,
379- fuzziness = "AUTO" ,
380- scale_score = False ,
381- )
382- mock_store ._embedding_retrieval_async .assert_called_once_with (
383- query_embedding = [0.1 , 0.2 , 0.3 ],
384- filters = {"key" : "value" },
385- top_k = 1 ,
386- num_candidates = None ,
387- )
388-
389- @pytest .mark .asyncio
390- async def test_run_async_in_pipeline (self , mock_embedder ):
391- pipeline = AsyncPipeline ()
392- mock_store = Mock (spec = ElasticsearchDocumentStore )
393- mock_store ._bm25_retrieval_async .return_value = [Document (content = "Test doc BM25" )]
394- mock_store ._embedding_retrieval_async .return_value = [Document (content = "Test doc Embedding" )]
395-
396- retriever = ElasticsearchHybridRetriever (document_store = mock_store , embedder = mock_embedder )
397- pipeline .add_component ("retriever" , retriever )
398-
399- await pipeline .run_async (data = {"retriever" : {"query" : "test query" , "filters_bm25" : {"param_a" : "default" }}})
400-
401- mock_store ._bm25_retrieval_async .assert_called_once_with (
402- query = "test query" ,
403- filters = {"param_a" : "default" },
404- top_k = 10 ,
405- fuzziness = "AUTO" ,
406- scale_score = False ,
407- )
408- mock_store ._embedding_retrieval_async .assert_called_once_with (
409- query_embedding = [0.1 , 0.2 , 0.3 ],
410- filters = {},
411- top_k = 10 ,
412- num_candidates = None ,
413- )
0 commit comments