Skip to content

Commit 2a90803

Browse files
committed
chore: added first tests
1 parent 84545a9 commit 2a90803

File tree

3 files changed

+160
-9
lines changed

3 files changed

+160
-9
lines changed

aws_lambda_powertools/event_handler/api_gateway.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -374,11 +374,13 @@ def _get_openapi_path(
374374
success_response["content"] = {"application/json": {"schema": {}}}
375375
json_response = success_response["content"].setdefault("application/json", {})
376376

377-
json_response["schema"] = self._openapi_operation_return(
378-
operation_id=self.operation_id,
379-
param=dependant.return_param,
380-
model_name_map=model_name_map,
381-
field_mapping=field_mapping,
377+
json_response.update(
378+
self._openapi_operation_return(
379+
operation_id=self.operation_id,
380+
param=dependant.return_param,
381+
model_name_map=model_name_map,
382+
field_mapping=field_mapping,
383+
),
382384
)
383385

384386
path[self.method.lower()] = operation
@@ -387,8 +389,7 @@ def _get_openapi_path(
387389
return path, definitions
388390

389391
def _openapi_operation_summary(self) -> str:
390-
# Generate a summary from the pattern
391-
return self.rule.__str__().replace("_", " ").title()
392+
return f"{self.method.upper()} {self.path}"
392393

393394
def _openapi_operation_metadata(self, operation_ids: Set[str]) -> Dict[str, Any]:
394395
operation: Dict[str, Any] = {}

aws_lambda_powertools/event_handler/openapi/models.py

-2
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,6 @@ class Config:
269269
# https://swagger.io/specification/#media-type-object
270270
class MediaType(BaseModel):
271271
schema_: Optional[Union[Schema, Reference]] = Field(default=None, alias="schema")
272-
example: Optional[Any] = None
273272
examples: Optional[Dict[str, Union[Example, Reference]]] = None
274273
encoding: Optional[Dict[str, Encoding]] = None
275274

@@ -292,7 +291,6 @@ class ParameterBase(BaseModel):
292291
explode: Optional[bool] = None
293292
allowReserved: Optional[bool] = None
294293
schema_: Optional[Union[Schema, Reference]] = Field(default=None, alias="schema")
295-
example: Optional[Any] = None
296294
examples: Optional[Dict[str, Union[Example, Reference]]] = None
297295
# Serialization rules for more complex scenarios
298296
content: Optional[Dict[str, MediaType]] = None
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
from dataclasses import dataclass
2+
3+
from pydantic import BaseModel
4+
5+
from aws_lambda_powertools.event_handler.api_gateway import ApiGatewayResolver
6+
from aws_lambda_powertools.event_handler.openapi.models import (
7+
Parameter,
8+
ParameterInType,
9+
Schema,
10+
)
11+
12+
13+
def test_openapi_no_params():
14+
app = ApiGatewayResolver()
15+
16+
@app.get("/")
17+
def handler():
18+
pass
19+
20+
schema = app.get_openapi_schema(title="Hello API", version="1.0.0")
21+
22+
assert len(schema.paths.keys()) == 1
23+
assert "/" in schema.paths
24+
25+
path = schema.paths["/"]
26+
assert path.get
27+
28+
get = path.get
29+
assert get.summary == "GET /"
30+
assert get.operationId == "GetHandler"
31+
32+
assert "200" in get.responses
33+
response = get.responses["200"]
34+
assert response.description == "Success"
35+
36+
assert "application/json" in response.content
37+
json_response = response.content["application/json"]
38+
assert json_response.schema_ == Schema()
39+
assert not json_response.examples
40+
assert not json_response.encoding
41+
42+
43+
def test_openapi_with_scalar_params():
44+
app = ApiGatewayResolver()
45+
46+
@app.get("/users/<user_id>")
47+
def handler(user_id: str, include_extra: bool = False):
48+
pass
49+
50+
schema = app.get_openapi_schema(title="Hello API", version="1.0.0")
51+
52+
assert len(schema.paths.keys()) == 1
53+
assert "/users/<user_id>" in schema.paths
54+
55+
path = schema.paths["/users/<user_id>"]
56+
assert path.get
57+
58+
get = path.get
59+
assert get.summary == "GET /users/<user_id>"
60+
assert get.operationId == "GetHandler"
61+
assert len(get.parameters) == 2
62+
63+
parameter = get.parameters[0]
64+
assert isinstance(parameter, Parameter)
65+
assert parameter.in_ == ParameterInType.path
66+
assert parameter.name == "user_id"
67+
assert parameter.required is True
68+
assert parameter.schema_.default is None
69+
assert parameter.schema_.type == "string"
70+
assert parameter.schema_.title == "User Id"
71+
72+
parameter = get.parameters[1]
73+
assert isinstance(parameter, Parameter)
74+
assert parameter.in_ == ParameterInType.query
75+
assert parameter.name == "include_extra"
76+
assert parameter.required is False
77+
assert parameter.schema_.default is False
78+
assert parameter.schema_.type == "boolean"
79+
assert parameter.schema_.title == "Include Extra"
80+
81+
82+
def test_openapi_with_scalar_returns():
83+
app = ApiGatewayResolver()
84+
85+
@app.get("/")
86+
def handler() -> str:
87+
return "Hello, world"
88+
89+
schema = app.get_openapi_schema(title="Hello API", version="1.0.0")
90+
assert len(schema.paths.keys()) == 1
91+
92+
get = schema.paths["/"].get
93+
assert get.parameters is None
94+
95+
response = get.responses["200"].content["application/json"]
96+
assert response.schema_.title == "Return"
97+
assert response.schema_.type == "string"
98+
99+
100+
def test_openapi_with_pydantic_returns():
101+
app = ApiGatewayResolver()
102+
103+
class User(BaseModel):
104+
name: str
105+
106+
@app.get("/")
107+
def handler() -> User:
108+
return User(name="Ruben Fonseca")
109+
110+
schema = app.get_openapi_schema(title="Hello API", version="1.0.0")
111+
assert len(schema.paths.keys()) == 1
112+
113+
get = schema.paths["/"].get
114+
assert get.parameters is None
115+
116+
response = get.responses["200"].content["application/json"]
117+
reference = response.schema_
118+
assert reference.ref == "#/components/schemas/User"
119+
120+
assert "User" in schema.components.schemas
121+
user_schema = schema.components.schemas["User"]
122+
assert isinstance(user_schema, Schema)
123+
assert user_schema.title == "User"
124+
assert "name" in user_schema.properties
125+
126+
127+
def test_openapi_with_dataclasse_return():
128+
app = ApiGatewayResolver()
129+
130+
@dataclass
131+
class User:
132+
surname: str
133+
134+
@app.get("/")
135+
def handler() -> User:
136+
return User(name="Ruben Fonseca")
137+
138+
schema = app.get_openapi_schema(title="Hello API", version="1.0.0")
139+
assert len(schema.paths.keys()) == 1
140+
141+
get = schema.paths["/"].get
142+
assert get.parameters is None
143+
144+
response = get.responses["200"].content["application/json"]
145+
reference = response.schema_
146+
assert reference.ref == "#/components/schemas/User"
147+
148+
assert "User" in schema.components.schemas
149+
user_schema = schema.components.schemas["User"]
150+
assert isinstance(user_schema, Schema)
151+
assert user_schema.title == "User"
152+
assert "surname" in user_schema.properties

0 commit comments

Comments
 (0)