committed by
GitHub
20 changed files with 802 additions and 602 deletions
@ -0,0 +1,98 @@ |
|||||
|
import sys |
||||
|
|
||||
|
import pytest |
||||
|
|
||||
|
from tests.utils import skip_module_if_py_gte_314 |
||||
|
|
||||
|
if sys.version_info >= (3, 14): |
||||
|
skip_module_if_py_gte_314() |
||||
|
|
||||
|
from fastapi import FastAPI |
||||
|
from fastapi._compat.v1 import BaseModel |
||||
|
from fastapi.testclient import TestClient |
||||
|
|
||||
|
|
||||
|
def test_warns_pydantic_v1_model_in_endpoint_param() -> None: |
||||
|
class ParamModelV1(BaseModel): |
||||
|
name: str |
||||
|
|
||||
|
app = FastAPI() |
||||
|
|
||||
|
with pytest.warns( |
||||
|
DeprecationWarning, |
||||
|
match=r"pydantic\.v1 is deprecated.*Please update the param data:", |
||||
|
): |
||||
|
|
||||
|
@app.post("/param") |
||||
|
def endpoint(data: ParamModelV1): |
||||
|
return data |
||||
|
|
||||
|
client = TestClient(app) |
||||
|
response = client.post("/param", json={"name": "test"}) |
||||
|
assert response.status_code == 200, response.text |
||||
|
assert response.json() == {"name": "test"} |
||||
|
|
||||
|
|
||||
|
def test_warns_pydantic_v1_model_in_return_type() -> None: |
||||
|
class ReturnModelV1(BaseModel): |
||||
|
name: str |
||||
|
|
||||
|
app = FastAPI() |
||||
|
|
||||
|
with pytest.warns( |
||||
|
DeprecationWarning, |
||||
|
match=r"pydantic\.v1 is deprecated.*Please update the response model", |
||||
|
): |
||||
|
|
||||
|
@app.get("/return") |
||||
|
def endpoint() -> ReturnModelV1: |
||||
|
return ReturnModelV1(name="test") |
||||
|
|
||||
|
client = TestClient(app) |
||||
|
response = client.get("/return") |
||||
|
assert response.status_code == 200, response.text |
||||
|
assert response.json() == {"name": "test"} |
||||
|
|
||||
|
|
||||
|
def test_warns_pydantic_v1_model_in_response_model() -> None: |
||||
|
class ResponseModelV1(BaseModel): |
||||
|
name: str |
||||
|
|
||||
|
app = FastAPI() |
||||
|
|
||||
|
with pytest.warns( |
||||
|
DeprecationWarning, |
||||
|
match=r"pydantic\.v1 is deprecated.*Please update the response model", |
||||
|
): |
||||
|
|
||||
|
@app.get("/response-model", response_model=ResponseModelV1) |
||||
|
def endpoint(): |
||||
|
return {"name": "test"} |
||||
|
|
||||
|
client = TestClient(app) |
||||
|
response = client.get("/response-model") |
||||
|
assert response.status_code == 200, response.text |
||||
|
assert response.json() == {"name": "test"} |
||||
|
|
||||
|
|
||||
|
def test_warns_pydantic_v1_model_in_additional_responses_model() -> None: |
||||
|
class ErrorModelV1(BaseModel): |
||||
|
detail: str |
||||
|
|
||||
|
app = FastAPI() |
||||
|
|
||||
|
with pytest.warns( |
||||
|
DeprecationWarning, |
||||
|
match=r"pydantic\.v1 is deprecated.*In responses=\{\}, please update", |
||||
|
): |
||||
|
|
||||
|
@app.get( |
||||
|
"/responses", response_model=None, responses={400: {"model": ErrorModelV1}} |
||||
|
) |
||||
|
def endpoint(): |
||||
|
return {"ok": True} |
||||
|
|
||||
|
client = TestClient(app) |
||||
|
response = client.get("/responses") |
||||
|
assert response.status_code == 200, response.text |
||||
|
assert response.json() == {"ok": True} |
||||
@ -1,140 +1,137 @@ |
|||||
|
import warnings |
||||
|
|
||||
from fastapi import FastAPI |
from fastapi import FastAPI |
||||
|
|
||||
from . import modelsv1, modelsv2, modelsv2b |
from . import modelsv1, modelsv2, modelsv2b |
||||
|
|
||||
app = FastAPI() |
app = FastAPI() |
||||
|
|
||||
|
with warnings.catch_warnings(record=True): |
||||
|
warnings.simplefilter("always") |
||||
|
|
||||
@app.post("/v1-to-v2/item") |
@app.post("/v1-to-v2/item") |
||||
def handle_v1_item_to_v2(data: modelsv1.Item) -> modelsv2.Item: |
def handle_v1_item_to_v2(data: modelsv1.Item) -> modelsv2.Item: |
||||
return modelsv2.Item( |
return modelsv2.Item( |
||||
new_title=data.title, |
new_title=data.title, |
||||
new_size=data.size, |
new_size=data.size, |
||||
new_description=data.description, |
new_description=data.description, |
||||
new_sub=modelsv2.SubItem(new_sub_name=data.sub.name), |
new_sub=modelsv2.SubItem(new_sub_name=data.sub.name), |
||||
new_multi=[modelsv2.SubItem(new_sub_name=s.name) for s in data.multi], |
new_multi=[modelsv2.SubItem(new_sub_name=s.name) for s in data.multi], |
||||
) |
) |
||||
|
|
||||
|
|
||||
@app.post("/v2-to-v1/item") |
|
||||
def handle_v2_item_to_v1(data: modelsv2.Item) -> modelsv1.Item: |
|
||||
return modelsv1.Item( |
|
||||
title=data.new_title, |
|
||||
size=data.new_size, |
|
||||
description=data.new_description, |
|
||||
sub=modelsv1.SubItem(name=data.new_sub.new_sub_name), |
|
||||
multi=[modelsv1.SubItem(name=s.new_sub_name) for s in data.new_multi], |
|
||||
) |
|
||||
|
|
||||
|
|
||||
@app.post("/v1-to-v2/item-to-list") |
@app.post("/v2-to-v1/item") |
||||
def handle_v1_item_to_v2_list(data: modelsv1.Item) -> list[modelsv2.Item]: |
def handle_v2_item_to_v1(data: modelsv2.Item) -> modelsv1.Item: |
||||
converted = modelsv2.Item( |
return modelsv1.Item( |
||||
new_title=data.title, |
title=data.new_title, |
||||
new_size=data.size, |
size=data.new_size, |
||||
new_description=data.description, |
description=data.new_description, |
||||
new_sub=modelsv2.SubItem(new_sub_name=data.sub.name), |
sub=modelsv1.SubItem(name=data.new_sub.new_sub_name), |
||||
new_multi=[modelsv2.SubItem(new_sub_name=s.name) for s in data.multi], |
multi=[modelsv1.SubItem(name=s.new_sub_name) for s in data.new_multi], |
||||
) |
) |
||||
return [converted, converted] |
|
||||
|
|
||||
|
@app.post("/v1-to-v2/item-to-list") |
||||
|
def handle_v1_item_to_v2_list(data: modelsv1.Item) -> list[modelsv2.Item]: |
||||
|
converted = modelsv2.Item( |
||||
|
new_title=data.title, |
||||
|
new_size=data.size, |
||||
|
new_description=data.description, |
||||
|
new_sub=modelsv2.SubItem(new_sub_name=data.sub.name), |
||||
|
new_multi=[modelsv2.SubItem(new_sub_name=s.name) for s in data.multi], |
||||
|
) |
||||
|
return [converted, converted] |
||||
|
|
||||
|
@app.post("/v1-to-v2/list-to-list") |
||||
|
def handle_v1_list_to_v2_list(data: list[modelsv1.Item]) -> list[modelsv2.Item]: |
||||
|
result = [] |
||||
|
for item in data: |
||||
|
result.append( |
||||
|
modelsv2.Item( |
||||
|
new_title=item.title, |
||||
|
new_size=item.size, |
||||
|
new_description=item.description, |
||||
|
new_sub=modelsv2.SubItem(new_sub_name=item.sub.name), |
||||
|
new_multi=[ |
||||
|
modelsv2.SubItem(new_sub_name=s.name) for s in item.multi |
||||
|
], |
||||
|
) |
||||
|
) |
||||
|
return result |
||||
|
|
||||
@app.post("/v1-to-v2/list-to-list") |
@app.post("/v1-to-v2/list-to-item") |
||||
def handle_v1_list_to_v2_list(data: list[modelsv1.Item]) -> list[modelsv2.Item]: |
def handle_v1_list_to_v2_item(data: list[modelsv1.Item]) -> modelsv2.Item: |
||||
result = [] |
if data: |
||||
for item in data: |
item = data[0] |
||||
result.append( |
return modelsv2.Item( |
||||
modelsv2.Item( |
|
||||
new_title=item.title, |
new_title=item.title, |
||||
new_size=item.size, |
new_size=item.size, |
||||
new_description=item.description, |
new_description=item.description, |
||||
new_sub=modelsv2.SubItem(new_sub_name=item.sub.name), |
new_sub=modelsv2.SubItem(new_sub_name=item.sub.name), |
||||
new_multi=[modelsv2.SubItem(new_sub_name=s.name) for s in item.multi], |
new_multi=[modelsv2.SubItem(new_sub_name=s.name) for s in item.multi], |
||||
) |
) |
||||
) |
|
||||
return result |
|
||||
|
|
||||
|
|
||||
@app.post("/v1-to-v2/list-to-item") |
|
||||
def handle_v1_list_to_v2_item(data: list[modelsv1.Item]) -> modelsv2.Item: |
|
||||
if data: |
|
||||
item = data[0] |
|
||||
return modelsv2.Item( |
return modelsv2.Item( |
||||
new_title=item.title, |
new_title="", new_size=0, new_sub=modelsv2.SubItem(new_sub_name="") |
||||
new_size=item.size, |
|
||||
new_description=item.description, |
|
||||
new_sub=modelsv2.SubItem(new_sub_name=item.sub.name), |
|
||||
new_multi=[modelsv2.SubItem(new_sub_name=s.name) for s in item.multi], |
|
||||
) |
) |
||||
return modelsv2.Item( |
|
||||
new_title="", new_size=0, new_sub=modelsv2.SubItem(new_sub_name="") |
|
||||
) |
|
||||
|
|
||||
|
|
||||
@app.post("/v2-to-v1/item-to-list") |
|
||||
def handle_v2_item_to_v1_list(data: modelsv2.Item) -> list[modelsv1.Item]: |
|
||||
converted = modelsv1.Item( |
|
||||
title=data.new_title, |
|
||||
size=data.new_size, |
|
||||
description=data.new_description, |
|
||||
sub=modelsv1.SubItem(name=data.new_sub.new_sub_name), |
|
||||
multi=[modelsv1.SubItem(name=s.new_sub_name) for s in data.new_multi], |
|
||||
) |
|
||||
return [converted, converted] |
|
||||
|
|
||||
|
@app.post("/v2-to-v1/item-to-list") |
||||
|
def handle_v2_item_to_v1_list(data: modelsv2.Item) -> list[modelsv1.Item]: |
||||
|
converted = modelsv1.Item( |
||||
|
title=data.new_title, |
||||
|
size=data.new_size, |
||||
|
description=data.new_description, |
||||
|
sub=modelsv1.SubItem(name=data.new_sub.new_sub_name), |
||||
|
multi=[modelsv1.SubItem(name=s.new_sub_name) for s in data.new_multi], |
||||
|
) |
||||
|
return [converted, converted] |
||||
|
|
||||
|
@app.post("/v2-to-v1/list-to-list") |
||||
|
def handle_v2_list_to_v1_list(data: list[modelsv2.Item]) -> list[modelsv1.Item]: |
||||
|
result = [] |
||||
|
for item in data: |
||||
|
result.append( |
||||
|
modelsv1.Item( |
||||
|
title=item.new_title, |
||||
|
size=item.new_size, |
||||
|
description=item.new_description, |
||||
|
sub=modelsv1.SubItem(name=item.new_sub.new_sub_name), |
||||
|
multi=[ |
||||
|
modelsv1.SubItem(name=s.new_sub_name) for s in item.new_multi |
||||
|
], |
||||
|
) |
||||
|
) |
||||
|
return result |
||||
|
|
||||
@app.post("/v2-to-v1/list-to-list") |
@app.post("/v2-to-v1/list-to-item") |
||||
def handle_v2_list_to_v1_list(data: list[modelsv2.Item]) -> list[modelsv1.Item]: |
def handle_v2_list_to_v1_item(data: list[modelsv2.Item]) -> modelsv1.Item: |
||||
result = [] |
if data: |
||||
for item in data: |
item = data[0] |
||||
result.append( |
return modelsv1.Item( |
||||
modelsv1.Item( |
|
||||
title=item.new_title, |
title=item.new_title, |
||||
size=item.new_size, |
size=item.new_size, |
||||
description=item.new_description, |
description=item.new_description, |
||||
sub=modelsv1.SubItem(name=item.new_sub.new_sub_name), |
sub=modelsv1.SubItem(name=item.new_sub.new_sub_name), |
||||
multi=[modelsv1.SubItem(name=s.new_sub_name) for s in item.new_multi], |
multi=[modelsv1.SubItem(name=s.new_sub_name) for s in item.new_multi], |
||||
) |
) |
||||
) |
return modelsv1.Item(title="", size=0, sub=modelsv1.SubItem(name="")) |
||||
return result |
|
||||
|
|
||||
|
|
||||
@app.post("/v2-to-v1/list-to-item") |
@app.post("/v2-to-v1/same-name") |
||||
def handle_v2_list_to_v1_item(data: list[modelsv2.Item]) -> modelsv1.Item: |
def handle_v2_same_name_to_v1( |
||||
if data: |
item1: modelsv2.Item, item2: modelsv2b.Item |
||||
item = data[0] |
) -> modelsv1.Item: |
||||
return modelsv1.Item( |
return modelsv1.Item( |
||||
title=item.new_title, |
title=item1.new_title, |
||||
size=item.new_size, |
size=item2.dup_size, |
||||
description=item.new_description, |
description=item1.new_description, |
||||
sub=modelsv1.SubItem(name=item.new_sub.new_sub_name), |
sub=modelsv1.SubItem(name=item1.new_sub.new_sub_name), |
||||
multi=[modelsv1.SubItem(name=s.new_sub_name) for s in item.new_multi], |
multi=[modelsv1.SubItem(name=s.dup_sub_name) for s in item2.dup_multi], |
||||
) |
) |
||||
return modelsv1.Item(title="", size=0, sub=modelsv1.SubItem(name="")) |
|
||||
|
|
||||
|
|
||||
@app.post("/v2-to-v1/same-name") |
|
||||
def handle_v2_same_name_to_v1( |
|
||||
item1: modelsv2.Item, item2: modelsv2b.Item |
|
||||
) -> modelsv1.Item: |
|
||||
return modelsv1.Item( |
|
||||
title=item1.new_title, |
|
||||
size=item2.dup_size, |
|
||||
description=item1.new_description, |
|
||||
sub=modelsv1.SubItem(name=item1.new_sub.new_sub_name), |
|
||||
multi=[modelsv1.SubItem(name=s.dup_sub_name) for s in item2.dup_multi], |
|
||||
) |
|
||||
|
|
||||
|
|
||||
@app.post("/v2-to-v1/list-of-items-to-list-of-items") |
@app.post("/v2-to-v1/list-of-items-to-list-of-items") |
||||
def handle_v2_items_in_list_to_v1_item_in_list( |
def handle_v2_items_in_list_to_v1_item_in_list( |
||||
data1: list[modelsv2.ItemInList], data2: list[modelsv2b.ItemInList] |
data1: list[modelsv2.ItemInList], data2: list[modelsv2b.ItemInList] |
||||
) -> list[modelsv1.ItemInList]: |
) -> list[modelsv1.ItemInList]: |
||||
result = [] |
item1 = data1[0] |
||||
item1 = data1[0] |
item2 = data2[0] |
||||
item2 = data2[0] |
return [ |
||||
result = [ |
modelsv1.ItemInList(name1=item1.name2), |
||||
modelsv1.ItemInList(name1=item1.name2), |
modelsv1.ItemInList(name1=item2.dup_name2), |
||||
modelsv1.ItemInList(name1=item2.dup_name2), |
] |
||||
] |
|
||||
return result |
|
||||
|
|||||
Loading…
Reference in new issue