Coverage for agentos/tests/test_agent_builder.py: 100%
87 statements
« prev ^ index » next coverage.py v7.14.3, created at 2026-07-06 23:40 +0800
« prev ^ index » next coverage.py v7.14.3, created at 2026-07-06 23:40 +0800
1"""Tests for agentos/agent/agent_builder.py."""
3import os
5from agentos.agent.agent_builder import (
6 _MockProvider,
7 build_agent,
8 create_provider,
9 discover_tools,
10)
11from agentos.agent.tool_agent import ToolAgent
14class TestMockProvider:
15 def test_provider_name(self):
16 mp = _MockProvider()
17 assert mp.provider_name == "mock-dev"
19 def test_chat_returns_completion(self):
20 mp = _MockProvider()
21 result = mp.chat([{"role": "user", "content": "hello"}])
22 assert result is not None
23 assert len(result.choices) == 1
24 assert "Mock provider" in result.choices[0].message.content
26 def test_achat_returns_same(self):
27 import asyncio
28 mp = _MockProvider()
29 sync = mp.chat([])
30 try:
31 loop = asyncio.get_running_loop()
32 except RuntimeError:
33 loop = asyncio.new_event_loop()
34 asyncio.set_event_loop(loop)
35 async_result = loop.run_until_complete(mp.achat([]))
36 assert async_result.choices[0].message.content == sync.choices[0].message.content
39class TestDiscoverTools:
40 def test_discovers_tools(self):
41 tools = discover_tools()
42 assert isinstance(tools, list)
43 assert len(tools) > 0
45 def test_tools_are_instantiated(self):
46 tools = discover_tools()
47 for tool in tools:
48 assert hasattr(tool, "name")
49 assert tool.name is not None
51 def test_no_duplicate_tools(self):
52 tools = discover_tools()
53 names = [t.name for t in tools]
54 assert len(names) == len(set(names)), f"Duplicate tool names: {names}"
57class TestCreateProvider:
58 def test_returns_mock_when_no_api_key(self):
59 # Ensure no API keys are set
60 for key in ["DEEPSEEK_API_KEY", "OPENAI_API_KEY", "ANTHROPIC_API_KEY"]:
61 os.environ.pop(key, None)
62 provider = create_provider()
63 assert provider.provider_name == "mock-dev"
64 assert isinstance(provider, _MockProvider)
66 def test_returns_deepseek_when_key_set(self, monkeypatch):
67 monkeypatch.setenv("DEEPSEEK_API_KEY", "sk-test-deepseek")
68 monkeypatch.delenv("OPENAI_API_KEY", raising=False)
69 monkeypatch.delenv("ANTHROPIC_API_KEY", raising=False)
70 from agentos.llm.providers.deepseek import DeepSeekProvider
71 provider = create_provider()
72 assert isinstance(provider, DeepSeekProvider)
74 def test_returns_openai_when_only_openai_key_set(self, monkeypatch):
75 monkeypatch.delenv("DEEPSEEK_API_KEY", raising=False)
76 monkeypatch.setenv("OPENAI_API_KEY", "sk-test-openai")
77 monkeypatch.delenv("ANTHROPIC_API_KEY", raising=False)
78 from agentos.llm.providers.openai import OpenAIProvider
79 provider = create_provider()
80 assert isinstance(provider, OpenAIProvider)
83class TestBuildAgent:
84 def test_builds_with_mock_provider(self):
85 # Ensure no real API keys
86 for key in ["DEEPSEEK_API_KEY", "OPENAI_API_KEY", "ANTHROPIC_API_KEY"]:
87 os.environ.pop(key, None)
88 agent = build_agent(discover_all=False, include_skills=False)
89 assert isinstance(agent, ToolAgent)
90 assert agent._provider.provider_name == "mock-dev"
92 def test_builds_with_manual_tools(self):
93 tools = discover_tools()[:3] # take first 3
94 agent = build_agent(tools=list(tools), discover_all=False, include_skills=False)
95 assert isinstance(agent, ToolAgent)
97 def test_builds_with_custom_system_prompt(self):
98 custom_prompt = "You are a test assistant. Answer briefly."
99 agent = build_agent(
100 system_prompt=custom_prompt,
101 discover_all=False,
102 include_skills=False,
103 )
104 assert agent._system_prompt == custom_prompt
106 def test_builds_with_default_system_prompt(self):
107 agent = build_agent(discover_all=False, include_skills=False)
108 assert "智能助手" in agent._system_prompt
110 def test_builds_with_custom_max_steps(self):
111 agent = build_agent(max_steps=5, discover_all=False, include_skills=False)
112 assert agent._config.max_steps == 5
114 def test_builds_with_custom_verbose(self):
115 agent = build_agent(verbose=True, discover_all=False, include_skills=False)
116 assert agent._config.verbose is True
118 def test_builds_with_custom_provider(self):
119 mp = _MockProvider()
120 agent = build_agent(provider=mp, discover_all=False, include_skills=False)
121 assert agent._provider is mp