-
Notifications
You must be signed in to change notification settings - Fork 421
/
Copy pathtest_parser.py
112 lines (80 loc) · 3.64 KB
/
test_parser.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import json
from typing import Dict, Union
import pydantic
import pytest
from aws_lambda_powertools.utilities.parser import (
ValidationError,
event_parser,
exceptions,
)
from aws_lambda_powertools.utilities.typing import LambdaContext
@pytest.mark.parametrize("invalid_value", [None, bool(), [], (), object])
def test_parser_unsupported_event(dummy_schema, invalid_value):
@event_parser(model=dummy_schema)
def handle_no_envelope(event: Dict, _: LambdaContext):
return event
with pytest.raises(ValidationError):
handle_no_envelope(event=invalid_value, context=LambdaContext())
@pytest.mark.parametrize(
"invalid_envelope,expected",
[(True, ""), (["dummy"], ""), (object, exceptions.InvalidEnvelopeError)],
)
def test_parser_invalid_envelope_type(dummy_event, dummy_schema, invalid_envelope, expected):
@event_parser(model=dummy_schema, envelope=invalid_envelope)
def handle_no_envelope(event: Dict, _: LambdaContext):
return event
if hasattr(expected, "__cause__"):
with pytest.raises(expected):
handle_no_envelope(event=dummy_event["payload"], context=LambdaContext())
else:
handle_no_envelope(event=dummy_event["payload"], context=LambdaContext())
def test_parser_schema_with_envelope(dummy_event, dummy_schema, dummy_envelope):
@event_parser(model=dummy_schema, envelope=dummy_envelope)
def handle_no_envelope(event: Dict, _: LambdaContext):
return event
handle_no_envelope(dummy_event, LambdaContext())
def test_parser_schema_no_envelope(dummy_event, dummy_schema):
@event_parser(model=dummy_schema)
def handle_no_envelope(event: Dict, _: LambdaContext):
return event
handle_no_envelope(dummy_event["payload"], LambdaContext())
@pytest.mark.usefixtures("pydanticv2_only")
def test_pydanticv2_validation():
class FakeModel(pydantic.BaseModel):
region: str
event_name: str
version: int
# WHEN using the validator for v2
@pydantic.field_validator("version", mode="before")
def validate_field(cls, value):
return int(value)
event_raw = {"region": "us-east-1", "event_name": "aws-powertools", "version": "10"}
event_parsed = FakeModel(**event_raw)
# THEN parse the event as expected
assert event_parsed.region == event_raw["region"]
assert event_parsed.event_name == event_raw["event_name"]
assert event_parsed.version == int(event_raw["version"])
@pytest.mark.parametrize("invalid_schema", [None, str, bool(), [], (), object])
def test_parser_with_invalid_schema_type(dummy_event, invalid_schema):
@event_parser(model=invalid_schema)
def handle_no_envelope(event: Dict, _: LambdaContext):
return event
with pytest.raises(exceptions.InvalidModelTypeError):
handle_no_envelope(event=dummy_event, context=LambdaContext())
def test_parser_event_as_json_string(dummy_event, dummy_schema):
dummy_event = json.dumps(dummy_event["payload"])
@event_parser(model=dummy_schema)
def handle_no_envelope(event: Union[Dict, str], _: LambdaContext):
return event
handle_no_envelope(dummy_event, LambdaContext())
def test_parser_event_with_type_hint(dummy_event, dummy_schema):
@event_parser()
def handler(event: dummy_schema, _: LambdaContext):
assert event.message == "hello world"
handler(dummy_event["payload"], LambdaContext())
def test_parser_event_without_type_hint(dummy_event, dummy_schema):
@event_parser()
def handler(event, _):
assert event.message == "hello world"
with pytest.raises(exceptions.InvalidModelTypeError):
handler(dummy_event["payload"], LambdaContext())