File: test_schema_context.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 (62 lines) | stat: -rw-r--r-- 1,623 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
from ninja import NinjaAPI, Schema
from ninja.testing import TestClient


class ResolveWithKWargs(Schema):
    value: int

    @staticmethod
    def resolve_value(obj, **kwargs):
        context = kwargs["context"]
        return obj["value"] + context["extra"]


class ResolveWithContext(Schema):
    value: int

    @staticmethod
    def resolve_value(obj, context):
        return obj["value"] + context["extra"]


class DataWithRequestContext(Schema):
    value: dict = None
    other: dict = None

    @staticmethod
    def resolve_value(obj, context):
        result = {k: str(v) for k, v in context.items()}
        assert "request" in result, "request not in context"
        result["request"] = "<request>"  # making it static for easier testing
        return result


api = NinjaAPI()


@api.post("/resolve_ctx", response=DataWithRequestContext)
def resolve_ctx(request, data: DataWithRequestContext):
    return {"other": data.dict()}


client = TestClient(api)


def test_schema_with_context():
    obj = ResolveWithKWargs.model_validate({"value": 10}, context={"extra": 10})
    assert obj.value == 20

    obj = ResolveWithContext.model_validate({"value": 2}, context={"extra": 2})
    assert obj.value == 4

    obj = ResolveWithContext.from_orm({"value": 2}, context={"extra": 2})
    assert obj.value == 4


def test_request_context():
    resp = client.post("/resolve_ctx", json={})
    assert resp.status_code == 200, resp.content
    assert resp.json() == {
        "other": {"value": {"request": "<request>"}, "other": None},
        "value": {"request": "<request>", "response_status": "200"},
    }