From b552cede03e48e806f0cb1bf319ed9c13140a9b4 Mon Sep 17 00:00:00 2001 From: reginaldalfret Date: Fri, 9 Oct 2026 14:31:31 +0530 Subject: [PATCH 1/2] fix(parser): support camelCase replyTo alias in SesMailCommonHeaders (#8523) Signed-off-by: reginaldalfret --- .../utilities/parser/models/ses.py | 8 +++- tests/unit/parser/_pydantic/test_ses.py | 42 +++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/utilities/parser/models/ses.py b/aws_lambda_powertools/utilities/parser/models/ses.py index 833cc557df0..409d90831b7 100644 --- a/aws_lambda_powertools/utilities/parser/models/ses.py +++ b/aws_lambda_powertools/utilities/parser/models/ses.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import List, Literal -from pydantic import BaseModel, Field +from pydantic import AliasChoices, BaseModel, Field from pydantic.types import PositiveInt @@ -37,7 +37,11 @@ class SesMailCommonHeaders(BaseModel): cc: List[str] | None = None bcc: List[str] | None = None sender: List[str] | None = None - reply_to: List[str] | None = Field(None, alias="reply-to") + reply_to: List[str] | None = Field( + None, + validation_alias=AliasChoices("replyTo", "reply-to", "reply_to"), + serialization_alias="replyTo", + ) returnPath: str messageId: str date: str diff --git a/tests/unit/parser/_pydantic/test_ses.py b/tests/unit/parser/_pydantic/test_ses.py index 34eb43bf5eb..cf0dca5ee5c 100644 --- a/tests/unit/parser/_pydantic/test_ses.py +++ b/tests/unit/parser/_pydantic/test_ses.py @@ -50,3 +50,45 @@ def test_ses_trigger_event(): assert action.type == raw_receipt["action"]["type"] assert action.functionArn == raw_receipt["action"]["functionArn"] assert action.invocationType == raw_receipt["action"]["invocationType"] + + +def test_ses_reply_to_header(): + from aws_lambda_powertools.utilities.parser.models.ses import SesMailCommonHeaders + + # Test with standard SES notification camelCase payload + headers_camel = SesMailCommonHeaders.model_validate({ + "from": ["sender@example.com"], + "to": ["receiver@example.com"], + "returnPath": "bounce@example.com", + "messageId": "", + "date": "Wed, 7 Oct 2026 12:34:56 -0700", + "subject": "SES Subject", + "replyTo": ["reply@example.com"], + }) + assert headers_camel.reply_to == ["reply@example.com"] + assert headers_camel.model_dump(by_alias=True)["replyTo"] == ["reply@example.com"] + + # Test backwards compatibility with hyphenated alias + headers_hyphen = SesMailCommonHeaders.model_validate({ + "from": ["sender@example.com"], + "to": ["receiver@example.com"], + "returnPath": "bounce@example.com", + "messageId": "", + "date": "Wed, 7 Oct 2026 12:34:56 -0700", + "subject": "SES Subject", + "reply-to": ["reply-hyphen@example.com"], + }) + assert headers_hyphen.reply_to == ["reply-hyphen@example.com"] + + # Test keyword argument instantiation + headers_kwarg = SesMailCommonHeaders( + **{"from": ["sender@example.com"]}, + to=["receiver@example.com"], + returnPath="bounce@example.com", + messageId="", + date="Wed, 7 Oct 2026 12:34:56 -0700", + subject="SES Subject", + reply_to=["reply-kwarg@example.com"], + ) + assert headers_kwarg.reply_to == ["reply-kwarg@example.com"] + From 45a1f0f2e5588c705628a48d2ee95fa31e905e07 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Thu, 15 Oct 2026 12:07:50 +0000 Subject: [PATCH 2/2] chore(tests): apply ruff format to SES parser test Co-Authored-By: Claude Fable 5.1 --- tests/unit/parser/_pydantic/test_ses.py | 41 +++++++++++++------------ 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/tests/unit/parser/_pydantic/test_ses.py b/tests/unit/parser/_pydantic/test_ses.py index cf0dca5ee5c..91d005fe47e 100644 --- a/tests/unit/parser/_pydantic/test_ses.py +++ b/tests/unit/parser/_pydantic/test_ses.py @@ -56,28 +56,32 @@ def test_ses_reply_to_header(): from aws_lambda_powertools.utilities.parser.models.ses import SesMailCommonHeaders # Test with standard SES notification camelCase payload - headers_camel = SesMailCommonHeaders.model_validate({ - "from": ["sender@example.com"], - "to": ["receiver@example.com"], - "returnPath": "bounce@example.com", - "messageId": "", - "date": "Wed, 7 Oct 2026 12:34:56 -0700", - "subject": "SES Subject", - "replyTo": ["reply@example.com"], - }) + headers_camel = SesMailCommonHeaders.model_validate( + { + "from": ["sender@example.com"], + "to": ["receiver@example.com"], + "returnPath": "bounce@example.com", + "messageId": "", + "date": "Wed, 7 Oct 2026 12:34:56 -0700", + "subject": "SES Subject", + "replyTo": ["reply@example.com"], + }, + ) assert headers_camel.reply_to == ["reply@example.com"] assert headers_camel.model_dump(by_alias=True)["replyTo"] == ["reply@example.com"] # Test backwards compatibility with hyphenated alias - headers_hyphen = SesMailCommonHeaders.model_validate({ - "from": ["sender@example.com"], - "to": ["receiver@example.com"], - "returnPath": "bounce@example.com", - "messageId": "", - "date": "Wed, 7 Oct 2026 12:34:56 -0700", - "subject": "SES Subject", - "reply-to": ["reply-hyphen@example.com"], - }) + headers_hyphen = SesMailCommonHeaders.model_validate( + { + "from": ["sender@example.com"], + "to": ["receiver@example.com"], + "returnPath": "bounce@example.com", + "messageId": "", + "date": "Wed, 7 Oct 2026 12:34:56 -0700", + "subject": "SES Subject", + "reply-to": ["reply-hyphen@example.com"], + }, + ) assert headers_hyphen.reply_to == ["reply-hyphen@example.com"] # Test keyword argument instantiation @@ -91,4 +95,3 @@ def test_ses_reply_to_header(): reply_to=["reply-kwarg@example.com"], ) assert headers_kwarg.reply_to == ["reply-kwarg@example.com"] -