Browse Source

Shield pydantic v2 things from pydantic v1 path

pull/11634/head
Alex Couper 1 year ago
parent
commit
886c1f4643
  1. 54
      tests/test_serialize_response_model.py

54
tests/test_serialize_response_model.py

@ -1,10 +1,11 @@
from typing import Dict, List, Optional from typing import Dict, List, Optional
import pytest import pytest
from pydantic import BaseModel, Field
from starlette.testclient import TestClient
from fastapi import FastAPI from fastapi import FastAPI
from fastapi._compat import PYDANTIC_VERSION from fastapi._compat import PYDANTIC_VERSION
from pydantic import BaseModel, Field, model_serializer
from starlette.testclient import TestClient
app = FastAPI() app = FastAPI()
@ -14,14 +15,6 @@ class Item(BaseModel):
price: Optional[float] = None price: Optional[float] = None
owner_ids: Optional[List[int]] = None owner_ids: Optional[List[int]] = None
@model_serializer(mode="wrap")
def _serialize(self, handler, info):
data = handler(self)
if info.context and info.context.get("mode") == "FASTAPI":
if "price" in data:
data.pop("price")
return data
@app.get("/items/valid", response_model=Item) @app.get("/items/valid", response_model=Item)
def get_valid(): def get_valid():
@ -93,18 +86,6 @@ def get_validdict_exclude_unset():
} }
@app.get(
"/items/validdict-with-context",
response_model=Dict[str, Item],
response_model_context={"mode": "FASTAPI"},
)
async def get_validdict_with_context():
return {
"k1": Item(aliased_name="foo"),
"k2": Item(aliased_name="bar", price=1.0),
"k3": Item(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]),
}
client = TestClient(app) client = TestClient(app)
@ -179,6 +160,35 @@ def test_validdict_exclude_unset():
@pytest.mark.skipif(PYDANTIC_VERSION < "2.7.2", reason="requires Pydantic 2.7.3+") @pytest.mark.skipif(PYDANTIC_VERSION < "2.7.2", reason="requires Pydantic 2.7.3+")
def test_validdict_with_context(): def test_validdict_with_context():
from pydantic import SerializationInfo, model_serializer
class Item(BaseModel):
name: str = Field(alias="aliased_name")
price: Optional[float] = None
owner_ids: Optional[List[int]] = None
@model_serializer(mode="wrap")
def _serialize(self, handler, info: SerializationInfo):
data = handler(self)
if info.context and info.context.get("mode") == "FASTAPI":
if "price" in data:
data.pop("price")
return data
app_new = FastAPI()
@app_new.get(
"/items/validdict-with-context",
response_model=Dict[str, Item],
response_model_context={"mode": "FASTAPI"},
)
async def get_validdict_with_context():
return {
"k1": Item(aliased_name="foo"),
"k2": Item(aliased_name="bar", price=1.0),
"k3": Item(aliased_name="baz", price=2.0, owner_ids=[1, 2, 3]),
}
client = TestClient(app_new)
response = client.get("/items/validdict-with-context") response = client.get("/items/validdict-with-context")
response.raise_for_status() response.raise_for_status()
assert response.json() == { assert response.json() == {

Loading…
Cancel
Save