Skip to content

Commit 864b892

Browse files
committed
test-coverage: added more test
1 parent 971ed37 commit 864b892

File tree

7 files changed

+76
-43
lines changed

7 files changed

+76
-43
lines changed

ellar/common/responses/models/json.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,4 @@ def serialize(
9191
)
9292
except Exception: # pragma:no cover
9393
"""Could not serialize response obj"""
94-
return response_obj
94+
return response_obj

ellar/common/routing/base.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,11 @@ class RouteOperationBase:
3434

3535
def __init__(self, endpoint: t.Callable) -> None:
3636
self.endpoint = endpoint
37-
_controller_type: t.Type = reflect.get_metadata( # type: ignore[assignment]
38-
CONTROLLER_CLASS_KEY, self.endpoint
39-
)
40-
self._controller_type: t.Union[t.Type, t.Type["ControllerBase"]] = t.cast(
37+
38+
self._controller_type = None
39+
_controller_type: t.Type = self.get_controller_type()
40+
41+
self._controller_type: t.Union[t.Type, t.Type["ControllerBase"]] = t.cast( # type:ignore[no-redef]
4142
t.Union[t.Type, t.Type["ControllerBase"]], _controller_type
4243
)
4344

ellar/common/routing/schema.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class WsRouteParameters(Serializer):
7171
endpoint: t.Callable
7272
encoding: t.Optional[str] = Field("json")
7373
use_extra_handler: bool = Field(False)
74-
extra_handler_type: t.Optional[t.Type["WebSocketExtraHandler"]] = None
74+
extra_handler_type: t.Optional[t.Type[WebSocketExtraHandler]] = None
7575
_kwargs: t.Dict = PrivateAttr()
7676

7777
def __init__(self, **data: t.Any) -> None:

ellar/common/routing/websocket/handler.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from ellar.common.interfaces import IExecutionContext
66
from ellar.common.logger import request_logger
77
from ellar.common.params import WebsocketEndpointArgsModel
8-
from ellar.pydantic import as_pydantic_validator
98
from starlette import status
109
from starlette.exceptions import WebSocketException
1110
from starlette.status import WS_1008_POLICY_VIOLATION
@@ -15,7 +14,7 @@
1514
from ellar.core.connection import WebSocket
1615

1716

18-
@as_pydantic_validator("__validate_input__")
17+
# @as_pydantic_validator("__validate_input__")
1918
class WebSocketExtraHandler:
2019
def __init__(
2120
self,
@@ -157,16 +156,17 @@ async def decode(self, websocket: "WebSocket", message: Message) -> t.Any:
157156
), f"Unsupported 'encoding' attribute {self.encoding}"
158157
return message["text"] if message.get("text") else message["bytes"]
159158

160-
@classmethod
161-
def __validate_input__(cls, __input_value: t.Any, _: t.Any) -> t.Any:
162-
if not isinstance(__input_value, type):
163-
raise ValueError(
164-
f"Expected Type[WebSocketExtraHandler], received: {type(__input_value)}"
165-
)
166-
if WebSocketExtraHandler != __input_value or not issubclass(
167-
__input_value, WebSocketExtraHandler
168-
):
169-
raise ValueError(
170-
f"Expected Type[WebSocketExtraHandler], received: {type(__input_value)}"
171-
)
172-
return __input_value
159+
# THIS HAS BEEN TAKEN CARE OF BY PYDANTIC v2
160+
# @classmethod
161+
# def __validate_input__(cls, __input_value: t.Any, _: t.Any) -> t.Any:
162+
# if not isinstance(__input_value, type):
163+
# raise ValueError(
164+
# f"Expected Type[WebSocketExtraHandler], received: {type(__input_value)}"
165+
# )
166+
# if WebSocketExtraHandler != __input_value or not issubclass(
167+
# __input_value, WebSocketExtraHandler
168+
# ):
169+
# raise ValueError(
170+
# f"Expected Type[WebSocketExtraHandler], received: {type(__input_value)}"
171+
# )
172+
# return __input_value

ellar/common/serializer/base.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,13 @@ def serialize(
8484
self, serializer_filter: t.Optional[SerializerFilter] = None
8585
) -> t.Dict:
8686
_filter = serializer_filter or self._filter
87-
return t.cast(
88-
dict,
89-
super().model_dump(**_filter.dict()), # type:ignore[misc]
90-
)
87+
return self.model_dump(**_filter.dict())
9188

9289
def serialize_json(
9390
self, serializer_filter: t.Optional[SerializerFilter] = None
9491
) -> str:
9592
_filter = serializer_filter or self._filter
96-
return super().model_dump_json(**_filter.dict()) # type:ignore[no-any-return,misc]
93+
return self.model_dump_json(**_filter.dict())
9794

9895
def dict(self, **kwargs: t.Any) -> t.Dict:
9996
return self.model_dump(**kwargs)

tests/test_response/test_pydantic_response_model.py

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from typing import Dict, List, Optional, Union
22

3+
import ellar.common as common
34
from ellar.app import AppFactory
4-
from ellar.common import ModuleRouter, Serializer, serializer_filter
55
from pydantic import BaseModel, Field
66

7-
mr = ModuleRouter("")
7+
mr = common.ModuleRouter("")
88

99

1010
class Item(BaseModel):
@@ -13,7 +13,7 @@ class Item(BaseModel):
1313
owner_ids: Optional[List[int]] = None
1414

1515

16-
class ItemSerializer(Serializer):
16+
class ItemSerializer(common.Serializer):
1717
name: str = Field(..., alias="aliased_name")
1818
price: Optional[float] = None
1919
owner_ids: Optional[List[int]] = None
@@ -48,19 +48,19 @@ def get_validdict():
4848

4949

5050
@mr.get("/items/valid-exclude-unset")
51-
@serializer_filter(exclude_unset=True)
51+
@common.serializer_filter(exclude_unset=True)
5252
def get_valid_exclude_unset():
5353
return Item(aliased_name="valid", price=1.0)
5454

5555

5656
@mr.get("/items/coerce-exclude-unset")
57-
@serializer_filter(exclude_unset=True)
57+
@common.serializer_filter(exclude_unset=True)
5858
def get_coerce_exclude_unset():
5959
return ItemSerializer(aliased_name="coerce", price="1.0")
6060

6161

6262
@mr.get("/items/validlist-exclude-unset")
63-
@serializer_filter(exclude_unset=True)
63+
@common.serializer_filter(exclude_unset=True)
6464
def get_validlist_exclude_unset():
6565
return [
6666
Item(aliased_name="foo"),
@@ -70,7 +70,7 @@ def get_validlist_exclude_unset():
7070

7171

7272
@mr.get("/items/validdict-exclude-unset")
73-
@serializer_filter(exclude_unset=True)
73+
@common.serializer_filter(exclude_unset=True)
7474
def get_validdict_exclude_unset():
7575
return {
7676
"k1": ItemSerializer(aliased_name="foo"),
@@ -79,6 +79,22 @@ def get_validdict_exclude_unset():
7979
}
8080

8181

82+
@mr.get(
83+
"/items/valid-ellipsis-response-model",
84+
response={201: Dict[str, ItemSerializer], ...: List[Item]},
85+
)
86+
def get_valid_ellipsis(switch: common.Query[str]):
87+
if switch == "ellipsis":
88+
return [
89+
Item(aliased_name="bar", price=1.0),
90+
Item(aliased_name="bar2", price=2.0),
91+
]
92+
return 201, {
93+
"k1": ItemSerializer(aliased_name="foo"),
94+
"k3": ItemSerializer(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]),
95+
}
96+
97+
8298
app = AppFactory.create_app(routers=(mr,))
8399

84100

@@ -156,3 +172,18 @@ def test_validdict_exclude_unset(test_client_factory):
156172
"k2": {"aliased_name": "bar", "price": 1.0},
157173
"k3": {"aliased_name": "baz", "price": 2.0, "owner_ids": [1, 2, 3]},
158174
}
175+
176+
177+
def test_valid_ellipsis(test_client_factory):
178+
client = test_client_factory(app)
179+
response = client.get("/items/valid-ellipsis-response-model?switch=ellipsis")
180+
response.raise_for_status()
181+
assert response.json() == [
182+
{"aliased_name": "bar", "owner_ids": None, "price": 1.0},
183+
{"aliased_name": "bar2", "owner_ids": None, "price": 2.0},
184+
]
185+
response = client.get("/items/valid-ellipsis-response-model?switch=none")
186+
assert response.json() == {
187+
"k1": {"aliased_name": "foo", "owner_ids": None, "price": None},
188+
"k3": {"aliased_name": "baz", "owner_ids": [1, 2, 3], "price": 2.0},
189+
}

