Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions aws_lambda_powertools/utilities/data_classes/common.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import base64
import json
from typing import Any, Dict, Optional

Expand Down Expand Up @@ -66,6 +67,14 @@ def json_body(self) -> Any:
"""Parses the submitted body as json"""
return json.loads(self["body"])

@property
def decode_body(self) -> str:
"""Dynamically base64 decode body as a str"""
body: str = self["body"]
if self.is_base64_encoded:
return base64.b64decode(body.encode()).decode()
return body

@property
def path(self) -> str:
return self["path"]
Expand Down
35 changes: 35 additions & 0 deletions tests/functional/test_data_classes.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
from secrets import compare_digest
from urllib.parse import quote_plus

import pytest

from aws_lambda_powertools.utilities.data_classes import (
ALBEvent,
APIGatewayProxyEvent,
Expand Down Expand Up @@ -843,6 +845,39 @@ def test_base_proxy_event_get_header_value_case_insensitive():
assert value is None


def test_base_proxy_event_json_body_key_error():
event = BaseProxyEvent({})
with pytest.raises(KeyError) as ke:
assert not event.json_body
assert str(ke.value) == "'body'"


def test_base_proxy_event_json_body():
data = {"message": "Foo"}
event = BaseProxyEvent({"body": json.dumps(data)})
assert event.json_body == data


def test_base_proxy_event_decode_body_key_error():
event = BaseProxyEvent({})
with pytest.raises(KeyError) as ke:
assert not event.decode_body
assert str(ke.value) == "'body'"


def test_base_proxy_event_decode_body_encoded_false():
data = "Foo"
event = BaseProxyEvent({"body": data, "isBase64Encoded": False})
assert event.decode_body == data


def test_base_proxy_event_decode_body_encoded_true():
data = "Foo"
encoded_data = base64.b64encode(data.encode()).decode()
event = BaseProxyEvent({"body": encoded_data, "isBase64Encoded": True})
assert event.decode_body == data


def test_kinesis_stream_event():
event = KinesisStreamEvent(load_event("kinesisStreamEvent.json"))

Expand Down