This is an automated email from the ASF dual-hosted git repository.

kaxil pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new fe1618f9f32 Fix LangChain hook tests failing when langchain is not 
installed (#67237)
fe1618f9f32 is described below

commit fe1618f9f328d62480e105b10a8b5d6a38c77fe7
Author: Amogh Desai <[email protected]>
AuthorDate: Wed May 20 21:20:35 2026 +0530

    Fix LangChain hook tests failing when langchain is not installed (#67237)
    
    * Fix LangChain hook tests failing when langchain is not installed
    
    * Fix LangChain hook tests failing when langchain is not installed
---
 .../tests/unit/common/ai/hooks/test_langchain.py   | 23 ++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/providers/common/ai/tests/unit/common/ai/hooks/test_langchain.py 
b/providers/common/ai/tests/unit/common/ai/hooks/test_langchain.py
index ed2f9581937..646f72aa107 100644
--- a/providers/common/ai/tests/unit/common/ai/hooks/test_langchain.py
+++ b/providers/common/ai/tests/unit/common/ai/hooks/test_langchain.py
@@ -16,6 +16,7 @@
 # under the License.
 from __future__ import annotations
 
+import sys
 from unittest.mock import MagicMock, patch
 
 import pytest
@@ -23,6 +24,28 @@ import pytest
 from airflow.providers.common.ai.hooks.langchain import LangChainHook
 
 
[email protected](autouse=True)
+def _stub_langchain_modules():
+    # langchain is an optional dep; stub sys.modules so @patch can resolve
+    # langchain.* targets without it being installed.
+    # Submodule entries are derived from parent mock attributes so @patch
+    # (which resolves via getattr) and the hook's lazy imports (which read
+    # sys.modules["langchain.chat_models"]) see the same object.
+    lc = MagicMock()
+    lc_core = MagicMock()
+    mocks = {
+        "langchain": lc,
+        "langchain.chat_models": lc.chat_models,
+        "langchain.embeddings": lc.embeddings,
+        "langchain_core": lc_core,
+        "langchain_core.embeddings": lc_core.embeddings,
+        "langchain_core.language_models": lc_core.language_models,
+        "langchain_core.language_models.chat_models": 
lc_core.language_models.chat_models,
+    }
+    with patch.dict(sys.modules, mocks):
+        yield
+
+
 def _conn(password: str = "", host: str = "", extra: dict | None = None) -> 
MagicMock:
     mock_conn = MagicMock()
     mock_conn.password = password

Reply via email to