115 lines
3.7 KiB
Python
115 lines
3.7 KiB
Python
import importlib
|
|
import os
|
|
import sys
|
|
import types
|
|
import unittest
|
|
from enum import Enum
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
def _load_websocket_manager_module():
|
|
for path in (ROOT, ROOT / "backend"):
|
|
path_str = str(path)
|
|
if path_str not in sys.path:
|
|
sys.path.insert(0, path_str)
|
|
|
|
for module_name in (
|
|
"backend.server.websocket_manager",
|
|
"backend.server.multi_agent_runner",
|
|
"backend.server.server_utils",
|
|
"gpt_researcher.actions",
|
|
"gpt_researcher.utils.enum",
|
|
"report_type",
|
|
"backend.report_type",
|
|
"fastapi",
|
|
):
|
|
sys.modules.pop(module_name, None)
|
|
|
|
fastapi_module = types.ModuleType("fastapi")
|
|
fastapi_module.WebSocket = type("WebSocket", (), {})
|
|
|
|
report_type_module = types.ModuleType("backend.report_type")
|
|
report_type_module.BasicReport = type("BasicReport", (), {})
|
|
report_type_module.DetailedReport = type("DetailedReport", (), {})
|
|
|
|
enum_module = types.ModuleType("gpt_researcher.utils.enum")
|
|
|
|
class ReportType(Enum):
|
|
DetailedReport = "detailed_report"
|
|
|
|
class Tone(Enum):
|
|
Objective = "objective"
|
|
|
|
enum_module.ReportType = ReportType
|
|
enum_module.Tone = Tone
|
|
|
|
actions_module = types.ModuleType("gpt_researcher.actions")
|
|
actions_module.stream_output = lambda *args, **kwargs: None
|
|
|
|
multi_agent_runner_module = types.ModuleType("backend.server.multi_agent_runner")
|
|
|
|
async def run_multi_agent_task(*args, **kwargs):
|
|
return {"report": "stub-report"}
|
|
|
|
multi_agent_runner_module.run_multi_agent_task = run_multi_agent_task
|
|
|
|
server_utils_module = types.ModuleType("backend.server.server_utils")
|
|
server_utils_module.CustomLogsHandler = type("CustomLogsHandler", (), {})
|
|
|
|
with patch.dict(
|
|
sys.modules,
|
|
{
|
|
"fastapi": fastapi_module,
|
|
"report_type": report_type_module,
|
|
"backend.report_type": report_type_module,
|
|
"gpt_researcher.utils.enum": enum_module,
|
|
"gpt_researcher.actions": actions_module,
|
|
"backend.server.multi_agent_runner": multi_agent_runner_module,
|
|
"backend.server.server_utils": server_utils_module,
|
|
},
|
|
):
|
|
return importlib.import_module("backend.server.websocket_manager")
|
|
|
|
|
|
class WebSocketManagerTests(unittest.IsolatedAsyncioTestCase):
|
|
def test_websocket_manager_module_imports(self):
|
|
module = importlib.import_module("backend.server.websocket_manager")
|
|
self.assertTrue(hasattr(module, "WebSocketManager"))
|
|
|
|
def test_server_app_module_imports(self):
|
|
module = importlib.import_module("backend.server.app")
|
|
self.assertTrue(hasattr(module, "app"))
|
|
|
|
async def test_start_streaming_reads_config_path_from_environment(self):
|
|
websocket_manager = _load_websocket_manager_module()
|
|
manager = websocket_manager.WebSocketManager()
|
|
call_kwargs = {}
|
|
|
|
async def fake_run_agent(*args, **kwargs):
|
|
call_kwargs.update(kwargs)
|
|
return "stub-report"
|
|
|
|
websocket_manager.run_agent = fake_run_agent
|
|
|
|
with patch.dict(os.environ, {"CONFIG_PATH": "custom-config"}, clear=False):
|
|
report = await manager.start_streaming(
|
|
task="test-task",
|
|
report_type="research_report",
|
|
report_source="web",
|
|
source_urls=[],
|
|
document_urls=[],
|
|
tone="Objective",
|
|
websocket=object(),
|
|
)
|
|
|
|
self.assertEqual(report, "stub-report")
|
|
self.assertEqual(call_kwargs["config_path"], "custom-config")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|