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
|
#!/bin/sh
[ "$1" = "python3-django-restframework" ] || exit 0
python3 - << EOF
import sys
import importlib.metadata
version = importlib.metadata.version("djangorestframework")
if version != "$2":
print("Wrong version: " + version)
sys.exit(1)
# Bootstrap a minimal Django configuration
import django
from django.conf import settings
settings.configure(
INSTALLED_APPS=[
"django.contrib.contenttypes",
"django.contrib.auth",
"rest_framework",
],
DATABASES={
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": ":memory:",
}
},
ROOT_URLCONF=[],
DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
django.setup()
# --- Serializer ---
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
title = serializers.CharField(max_length=100)
year = serializers.IntegerField(min_value=0)
isbn = serializers.CharField(required=False, allow_blank=True)
# Valid data
s = BookSerializer(data={"title": "Two Scoops of Django", "year": 2023})
assert s.is_valid(), f"Serializer errors: {s.errors}"
assert s.validated_data["title"] == "Two Scoops of Django"
assert s.validated_data["year"] == 2023
# Invalid data
s2 = BookSerializer(data={"title": "", "year": -1})
assert not s2.is_valid()
assert "title" in s2.errors
assert "year" in s2.errors
# --- APIRequestFactory + APIView ---
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.test import APIRequestFactory
from rest_framework import status
class EchoView(APIView):
def get(self, request):
return Response({"method": "GET", "query": request.query_params.get("q", "")})
def post(self, request):
return Response({"received": request.data}, status=status.HTTP_201_CREATED)
factory = APIRequestFactory()
# GET
request = factory.get("/echo/", {"q": "hello"})
view = EchoView.as_view()
response = view(request)
response.accepted_renderer = __import__("rest_framework.renderers", fromlist=["JSONRenderer"]).JSONRenderer()
response.accepted_media_type = "application/json"
response.renderer_context = {}
assert response.status_code == 200
assert response.data["method"] == "GET"
assert response.data["query"] == "hello"
# POST
request = factory.post("/echo/", {"key": "value"}, format="json")
response = view(request)
assert response.status_code == 201
assert response.data["received"] == {"key": "value"}
# --- Status codes ---
assert status.HTTP_200_OK == 200
assert status.HTTP_201_CREATED == 201
assert status.HTTP_400_BAD_REQUEST == 400
assert status.HTTP_404_NOT_FOUND == 404
assert status.is_success(200)
assert status.is_client_error(400)
assert status.is_server_error(500)
# --- SimpleRouter ---
from rest_framework.routers import SimpleRouter
from rest_framework.viewsets import ViewSet
class NullViewSet(ViewSet):
def list(self, request):
return Response([])
router = SimpleRouter()
router.register(r"items", NullViewSet, basename="item")
urls = [u.name for u in router.urls]
assert "item-list" in urls, f"Expected item-list in {urls}"
sys.exit(0)
EOF
|