aixtools 0.1.9__py3-none-any.whl → 0.1.11__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.

Potentially problematic release.


This version of aixtools might be problematic. Click here for more details.

Files changed (48) hide show
  1. aixtools/_version.py +2 -2
  2. aixtools/compliance/__init__.py +9 -0
  3. aixtools/compliance/private_data.py +5 -3
  4. aixtools/mcp/client.py +102 -1
  5. aixtools/testing/aix_test_model.py +2 -0
  6. {aixtools-0.1.9.dist-info → aixtools-0.1.11.dist-info}/METADATA +2 -1
  7. {aixtools-0.1.9.dist-info → aixtools-0.1.11.dist-info}/RECORD +10 -46
  8. aixtools-0.1.11.dist-info/top_level.txt +1 -0
  9. aixtools-0.1.9.dist-info/top_level.txt +0 -5
  10. docker/mcp-base/Dockerfile +0 -33
  11. docker/mcp-base/zscaler.crt +0 -28
  12. notebooks/example_faulty_mcp_server.ipynb +0 -74
  13. notebooks/example_mcp_server_stdio.ipynb +0 -76
  14. notebooks/example_raw_mcp_client.ipynb +0 -84
  15. notebooks/example_tool_doctor.ipynb +0 -65
  16. scripts/config.sh +0 -28
  17. scripts/lint.sh +0 -32
  18. scripts/log_view.sh +0 -18
  19. scripts/run_example_mcp_server.sh +0 -14
  20. scripts/run_faulty_mcp_server.sh +0 -13
  21. scripts/run_server.sh +0 -29
  22. scripts/test.sh +0 -30
  23. tests/__init__.py +0 -0
  24. tests/unit/__init__.py +0 -0
  25. tests/unit/a2a/__init__.py +0 -0
  26. tests/unit/a2a/google_sdk/__init__.py +0 -0
  27. tests/unit/a2a/google_sdk/pydantic_ai_adapter/__init__.py +0 -0
  28. tests/unit/a2a/google_sdk/pydantic_ai_adapter/test_agent_executor.py +0 -188
  29. tests/unit/a2a/google_sdk/pydantic_ai_adapter/test_storage.py +0 -156
  30. tests/unit/a2a/google_sdk/test_card.py +0 -114
  31. tests/unit/a2a/google_sdk/test_remote_agent_connection.py +0 -413
  32. tests/unit/a2a/google_sdk/test_utils.py +0 -208
  33. tests/unit/agents/__init__.py +0 -0
  34. tests/unit/agents/test_prompt.py +0 -363
  35. tests/unit/compliance/test_private_data.py +0 -329
  36. tests/unit/google/__init__.py +0 -1
  37. tests/unit/google/test_client.py +0 -233
  38. tests/unit/mcp/__init__.py +0 -0
  39. tests/unit/mcp/test_client.py +0 -242
  40. tests/unit/server/__init__.py +0 -0
  41. tests/unit/server/test_path.py +0 -225
  42. tests/unit/server/test_utils.py +0 -362
  43. tests/unit/utils/__init__.py +0 -0
  44. tests/unit/utils/test_files.py +0 -146
  45. tests/unit/vault/__init__.py +0 -0
  46. tests/unit/vault/test_vault.py +0 -246
  47. {aixtools-0.1.9.dist-info → aixtools-0.1.11.dist-info}/WHEEL +0 -0
  48. {aixtools-0.1.9.dist-info → aixtools-0.1.11.dist-info}/entry_points.txt +0 -0
