Skip to content

Commit

Permalink
Fixed parameters parse nested model
Browse files Browse the repository at this point in the history
  • Loading branch information
abersheeran committed Mar 13, 2024
1 parent 68a3098 commit f25efee
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 2 deletions.
4 changes: 2 additions & 2 deletions kui/pydantic_compatible.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def validate_model(model: Type[BaseModel], v: Any) -> Tuple[Type[BaseModel], Any
if hasattr(res, "__root__"):
return model, res.__root__
else:
return model, res.dict(by_alias=False)
return model, res.__dict__

def get_model_fields(model: Type[BaseModel]) -> Dict[str, ModelField]: # type: ignore
return model.__fields__ # type: ignore
Expand All @@ -53,7 +53,7 @@ def validate_model(model: Type[BaseModel], v: Any) -> Tuple[Type[BaseModel], Any
if isinstance(res, RootModel):
return model, res.root
else:
return model, res.model_dump(by_alias=False)
return model, res.__dict__

def get_model_fields(model: Type[BaseModel]) -> Dict[str, FieldInfo]: # type: ignore
return model.model_fields
Expand Down
22 changes: 22 additions & 0 deletions tests/asgi/test_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import httpx
import pytest
from async_asgi_testclient import TestClient
from pydantic import BaseModel
from typing_extensions import Annotated

from kui.asgi import (
Expand Down Expand Up @@ -255,3 +256,24 @@ async def upload_file(file: Annotated[UploadFile, Body(...)]):

resp = await client.post("/", files={"file0": io.BytesIO(b"123")})
assert resp.status_code == 422


@pytest.mark.asyncio
async def test_parameters_nest_model():
app = Kui()

class User(BaseModel):
name: str
age: int

@app.router.http.post("/")
async def create_user(user: Annotated[User, Body(...)]):
assert user.age >= 18
return user

async with httpx.AsyncClient(app=app, base_url="http://testserver") as client:
resp = await client.post("/", json={"user": {"name": "aber", "age": 18}})
assert resp.json() == {"name": "aber", "age": 18}

resp = await client.post("/", json={"name": "aber", "age": 18})
assert resp.status_code == 422
21 changes: 21 additions & 0 deletions tests/wsgi/test_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import httpx
from httpx import Client
from pydantic import BaseModel
from typing_extensions import Annotated

from kui.wsgi import (
Expand Down Expand Up @@ -245,3 +246,23 @@ def upload_file(file: Annotated[UploadFile, Body(...)]):

resp = client.post("/", files={"file0": io.BytesIO(b"123")})
assert resp.status_code == 422


def test_parameters_nest_model():
app = Kui()

class User(BaseModel):
name: str
age: int

@app.router.http.post("/")
def create_user(user: Annotated[User, Body(...)]):
assert user.age >= 18
return user

with httpx.Client(app=app, base_url="http://testserver") as client:
resp = client.post("/", json={"user": {"name": "aber", "age": 18}})
assert resp.json() == {"name": "aber", "age": 18}

resp = client.post("/", json={"name": "aber", "age": 18})
assert resp.status_code == 422

0 comments on commit f25efee

Please sign in to comment.