Skip to content

Commit 8e8f6cb

Browse files
fix(parser): fix DynamoDB Stream Lambda invocation record model (#8321)
* fix(parser): fix DynamoDB Stream Lambda invocation record model The responseContext.functionError field is null if the error did not occur during function execution. * chore: fix ruff B905 errors * chore: bump ruff target version to 3.10 Also add temporary ignores for some upgrade rules, as there are 1017 corresponding errors. --------- Co-authored-by: Leandro Damascena <lcdama@amazon.pt>
1 parent e7f7066 commit 8e8f6cb

5 files changed

Lines changed: 33 additions & 6 deletions

File tree

aws_lambda_powertools/event_handler/events_appsync/appsync_events.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ async def _call_publish_event_async_resolver(
321321
if isinstance(ret, Exception)
322322
else {"id": e.get("id"), "payload": ret}
323323
)
324-
for e, ret in zip(self.current_event.events, results)
324+
for e, ret in zip(self.current_event.events, results, strict=True)
325325
],
326326
)
327327

aws_lambda_powertools/utilities/parser/models/dynamodb.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ class ResponseContext(BaseModel):
175175
description="The version of the Lambda executed",
176176
examples=["$LATEST"],
177177
)
178-
function_error: str = Field(
178+
function_error: Optional[str] = Field(
179+
default=None,
179180
description="",
180181
examples=["Unhandled"],
181182
)

ruff.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ lint.ignore = [
4141
"A005",
4242
"TC006", # https://docs.astral.sh/ruff/rules/runtime-cast-value/
4343
"PLC0415", # https://docs.astral.sh/ruff/rules/import-outside-top-level/
44+
"UP006",
45+
"UP007",
46+
"UP035",
47+
"UP045",
4448
]
4549

4650
# Exclude files and directories
@@ -62,7 +66,7 @@ exclude = [
6266
# Maximum line length
6367
line-length = 120
6468

65-
target-version = "py38"
69+
target-version = "py310"
6670

6771
fix = true
6872
lint.fixable = ["I", "COM812", "W"]

tests/unit/data_classes/required_dependencies/test_bedrock_agent_function_event.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def test_bedrock_agent_function_event():
3232
raw_parameters = raw_event["parameters"]
3333
assert len(parameters) == len(raw_parameters)
3434

35-
for param, raw_param in zip(parameters, raw_parameters):
35+
for param, raw_param in zip(parameters, raw_parameters, strict=True):
3636
assert param.name == raw_param["name"]
3737
assert param.type == raw_param["type"]
3838
assert param.value == raw_param["value"]

tests/unit/parser/_pydantic/test_dynamodb.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from typing import Any
2+
13
import pytest
24

35
from aws_lambda_powertools.utilities.parser import ValidationError, envelopes, parse
@@ -86,8 +88,26 @@ def test_validate_event_does_not_conform_with_model():
8688
parse(event=raw_event, model=MyDynamoBusiness, envelope=envelopes.DynamoDBStreamEnvelope)
8789

8890

89-
def test_dynamo_db_stream_lambda_invocation_event():
91+
@pytest.mark.parametrize(
92+
"response_context",
93+
[
94+
pytest.param(
95+
{"statusCode": 200, "executedVersion": "$LATEST"},
96+
id="without function error",
97+
),
98+
pytest.param(
99+
{"statusCode": 200, "executedVersion": "$LATEST", "functionError": None},
100+
id="with null function error",
101+
),
102+
pytest.param(
103+
{"statusCode": 200, "executedVersion": "$LATEST", "functionError": "Unhandled"},
104+
id="with function error",
105+
),
106+
],
107+
)
108+
def test_dynamo_db_stream_lambda_invocation_event(response_context: dict[str, Any]):
90109
raw_event = load_event("dynamoStreamLambdaInvocationEvent.json")
110+
raw_event["responseContext"] = response_context
91111
parsed_event: DynamoDBStreamLambdaOnFailureDestinationModel = parse(
92112
event=raw_event,
93113
model=DynamoDBStreamLambdaOnFailureDestinationModel,
@@ -111,6 +131,8 @@ def test_dynamo_db_stream_lambda_invocation_event():
111131
)
112132
assert parsed_event.ddb_stream_batch_info.stream_arn == raw_event["DDBStreamBatchInfo"]["streamArn"]
113133
assert parsed_event.request_context.model_dump(by_alias=True) == raw_event["requestContext"]
114-
assert parsed_event.response_context.model_dump(by_alias=True) == raw_event["responseContext"]
134+
assert parsed_event.response_context.status_code == response_context["statusCode"]
135+
assert parsed_event.response_context.executed_version == response_context["executedVersion"]
136+
assert parsed_event.response_context.function_error == response_context.get("functionError")
115137
assert parsed_event.timestamp.strftime("%Y-%m-%dT%H:%M:%SZ") == raw_event["timestamp"]
116138
assert parsed_event.version == raw_event["version"]

0 commit comments

Comments
 (0)