Skip to content

Commit 80d4866

Browse files
authored
Merge pull request #87 from mwarzybok-sumoheavy/feature/SP-874
SP-874 Support "errors" array
2 parents 2454ebf + 1d366b0 commit 80d4866

File tree

3 files changed

+53
-0
lines changed

3 files changed

+53
-0
lines changed

src/bitpay/clients/response_parser.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,29 @@ def response_to_json_string(response: Response) -> Any:
3737
response_obj["error"]
3838
)
3939

40+
if "errors" in response_obj:
41+
final_message = ""
42+
for error in response_obj["errors"]:
43+
error_value = error.get("error", "")
44+
param_value = error.get("param", "")
45+
46+
if error_value.endswith("."):
47+
error_value = error_value[:-1]
48+
49+
if error_value:
50+
result = f"{error_value} {param_value}".strip()
51+
else:
52+
result = param_value.strip()
53+
54+
if not result.endswith("."):
55+
result += "."
56+
57+
if not final_message == "":
58+
result = " " + result
59+
60+
final_message += result
61+
BitPayExceptionProvider.throw_api_exception_with_message(final_message)
62+
4063
if "success" in response_obj:
4164
return response_obj["success"]
4265

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"errors":[{"error":"Missing required parameter.","param":"price"},{"error":"Missing required parameter.","param":"currency"}]}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import json
2+
import os
3+
4+
import pytest
5+
6+
from requests import Response, PreparedRequest
7+
8+
from bitpay.clients.response_parser import ResponseParser
9+
from bitpay.exceptions.bitpay_api_exception import BitPayApiException
10+
11+
12+
@pytest.mark.unit
13+
def test_handle_multiple_errors(mocker):
14+
with pytest.raises(BitPayApiException) as exc_info:
15+
with open(
16+
os.path.abspath(os.path.dirname(__file__))
17+
+ "/response_with_errors.json",
18+
"r",
19+
) as file:
20+
response_json = json.load(file)
21+
request = mocker.Mock(spec=PreparedRequest)
22+
request.method = "POST"
23+
request.url = "https://some-url.com"
24+
response = mocker.Mock(spec=Response)
25+
response.request = request
26+
response.json.return_value = response_json
27+
ResponseParser.response_to_json_string(response)
28+
29+
assert str(exc_info.value) == "Missing required parameter price. Missing required parameter currency."

0 commit comments

Comments
 (0)