mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-05-23 08:25:57 +00:00
fix: thread app config through client and sync providers
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
"""Unit tests for checkpointer config and singleton factory."""
|
||||
|
||||
import sys
|
||||
from types import SimpleNamespace
|
||||
from unittest.mock import AsyncMock, MagicMock, patch
|
||||
|
||||
import pytest
|
||||
@@ -103,6 +104,53 @@ class TestGetCheckpointer:
|
||||
cp2 = get_checkpointer()
|
||||
assert cp1 is not cp2
|
||||
|
||||
def test_explicit_app_config_bypasses_global_config_lookup(self):
|
||||
from langgraph.checkpoint.memory import InMemorySaver
|
||||
|
||||
explicit_config = SimpleNamespace(
|
||||
checkpointer=CheckpointerConfig(type="memory"),
|
||||
database=SimpleNamespace(backend="memory"),
|
||||
)
|
||||
|
||||
with patch(
|
||||
"deerflow.runtime.checkpointer.provider.get_app_config",
|
||||
side_effect=AssertionError("ambient get_app_config() must not be used when app_config is explicit"),
|
||||
):
|
||||
cp = get_checkpointer(app_config=explicit_config)
|
||||
|
||||
assert isinstance(cp, InMemorySaver)
|
||||
|
||||
def test_explicit_app_config_uses_unified_database_sqlite_backend(self):
|
||||
explicit_config = SimpleNamespace(
|
||||
checkpointer=None,
|
||||
database=SimpleNamespace(backend="sqlite", checkpointer_sqlite_path="/tmp/explicit/deerflow.db"),
|
||||
)
|
||||
|
||||
mock_saver_instance = MagicMock()
|
||||
mock_cm = MagicMock()
|
||||
mock_cm.__enter__ = MagicMock(return_value=mock_saver_instance)
|
||||
mock_cm.__exit__ = MagicMock(return_value=False)
|
||||
|
||||
mock_saver_cls = MagicMock()
|
||||
mock_saver_cls.from_conn_string = MagicMock(return_value=mock_cm)
|
||||
|
||||
mock_module = MagicMock()
|
||||
mock_module.SqliteSaver = mock_saver_cls
|
||||
|
||||
with (
|
||||
patch.dict(sys.modules, {"langgraph.checkpoint.sqlite": mock_module}),
|
||||
patch(
|
||||
"deerflow.runtime.checkpointer.provider.get_app_config",
|
||||
side_effect=AssertionError("ambient get_app_config() must not be used when app_config is explicit"),
|
||||
),
|
||||
patch("deerflow.runtime.checkpointer.provider.ensure_sqlite_parent_dir") as mock_ensure,
|
||||
):
|
||||
cp = get_checkpointer(app_config=explicit_config)
|
||||
|
||||
assert cp is mock_saver_instance
|
||||
mock_ensure.assert_called_once_with("/tmp/explicit/deerflow.db")
|
||||
mock_saver_cls.from_conn_string.assert_called_once_with("/tmp/explicit/deerflow.db")
|
||||
|
||||
def test_sqlite_raises_when_package_missing(self):
|
||||
load_checkpointer_config_from_dict({"type": "sqlite", "connection_string": "/tmp/test.db"})
|
||||
with patch.dict(sys.modules, {"langgraph.checkpoint.sqlite": None}):
|
||||
|
||||
@@ -848,6 +848,28 @@ class TestEnsureAgent:
|
||||
assert mock_apply_prompt.call_args.kwargs.get("agent_name") == "custom-agent"
|
||||
assert mock_apply_prompt.call_args.kwargs.get("available_skills") == {"test_skill"}
|
||||
|
||||
def test_threads_explicit_app_config_to_dependencies(self, client):
|
||||
"""Client-owned AppConfig must flow into model/tool/prompt/checkpointer composition."""
|
||||
mock_agent = MagicMock()
|
||||
mock_checkpointer = MagicMock()
|
||||
config = client._get_runnable_config("t1")
|
||||
|
||||
with (
|
||||
patch("deerflow.client.create_chat_model", return_value=MagicMock()) as mock_create_chat_model,
|
||||
patch("deerflow.client.create_agent", return_value=mock_agent),
|
||||
patch("deerflow.client._build_middlewares", return_value=[]) as mock_build_middlewares,
|
||||
patch("deerflow.client.apply_prompt_template", return_value="prompt") as mock_apply_prompt,
|
||||
patch("deerflow.tools.get_available_tools", return_value=[]) as mock_get_available_tools,
|
||||
patch("deerflow.runtime.checkpointer.get_checkpointer", return_value=mock_checkpointer) as mock_get_checkpointer,
|
||||
):
|
||||
client._ensure_agent(config)
|
||||
|
||||
assert mock_create_chat_model.call_args.kwargs["app_config"] is client._app_config
|
||||
assert mock_build_middlewares.call_args.kwargs["app_config"] is client._app_config
|
||||
assert mock_apply_prompt.call_args.kwargs["app_config"] is client._app_config
|
||||
assert mock_get_available_tools.call_args.kwargs["app_config"] is client._app_config
|
||||
assert mock_get_checkpointer.call_args.kwargs["app_config"] is client._app_config
|
||||
|
||||
def test_uses_default_checkpointer_when_available(self, client):
|
||||
mock_agent = MagicMock()
|
||||
mock_checkpointer = MagicMock()
|
||||
|
||||
Reference in New Issue
Block a user