Skip to content

Commit 2e115dd

Browse files
committed
fix: improve coverage of encoders
1 parent d116be2 commit 2e115dd

File tree

1 file changed

+183
-0
lines changed

1 file changed

+183
-0
lines changed
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
from dataclasses import dataclass
2+
from typing import List
3+
4+
from pydantic import BaseModel
5+
from pydantic.color import Color
6+
7+
from aws_lambda_powertools.event_handler.openapi.encoders import jsonable_encoder
8+
9+
10+
def test_openapi_encode_include():
11+
class User(BaseModel):
12+
name: str
13+
age: int
14+
15+
result = jsonable_encoder(User(name="John", age=20), include=["name"])
16+
assert result == {"name": "John"}
17+
18+
19+
def test_openapi_encode_exclude():
20+
class User(BaseModel):
21+
name: str
22+
age: int
23+
24+
result = jsonable_encoder(User(name="John", age=20), exclude=["age"])
25+
assert result == {"name": "John"}
26+
27+
28+
def test_openapi_encode_pydantic():
29+
class Order(BaseModel):
30+
quantity: int
31+
32+
class User(BaseModel):
33+
name: str
34+
order: Order
35+
36+
result = jsonable_encoder(User(name="John", order=Order(quantity=2)))
37+
assert result == {"name": "John", "order": {"quantity": 2}}
38+
39+
40+
def test_openapi_encode_pydantic_root_types():
41+
class User(BaseModel):
42+
__root__: List[str]
43+
44+
result = jsonable_encoder(User(__root__=["John", "Jane"]))
45+
assert result == ["John", "Jane"]
46+
47+
48+
def test_openapi_encode_dataclass():
49+
@dataclass
50+
class Order:
51+
quantity: int
52+
53+
@dataclass
54+
class User:
55+
name: str
56+
order: Order
57+
58+
result = jsonable_encoder(User(name="John", order=Order(quantity=2)))
59+
assert result == {"name": "John", "order": {"quantity": 2}}
60+
61+
62+
def test_openapi_encode_enum():
63+
from enum import Enum
64+
65+
class Color(Enum):
66+
RED = "red"
67+
GREEN = "green"
68+
BLUE = "blue"
69+
70+
result = jsonable_encoder(Color.RED)
71+
assert result == "red"
72+
73+
74+
def test_openapi_encode_purepath():
75+
from pathlib import PurePath
76+
77+
result = jsonable_encoder(PurePath("/foo/bar"))
78+
assert result == "/foo/bar"
79+
80+
81+
def test_openapi_encode_scalars():
82+
result = jsonable_encoder("foo")
83+
assert result == "foo"
84+
85+
result = jsonable_encoder(1)
86+
assert result == 1
87+
88+
result = jsonable_encoder(1.0)
89+
assert result == 1.0
90+
91+
result = jsonable_encoder(True)
92+
assert result is True
93+
94+
result = jsonable_encoder(None)
95+
assert result is None
96+
97+
98+
def test_openapi_encode_dict():
99+
result = jsonable_encoder({"foo": "bar"})
100+
assert result == {"foo": "bar"}
101+
102+
103+
def test_openapi_encode_dict_with_include():
104+
result = jsonable_encoder({"foo": "bar", "bar": "foo"}, include=["foo"])
105+
assert result == {"foo": "bar"}
106+
107+
108+
def test_openapi_encode_dict_with_exclude():
109+
result = jsonable_encoder({"foo": "bar", "bar": "foo"}, exclude=["bar"])
110+
assert result == {"foo": "bar"}
111+
112+
113+
def test_openapi_encode_sequences():
114+
result = jsonable_encoder(["foo", "bar"])
115+
assert result == ["foo", "bar"]
116+
117+
result = jsonable_encoder(("foo", "bar"))
118+
assert result == ["foo", "bar"]
119+
120+
result = jsonable_encoder({"foo", "bar"})
121+
assert set(result) == {"foo", "bar"}
122+
123+
result = jsonable_encoder(frozenset(("foo", "bar")))
124+
assert set(result) == {"foo", "bar"}
125+
126+
127+
def test_openapi_encode_bytes():
128+
result = jsonable_encoder(b"foo")
129+
assert result == "foo"
130+
131+
132+
def test_openapi_encode_timedelta():
133+
from datetime import timedelta
134+
135+
result = jsonable_encoder(timedelta(seconds=1))
136+
assert result == 1
137+
138+
139+
def test_openapi_encode_decimal():
140+
from decimal import Decimal
141+
142+
result = jsonable_encoder(Decimal("1.0"))
143+
assert result == 1.0
144+
145+
result = jsonable_encoder(Decimal("1"))
146+
assert result == 1
147+
148+
149+
def test_openapi_encode_uuid():
150+
from uuid import UUID
151+
152+
result = jsonable_encoder(UUID("123e4567-e89b-12d3-a456-426614174000"))
153+
assert result == "123e4567-e89b-12d3-a456-426614174000"
154+
155+
156+
def test_openapi_encode_encodable():
157+
from datetime import date, datetime, time
158+
159+
result = jsonable_encoder(date(2021, 1, 1))
160+
assert result == "2021-01-01"
161+
162+
result = jsonable_encoder(datetime(2021, 1, 1, 0, 0, 0))
163+
assert result == "2021-01-01T00:00:00"
164+
165+
result = jsonable_encoder(time(0, 0, 0))
166+
assert result == "00:00:00"
167+
168+
169+
def test_openapi_encode_subclasses():
170+
class MyColor(Color):
171+
pass
172+
173+
result = jsonable_encoder(MyColor("red"))
174+
assert result == "red"
175+
176+
177+
def test_openapi_encode_other():
178+
class User:
179+
def __init__(self, name: str):
180+
self.name = name
181+
182+
result = jsonable_encoder(User(name="John"))
183+
assert result == {"name": "John"}

0 commit comments

Comments
 (0)