Skip to content

Commit dc64b8a

Browse files
author
Ran Isenberg
committed
Add validate function, fix flake8 issues
1 parent bce7aab commit dc64b8a

File tree

7 files changed

+93
-26
lines changed

7 files changed

+93
-26
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
"""Validation utility
22
"""
33
from .envelopes import DynamoDBEnvelope, EventBridgeEnvelope, SnsEnvelope, SqsEnvelope, UserEnvelope
4-
from .validator import validator
4+
from .validator import validate, validator
55

6-
__all__ = ["UserEnvelope", "DynamoDBEnvelope", "EventBridgeEnvelope", "SnsEnvelope", "SqsEnvelope", "validator"]
6+
__all__ = [
7+
"UserEnvelope",
8+
"DynamoDBEnvelope",
9+
"EventBridgeEnvelope",
10+
"SnsEnvelope",
11+
"SqsEnvelope",
12+
"validate",
13+
"validator",
14+
]

aws_lambda_powertools/utilities/validation/envelopes/__init__.py

+1-8
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,4 @@
44
from .sns import SnsEnvelope
55
from .sqs import SqsEnvelope
66

7-
8-
__all__ = [
9-
"UserEnvelope",
10-
"DynamoDBEnvelope",
11-
"EventBridgeEnvelope",
12-
"SqsEnvelope",
13-
"SnsEnvelope"
14-
]
7+
__all__ = ["UserEnvelope", "DynamoDBEnvelope", "EventBridgeEnvelope", "SqsEnvelope", "SnsEnvelope"]

aws_lambda_powertools/utilities/validation/envelopes/event_bridge.py

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from aws_lambda_powertools.utilities.validation.envelopes.base import BaseEnvelope
77
from aws_lambda_powertools.utilities.validation.schemas import EventBridgeSchema
88

9-
109
logger = logging.getLogger(__name__)
1110

1211

aws_lambda_powertools/utilities/validation/envelopes/sns.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@
1212
class SnsEnvelope(BaseEnvelope):
1313
def parse(self, event: Dict[str, Any], inbound_schema_model: BaseModel) -> Any:
1414
try:
15-
parsed_envelope = SnsSchema(**event)
15+
SnsSchema(**event)
1616
except (ValidationError, TypeError):
1717
logger.exception("Validation exception received from input sqs event")
1818
raise
19-
## TODO
2019
return None

aws_lambda_powertools/utilities/validation/schemas/sqs.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,4 @@ class SqsRecordSchema(BaseModel):
5757

5858

5959
class SqsSchema(BaseModel):
60-
Records: List[SqsRecordSchema]
60+
Records: List[SqsRecordSchema]

aws_lambda_powertools/utilities/validation/validator.py

+10
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,16 @@
99
logger = logging.getLogger(__name__)
1010

1111

12+
def validate(
13+
event: Dict[str, Any], schema_model: BaseModel, envelope: BaseEnvelope, return_parsed_event: bool = False
14+
) -> Any:
15+
logger.debug("Validating schema")
16+
parsed_event_model = envelope.parse(event=event, inbound_schema_model=schema_model)
17+
if return_parsed_event:
18+
return parsed_event_model
19+
return None
20+
21+
1222
@lambda_handler_decorator
1323
def validator(
1424
handler: Callable[[Dict, Any], Any],

tests/functional/test_validator.py

+70-12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import io
21
from http import HTTPStatus
32
from typing import Any, Dict, Optional
43

@@ -12,10 +11,79 @@
1211
EventBridgeEnvelope,
1312
SqsEnvelope,
1413
UserEnvelope,
15-
validator
14+
validate,
15+
validator,
1616
)
1717

1818

