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"},
}
|