Skip to content

Commit db4eda7

Browse files
authored
Added support for additional_data and request_id fields in the APIResponseError class (#293)
* - Added support for `additional_data` and `request_id` fields in the `APIResponseError` class * - Added coverage tests for code related to `additional_data` and `request_id`
1 parent 3971c56 commit db4eda7

File tree

3 files changed

+60
-3
lines changed

3 files changed

+60
-3
lines changed

notion_client/client.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,20 @@ def _parse_response(self, response: Response) -> Any:
153153
try:
154154
body = error.response.json()
155155
code = body.get("code")
156+
additional_data = body.get("additional_data")
157+
request_id = body.get("request_id")
156158
except json.JSONDecodeError:
157159
code = None
160+
additional_data = None
161+
request_id = None
158162
if code and is_api_error_code(code):
159-
raise APIResponseError(response, body["message"], code)
163+
raise APIResponseError(
164+
response,
165+
body["message"],
166+
code,
167+
additional_data,
168+
request_id,
169+
)
160170
raise HTTPResponseError(error.response)
161171

162172
body = response.json()

notion_client/errors.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"""
55

66
from enum import Enum
7-
from typing import Optional
7+
from typing import Any, Dict, Optional
88

99
import httpx
1010

@@ -95,12 +95,21 @@ class APIResponseError(HTTPResponseError):
9595
"""An error raised by Notion API."""
9696

9797
code: APIErrorCode
98+
additional_data: Optional[Dict[str, Any]]
99+
request_id: Optional[str]
98100

99101
def __init__(
100-
self, response: httpx.Response, message: str, code: APIErrorCode
102+
self,
103+
response: httpx.Response,
104+
message: str,
105+
code: APIErrorCode,
106+
additional_data: Optional[Dict[str, Any]] = None,
107+
request_id: Optional[str] = None,
101108
) -> None:
102109
super().__init__(response, message)
103110
self.code = code
111+
self.additional_data = additional_data
112+
self.request_id = request_id
104113

105114

106115
def is_api_error_code(code: str) -> bool:

tests/test_errors.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,44 @@ async def test_api_async_request_bad_request_error(async_client):
5959
await async_client.request(STATUS_PAGE_BAD_REQUEST, "GET")
6060

6161

62+
@pytest.mark.vcr()
63+
def test_api_response_error_request_id(client):
64+
with pytest.raises(APIResponseError) as exc_info:
65+
client.request("/invalid", "GET")
66+
67+
error = exc_info.value
68+
assert isinstance(error.request_id, str)
69+
70+
71+
@pytest.mark.vcr()
72+
async def test_async_api_response_error_request_id(async_client):
73+
with pytest.raises(APIResponseError) as exc_info:
74+
await async_client.request("/invalid", "GET")
75+
76+
error = exc_info.value
77+
assert isinstance(error.request_id, str)
78+
79+
80+
@pytest.mark.vcr()
81+
def test_api_response_error_additional_data(client):
82+
with pytest.raises(APIResponseError) as exc_info:
83+
client.request("/users", "GET", auth="invalid-token")
84+
85+
error = exc_info.value
86+
if error.additional_data is not None:
87+
assert isinstance(error.additional_data, dict)
88+
89+
90+
@pytest.mark.vcr()
91+
async def test_async_api_response_error_additional_data(async_client):
92+
with pytest.raises(APIResponseError) as exc_info:
93+
await async_client.request("/users", "GET", auth="invalid-token")
94+
95+
error = exc_info.value
96+
if error.additional_data is not None:
97+
assert isinstance(error.additional_data, dict)
98+
99+
62100
async def test_is_api_error_code():
63101
error_code = "unauthorized"
64102
assert is_api_error_code(error_code)

0 commit comments

Comments
 (0)