@@ -1,246 +0,0 @@
1
- from unittest.mock import MagicMock, patch
2
-
3
- import pytest
4
- from hvac.exceptions import InvalidPath
5
-
6
- from aixtools.vault.vault import VaultAuthError, VaultClient
7
-
8
-
9
- @pytest.fixture
10
- def patched_vault_client():
11
- with patch("aixtools.vault.vault.hvac.Client") as mock_hvac_client_cls:
12
- fake_hvac_client = MagicMock()
13
- fake_hvac_client.is_authenticated.return_value = True
14
- mock_hvac_client_cls.return_value = fake_hvac_client
15
-
16
- client = VaultClient()
17
- return client
18
-
19
-
20
- @pytest.fixture
21
- def valid_params():
22
- return {
23
- "vault_mount_point": "secret",
24
- "path_prefix": "path",
25
- "env": "dev",
26
- "user_id": "test-user",
27
- "service_name": "test-service",
28
- "user_api_key": "test-api-key",
29
- }
30
-
31
-
32
- def test_store_user_service_api_key_success(patched_vault_client, valid_params):
33
- patched_vault_client.client.secrets.kv.v2.create_or_update_secret.return_value = {}
34
-
35
- patched_vault_client.store_user_service_api_key(
36
- user_id=valid_params["user_id"],
37
- service_name=valid_params["service_name"],
38
- user_api_key=valid_params["user_api_key"],
39
- )
40
-
41
- secret_path = (
42
- f"{valid_params['path_prefix']}/{valid_params['env']}/{valid_params['user_id']}/{valid_params['service_name']}"
43
- )
44
-
45
- patched_vault_client.client.secrets.kv.v2.create_or_update_secret.assert_called_once_with(
46
- secret_path,
47
- secret={"user-api-key": valid_params["user_api_key"]},
48
- mount_point=valid_params["vault_mount_point"],
49
- )
50
-
51
-
52
- def test_store_user_service_api_key_invalid_path(patched_vault_client, valid_params):
53
- patched_vault_client.client.secrets.kv.v2.create_or_update_secret.side_effect = Exception("Invalid Path")
54
-
55
- with pytest.raises(VaultAuthError, match="Invalid Path"):
56
- patched_vault_client.store_user_service_api_key(
57
- user_id=valid_params["user_id"],
58
- service_name=valid_params["service_name"],
59
- user_api_key=valid_params["user_api_key"],
60
- )
61
- patched_vault_client.client.assert_not_called()
62
-
63
-
64
- def test_read_user_service_api_key_success(patched_vault_client):
65
- """Test successful read of user service API key."""
66
- mock_response = {"data": {"data": {"user-api-key": "test-api-key"}}}
67
- patched_vault_client.client.secrets.kv.v2.read_secret_version.return_value = mock_response
68
-
69
- result = patched_vault_client.read_user_service_api_key(user_id="test-user", service_name="test-service")
70
-
71
- assert result == "test-api-key"
72
- patched_vault_client.client.secrets.kv.v2.read_secret_version.assert_called_once_with(
73
- "path/dev/test-user/test-service", mount_point="secret", raise_on_deleted_version=True
74
- )
75
-
76
-
77
- def test_read_user_service_api_key_secret_not_found(patched_vault_client):
78
- """Test read_user_service_api_key when the secret path does not exist."""
79
- patched_vault_client.client.secrets.kv.v2.read_secret_version.side_effect = InvalidPath
80
-
81
- result = patched_vault_client.read_user_service_api_key(user_id="test-user", service_name="test-service")
82
-
83
- assert result is None
84
- patched_vault_client.client.secrets.kv.v2.read_secret_version.assert_called_once_with(
85
- "path/dev/test-user/test-service", mount_point="secret", raise_on_deleted_version=True
86
- )
87
-
88
-
89
- def test_read_user_service_api_key_unexpected_error(patched_vault_client):
90
- """Test read_user_service_api_key when an unexpected exception occurs."""
91
- patched_vault_client.client.secrets.kv.v2.read_secret_version.side_effect = Exception("Unexpected error")
92
-
93
- with pytest.raises(VaultAuthError, match="Unexpected error"):
94
- patched_vault_client.read_user_service_api_key(user_id="test-user", service_name="test-service")
95
-
96
- patched_vault_client.client.secrets.kv.v2.read_secret_version.assert_called_once_with(
97
- "path/dev/test-user/test-service", mount_point="secret", raise_on_deleted_version=True
98
- )
99
-
100
-
101
- def test_store_user_service_secret_success(patched_vault_client, valid_params):
102
- """Test successful storage of complete user service secret."""
103
- secret_data = {"api_key": "test-api-key", "token": "test-token", "endpoint": "https://api.example.com"}
104
- patched_vault_client.client.secrets.kv.v2.create_or_update_secret.return_value = {}
105
-
106
- patched_vault_client.store_user_service_secret(
107
- user_id=valid_params["user_id"],
108
- service_name=valid_params["service_name"],
109
- secret_data=secret_data,
110
- )
111
-
112
- secret_path = (
113
- f"{valid_params['path_prefix']}/{valid_params['env']}/{valid_params['user_id']}/{valid_params['service_name']}"
114
- )
115
-
116
- patched_vault_client.client.secrets.kv.v2.create_or_update_secret.assert_called_once_with(
117
- secret_path,
118
- secret=secret_data,
119
- mount_point=valid_params["vault_mount_point"],
120
- )
121
-
122
-
123
- def test_store_user_service_secret_error(patched_vault_client, valid_params):
124
- """Test store_user_service_secret when an error occurs."""
125
- secret_data = {"api_key": "test-api-key", "token": "test-token"}
126
- patched_vault_client.client.secrets.kv.v2.create_or_update_secret.side_effect = Exception("Storage error")
127
-
128
- with pytest.raises(VaultAuthError, match="Storage error"):
129
- patched_vault_client.store_user_service_secret(
130
- user_id=valid_params["user_id"],
131
- service_name=valid_params["service_name"],
132
- secret_data=secret_data,
133
- )
134
-
135
-
136
- def test_read_user_service_secret_success(patched_vault_client):
137
- """Test successful read of complete user service secret."""
138
- secret_data = {"api_key": "test-api-key", "token": "test-token", "endpoint": "https://api.example.com"}
139
- mock_response = {"data": {"data": secret_data}}
140
- patched_vault_client.client.secrets.kv.v2.read_secret_version.return_value = mock_response
141
-
142
- result = patched_vault_client.read_user_service_secret(user_id="test-user", service_name="test-service")
143
-
144
- assert result == secret_data
145
- patched_vault_client.client.secrets.kv.v2.read_secret_version.assert_called_once_with(
146
- "path/dev/test-user/test-service", mount_point="secret", raise_on_deleted_version=True
147
- )
148
-
149
-
150
- def test_read_user_service_secret_not_found(patched_vault_client):
151
- """Test read_user_service_secret when the secret path does not exist."""
152
- patched_vault_client.client.secrets.kv.v2.read_secret_version.side_effect = InvalidPath
153
-
154
- result = patched_vault_client.read_user_service_secret(user_id="test-user", service_name="test-service")
155
-
156
- assert result is None
157
- patched_vault_client.client.secrets.kv.v2.read_secret_version.assert_called_once_with(
158
- "path/dev/test-user/test-service", mount_point="secret", raise_on_deleted_version=True
159
- )
160
-
161
-
162
- def test_list_user_secret_keys_success(patched_vault_client):
163
- """Test successful listing of all user secret keys."""
164
- mock_response = {"data": {"keys": ["service1/", "service2/", "service3"]}}
165
- patched_vault_client.client.secrets.kv.v2.list_secrets.return_value = mock_response
166
-
167
- result = patched_vault_client.list_user_secret_keys(user_id="test-user")
168
-
169
- assert result == ["service1", "service2", "service3"]
170
- patched_vault_client.client.secrets.kv.v2.list_secrets.assert_called_once_with(
171
- path="path/dev/test-user", mount_point="secret"
172
- )
173
-
174
-
175
- def test_list_user_secret_keys_no_secrets(patched_vault_client):
176
- """Test listing user secret keys when no secrets exist."""
177
- mock_response = {"data": {"keys": []}}
178
- patched_vault_client.client.secrets.kv.v2.list_secrets.return_value = mock_response
179
-
180
- result = patched_vault_client.list_user_secret_keys(user_id="test-user")
181
-
182
- assert result == []
183
- patched_vault_client.client.secrets.kv.v2.list_secrets.assert_called_once_with(
184
- path="path/dev/test-user", mount_point="secret"
185
- )
186
-
187
-
188
- def test_list_user_secret_keys_empty_response(patched_vault_client):
189
- """Test listing user secret keys when response is empty."""
190
- patched_vault_client.client.secrets.kv.v2.list_secrets.return_value = {}
191
-
192
- result = patched_vault_client.list_user_secret_keys(user_id="test-user")
193
-
194
- assert result == []
195
- patched_vault_client.client.secrets.kv.v2.list_secrets.assert_called_once_with(
196
- path="path/dev/test-user", mount_point="secret"
197
- )
198
-
199
-
200
- def test_list_user_secret_keys_invalid_path(patched_vault_client):
201
- """Test listing user secret keys when user path does not exist."""
202
- patched_vault_client.client.secrets.kv.v2.list_secrets.side_effect = InvalidPath
203
-
204
- result = patched_vault_client.list_user_secret_keys(user_id="test-user")
205
-
206
- assert result == []
207
- patched_vault_client.client.secrets.kv.v2.list_secrets.assert_called_once_with(
208
- path="path/dev/test-user", mount_point="secret"
209
- )
210
-
211
-
212
- def test_list_user_secret_keys_unexpected_error(patched_vault_client):
213
- """Test listing user secret keys when an unexpected exception occurs."""
214
- patched_vault_client.client.secrets.kv.v2.list_secrets.side_effect = Exception("List error")
215
-
216
- with pytest.raises(VaultAuthError, match="List error"):
217
- patched_vault_client.list_user_secret_keys(user_id="test-user")
218
-
219
- patched_vault_client.client.secrets.kv.v2.list_secrets.assert_called_once_with(
220
- path="path/dev/test-user", mount_point="secret"
221
- )
222
-
223
-
224
- def test_list_user_secret_keys_strips_trailing_slashes(patched_vault_client):
225
- """Test that trailing slashes are properly stripped from directory names."""
226
- mock_response = {"data": {"keys": ["service1/", "service2/", "service3", "service4/"]}}
227
- patched_vault_client.client.secrets.kv.v2.list_secrets.return_value = mock_response
228
-
229
- result = patched_vault_client.list_user_secret_keys(user_id="test-user")
230
-
231
- assert result == ["service1", "service2", "service3", "service4"]
232
- patched_vault_client.client.secrets.kv.v2.list_secrets.assert_called_once_with(
233
- path="path/dev/test-user", mount_point="secret"
234
- )
235
-
236
-
237
- def test_read_user_service_secret_error(patched_vault_client):
238
- """Test read_user_service_secret when an unexpected exception occurs."""
239
- patched_vault_client.client.secrets.kv.v2.read_secret_version.side_effect = Exception("Read error")
240
-
241
- with pytest.raises(VaultAuthError, match="Read error"):
242
- patched_vault_client.read_user_service_secret(user_id="test-user", service_name="test-service")
243
-
244
- patched_vault_client.client.secrets.kv.v2.read_secret_version.assert_called_once_with(
245
- "path/dev/test-user/test-service", mount_point="secret", raise_on_deleted_version=True
246
- )