Skip to content

Commit 5583620

Browse files
authored
fix(testing-sdk): serialization for callback fail accepts empty bodies (#99)
1 parent 8ed1f70 commit 5583620

2 files changed

Lines changed: 30 additions & 21 deletions

File tree

src/aws_durable_execution_sdk_python_testing/web/handlers.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,27 @@ def _parse_json_body(self, request: HTTPRequest) -> dict[str, Any]:
9191
dict: The parsed JSON data
9292
9393
Raises:
94-
InvalidParameterValueException: If the request body is empty or invalid JSON
94+
InvalidParameterValueException: If the request body is empty
9595
"""
9696
if not request.body:
9797
msg = "Request body is required"
9898
raise InvalidParameterValueException(msg)
99+
return self._parse_json_body_optional(request)
100+
101+
def _parse_json_body_optional(self, request: HTTPRequest) -> dict[str, Any]:
102+
"""Parse JSON body from HTTP request with validation.
103+
104+
Args:
105+
request: The HTTP request containing the JSON body
106+
107+
Returns:
108+
dict: The parsed JSON data
109+
110+
Raises:
111+
InvalidParameterValueException: If the request body is invalid JSON
112+
"""
113+
if not request.body:
114+
return {}
99115

100116
# Handle both dict and bytes body types
101117
if isinstance(request.body, dict):
@@ -690,7 +706,7 @@ def handle(self, parsed_route: Route, request: HTTPRequest) -> HTTPResponse:
690706
callback_route = cast(CallbackFailureRoute, parsed_route)
691707
callback_id: str = callback_route.callback_id
692708

693-
body_data: dict[str, Any] = self._parse_json_body(request)
709+
body_data: dict[str, Any] = self._parse_json_body_optional(request)
694710
callback_request: SendDurableExecutionCallbackFailureRequest = (
695711
SendDurableExecutionCallbackFailureRequest.from_dict(
696712
body_data, callback_id
@@ -734,10 +750,7 @@ def handle(self, parsed_route: Route, request: HTTPRequest) -> HTTPResponse:
734750
HTTPResponse: The HTTP response to send to the client
735751
"""
736752
try:
737-
# Parse request body for validation but heartbeat doesn't use the data
738-
body_data: dict[str, Any] = self._parse_json_body(request)
739-
SendDurableExecutionCallbackHeartbeatRequest.from_dict(body_data)
740-
753+
# Heartbeat requests don't have a body, only callback_id from URL
741754
callback_route = cast(CallbackHeartbeatRoute, parsed_route)
742755
callback_id: str = callback_route.callback_id
743756

tests/web/handlers_test.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2173,10 +2173,8 @@ def test_send_durable_execution_callback_failure_handler_empty_body():
21732173
)
21742174

21752175
response = handler.handle(callback_route, request)
2176-
# Handler returns 400 for empty body with AWS-compliant format
2177-
assert response.status_code == 400
2178-
assert response.body["Type"] == "InvalidParameterValueException"
2179-
assert "Request body is required" in response.body["message"]
2176+
# Handler should accept empty body for failure requests
2177+
assert response.status_code == 200
21802178

21812179

21822180
def test_send_durable_execution_callback_heartbeat_handler():
@@ -2221,24 +2219,22 @@ def test_send_durable_execution_callback_heartbeat_handler_empty_body():
22212219
executor = Mock()
22222220
handler = SendDurableExecutionCallbackHeartbeatHandler(executor)
22232221

2222+
base_route = Route.from_string(
2223+
"/2025-12-01/durable-execution-callbacks/test-id/heartbeat"
2224+
)
2225+
callback_route = CallbackHeartbeatRoute.from_route(base_route)
2226+
22242227
request = HTTPRequest(
22252228
method="POST",
2226-
path=Route.from_string(
2227-
"/2025-12-01/durable-execution-callbacks/test-id/heartbeat"
2228-
),
2229+
path=callback_route,
22292230
headers={},
22302231
query_params={},
22312232
body={},
22322233
)
22332234

2234-
response = handler.handle(
2235-
Route.from_string("/2025-12-01/durable-execution-callbacks/test-id/heartbeat"),
2236-
request,
2237-
)
2238-
# Handler returns 400 for empty body with AWS-compliant format
2239-
assert response.status_code == 400
2240-
assert response.body["Type"] == "InvalidParameterValueException"
2241-
assert "Request body is required" in response.body["message"]
2235+
response = handler.handle(callback_route, request)
2236+
# Handler should accept empty body for heartbeat requests
2237+
assert response.status_code == 200
22422238

22432239

22442240
def test_health_handler():

0 commit comments

Comments
 (0)