pygeai 0.2.7b51__py3-none-any.whl → 0.2.7b53__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,395 @@
1
+ import unittest
2
+ from unittest.mock import Mock, patch, MagicMock
3
+ import uuid
4
+ import requests
5
+ from pygeai.proxy.clients import (
6
+ ProxyClient, ToolProxyData, ToolProxyJob,
7
+ ToolProxyJobResult
8
+ )
9
+ from pygeai.proxy.tool import ProxiedTool
10
+
11
+
12
+ class TestToolProxyData(unittest.TestCase):
13
+ """
14
+ python -m unittest pygeai.tests.proxy.test_clients.TestToolProxyData
15
+ """
16
+
17
+ def setUp(self):
18
+ """Set up test fixtures."""
19
+ self.test_uuid = uuid.uuid4()
20
+ self.test_affinity = uuid.uuid4()
21
+ self.tool = ProxiedTool(
22
+ server_name="test_server",
23
+ name="test_tool",
24
+ description="Test tool",
25
+ public_prefix="public.prefix",
26
+ input_schema={"type": "object"}
27
+ )
28
+
29
+ def test_initialization_with_defaults(self):
30
+ """Test initialization with default values."""
31
+ data = ToolProxyData()
32
+ self.assertIsNone(data.id)
33
+ self.assertIsNone(data.name)
34
+ self.assertIsNone(data.description)
35
+ self.assertIsNone(data.affinity)
36
+ self.assertIsNone(data.tools)
37
+
38
+ def test_initialization_with_values(self):
39
+ """Test initialization with provided values."""
40
+ data = ToolProxyData(
41
+ id=self.test_uuid,
42
+ name="Test Proxy",
43
+ description="Test Description",
44
+ affinity=self.test_affinity,
45
+ tools=[self.tool]
46
+ )
47
+ self.assertEqual(data.id, self.test_uuid)
48
+ self.assertEqual(data.name, "Test Proxy")
49
+ self.assertEqual(data.description, "Test Description")
50
+ self.assertEqual(data.affinity, self.test_affinity)
51
+ self.assertEqual(data.tools, [self.tool])
52
+
53
+ def test_to_dict_with_all_values(self):
54
+ """Test converting to dictionary with all values."""
55
+ data = ToolProxyData(
56
+ id=self.test_uuid,
57
+ name="Test Proxy",
58
+ description="Test Description",
59
+ affinity=self.test_affinity,
60
+ tools=[self.tool]
61
+ )
62
+ result = data.to_dict()
63
+
64
+ expected = {
65
+ "id": str(self.test_uuid),
66
+ "name": "Test Proxy",
67
+ "description": "Test Description",
68
+ "affinity": str(self.test_affinity),
69
+ "tools": [
70
+ {
71
+ "name": self.tool.get_full_name(),
72
+ "publicName": self.tool.get_public_name(),
73
+ "server": self.tool.server_name,
74
+ "description": self.tool.description,
75
+ "inputSchema": self.tool.format_for_llm()
76
+ }
77
+ ]
78
+ }
79
+ self.assertEqual(result, expected)
80
+
81
+ def test_to_dict_with_none_values(self):
82
+ """Test converting to dictionary with None values."""
83
+ data = ToolProxyData()
84
+ result = data.to_dict()
85
+
86
+ expected = {
87
+ "id": None,
88
+ "name": None,
89
+ "description": None,
90
+ "affinity": str(uuid.UUID(int=0)),
91
+ "tools": []
92
+ }
93
+ self.assertEqual(result, expected)
94
+
95
+ def test_to_dict_with_private_tool(self):
96
+ """Test converting to dictionary with private tool."""
97
+ private_tool = ProxiedTool(
98
+ server_name="server",
99
+ name="tool",
100
+ description="desc",
101
+ public_prefix=None,
102
+ input_schema={}
103
+ )
104
+ data = ToolProxyData(tools=[private_tool])
105
+ result = data.to_dict()
106
+
107
+ tool_dict = result["tools"][0]
108
+ self.assertNotIn("publicName", tool_dict)
109
+
110
+
111
+ class TestToolProxyJob(unittest.TestCase):
112
+ """
113
+ python -m unittest pygeai.tests.proxy.test_clients.TestToolProxyJob
114
+ """
115
+
116
+ def setUp(self):
117
+ """Set up test fixtures."""
118
+ self.test_uuid = uuid.uuid4()
119
+ self.proxy_uuid = uuid.uuid4()
120
+
121
+ def test_initialization(self):
122
+ """Test job initialization."""
123
+ job = ToolProxyJob(
124
+ id=self.test_uuid,
125
+ proxy_id=self.proxy_uuid,
126
+ proxy_status="active",
127
+ job_status="pending",
128
+ input="test input",
129
+ output="test output",
130
+ server="test_server"
131
+ )
132
+ self.assertEqual(job.id, self.test_uuid)
133
+ self.assertEqual(job.proxy_id, self.proxy_uuid)
134
+ self.assertEqual(job.proxy_status, "active")
135
+ self.assertEqual(job.job_status, "pending")
136
+ self.assertEqual(job.input, "test input")
137
+ self.assertEqual(job.output, "test output")
138
+ self.assertEqual(job.server, "test_server")
139
+
140
+ def test_from_dict(self):
141
+ """Test creating job from dictionary."""
142
+ data = {
143
+ "id": str(self.test_uuid),
144
+ "proxyId": str(self.proxy_uuid),
145
+ "proxyStatus": "active",
146
+ "jobStatus": "pending",
147
+ "input": "test input",
148
+ "output": "test output",
149
+ "server": "test_server"
150
+ }
151
+ job = ToolProxyJob.from_dict(data)
152
+
153
+ self.assertEqual(job.id, self.test_uuid)
154
+ self.assertEqual(job.proxy_id, self.proxy_uuid)
155
+ self.assertEqual(job.proxy_status, "active")
156
+ self.assertEqual(job.job_status, "pending")
157
+ self.assertEqual(job.input, "test input")
158
+ self.assertEqual(job.output, "test output")
159
+ self.assertEqual(job.server, "test_server")
160
+
161
+ def test_from_dict_with_optional_fields(self):
162
+ """Test creating job from dictionary with optional fields."""
163
+ data = {
164
+ "id": str(self.test_uuid),
165
+ "proxyId": str(self.proxy_uuid),
166
+ "proxyStatus": "active",
167
+ "jobStatus": "pending"
168
+ }
169
+ job = ToolProxyJob.from_dict(data)
170
+
171
+ self.assertEqual(job.id, self.test_uuid)
172
+ self.assertEqual(job.proxy_id, self.proxy_uuid)
173
+ self.assertEqual(job.proxy_status, "active")
174
+ self.assertEqual(job.job_status, "pending")
175
+ self.assertIsNone(job.input)
176
+ self.assertIsNone(job.output)
177
+ self.assertIsNone(job.server)
178
+
179
+
180
+ class TestToolProxyJobResult(unittest.TestCase):
181
+ """
182
+ python -m unittest pygeai.tests.proxy.test_clients.TestToolProxyJobResult
183
+ """
184
+
185
+ def setUp(self):
186
+ """Set up test fixtures."""
187
+ self.test_uuid = uuid.uuid4()
188
+ self.proxy_uuid = uuid.uuid4()
189
+ self.job = ToolProxyJob(
190
+ id=self.test_uuid,
191
+ proxy_id=self.proxy_uuid,
192
+ proxy_status="active",
193
+ job_status="completed",
194
+ input="test input",
195
+ output="test output",
196
+ server="test_server"
197
+ )
198
+
199
+ def test_initialization(self):
200
+ """Test result initialization."""
201
+ result = ToolProxyJobResult(success=True, job=self.job)
202
+ self.assertTrue(result.success)
203
+ self.assertEqual(result.job, self.job)
204
+
205
+ def test_to_dict(self):
206
+ """Test converting result to dictionary."""
207
+ result = ToolProxyJobResult(success=True, job=self.job)
208
+ result_dict = result.to_dict()
209
+
210
+ expected = {
211
+ "success": True,
212
+ "job": {
213
+ "id": str(self.test_uuid),
214
+ "jobStatus": "completed",
215
+ "output": "test output"
216
+ }
217
+ }
218
+ self.assertEqual(result_dict, expected)
219
+
220
+
221
+ class TestProxyClient(unittest.TestCase):
222
+ """
223
+ python -m unittest pygeai.tests.proxy.test_clients.TestProxyClient
224
+ """
225
+
226
+ def setUp(self):
227
+ """Set up test fixtures."""
228
+ self.api_key = "test_api_key"
229
+ self.base_url = "https://api.example.com"
230
+ self.proxy_id = uuid.uuid4()
231
+ self.client = ProxyClient(self.api_key, self.base_url, self.proxy_id)
232
+
233
+ def test_initialization(self):
234
+ """Test client initialization."""
235
+ self.assertEqual(self.client.proxy_id, self.proxy_id)
236
+ self.assertEqual(self.client.base_url, "https://api.example.com/v2/tool-proxy")
237
+ self.assertEqual(self.client.session.headers["Authorization"], f"Bearer {self.api_key}")
238
+ self.assertEqual(self.client.session.timeout, (5, 30))
239
+
240
+ def test_initialization_with_trailing_slash(self):
241
+ """Test client initialization with trailing slash in base URL."""
242
+ client = ProxyClient(self.api_key, "https://api.example.com/", self.proxy_id)
243
+ self.assertEqual(client.base_url, "https://api.example.com/v2/tool-proxy")
244
+
245
+ @patch('requests.Session')
246
+ def test_make_request_success(self, mock_session):
247
+ """Test successful request."""
248
+ mock_response = Mock()
249
+ mock_response.json.return_value = {"status": "success"}
250
+ mock_response.raise_for_status.return_value = None
251
+ mock_session.return_value.request.return_value = mock_response
252
+
253
+ client = ProxyClient(self.api_key, self.base_url, self.proxy_id)
254
+ result = client._make_request("GET", "/test")
255
+
256
+ self.assertEqual(result, {"status": "success"})
257
+
258
+ @patch('requests.Session')
259
+ def test_make_request_timeout(self, mock_session):
260
+ """Test request timeout."""
261
+ mock_session.return_value.request.side_effect = requests.exceptions.Timeout()
262
+
263
+ client = ProxyClient(self.api_key, self.base_url, self.proxy_id)
264
+
265
+ with self.assertRaises(TimeoutError):
266
+ client._make_request("GET", "/test")
267
+
268
+ @patch('requests.Session')
269
+ def test_make_request_http_error(self, mock_session):
270
+ """Test HTTP error."""
271
+ mock_session.return_value.request.side_effect = requests.exceptions.HTTPError("404 Not Found")
272
+
273
+ client = ProxyClient(self.api_key, self.base_url, self.proxy_id)
274
+
275
+ with self.assertRaises(requests.exceptions.HTTPError):
276
+ client._make_request("GET", "/test")
277
+
278
+ @patch('requests.Session')
279
+ def test_make_request_connection_error(self, mock_session):
280
+ """Test connection error."""
281
+ mock_session.return_value.request.side_effect = requests.exceptions.ConnectionError()
282
+
283
+ client = ProxyClient(self.api_key, self.base_url, self.proxy_id)
284
+
285
+ with self.assertRaises(ConnectionError):
286
+ client._make_request("GET", "/test")
287
+
288
+ @patch('requests.Session')
289
+ def test_make_request_ssl_error(self, mock_session):
290
+ """Test SSL error."""
291
+ mock_session.return_value.request.side_effect = requests.exceptions.SSLError()
292
+
293
+ client = ProxyClient(self.api_key, self.base_url, self.proxy_id)
294
+
295
+ with self.assertRaises(requests.exceptions.SSLError):
296
+ client._make_request("GET", "/test")
297
+
298
+ @patch('requests.Session')
299
+ def test_make_request_proxy_error(self, mock_session):
300
+ """Test proxy error."""
301
+ mock_session.return_value.request.side_effect = requests.exceptions.ProxyError()
302
+
303
+ client = ProxyClient(self.api_key, self.base_url, self.proxy_id)
304
+
305
+ with self.assertRaises(requests.exceptions.ProxyError):
306
+ client._make_request("GET", "/test")
307
+
308
+ @patch('requests.Session')
309
+ def test_make_request_json_decode_error(self, mock_session):
310
+ """Test JSON decode error."""
311
+ mock_response = Mock()
312
+ mock_response.json.side_effect = ValueError("Invalid JSON")
313
+ mock_response.text = "plain text response"
314
+ mock_response.raise_for_status.return_value = None
315
+ mock_session.return_value.request.return_value = mock_response
316
+
317
+ client = ProxyClient(self.api_key, self.base_url, self.proxy_id)
318
+ result = client._make_request("GET", "/test")
319
+
320
+ self.assertEqual(result, "plain text response")
321
+
322
+ @patch.object(ProxyClient, '_make_request')
323
+ def test_register(self, mock_make_request):
324
+ """Test proxy registration."""
325
+ mock_make_request.return_value = {"status": "registered"}
326
+
327
+ tool = ProxiedTool(
328
+ server_name="test_server",
329
+ name="test_tool",
330
+ description="Test tool",
331
+ public_prefix="public.prefix",
332
+ input_schema={"type": "object"}
333
+ )
334
+
335
+ proxy_data = ToolProxyData(
336
+ name="Test Proxy",
337
+ description="Test Description",
338
+ tools=[tool]
339
+ )
340
+
341
+ result = self.client.register(proxy_data)
342
+
343
+ self.assertEqual(result, {"status": "registered"})
344
+ self.assertEqual(proxy_data.id, self.proxy_id)
345
+ mock_make_request.assert_called_once_with(
346
+ 'POST', '/register',
347
+ json={"server": proxy_data.to_dict()}
348
+ )
349
+
350
+ @patch.object(ProxyClient, '_make_request')
351
+ def test_dequeue(self, mock_make_request):
352
+ """Test job dequeuing."""
353
+ mock_jobs = [
354
+ {
355
+ "id": str(uuid.uuid4()),
356
+ "proxyId": str(self.proxy_id),
357
+ "proxyStatus": "active",
358
+ "jobStatus": "pending",
359
+ "input": "test input",
360
+ "output": None,
361
+ "server": "test_server"
362
+ }
363
+ ]
364
+ mock_make_request.return_value = mock_jobs
365
+
366
+ result = self.client.dequeue()
367
+
368
+ self.assertEqual(len(result), 1)
369
+ self.assertIsInstance(result[0], ToolProxyJob)
370
+ mock_make_request.assert_called_once_with('GET', f'/dequeue/{self.proxy_id}')
371
+
372
+ @patch.object(ProxyClient, '_make_request')
373
+ def test_send_result(self, mock_make_request):
374
+ """Test sending job result."""
375
+ job = ToolProxyJob(
376
+ id=uuid.uuid4(),
377
+ proxy_id=self.proxy_id,
378
+ proxy_status="active",
379
+ job_status="completed",
380
+ input="test input",
381
+ output="test output",
382
+ server="test_server"
383
+ )
384
+ result = ToolProxyJobResult(success=True, job=job)
385
+
386
+ self.client.send_result(result)
387
+
388
+ mock_make_request.assert_called_once_with(
389
+ 'POST', f'/result/{self.proxy_id}',
390
+ json={"jobResult": result.to_dict()}
391
+ )
392
+
393
+
394
+ if __name__ == '__main__':
395
+ unittest.main()
@@ -0,0 +1,171 @@
1
+ import unittest
2
+ from unittest.mock import patch, MagicMock
3
+ import uuid
4
+ import os
5
+ from pygeai.proxy.config import ProxySettingsManager
6
+
7
+
8
+ class TestProxySettingsManager(unittest.TestCase):
9
+ """
10
+ python -m unittest pygeai.tests.proxy.test_config.TestProxySettingsManager
11
+ """
12
+
13
+ def setUp(self):
14
+ """Set up test fixtures."""
15
+ patcher = patch('pygeai.core.common.config.SettingsManager.__init__', lambda x: None)
16
+ self.addCleanup(patcher.stop)
17
+ patcher.start()
18
+ self.settings = ProxySettingsManager()
19
+ self.settings.config = MagicMock() # Mock configparser
20
+ self.test_uuid = uuid.uuid4()
21
+ self.test_alias = "test_alias"
22
+
23
+ def test_default_alias(self):
24
+ self.assertEqual(self.settings.DEFAULT_ALIAS, "default")
25
+ self.assertEqual(self.settings.get_current_alias(), "default")
26
+
27
+ def test_set_current_alias(self):
28
+ self.settings.set_current_alias(self.test_alias)
29
+ self.assertEqual(self.settings.get_current_alias(), self.test_alias)
30
+
31
+ def test_get_proxy_id_none(self):
32
+ self.settings.get_setting_value = MagicMock(return_value=None)
33
+ result = self.settings.get_proxy_id()
34
+ self.assertIsNone(result)
35
+
36
+ def test_set_and_get_proxy_id(self):
37
+ self.settings.set_setting_value = MagicMock()
38
+ self.settings.get_setting_value = MagicMock(return_value=str(self.test_uuid))
39
+ self.settings.set_proxy_id(self.test_uuid)
40
+ result = self.settings.get_proxy_id()
41
+ self.assertEqual(result, self.test_uuid)
42
+
43
+ def test_set_and_get_proxy_id_with_alias(self):
44
+ self.settings.set_setting_value = MagicMock()
45
+ self.settings.get_setting_value = MagicMock(return_value=str(self.test_uuid))
46
+ self.settings.set_proxy_id(self.test_uuid, self.test_alias)
47
+ result = self.settings.get_proxy_id(self.test_alias)
48
+ self.assertEqual(result, self.test_uuid)
49
+
50
+ def test_get_proxy_name_none(self):
51
+ self.settings.get_setting_value = MagicMock(return_value=None)
52
+ result = self.settings.get_proxy_name()
53
+ self.assertIsNone(result)
54
+
55
+ def test_set_and_get_proxy_name(self):
56
+ test_name = "Test Proxy"
57
+ self.settings.set_setting_value = MagicMock()
58
+ self.settings.get_setting_value = MagicMock(return_value=test_name)
59
+ self.settings.set_proxy_name(test_name)
60
+ result = self.settings.get_proxy_name()
61
+ self.assertEqual(result, test_name)
62
+
63
+ def test_set_and_get_proxy_name_with_alias(self):
64
+ test_name = "Test Proxy"
65
+ self.settings.set_setting_value = MagicMock()
66
+ self.settings.get_setting_value = MagicMock(return_value=test_name)
67
+ self.settings.set_proxy_name(test_name, self.test_alias)
68
+ result = self.settings.get_proxy_name(self.test_alias)
69
+ self.assertEqual(result, test_name)
70
+
71
+ def test_get_proxy_description_none(self):
72
+ self.settings.get_setting_value = MagicMock(return_value=None)
73
+ result = self.settings.get_proxy_description()
74
+ self.assertIsNone(result)
75
+
76
+ def test_set_and_get_proxy_description(self):
77
+ test_description = "Test Description"
78
+ self.settings.set_setting_value = MagicMock()
79
+ self.settings.get_setting_value = MagicMock(return_value=test_description)
80
+ self.settings.set_proxy_description(test_description)
81
+ result = self.settings.get_proxy_description()
82
+ self.assertEqual(result, test_description)
83
+
84
+ def test_set_and_get_proxy_description_with_alias(self):
85
+ test_description = "Test Description"
86
+ self.settings.set_setting_value = MagicMock()
87
+ self.settings.get_setting_value = MagicMock(return_value=test_description)
88
+ self.settings.set_proxy_description(test_description, self.test_alias)
89
+ result = self.settings.get_proxy_description(self.test_alias)
90
+ self.assertEqual(result, test_description)
91
+
92
+ def test_get_proxy_affinity_default(self):
93
+ self.settings.has_value = MagicMock(return_value=False)
94
+ result = self.settings.get_proxy_affinity()
95
+ self.assertEqual(result, uuid.UUID(int=0))
96
+
97
+ def test_set_and_get_proxy_affinity(self):
98
+ self.settings.set_setting_value = MagicMock()
99
+ self.settings.has_value = MagicMock(return_value=True)
100
+ self.settings.get_setting_value = MagicMock(return_value=str(self.test_uuid))
101
+ self.settings.set_proxy_affinity(self.test_uuid)
102
+ result = self.settings.get_proxy_affinity()
103
+ self.assertEqual(result, self.test_uuid)
104
+
105
+ def test_set_and_get_proxy_affinity_with_alias(self):
106
+ self.settings.set_setting_value = MagicMock()
107
+ self.settings.has_value = MagicMock(return_value=True)
108
+ self.settings.get_setting_value = MagicMock(return_value=str(self.test_uuid))
109
+ self.settings.set_proxy_affinity(self.test_uuid, self.test_alias)
110
+ result = self.settings.get_proxy_affinity(self.test_alias)
111
+ self.assertEqual(result, self.test_uuid)
112
+
113
+ @patch.dict(os.environ, {'PROXY_ID': 'test-uuid'})
114
+ def test_get_setting_value_from_env(self):
115
+ result = self.settings.get_setting_value("PROXY_ID", "default")
116
+ self.assertEqual(result, 'test-uuid')
117
+
118
+ @patch.dict(os.environ, {'PROXY_NAME': 'test-name'})
119
+ def test_get_setting_value_from_env_with_alias(self):
120
+ result = self.settings.get_setting_value("PROXY_NAME", "custom_alias")
121
+ self.assertIsNone(result)
122
+
123
+ def test_get_proxy_config(self):
124
+ test_name = "Test Proxy"
125
+ test_description = "Test Description"
126
+ self.settings.get_proxy_id = MagicMock(return_value=self.test_uuid)
127
+ self.settings.get_proxy_name = MagicMock(return_value=test_name)
128
+ self.settings.get_proxy_description = MagicMock(return_value=test_description)
129
+ self.settings.get_proxy_affinity = MagicMock(return_value=self.test_uuid)
130
+ result = self.settings.get_proxy_config()
131
+ expected = {
132
+ "id": str(self.test_uuid),
133
+ "name": test_name,
134
+ "description": test_description,
135
+ "affinity": str(self.test_uuid)
136
+ }
137
+ self.assertEqual(result, expected)
138
+
139
+ def test_get_proxy_config_with_alias(self):
140
+ test_name = "Test Proxy"
141
+ test_description = "Test Description"
142
+ self.settings.get_proxy_id = MagicMock(return_value=self.test_uuid)
143
+ self.settings.get_proxy_name = MagicMock(return_value=test_name)
144
+ self.settings.get_proxy_description = MagicMock(return_value=test_description)
145
+ self.settings.get_proxy_affinity = MagicMock(return_value=self.test_uuid)
146
+ result = self.settings.get_proxy_config(self.test_alias)
147
+ expected = {
148
+ "id": str(self.test_uuid),
149
+ "name": test_name,
150
+ "description": test_description,
151
+ "affinity": str(self.test_uuid)
152
+ }
153
+ self.assertEqual(result, expected)
154
+
155
+ def test_get_proxy_config_with_none_values(self):
156
+ self.settings.get_proxy_id = MagicMock(return_value=None)
157
+ self.settings.get_proxy_name = MagicMock(return_value=None)
158
+ self.settings.get_proxy_description = MagicMock(return_value=None)
159
+ self.settings.get_proxy_affinity = MagicMock(return_value=uuid.UUID(int=0))
160
+ result = self.settings.get_proxy_config()
161
+ expected = {
162
+ "id": None,
163
+ "name": None,
164
+ "description": None,
165
+ "affinity": str(uuid.UUID(int=0))
166
+ }
167
+ self.assertEqual(result, expected)
168
+
169
+
170
+ if __name__ == '__main__':
171
+ unittest.main()