File size: 4,270 Bytes
69fb140
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
"""
測試動態工具路由器
"""

import pytest
import sys
import os

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from core.tool_router import ToolRouter


class TestToolRouter:
    """測試 ToolRouter 類別"""
    
    def _create_mock_tools(self):
        """建立模擬工具列表"""
        return [
            {"type": "function", "function": {"name": "weather_query", "description": "天氣查詢"}},
            {"type": "function", "function": {"name": "tdx_bus_arrival", "description": "公車到站"}},
            {"type": "function", "function": {"name": "tdx_youbike", "description": "YouBike 查詢"}},
            {"type": "function", "function": {"name": "reverse_geocode", "description": "位置查詢"}},
            {"type": "function", "function": {"name": "news_query", "description": "新聞查詢"}},
            {"type": "function", "function": {"name": "exchange_query", "description": "匯率查詢"}},
        ]
    
    def test_detect_categories_weather(self):
        """測試天氣分類檢測"""
        router = ToolRouter()
        
        categories = router._detect_categories("台北天氣怎麼樣")
        assert "weather" in categories
        
        categories = router._detect_categories("今天會下雨嗎")
        assert "weather" in categories
    
    def test_detect_categories_transportation(self):
        """測試交通分類檢測"""
        router = ToolRouter()
        
        categories = router._detect_categories("附近的公車站")
        assert "transportation" in categories
        
        categories = router._detect_categories("YouBike 在哪")
        assert "transportation" in categories
    
    def test_detect_categories_location(self):
        """測試位置分類檢測"""
        router = ToolRouter()
        
        categories = router._detect_categories("我在哪裡")
        assert "location" in categories
        
        categories = router._detect_categories("怎麼去台北車站")
        assert "location" in categories
    
    def test_filter_tools_basic(self):
        """測試基本工具過濾"""
        router = ToolRouter()
        tools = self._create_mock_tools()
        
        filtered = router.filter_tools(tools, "台北天氣", {})
        
        # 應該返回工具(天氣相關優先)
        assert len(filtered) > 0
        tool_names = [t["function"]["name"] for t in filtered]
        assert "weather_query" in tool_names
    
    def test_filter_tools_night_exclusion(self):
        """測試深夜工具排除"""
        router = ToolRouter()
        tools = self._create_mock_tools()
        
        # 深夜(凌晨 2 點)
        filtered = router.filter_tools(tools, "公車", {"hour": 2})
        tool_names = [t["function"]["name"] for t in filtered]
        
        # 深夜應該排除公車和捷運
        assert "tdx_bus_arrival" not in tool_names
    
    def test_filter_tools_daytime(self):
        """測試白天工具不排除"""
        router = ToolRouter()
        tools = self._create_mock_tools()
        
        # 白天(下午 2 點)
        filtered = router.filter_tools(tools, "公車", {"hour": 14})
        tool_names = [t["function"]["name"] for t in filtered]
        
        # 白天應該包含公車
        assert "tdx_bus_arrival" in tool_names
    
    def test_sort_tools_priority(self):
        """測試工具排序"""
        router = ToolRouter()
        tools = self._create_mock_tools()
        
        # 天氣查詢應該排在前面
        filtered = router.filter_tools(tools, "天氣", {"hour": 12})
        
        # 第一個應該是天氣相關工具
        assert filtered[0]["function"]["name"] == "weather_query"
    
    def test_record_tool_usage(self):
        """測試工具使用記錄"""
        router = ToolRouter()
        
        router.record_tool_usage("user1", "weather_query")
        router.record_tool_usage("user1", "weather_query")
        router.record_tool_usage("user1", "news_query")
        
        assert router._user_preferences["user1"]["weather_query"] == 2
        assert router._user_preferences["user1"]["news_query"] == 1


if __name__ == "__main__":
    pytest.main([__file__, "-v"])