# # Copyright 2025 The InfiniFlow Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # """ Mock heavy dependencies that graphrag/utils.py transitively imports, so unit tests can run without infrastructure services (Redis, Elasticsearch, etc.). """ import sys from unittest.mock import MagicMock _modules_to_mock = [ "quart", "common.connection_utils", "common.settings", "common.doc_store", "common.doc_store.doc_store_base", "api.db.services", "api.db.services.task_service", "rag.graphrag.general.leiden", "rag.llm.chat_model", "rag.nlp", "rag.nlp.search", "rag.nlp.rag_tokenizer", "rag.utils.redis_conn", ] for mod_name in _modules_to_mock: if mod_name not in sys.modules: sys.modules[mod_name] = MagicMock() # Ensure `from common.connection_utils import timeout` returns a no-op decorator sys.modules["common.connection_utils"].timeout = lambda *a, **kw: lambda fn: fn sys.modules["api.db.services.task_service"].has_canceled = lambda *_a, **_kw: False sys.modules["rag.graphrag.general.leiden"].run = lambda *_a, **_kw: {} sys.modules["rag.graphrag.general.leiden"].add_community_info2graph = lambda *_a, **_kw: None # Only stub ``Base`` when we actually mocked chat_model. This conftest mutates # the global sys.modules at import time, and rag/graphrag/ is collected before # rag/llm/. If an earlier test package already imported the real chat_model, # unconditionally assigning ``Base = object`` clobbered the genuine class and # leaked into the rag/llm unit tests that import it (AttributeError: no # attribute '_clean_conf'). graphrag only uses ``Base`` as a type alias, so the # real class works just as well when it is already loaded. if isinstance(sys.modules["rag.llm.chat_model"], MagicMock): sys.modules["rag.llm.chat_model"].Base = object