From 1a41ba664c292eccd3bd3c64d0922cc51dd52177 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Thu, 20 Feb 2025 16:34:56 +0000 Subject: [PATCH 1/2] Fixing scheduler detail field --- .../utilities/parser/models/event_bridge.py | 8 +++++++- tests/events/eventBridgeSchedulerEvent.json | 13 +++++++++++++ tests/unit/parser/_pydantic/test_eventbridge.py | 8 ++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 tests/events/eventBridgeSchedulerEvent.json diff --git a/aws_lambda_powertools/utilities/parser/models/event_bridge.py b/aws_lambda_powertools/utilities/parser/models/event_bridge.py index d19a5a51461..44fd8c10bf3 100644 --- a/aws_lambda_powertools/utilities/parser/models/event_bridge.py +++ b/aws_lambda_powertools/utilities/parser/models/event_bridge.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import List, Optional -from pydantic import BaseModel, ConfigDict, Field +from pydantic import BaseModel, ConfigDict, Field, field_validator from aws_lambda_powertools.utilities.parser.types import RawDictOrModel @@ -19,3 +19,9 @@ class EventBridgeModel(BaseModel): detail_type: str = Field(..., alias="detail-type") detail: RawDictOrModel replay_name: Optional[str] = Field(None, alias="replay-name") + + @field_validator("detail", mode="before") + def validate_detail(cls, v, fields): + # EventBridge Scheduler sends detail field as '{}' string when no payload is present + # See: https://github.com/aws-powertools/powertools-lambda-python/issues/6112 + return {} if fields.data.get("source") == "aws.scheduler" and v == "{}" else v diff --git a/tests/events/eventBridgeSchedulerEvent.json b/tests/events/eventBridgeSchedulerEvent.json new file mode 100644 index 00000000000..25ef89db982 --- /dev/null +++ b/tests/events/eventBridgeSchedulerEvent.json @@ -0,0 +1,13 @@ +{ + "version":"0", + "id":"d167b752-343a-4b28-afd6-d4de056319e8", + "detail-type":"Scheduled Event", + "source":"aws.scheduler", + "account":"533568316194", + "time":"2025-02-20T16:03:00Z", + "region":"us-east-1", + "resources":[ + "arn:aws:scheduler:us-east-1:123456789012:schedule/default/aaaaa" + ], + "detail":"{}" +} diff --git a/tests/unit/parser/_pydantic/test_eventbridge.py b/tests/unit/parser/_pydantic/test_eventbridge.py index 056a3bb2591..585406e7095 100644 --- a/tests/unit/parser/_pydantic/test_eventbridge.py +++ b/tests/unit/parser/_pydantic/test_eventbridge.py @@ -1,6 +1,7 @@ import pytest from aws_lambda_powertools.utilities.parser import ValidationError, envelopes, parse +from aws_lambda_powertools.utilities.parser.models import EventBridgeModel from tests.functional.utils import load_event from tests.unit.parser._pydantic.schemas import ( MyAdvancedEventbridgeBusiness, @@ -51,3 +52,10 @@ def test_handle_invalid_event_with_eventbridge_envelope(): empty_event = {} with pytest.raises(ValidationError): parse(event=empty_event, model=MyEventbridgeBusiness, envelope=envelopes.EventBridgeEnvelope) + + +def test_handle_eventbridge_scheduler(): + raw_event = load_event("eventBridgeSchedulerEvent.json") + parsed_event: EventBridgeModel = EventBridgeModel(**raw_event) + + assert parsed_event.detail == {} From e6cd557b5b13af661dc954eacf3357a9995821ab Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Thu, 20 Feb 2025 16:49:34 +0000 Subject: [PATCH 2/2] Fixing scheduler detail field --- tests/events/eventBridgeSchedulerEvent.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/events/eventBridgeSchedulerEvent.json b/tests/events/eventBridgeSchedulerEvent.json index 25ef89db982..9ced359e471 100644 --- a/tests/events/eventBridgeSchedulerEvent.json +++ b/tests/events/eventBridgeSchedulerEvent.json @@ -3,7 +3,7 @@ "id":"d167b752-343a-4b28-afd6-d4de056319e8", "detail-type":"Scheduled Event", "source":"aws.scheduler", - "account":"533568316194", + "account":"123456789012", "time":"2025-02-20T16:03:00Z", "region":"us-east-1", "resources":[