Coverage for agentos/tests/test_agent_builder.py: 0%

87 statements  

« prev     ^ index     » next       coverage.py v7.14.3, created at 2026-07-08 21:26 +0800

1"""Tests for agentos/agent/agent_builder.py.""" 

2 

3import os 

4 

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 

12 

13 

14class TestMockProvider: 

15 def test_provider_name(self): 

16 mp = _MockProvider() 

17 assert mp.provider_name == "mock-dev" 

18 

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 

25 

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 

37 

38 

39class TestDiscoverTools: 

40 def test_discovers_tools(self): 

41 tools = discover_tools() 

42 assert isinstance(tools, list) 

43 assert len(tools) > 0 

44 

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 

50 

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}" 

55 

56 

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) 

65 

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) 

73 

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) 

81 

82 

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" 

91 

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) 

96 

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 

105 

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 

109 

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 

113 

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 

117 

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