19+
class MyMessage(BaseModel):
20+
message: str
21+
messageId: int
22+
23+
24+
def test_validate_function():
25+
eventbridge_event = {
26+
"version": "0",
27+
"id": "553961c5-5017-5763-6f21-f88d5f5f4b05",
28+
"detail-type": "my func stream event json",
29+
"source": "arn:aws:lambda:eu-west-1:88888888:function:my_func",
30+
"account": "88888888",
31+
"time": "2020-02-11T08:18:09Z",
32+
"region": "eu-west-1",
33+
"resources": ["arn:aws:dynamodb:eu-west-1:88888888:table/stream/2020-02"],
34+
"detail": {"message": "hello", "messageId": 8},
35+
}
36+
parsed_event = validate(eventbridge_event, MyMessage, EventBridgeEnvelope(), True)
37+
assert parsed_event.dict() == {"message": "hello", "messageId": 8}
38+
39+
40+
def test_validate_function_no_return_value():
41+
eventbridge_event = {
42+
"version": "0",
43+
"id": "553961c5-5017-5763-6f21-f88d5f5f4b05",
44+
"detail-type": "my func stream event json",
45+
"source": "arn:aws:lambda:eu-west-1:88888888:function:my_func",
46+
"account": "88888888",
47+
"time": "2020-02-11T08:18:09Z",
48+
"region": "eu-west-1",
49+
"resources": ["arn:aws:dynamodb:eu-west-1:88888888:table/stream/2020-02"],
50+
"detail": {"message": "hello", "messageId": 8},
51+
}
52+
parsed_event = validate(eventbridge_event, MyMessage, EventBridgeEnvelope())
53+
assert parsed_event is None
54+
55+
56+
def test_validate_function_fail_envelope():
57+
eventbridge_event = {
58+
"version": "0",
59+
"id": "553961c5-5017-5763-6f21-f88d5f5f4b05",
60+
"detail-type": "my func stream event json",
61+
"source": "arn:aws:lambda:eu-west-1:88888888:function:my_func",
62+
"time": "2020-02-11T08:18:09Z",
63+
"region": "eu-west-1",
64+
"resources": ["arn:aws:dynamodb:eu-west-1:88888888:table/stream/2020-02"],
65+
"detail": {"message": "hello", "messageId": 8},
66+
}
67+
with pytest.raises(ValidationError):
68+
validate(eventbridge_event, MyMessage, EventBridgeEnvelope())
69+
70+
71+
def test_validate_function_fail_user_schema():
72+
eventbridge_event = {
73+
"version": "0",
74+
"id": "553961c5-5017-5763-6f21-f88d5f5f4b05",
75+
"detail-type": "my func stream event json",
76+
"source": "arn:aws:lambda:eu-west-1:88888888:function:my_func",
77+
"account": "88888888",
78+
"time": "2020-02-11T08:18:09Z",
79+
"region": "eu-west-1",
80+
"resources": ["arn:aws:dynamodb:eu-west-1:88888888:table/stream/2020-02"],
81+
"detail": {"mess11age": "hello", "messageId": 8},
82+
}
83+
with pytest.raises(ValidationError):
84+
validate(eventbridge_event, MyMessage, EventBridgeEnvelope())
85+
86+
1987
class OutboundSchema(BaseModel):
2088
response_code: HTTPStatus
2189
message: str
@@ -25,11 +93,6 @@ class InboundSchema(BaseModel):
2593
greeting: str
2694

2795

28-
@pytest.fixture
29-
def stdout():
30-
return io.StringIO()
31-
32-
3396
@validator(inbound_schema_model=InboundSchema, outbound_schema_model=OutboundSchema, envelope=UserEnvelope())
3497
def my_handler(event: Dict[str, Any], context: LambdaContext) -> Dict[str, Optional[Any]]:
3598
assert event["custom"]
@@ -58,11 +121,6 @@ def test_fail_inbound_validation():
58121
my_handler({"this_fails": "hello"}, LambdaContext())
59122

60123

61-
class MyMessage(BaseModel):
62-
message: str
63-
messageId: int
64-
65-
66124
@validator(inbound_schema_model=MyMessage, outbound_schema_model=OutboundSchema, envelope=DynamoDBEnvelope())
67125
def dynamodb_handler(event: Dict[str, Any], context: LambdaContext) -> Dict[str, Optional[Any]]:
68126
assert event["custom"]

0 commit comments

Comments
 (0)