5 changed files with 374 additions and 0 deletions
@ -0,0 +1,116 @@ |
|||
from typing import List |
|||
|
|||
from fastapi import FastAPI |
|||
|
|||
from . import modelsv1, modelsv2 |
|||
|
|||
app = FastAPI() |
|||
|
|||
|
|||
@app.post("/v1-to-v2/item") |
|||
def handle_v1_item_to_v2(data: modelsv1.Item) -> modelsv2.Item: |
|||
return 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], |
|||
) |
|||
|
|||
|
|||
@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") |
|||
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-item") |
|||
def handle_v1_list_to_v2_item(data: List[modelsv1.Item]) -> modelsv2.Item: |
|||
if data: |
|||
item = data[0] |
|||
return 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 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/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-item") |
|||
def handle_v2_list_to_v1_item(data: List[modelsv2.Item]) -> modelsv1.Item: |
|||
if data: |
|||
item = data[0] |
|||
return 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 modelsv1.Item(title="", size=0, sub=modelsv1.SubItem(name="")) |
|||
|
|||
@ -0,0 +1,15 @@ |
|||
from typing import List, Union |
|||
|
|||
from fastapi._compat.v1 import BaseModel |
|||
|
|||
|
|||
class SubItem(BaseModel): |
|||
name: str |
|||
|
|||
|
|||
class Item(BaseModel): |
|||
title: str |
|||
size: int |
|||
description: Union[str, None] = None |
|||
sub: SubItem |
|||
multi: List[SubItem] = [] |
|||
@ -0,0 +1,15 @@ |
|||
from typing import List, Union |
|||
|
|||
from pydantic import BaseModel |
|||
|
|||
|
|||
class SubItem(BaseModel): |
|||
new_sub_name: str |
|||
|
|||
|
|||
class Item(BaseModel): |
|||
new_title: str |
|||
new_size: int |
|||
new_description: Union[str, None] = None |
|||
new_sub: SubItem |
|||
new_multi: List[SubItem] = [] |
|||
@ -0,0 +1,228 @@ |
|||
from fastapi.testclient import TestClient |
|||
from inline_snapshot import snapshot |
|||
|
|||
from .main import app |
|||
|
|||
client = TestClient(app) |
|||
|
|||
|
|||
def test_v1_to_v2_item(): |
|||
response = client.post( |
|||
"/v1-to-v2/item", |
|||
json={"title": "Test", "size": 10, "sub": {"name": "SubTest"}}, |
|||
) |
|||
assert response.status_code == 200 |
|||
assert response.json() == { |
|||
"new_title": "Test", |
|||
"new_size": 10, |
|||
"new_description": None, |
|||
"new_sub": {"new_sub_name": "SubTest"}, |
|||
"new_multi": [], |
|||
} |
|||
|
|||
|
|||
def test_v2_to_v1_item(): |
|||
response = client.post( |
|||
"/v2-to-v1/item", |
|||
json={ |
|||
"new_title": "NewTest", |
|||
"new_size": 20, |
|||
"new_sub": {"new_sub_name": "NewSubTest"}, |
|||
}, |
|||
) |
|||
assert response.status_code == 200 |
|||
assert response.json() == { |
|||
"title": "NewTest", |
|||
"size": 20, |
|||
"description": None, |
|||
"sub": {"name": "NewSubTest"}, |
|||
"multi": [], |
|||
} |
|||
|
|||
|
|||
def test_v1_to_v2_item_to_list(): |
|||
response = client.post( |
|||
"/v1-to-v2/item-to-list", |
|||
json={"title": "ListTest", "size": 30, "sub": {"name": "SubListTest"}}, |
|||
) |
|||
assert response.status_code == 200 |
|||
assert response.json() == [ |
|||
{ |
|||
"new_title": "ListTest", |
|||
"new_size": 30, |
|||
"new_description": None, |
|||
"new_sub": {"new_sub_name": "SubListTest"}, |
|||
"new_multi": [], |
|||
}, |
|||
{ |
|||
"new_title": "ListTest", |
|||
"new_size": 30, |
|||
"new_description": None, |
|||
"new_sub": {"new_sub_name": "SubListTest"}, |
|||
"new_multi": [], |
|||
}, |
|||
] |
|||
|
|||
|
|||
def test_v1_to_v2_list_to_list(): |
|||
response = client.post( |
|||
"/v1-to-v2/list-to-list", |
|||
json=[ |
|||
{"title": "Item1", "size": 40, "sub": {"name": "Sub1"}}, |
|||
{"title": "Item2", "size": 50, "sub": {"name": "Sub2"}}, |
|||
], |
|||
) |
|||
assert response.status_code == 200 |
|||
assert response.json() == [ |
|||
{ |
|||
"new_title": "Item1", |
|||
"new_size": 40, |
|||
"new_description": None, |
|||
"new_sub": {"new_sub_name": "Sub1"}, |
|||
"new_multi": [], |
|||
}, |
|||
{ |
|||
"new_title": "Item2", |
|||
"new_size": 50, |
|||
"new_description": None, |
|||
"new_sub": {"new_sub_name": "Sub2"}, |
|||
"new_multi": [], |
|||
}, |
|||
] |
|||
|
|||
|
|||
def test_v1_to_v2_list_to_item(): |
|||
response = client.post( |
|||
"/v1-to-v2/list-to-item", |
|||
json=[ |
|||
{"title": "FirstItem", "size": 60, "sub": {"name": "FirstSub"}}, |
|||
{"title": "SecondItem", "size": 70, "sub": {"name": "SecondSub"}}, |
|||
], |
|||
) |
|||
assert response.status_code == 200 |
|||
assert response.json() == { |
|||
"new_title": "FirstItem", |
|||
"new_size": 60, |
|||
"new_description": None, |
|||
"new_sub": {"new_sub_name": "FirstSub"}, |
|||
"new_multi": [], |
|||
} |
|||
|
|||
|
|||
def test_v2_to_v1_item_to_list(): |
|||
response = client.post( |
|||
"/v2-to-v1/item-to-list", |
|||
json={ |
|||
"new_title": "ListNew", |
|||
"new_size": 80, |
|||
"new_sub": {"new_sub_name": "SubListNew"}, |
|||
}, |
|||
) |
|||
assert response.status_code == 200 |
|||
assert response.json() == [ |
|||
{ |
|||
"title": "ListNew", |
|||
"size": 80, |
|||
"description": None, |
|||
"sub": {"name": "SubListNew"}, |
|||
"multi": [], |
|||
}, |
|||
{ |
|||
"title": "ListNew", |
|||
"size": 80, |
|||
"description": None, |
|||
"sub": {"name": "SubListNew"}, |
|||
"multi": [], |
|||
}, |
|||
] |
|||
|
|||
|
|||
def test_v2_to_v1_list_to_list(): |
|||
response = client.post( |
|||
"/v2-to-v1/list-to-list", |
|||
json=[ |
|||
{ |
|||
"new_title": "New1", |
|||
"new_size": 90, |
|||
"new_sub": {"new_sub_name": "NewSub1"}, |
|||
}, |
|||
{ |
|||
"new_title": "New2", |
|||
"new_size": 100, |
|||
"new_sub": {"new_sub_name": "NewSub2"}, |
|||
}, |
|||
], |
|||
) |
|||
assert response.status_code == 200 |
|||
assert response.json() == [ |
|||
{ |
|||
"title": "New1", |
|||
"size": 90, |
|||
"description": None, |
|||
"sub": {"name": "NewSub1"}, |
|||
"multi": [], |
|||
}, |
|||
{ |
|||
"title": "New2", |
|||
"size": 100, |
|||
"description": None, |
|||
"sub": {"name": "NewSub2"}, |
|||
"multi": [], |
|||
}, |
|||
] |
|||
|
|||
|
|||
def test_v2_to_v1_list_to_item(): |
|||
response = client.post( |
|||
"/v2-to-v1/list-to-item", |
|||
json=[ |
|||
{ |
|||
"new_title": "FirstNew", |
|||
"new_size": 110, |
|||
"new_sub": {"new_sub_name": "FirstNewSub"}, |
|||
}, |
|||
{ |
|||
"new_title": "SecondNew", |
|||
"new_size": 120, |
|||
"new_sub": {"new_sub_name": "SecondNewSub"}, |
|||
}, |
|||
], |
|||
) |
|||
assert response.status_code == 200 |
|||
assert response.json() == { |
|||
"title": "FirstNew", |
|||
"size": 110, |
|||
"description": None, |
|||
"sub": {"name": "FirstNewSub"}, |
|||
"multi": [], |
|||
} |
|||
|
|||
|
|||
def test_v1_to_v2_list_to_item_empty(): |
|||
response = client.post("/v1-to-v2/list-to-item", json=[]) |
|||
assert response.status_code == 200 |
|||
assert response.json() == { |
|||
"new_title": "", |
|||
"new_size": 0, |
|||
"new_description": None, |
|||
"new_sub": {"new_sub_name": ""}, |
|||
"new_multi": [], |
|||
} |
|||
|
|||
|
|||
def test_v2_to_v1_list_to_item_empty(): |
|||
response = client.post("/v2-to-v1/list-to-item", json=[]) |
|||
assert response.status_code == 200 |
|||
assert response.json() == { |
|||
"title": "", |
|||
"size": 0, |
|||
"description": None, |
|||
"sub": {"name": ""}, |
|||
"multi": [], |
|||
} |
|||
|
|||
|
|||
def test_openapi_schema(): |
|||
response = client.get("/openapi.json") |
|||
assert response.status_code == 200 |
|||
assert response.json() == snapshot() |
|||
Loading…
Reference in new issue