1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
import pytest
from pydantic import BaseModel
from ninja import Form, Query, Router
from ninja.testing import TestClient
class SomeModel(BaseModel):
i: int
s: str
f: float
class OtherModel(BaseModel):
x: int
y: int
class SelfReference(BaseModel):
a: int = 123
sibling: "SelfReference" = None
SelfReference.model_rebuild()
router = Router()
@router.post("/test1")
def view1(request, some: SomeModel):
assert isinstance(some, SomeModel)
return some
@router.post("/test2")
def view2(request, some: SomeModel, other: OtherModel):
assert isinstance(some, SomeModel)
assert isinstance(other, OtherModel)
return {"some": some, "other": other}
@router.post("/test3")
def view3(request, some: "SomeModel"):
assert isinstance(some, SomeModel)
return some
@router.post("/test_form")
def view4(request, form: OtherModel = Form(...)):
assert isinstance(form, OtherModel)
return form
@router.post("/test_query")
def view4query(request, q: OtherModel = Query(...)):
assert isinstance(q, OtherModel)
return q
@router.post("/selfref")
def view5(request, obj: SelfReference):
assert isinstance(obj, SelfReference)
return obj
@router.post("/model-default")
def view6(request, obj: OtherModel = None):
assert isinstance(obj, (OtherModel, None.__class__))
return obj
@router.post("/model-default2")
def view7(request, obj: OtherModel = OtherModel(x=1, y=1)):
assert isinstance(obj, OtherModel)
return obj
client = TestClient(router)
@pytest.mark.parametrize(
# fmt: off
"path,kwargs,expected_response",
[
(
"/test1",
dict(json={"i": "1", "s": "foo", "f": "1.1"}),
{"i": 1, "s": "foo", "f": 1.1},
),
(
"/test2",
dict(
json={
"some": {"i": "1", "s": "foo", "f": "1.1"},
"other": {"x": 1, "y": 2},
}
),
{"some": {"i": 1, "s": "foo", "f": 1.1}, "other": {"x": 1, "y": 2}},
),
(
"/test3",
dict(json={"i": "1", "s": "foo", "f": "1.1"}),
{"i": 1, "s": "foo", "f": 1.1},
),
(
"/test_form",
dict(data={"x": "10000", "y": "20000"}),
{"x": 10000, "y": 20000},
),
(
"/test_query?x=5&y=6",
dict(json=None),
{"x": 5, "y": 6},
),
(
"/selfref",
dict(json={"a": "1"}),
{"a": 1, "sibling": None},
),
(
"/selfref",
dict(json={"a": "1", "sibling": {"a": 2}}),
{"a": 1, "sibling": {"a": 2, "sibling": None}},
),
(
"model-default",
dict(json=None),
None,
),
(
"model-default2",
dict(json=None),
{"x": 1, "y": 1},
),
],
# fmt: on
)
def test_models(path, kwargs, expected_response):
response = client.post(path, **kwargs)
assert response.status_code == 200, response.content
assert response.json() == expected_response
def test_invalid_body():
response = client.post("/test1", body="invalid")
assert response.status_code == 400, response.content
assert response.json() == {
"detail": "Cannot parse request body",
}
|