File: test_models.py

package info (click to toggle)
django-ninja 1.6.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,280 kB
  • sloc: python: 16,041; javascript: 1,689; makefile: 40; sh: 25
file content (150 lines) | stat: -rw-r--r-- 3,406 bytes parent folder | download | duplicates (2)
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",
    }