weni-cli 3.8.2__tar.gz → 3.8.4__tar.gz
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.
- {weni_cli-3.8.2 → weni_cli-3.8.4}/PKG-INFO +1 -1
- {weni_cli-3.8.2 → weni_cli-3.8.4}/pyproject.toml +1 -1
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/cli_client.py +2 -2
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/tests/test_cli_client.py +11 -1
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/tests/test_ticketer_definition.py +44 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/ticketer_definition.py +17 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/README.md +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/__init__.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/auth.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/cli.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/__init__.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/common.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/response_handlers/__init__.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/response_handlers/handlers.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/tests/__init__.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/tests/test_weni_client.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/weni_client.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/channel_create.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/eval_init.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/eval_run.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/init.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/login.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/logs.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/project_current.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/project_list.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/project_push.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/project_use.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/run.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/ticketer_create.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/formatter/__init__.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/formatter/formatter.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/formatter/tests/test_formatter.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/handler.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/packager/__init__.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/packager/loader.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/packager/packager.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/packager/tests/__init__.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/packager/tests/test_loader.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/packager/tests/test_packager.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/spinner/__init__.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/spinner/spinners.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/store.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/utils.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/__init__.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/agent_definition.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/channel_definition.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/source.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/tests/__init__.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/tests/conftest.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/tests/test_active_test_definition.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/tests/test_channel_definition.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/tests/test_definition.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/tests/test_source.py +0 -0
- {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/wsgi.py +0 -0
|
@@ -110,7 +110,7 @@ class CLIClient:
|
|
|
110
110
|
timeout=timeout,
|
|
111
111
|
)
|
|
112
112
|
|
|
113
|
-
if response.status_code
|
|
113
|
+
if not (200 <= response.status_code < 300):
|
|
114
114
|
if response.status_code == 401:
|
|
115
115
|
raise RequestError("Invalid authentication token. Please login again using 'weni login'")
|
|
116
116
|
try:
|
|
@@ -159,7 +159,7 @@ class CLIClient:
|
|
|
159
159
|
params=params,
|
|
160
160
|
)
|
|
161
161
|
|
|
162
|
-
if response.status_code
|
|
162
|
+
if not (200 <= response.status_code < 300):
|
|
163
163
|
if response.status_code == 401:
|
|
164
164
|
raise RequestError("Invalid authentication token. Please login again using 'weni login'")
|
|
165
165
|
try:
|
|
@@ -837,6 +837,16 @@ def test_request_method_error_handling(client, mocker):
|
|
|
837
837
|
response = client._make_request("GET", "test/endpoint")
|
|
838
838
|
assert response == success_resp
|
|
839
839
|
|
|
840
|
+
# 4. Test with 201 Created response (common for POST create endpoints)
|
|
841
|
+
created_resp = mocker.MagicMock()
|
|
842
|
+
created_resp.status_code = 201
|
|
843
|
+
created_resp.json.return_value = {"uuid": "new-resource-uuid"}
|
|
844
|
+
|
|
845
|
+
client.session.request = mocker.MagicMock(return_value=created_resp)
|
|
846
|
+
|
|
847
|
+
response = client._make_request("POST", "test/endpoint")
|
|
848
|
+
assert response == created_resp
|
|
849
|
+
|
|
840
850
|
|
|
841
851
|
def test_streaming_request_json_error_response(client, mocker):
|
|
842
852
|
"""Test _streaming_request method with a JSON error response."""
|
|
@@ -1174,7 +1184,7 @@ def test_create_channel_with_whatsapp_channel_type(client, mocker):
|
|
|
1174
1184
|
def test_create_ticketer_success(client, mocker):
|
|
1175
1185
|
"""Test successful ticketer creation."""
|
|
1176
1186
|
mock_response = mocker.MagicMock()
|
|
1177
|
-
mock_response.status_code =
|
|
1187
|
+
mock_response.status_code = 201
|
|
1178
1188
|
mock_response.json.return_value = {"uuid": "ticketer-uuid", "name": "org support"}
|
|
1179
1189
|
mocker.patch.object(client, "_make_request", return_value=mock_response)
|
|
1180
1190
|
|
|
@@ -186,6 +186,50 @@ class TestValidateTicketerDefinitionSchema:
|
|
|
186
186
|
== "Ticketer at index 0: 'config.unknown_field' is not a recognized field in the ticketer definition file"
|
|
187
187
|
)
|
|
188
188
|
|
|
189
|
+
def test_valid_ticketer_definition_with_equivalent_templates(self, valid_ticketer_definition):
|
|
190
|
+
data = valid_ticketer_definition.copy()
|
|
191
|
+
data["ticketers"] = [dict(data["ticketers"][0])]
|
|
192
|
+
data["ticketers"][0]["config"] = dict(data["ticketers"][0]["config"])
|
|
193
|
+
data["ticketers"][0]["config"].update(
|
|
194
|
+
{
|
|
195
|
+
"open_template": '{"ticket_id":{{json .ticket_id}},"contact":{{json .contact}},'
|
|
196
|
+
'"body":{{json .body}},"topic":{{json .topic}},"assignee":{{json .assignee}},'
|
|
197
|
+
'"metadata":{{json .metadata}},"opened_at":{{json .opened_at}}}',
|
|
198
|
+
"open_response_template": '{"external_id":{{json .external_id}},'
|
|
199
|
+
'"status":{{json .status}},"created_at":{{json .created_at}}}',
|
|
200
|
+
"forward_template": '{"ticket_id":{{json .ticket_id}},"external_id":{{json .external_id}},'
|
|
201
|
+
'"message_id":{{json .message_id}},"direction":{{json .direction}},'
|
|
202
|
+
'"sender":{{json .sender}},"text":{{json .text}},"attachments":{{json .attachments}},'
|
|
203
|
+
'"metadata":{{json .metadata}},"sent_at":{{json .sent_at}}}',
|
|
204
|
+
"forward_response_template": '{"message_external_id":{{json .message_external_id}},'
|
|
205
|
+
'"status":{{json .status}}}',
|
|
206
|
+
"close_template": '{"ticket_id":{{json .ticket_id}},"external_id":{{json .external_id}},'
|
|
207
|
+
'"closed_by":{{json .closed_by}},"reason":{{json .reason}},'
|
|
208
|
+
'"metadata":{{json .metadata}},"closed_at":{{json .closed_at}}}',
|
|
209
|
+
"close_response_template": '{"status":{{json .status}}}',
|
|
210
|
+
"history_mode": "batch",
|
|
211
|
+
"history_batch_size": "50",
|
|
212
|
+
"route_history_message": "/v1/tickets/{external_id}/messages",
|
|
213
|
+
"history_template": '{"ticket_id":{{json .ticket_id}},"external_id":{{json .external_id}},'
|
|
214
|
+
'"contact":{{json .contact}},"messages":{{json .messages}},"metadata":{{json .metadata}}}',
|
|
215
|
+
"history_response_template": '{"status":{{json .status}},'
|
|
216
|
+
'"messages_received":{{json .messages_received}}}',
|
|
217
|
+
"messages_template": '{"external_id":{{json .external_id}},'
|
|
218
|
+
'"message_external_id":{{json .message_external_id}},"direction":{{json .direction}},'
|
|
219
|
+
'"sender":{{json .sender}},"text":{{json .text}},"attachments":{{json .attachments}},'
|
|
220
|
+
'"metadata":{{json .metadata}},"sent_at":{{json .sent_at}}}',
|
|
221
|
+
"messages_response_template": '{"status":{{json .status}},'
|
|
222
|
+
'"ticket_uuid":{{json .ticket_uuid}},"message_uuid":{{json .message_uuid}}}',
|
|
223
|
+
"tickets_close_template": '{"external_id":{{json .external_id}},'
|
|
224
|
+
'"closed_by":{{json .closed_by}},"reason":{{json .reason}},'
|
|
225
|
+
'"metadata":{{json .metadata}},"closed_at":{{json .closed_at}}}',
|
|
226
|
+
"tickets_close_response_template": '{"status":{{json .status}},'
|
|
227
|
+
'"ticket_uuid":{{json .ticket_uuid}}}',
|
|
228
|
+
}
|
|
229
|
+
)
|
|
230
|
+
error = validate_ticketer_definition_schema(data)
|
|
231
|
+
assert error is None
|
|
232
|
+
|
|
189
233
|
|
|
190
234
|
class TestLoadTicketerDefinition:
|
|
191
235
|
"""Tests for load_ticketer_definition function."""
|
|
@@ -18,7 +18,24 @@ OPTIONAL_CONFIG_FIELDS = [
|
|
|
18
18
|
"route_close",
|
|
19
19
|
"route_reopen",
|
|
20
20
|
"route_history",
|
|
21
|
+
"route_history_message",
|
|
21
22
|
"webhook_secret",
|
|
23
|
+
"history_mode",
|
|
24
|
+
"history_batch_size",
|
|
25
|
+
# Plataforma → Ticketer (request/response body templates)
|
|
26
|
+
"open_template",
|
|
27
|
+
"open_response_template",
|
|
28
|
+
"forward_template",
|
|
29
|
+
"forward_response_template",
|
|
30
|
+
"close_template",
|
|
31
|
+
"close_response_template",
|
|
32
|
+
"history_template",
|
|
33
|
+
"history_response_template",
|
|
34
|
+
# Ticketer → Plataforma (inbound webhook request/response templates)
|
|
35
|
+
"messages_template",
|
|
36
|
+
"messages_response_template",
|
|
37
|
+
"tickets_close_template",
|
|
38
|
+
"tickets_close_response_template",
|
|
22
39
|
]
|
|
23
40
|
|
|
24
41
|
URL_PATTERN = re.compile(r"^https?://")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|