From decab2fc8583076c1d24351cae6dab0c6302deff Mon Sep 17 00:00:00 2001 From: Om Borda <75739450+omborda2002@users.noreply.github.com> Date: Fri, 3 Jul 2026 12:36:51 +0200 Subject: [PATCH 1/4] test: type-check test/components/embedders and add it to mypy config --- pyproject.toml | 2 +- .../test_sentence_transformers_doc_image_embedder.py | 4 ++-- .../embedders/test_hugging_face_api_document_embedder.py | 8 ++++---- .../embedders/test_hugging_face_api_text_embedder.py | 2 +- .../components/embedders/test_openai_document_embedder.py | 6 +++--- test/components/embedders/test_openai_text_embedder.py | 5 +++-- .../test_sentence_transformers_document_embedder.py | 5 +++-- ...test_sentence_transformers_sparse_document_embedder.py | 5 +++-- .../test_sentence_transformers_sparse_text_embedder.py | 2 +- .../embedders/test_sentence_transformers_text_embedder.py | 3 ++- 10 files changed, 23 insertions(+), 19 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1b8da4e9367..6d365d4900a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -163,7 +163,7 @@ integration-only-slow = 'pytest --maxfail=5 -m "integration and slow" {args:test all = 'pytest {args:test}' # TODO We want to eventually type the whole test folder -types = "mypy --install-types --non-interactive --cache-dir=.mypy_cache/ {args:haystack test/core/ test/marshal/ test/testing/ test/tracing/ test/tools/ test/human_in_the_loop test/evaluation test/document_stores test/dataclasses test/utils/}" +types = "mypy --install-types --non-interactive --cache-dir=.mypy_cache/ {args:haystack test/core/ test/marshal/ test/testing/ test/tracing/ test/tools/ test/human_in_the_loop test/evaluation test/document_stores test/dataclasses test/utils/ test/components/embedders/}" [tool.hatch.envs.e2e] template = "test" diff --git a/test/components/embedders/image/test_sentence_transformers_doc_image_embedder.py b/test/components/embedders/image/test_sentence_transformers_doc_image_embedder.py index 587df63eabd..990f1b0ff3f 100644 --- a/test/components/embedders/image/test_sentence_transformers_doc_image_embedder.py +++ b/test/components/embedders/image/test_sentence_transformers_doc_image_embedder.py @@ -229,12 +229,12 @@ def test_run_wrong_input_format(self): with pytest.raises( TypeError, match="SentenceTransformersDocumentImageEmbedder expects a list of Documents as input" ): - embedder.run(documents=string_input) + embedder.run(documents=string_input) # type: ignore[arg-type] with pytest.raises( TypeError, match="SentenceTransformersDocumentImageEmbedder expects a list of Documents as input" ): - embedder.run(documents=list_integers_input) + embedder.run(documents=list_integers_input) # type: ignore[arg-type] @patch(f"{IMPORT_PATH}._SentenceTransformersEmbeddingBackendFactory") def test_model_onnx_backend(self, mocked_factory): diff --git a/test/components/embedders/test_hugging_face_api_document_embedder.py b/test/components/embedders/test_hugging_face_api_document_embedder.py index 477123ae512..243a68a36d0 100644 --- a/test/components/embedders/test_hugging_face_api_document_embedder.py +++ b/test/components/embedders/test_hugging_face_api_document_embedder.py @@ -271,7 +271,7 @@ def test_run_wrong_input_format(self, mock_check_valid_model): list_integers_input = [1, 2, 3] with pytest.raises(TypeError): - embedder.run(text=list_integers_input) + embedder.run(text=list_integers_input) # type: ignore[call-arg] def test_run_on_empty_list(self, mock_check_valid_model): embedder = HuggingFaceAPIDocumentEmbedder( @@ -280,7 +280,7 @@ def test_run_on_empty_list(self, mock_check_valid_model): token=Secret.from_token("fake-api-token"), ) - empty_list_input = [] + empty_list_input: list[Document] = [] result = embedder.run(documents=empty_list_input) assert result["documents"] is not None @@ -511,7 +511,7 @@ async def test_run_async_wrong_input_format(self, mock_check_valid_model): list_integers_input = [1, 2, 3] with pytest.raises(TypeError): - await embedder.run_async(text=list_integers_input) + await embedder.run_async(text=list_integers_input) # type: ignore[call-arg] @pytest.mark.asyncio async def test_run_async_on_empty_list(self, mock_check_valid_model): @@ -521,7 +521,7 @@ async def test_run_async_on_empty_list(self, mock_check_valid_model): token=Secret.from_token("fake-api-token"), ) - empty_list_input = [] + empty_list_input: list[Document] = [] result = await embedder.run_async(documents=empty_list_input) assert result["documents"] is not None diff --git a/test/components/embedders/test_hugging_face_api_text_embedder.py b/test/components/embedders/test_hugging_face_api_text_embedder.py index 53e0d414068..0c6e53d8a7a 100644 --- a/test/components/embedders/test_hugging_face_api_text_embedder.py +++ b/test/components/embedders/test_hugging_face_api_text_embedder.py @@ -137,7 +137,7 @@ def test_run_wrong_input_format(self, mock_check_valid_model): list_integers_input = [1, 2, 3] with pytest.raises(TypeError): - embedder.run(text=list_integers_input) + embedder.run(text=list_integers_input) # type: ignore[arg-type] def test_run(self, mock_check_valid_model, caplog): with patch("huggingface_hub.InferenceClient.feature_extraction") as mock_embedding_patch: diff --git a/test/components/embedders/test_openai_document_embedder.py b/test/components/embedders/test_openai_document_embedder.py index 4a97e7c457a..c9588e96986 100644 --- a/test/components/embedders/test_openai_document_embedder.py +++ b/test/components/embedders/test_openai_document_embedder.py @@ -198,15 +198,15 @@ def test_run_wrong_input_format(self): list_integers_input = [1, 2, 3] with pytest.raises(TypeError, match="OpenAIDocumentEmbedder expects a list of Documents as input"): - embedder.run(documents=string_input) + embedder.run(documents=string_input) # type: ignore[arg-type] with pytest.raises(TypeError, match="OpenAIDocumentEmbedder expects a list of Documents as input"): - embedder.run(documents=list_integers_input) + embedder.run(documents=list_integers_input) # type: ignore[arg-type] def test_run_on_empty_list(self): embedder = OpenAIDocumentEmbedder(api_key=Secret.from_token("fake-api-key")) - empty_list_input = [] + empty_list_input: list[Document] = [] result = embedder.run(documents=empty_list_input) assert result["documents"] is not None diff --git a/test/components/embedders/test_openai_text_embedder.py b/test/components/embedders/test_openai_text_embedder.py index 4b386fc6a71..dab26a13a26 100644 --- a/test/components/embedders/test_openai_text_embedder.py +++ b/test/components/embedders/test_openai_text_embedder.py @@ -7,6 +7,7 @@ import pytest from openai.types import CreateEmbeddingResponse, Embedding +from openai.types.create_embedding_response import Usage from haystack.components.embedders.openai_text_embedder import OpenAITextEmbedder from haystack.utils.auth import Secret @@ -166,7 +167,7 @@ def test_prepare_output(self, monkeypatch): data=[Embedding(embedding=[0.1, 0.2, 0.3], index=0, object="embedding")], model="text-embedding-ada-002", object="list", - usage={"prompt_tokens": 6, "total_tokens": 6}, + usage=Usage(prompt_tokens=6, total_tokens=6), ) embedder = OpenAITextEmbedder() @@ -182,7 +183,7 @@ def test_run_wrong_input_format(self): list_integers_input = [1, 2, 3] with pytest.raises(TypeError, match="OpenAITextEmbedder expects a string as an input"): - embedder.run(text=list_integers_input) + embedder.run(text=list_integers_input) # type: ignore[arg-type] @pytest.mark.skipif(os.environ.get("OPENAI_API_KEY", "") == "", reason="OPENAI_API_KEY is not set") @pytest.mark.integration diff --git a/test/components/embedders/test_sentence_transformers_document_embedder.py b/test/components/embedders/test_sentence_transformers_document_embedder.py index 3ce07c8dc72..c584fb508dc 100644 --- a/test/components/embedders/test_sentence_transformers_document_embedder.py +++ b/test/components/embedders/test_sentence_transformers_document_embedder.py @@ -265,6 +265,7 @@ def test_warmup(self, mocked_factory): ) mocked_factory.get_embedding_backend.assert_not_called() embedder.warm_up() + assert embedder.embedding_backend is not None embedder.embedding_backend.model.max_seq_length = 512 mocked_factory.get_embedding_backend.assert_called_once_with( model="model", @@ -317,12 +318,12 @@ def test_run_wrong_input_format(self): with pytest.raises( TypeError, match="SentenceTransformersDocumentEmbedder expects a list of Documents as input" ): - embedder.run(documents=string_input) + embedder.run(documents=string_input) # type: ignore[arg-type] with pytest.raises( TypeError, match="SentenceTransformersDocumentEmbedder expects a list of Documents as input" ): - embedder.run(documents=list_integers_input) + embedder.run(documents=list_integers_input) # type: ignore[arg-type] def test_embed_metadata(self): embedder = SentenceTransformersDocumentEmbedder( diff --git a/test/components/embedders/test_sentence_transformers_sparse_document_embedder.py b/test/components/embedders/test_sentence_transformers_sparse_document_embedder.py index 193be682a4a..b4967fa1caf 100644 --- a/test/components/embedders/test_sentence_transformers_sparse_document_embedder.py +++ b/test/components/embedders/test_sentence_transformers_sparse_document_embedder.py @@ -225,6 +225,7 @@ def test_warmup(self, mocked_factory): ) mocked_factory.get_embedding_backend.assert_not_called() embedder.warm_up() + assert embedder.embedding_backend is not None embedder.embedding_backend.model.max_seq_length = 512 mocked_factory.get_embedding_backend.assert_called_once_with( model="model", @@ -279,12 +280,12 @@ def test_run_wrong_input_format(self): with pytest.raises( TypeError, match="SentenceTransformersSparseDocumentEmbedder expects a list of Documents as input" ): - embedder.run(documents=string_input) + embedder.run(documents=string_input) # type: ignore[arg-type] with pytest.raises( TypeError, match="SentenceTransformersSparseDocumentEmbedder expects a list of Documents as input" ): - embedder.run(documents=list_integers_input) + embedder.run(documents=list_integers_input) # type: ignore[arg-type] def test_embed_metadata(self): embedder = SentenceTransformersSparseDocumentEmbedder( diff --git a/test/components/embedders/test_sentence_transformers_sparse_text_embedder.py b/test/components/embedders/test_sentence_transformers_sparse_text_embedder.py index 72c806dc29f..146b9ac2f39 100644 --- a/test/components/embedders/test_sentence_transformers_sparse_text_embedder.py +++ b/test/components/embedders/test_sentence_transformers_sparse_text_embedder.py @@ -234,7 +234,7 @@ def test_run_wrong_input_format(self): list_integers_input = [1, 2, 3] with pytest.raises(TypeError, match="SentenceTransformersSparseTextEmbedder expects a string as input"): - embedder.run(text=list_integers_input) + embedder.run(text=list_integers_input) # type: ignore[arg-type] @patch( "haystack.components.embedders.sentence_transformers_sparse_text_embedder._SentenceTransformersSparseEmbeddingBackendFactory" diff --git a/test/components/embedders/test_sentence_transformers_text_embedder.py b/test/components/embedders/test_sentence_transformers_text_embedder.py index 16131f30561..7fe7de21eb1 100644 --- a/test/components/embedders/test_sentence_transformers_text_embedder.py +++ b/test/components/embedders/test_sentence_transformers_text_embedder.py @@ -240,6 +240,7 @@ def test_warmup(self, mocked_factory): ) mocked_factory.get_embedding_backend.assert_not_called() embedder.warm_up() + assert embedder.embedding_backend is not None embedder.embedding_backend.model.max_seq_length = 512 mocked_factory.get_embedding_backend.assert_called_once_with( model="model", @@ -285,7 +286,7 @@ def test_run_wrong_input_format(self): list_integers_input = [1, 2, 3] with pytest.raises(TypeError, match="SentenceTransformersTextEmbedder expects a string as input"): - embedder.run(text=list_integers_input) + embedder.run(text=list_integers_input) # type: ignore[arg-type] def test_embed_encode_kwargs(self): embedder = SentenceTransformersTextEmbedder(model="model", encode_kwargs={"task": "retrieval.query"}) From 28a2a0a30fe4ce86630587b1a23e97f605f1cb1a Mon Sep 17 00:00:00 2001 From: bogdankostic Date: Thu, 9 Jul 2026 10:58:15 +0200 Subject: [PATCH 2/4] remove redundant embedder test files --- .../embedders/test_hugging_face_api_document_embedder.py | 0 test/components/embedders/test_hugging_face_api_text_embedder.py | 0 .../embedders/test_sentence_transformers_document_embedder.py | 0 .../test_sentence_transformers_sparse_document_embedder.py | 0 .../embedders/test_sentence_transformers_sparse_text_embedder.py | 0 .../embedders/test_sentence_transformers_text_embedder.py | 0 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/components/embedders/test_hugging_face_api_document_embedder.py delete mode 100644 test/components/embedders/test_hugging_face_api_text_embedder.py delete mode 100644 test/components/embedders/test_sentence_transformers_document_embedder.py delete mode 100644 test/components/embedders/test_sentence_transformers_sparse_document_embedder.py delete mode 100644 test/components/embedders/test_sentence_transformers_sparse_text_embedder.py delete mode 100644 test/components/embedders/test_sentence_transformers_text_embedder.py diff --git a/test/components/embedders/test_hugging_face_api_document_embedder.py b/test/components/embedders/test_hugging_face_api_document_embedder.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/test/components/embedders/test_hugging_face_api_text_embedder.py b/test/components/embedders/test_hugging_face_api_text_embedder.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/test/components/embedders/test_sentence_transformers_document_embedder.py b/test/components/embedders/test_sentence_transformers_document_embedder.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/test/components/embedders/test_sentence_transformers_sparse_document_embedder.py b/test/components/embedders/test_sentence_transformers_sparse_document_embedder.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/test/components/embedders/test_sentence_transformers_sparse_text_embedder.py b/test/components/embedders/test_sentence_transformers_sparse_text_embedder.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/test/components/embedders/test_sentence_transformers_text_embedder.py b/test/components/embedders/test_sentence_transformers_text_embedder.py deleted file mode 100644 index e69de29bb2d..00000000000 From 9265134a603ae991fe2514a5107190eebd1b8348 Mon Sep 17 00:00:00 2001 From: bogdankostic Date: Thu, 9 Jul 2026 10:59:04 +0200 Subject: [PATCH 3/4] remove test_sentence_transformers_doc_image_embedder.py --- .../image/test_sentence_transformers_doc_image_embedder.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/components/embedders/image/test_sentence_transformers_doc_image_embedder.py diff --git a/test/components/embedders/image/test_sentence_transformers_doc_image_embedder.py b/test/components/embedders/image/test_sentence_transformers_doc_image_embedder.py deleted file mode 100644 index e69de29bb2d..00000000000 From 04b196fda3055fa7250ea7040a54ccdff2a1228d Mon Sep 17 00:00:00 2001 From: bogdankostic Date: Thu, 9 Jul 2026 11:54:07 +0200 Subject: [PATCH 4/4] add assertions for client initialization across embedder tests --- .../embedders/test_azure_document_embedder.py | 11 +++++++++-- .../components/embedders/test_azure_text_embedder.py | 9 +++++++-- test/components/embedders/test_mock_text_embedder.py | 6 ++++-- .../embedders/test_openai_document_embedder.py | 12 ++++++++++-- .../embedders/test_openai_text_embedder.py | 9 +++++++-- 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/test/components/embedders/test_azure_document_embedder.py b/test/components/embedders/test_azure_document_embedder.py index e38866fbd80..12cbe6b7b86 100644 --- a/test/components/embedders/test_azure_document_embedder.py +++ b/test/components/embedders/test_azure_document_embedder.py @@ -216,6 +216,7 @@ def test_embed_batch_handles_exceptions_gracefully(self, caplog): embedding_separator=" | ", ) embedder.warm_up() + assert embedder.client is not None fake_texts_to_embed = {"1": "text1", "2": "text2"} @@ -237,6 +238,7 @@ def test_embed_batch_raises_exception_on_failure(self): raise_on_failure=True, ) embedder.warm_up() + assert embedder.client is not None fake_texts_to_embed = {"1": "text1", "2": "text2"} with patch.object( embedder.client.embeddings, @@ -303,6 +305,7 @@ def test_warm_up_uses_default_timeout_and_max_retries(self, monkeypatch): monkeypatch.setenv("AZURE_OPENAI_API_KEY", "fake-api-key") embedder = AzureOpenAIDocumentEmbedder(azure_endpoint="https://example-resource.azure.openai.com/") embedder.warm_up() + assert embedder.client is not None assert embedder.client.max_retries == 5 assert embedder.client.timeout == 30.0 @@ -312,6 +315,7 @@ def test_warm_up_uses_timeout_and_max_retries_from_parameters(self, monkeypatch) azure_endpoint="https://example-resource.azure.openai.com/", timeout=40.0, max_retries=1 ) embedder.warm_up() + assert embedder.client is not None assert embedder.client.max_retries == 1 assert embedder.client.timeout == 40.0 @@ -321,6 +325,7 @@ def test_warm_up_uses_timeout_and_max_retries_from_env_vars(self, monkeypatch): monkeypatch.setenv("OPENAI_MAX_RETRIES", "10") embedder = AzureOpenAIDocumentEmbedder(azure_endpoint="https://example-resource.azure.openai.com/") embedder.warm_up() + assert embedder.client is not None assert embedder.client.max_retries == 10 assert embedder.client.timeout == 100.0 @@ -334,6 +339,7 @@ def test_key_resolved_at_warm_up_not_init(self, monkeypatch): def test_sync_lifecycle(self, mock_azure_clients): sync_cls, _ = mock_azure_clients + sync_client = sync_cls.return_value embedder = AzureOpenAIDocumentEmbedder(azure_endpoint="https://example-resource.azure.openai.com/") assert embedder.client is None assert embedder.async_client is None @@ -343,11 +349,12 @@ def test_sync_lifecycle(self, mock_azure_clients): assert embedder.async_client is None embedder.close() - sync_cls.return_value.close.assert_called_once() + sync_client.close.assert_called_once() assert embedder.client is None async def test_async_lifecycle(self, mock_azure_clients): _, async_cls = mock_azure_clients + async_client = async_cls.return_value embedder = AzureOpenAIDocumentEmbedder(azure_endpoint="https://example-resource.azure.openai.com/") await embedder.warm_up_async() @@ -355,7 +362,7 @@ async def test_async_lifecycle(self, mock_azure_clients): assert embedder.client is None await embedder.close_async() - async_cls.return_value.close.assert_awaited_once() + async_client.close.assert_awaited_once() assert embedder.async_client is None async def test_close_is_safe_without_warm_up(self, mock_azure_clients): diff --git a/test/components/embedders/test_azure_text_embedder.py b/test/components/embedders/test_azure_text_embedder.py index a1a1f2ebc90..b71c2913db3 100644 --- a/test/components/embedders/test_azure_text_embedder.py +++ b/test/components/embedders/test_azure_text_embedder.py @@ -216,6 +216,7 @@ def test_warm_up_uses_default_timeout_and_max_retries(self, monkeypatch): monkeypatch.setenv("AZURE_OPENAI_API_KEY", "fake-api-key") embedder = AzureOpenAITextEmbedder(azure_endpoint="https://example-resource.azure.openai.com/") embedder.warm_up() + assert embedder.client is not None assert embedder.client.max_retries == 5 assert embedder.client.timeout == 30.0 @@ -225,6 +226,7 @@ def test_warm_up_uses_timeout_and_max_retries_from_parameters(self, monkeypatch) azure_endpoint="https://example-resource.azure.openai.com/", timeout=40.0, max_retries=1 ) embedder.warm_up() + assert embedder.client is not None assert embedder.client.max_retries == 1 assert embedder.client.timeout == 40.0 @@ -234,6 +236,7 @@ def test_warm_up_uses_timeout_and_max_retries_from_env_vars(self, monkeypatch): monkeypatch.setenv("OPENAI_MAX_RETRIES", "10") embedder = AzureOpenAITextEmbedder(azure_endpoint="https://example-resource.azure.openai.com/") embedder.warm_up() + assert embedder.client is not None assert embedder.client.max_retries == 10 assert embedder.client.timeout == 100.0 @@ -247,6 +250,7 @@ def test_key_resolved_at_warm_up_not_init(self, monkeypatch): def test_sync_lifecycle(self, mock_azure_clients): sync_cls, _ = mock_azure_clients + sync_client = sync_cls.return_value embedder = AzureOpenAITextEmbedder(azure_endpoint="https://example-resource.azure.openai.com/") assert embedder.client is None assert embedder.async_client is None @@ -256,11 +260,12 @@ def test_sync_lifecycle(self, mock_azure_clients): assert embedder.async_client is None embedder.close() - sync_cls.return_value.close.assert_called_once() + sync_client.close.assert_called_once() assert embedder.client is None async def test_async_lifecycle(self, mock_azure_clients): _, async_cls = mock_azure_clients + async_client = async_cls.return_value embedder = AzureOpenAITextEmbedder(azure_endpoint="https://example-resource.azure.openai.com/") await embedder.warm_up_async() @@ -268,7 +273,7 @@ async def test_async_lifecycle(self, mock_azure_clients): assert embedder.client is None await embedder.close_async() - async_cls.return_value.close.assert_awaited_once() + async_client.close.assert_awaited_once() assert embedder.async_client is None async def test_close_is_safe_without_warm_up(self, mock_azure_clients): diff --git a/test/components/embedders/test_mock_text_embedder.py b/test/components/embedders/test_mock_text_embedder.py index 05103e1d927..2649edffa9d 100644 --- a/test/components/embedders/test_mock_text_embedder.py +++ b/test/components/embedders/test_mock_text_embedder.py @@ -60,7 +60,8 @@ def test_embedding_fn(self): assert MockTextEmbedder(embedding_fn=_ones).run("hello")["embedding"] == [1.0, 1.0, 1.0] def test_embedding_fn_invalid_return_raises(self): - embedder = MockTextEmbedder(embedding_fn=lambda text: "not a vector") + # embedding_fn deliberately returns a non-vector to exercise the runtime type check + embedder = MockTextEmbedder(embedding_fn=lambda text: "not a vector") # type: ignore[arg-type, return-value] with pytest.raises(TypeError, match="must be a sequence of numbers"): embedder.run("hello") @@ -79,8 +80,9 @@ def test_meta(self): assert custom["extra"] == "value" def test_run_rejects_non_string(self): + # a non-string input is passed on purpose to exercise the runtime type check with pytest.raises(TypeError, match="expects a string"): - MockTextEmbedder().run(["not", "a", "string"]) + MockTextEmbedder().run(["not", "a", "string"]) # type: ignore[arg-type] async def test_run_async(self): embedder = MockTextEmbedder(dimension=8) diff --git a/test/components/embedders/test_openai_document_embedder.py b/test/components/embedders/test_openai_document_embedder.py index ed315db540b..84cb5753e88 100644 --- a/test/components/embedders/test_openai_document_embedder.py +++ b/test/components/embedders/test_openai_document_embedder.py @@ -217,6 +217,7 @@ def test_run_on_empty_list(self): def test_embed_batch_handles_exceptions_gracefully(self, caplog): embedder = OpenAIDocumentEmbedder(api_key=Secret.from_token("fake_api_key")) embedder.warm_up() + assert embedder.client is not None fake_texts_to_embed = {"1": "text1", "2": "text2"} with patch.object( embedder.client.embeddings, @@ -231,6 +232,7 @@ def test_embed_batch_handles_exceptions_gracefully(self, caplog): def test_run_handles_exceptions_gracefully(self, caplog): embedder = OpenAIDocumentEmbedder(api_key=Secret.from_token("fake_api_key"), batch_size=1) embedder.warm_up() + assert embedder.client is not None docs = [ Document(content="I love cheese", meta={"topic": "Cuisine"}), Document(content="A transformer is a deep learning architecture", meta={"topic": "ML"}), @@ -260,6 +262,7 @@ def test_run_handles_exceptions_gracefully(self, caplog): def test_embed_batch_raises_exception_on_failure(self): embedder = OpenAIDocumentEmbedder(api_key=Secret.from_token("fake_api_key"), raise_on_failure=True) embedder.warm_up() + assert embedder.client is not None fake_texts_to_embed = {"1": "text1", "2": "text2"} with patch.object( embedder.client.embeddings, @@ -354,12 +357,14 @@ def test_warm_up_uses_default_timeout_and_max_retries(self, monkeypatch): monkeypatch.setenv("OPENAI_API_KEY", "fake-api-key") embedder = OpenAIDocumentEmbedder() embedder.warm_up() + assert embedder.client is not None assert embedder.client.max_retries == 5 assert embedder.client.timeout == 30.0 def test_warm_up_uses_timeout_and_max_retries_from_parameters(self): embedder = OpenAIDocumentEmbedder(api_key=Secret.from_token("fake-api-key"), timeout=40.0, max_retries=1) embedder.warm_up() + assert embedder.client is not None assert embedder.client.max_retries == 1 assert embedder.client.timeout == 40.0 @@ -368,6 +373,7 @@ def test_warm_up_uses_timeout_and_max_retries_from_env_vars(self, monkeypatch): monkeypatch.setenv("OPENAI_MAX_RETRIES", "10") embedder = OpenAIDocumentEmbedder(api_key=Secret.from_token("fake-api-key")) embedder.warm_up() + assert embedder.client is not None assert embedder.client.max_retries == 10 assert embedder.client.timeout == 100.0 @@ -379,6 +385,7 @@ def test_key_resolved_at_warm_up_not_init(self, monkeypatch): def test_sync_lifecycle(self, mock_openai_clients): sync_cls, _ = mock_openai_clients + sync_client = sync_cls.return_value embedder = OpenAIDocumentEmbedder() assert embedder.client is None assert embedder.async_client is None @@ -388,11 +395,12 @@ def test_sync_lifecycle(self, mock_openai_clients): assert embedder.async_client is None embedder.close() - sync_cls.return_value.close.assert_called_once() + sync_client.close.assert_called_once() assert embedder.client is None async def test_async_lifecycle(self, mock_openai_clients): _, async_cls = mock_openai_clients + async_client = async_cls.return_value embedder = OpenAIDocumentEmbedder() await embedder.warm_up_async() @@ -400,7 +408,7 @@ async def test_async_lifecycle(self, mock_openai_clients): assert embedder.client is None await embedder.close_async() - async_cls.return_value.close.assert_awaited_once() + async_client.close.assert_awaited_once() assert embedder.async_client is None async def test_close_is_safe_without_warm_up(self, mock_openai_clients): diff --git a/test/components/embedders/test_openai_text_embedder.py b/test/components/embedders/test_openai_text_embedder.py index 3c94b88643e..d9283434b17 100644 --- a/test/components/embedders/test_openai_text_embedder.py +++ b/test/components/embedders/test_openai_text_embedder.py @@ -242,12 +242,14 @@ def test_warm_up_uses_default_timeout_and_max_retries(self, monkeypatch): monkeypatch.setenv("OPENAI_API_KEY", "fake-api-key") embedder = OpenAITextEmbedder() embedder.warm_up() + assert embedder.client is not None assert embedder.client.max_retries == 5 assert embedder.client.timeout == 30.0 def test_warm_up_uses_timeout_and_max_retries_from_parameters(self): embedder = OpenAITextEmbedder(api_key=Secret.from_token("fake-api-key"), timeout=40.0, max_retries=1) embedder.warm_up() + assert embedder.client is not None assert embedder.client.max_retries == 1 assert embedder.client.timeout == 40.0 @@ -256,6 +258,7 @@ def test_warm_up_uses_timeout_and_max_retries_from_env_vars(self, monkeypatch): monkeypatch.setenv("OPENAI_MAX_RETRIES", "10") embedder = OpenAITextEmbedder(api_key=Secret.from_token("fake-api-key")) embedder.warm_up() + assert embedder.client is not None assert embedder.client.max_retries == 10 assert embedder.client.timeout == 100.0 @@ -267,6 +270,7 @@ def test_key_resolved_at_warm_up_not_init(self, monkeypatch): def test_sync_lifecycle(self, mock_openai_clients): sync_cls, _ = mock_openai_clients + sync_client = sync_cls.return_value embedder = OpenAITextEmbedder() assert embedder.client is None assert embedder.async_client is None @@ -276,11 +280,12 @@ def test_sync_lifecycle(self, mock_openai_clients): assert embedder.async_client is None embedder.close() - sync_cls.return_value.close.assert_called_once() + sync_client.close.assert_called_once() assert embedder.client is None async def test_async_lifecycle(self, mock_openai_clients): _, async_cls = mock_openai_clients + async_client = async_cls.return_value embedder = OpenAITextEmbedder() await embedder.warm_up_async() @@ -288,7 +293,7 @@ async def test_async_lifecycle(self, mock_openai_clients): assert embedder.client is None await embedder.close_async() - async_cls.return_value.close.assert_awaited_once() + async_client.close.assert_awaited_once() assert embedder.async_client is None async def test_close_is_safe_without_warm_up(self, mock_openai_clients):