tests/test_response/test_route_response_model.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import List, Union
22

33
import pytest
4-
from ellar.common.constants import RESPONSE_OVERRIDE_KEY
4+
from ellar.common.constants import CONTROLLER_CLASS_KEY, RESPONSE_OVERRIDE_KEY
55
from ellar.common.exceptions import ImproperConfiguration
66
from ellar.common.responses.models import (
77
EmptyAPIResponseModel,
@@ -111,14 +111,18 @@ def test_route_response_model_exception(inputs):
111111

112112

113113
def test_invalid_response_override_definition():
114-
reflect.define_metadata(
115-
RESPONSE_OVERRIDE_KEY, {EmptyAPIResponseModel()}, endpoint_sample
116-
)
117-
with pytest.raises(ImproperConfiguration) as ex:
118-
RouteOperation(
119-
path="/",
120-
methods=["get"],
121-
endpoint=endpoint_sample,
122-
response={200: EmptyAPIResponseModel()},
114+
with reflect.context():
115+
reflect.define_metadata(
116+
RESPONSE_OVERRIDE_KEY, {EmptyAPIResponseModel()}, endpoint_sample
123117
)
118+
reflect.define_metadata(
119+
CONTROLLER_CLASS_KEY, type("endpoint_sample_class", (), {}), endpoint_sample
120+
)
121+
with pytest.raises(ImproperConfiguration) as ex:
122+
RouteOperation(
123+
path="/",
124+
methods=["get"],
125+
endpoint=endpoint_sample,
126+
response={200: EmptyAPIResponseModel()},
127+
)
124128
assert "`RESPONSE_OVERRIDE` is must be of type `Dict`" in str(ex)

0 commit comments

Comments
 (0)