Skip to content

Commit 73f7ed6

Browse files
authored
Added TestModelViewSet action tests in pytest style (#1060)
1 parent 55087bc commit 73f7ed6

File tree

4 files changed

+84
-138
lines changed

4 files changed

+84
-138
lines changed

example/tests/test_views.py

-131
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import json
2-
from datetime import datetime
32

43
from django.test import RequestFactory, override_settings
54
from django.utils import timezone
@@ -579,133 +578,3 @@ def _get_create_response(self, data, view):
579578
user = self.create_user("user", "pass")
580579
force_authenticate(request, user)
581580
return view(request)
582-
583-
584-
class TestModelViewSet(TestBase):
585-
def setUp(self):
586-
self.author = Author.objects.create(
587-
name="Super powerful superhero", email="[email protected]"
588-
)
589-
self.blog = Blog.objects.create(name="Some Blog", tagline="It's a blog")
590-
591-
def test_no_content_response(self):
592-
url = f"/blogs/{self.blog.pk}"
593-
response = self.client.delete(url)
594-
assert response.status_code == 204, response.rendered_content.decode()
595-
assert len(response.rendered_content) == 0, response.rendered_content.decode()
596-
597-
598-
class TestBlogViewSet(APITestCase):
599-
def setUp(self):
600-
self.blog = Blog.objects.create(name="Some Blog", tagline="It's a blog")
601-
self.entry = Entry.objects.create(
602-
blog=self.blog,
603-
headline="headline one",
604-
body_text="body_text two",
605-
)
606-
607-
def test_get_object_gives_correct_blog(self):
608-
url = reverse("entry-blog", kwargs={"entry_pk": self.entry.id})
609-
resp = self.client.get(url)
610-
expected = {
611-
"data": {
612-
"attributes": {"name": self.blog.name},
613-
"id": f"{self.blog.id}",
614-
"links": {"self": f"http://testserver/blogs/{self.blog.id}"},
615-
"meta": {"copyright": datetime.now().year},
616-
"relationships": {"tags": {"data": [], "meta": {"count": 0}}},
617-
"type": "blogs",
618-
},
619-
"meta": {"apiDocs": "/docs/api/blogs"},
620-
}
621-
got = resp.json()
622-
self.assertEqual(got, expected)
623-
624-
625-
class TestEntryViewSet(APITestCase):
626-
def setUp(self):
627-
self.blog = Blog.objects.create(name="Some Blog", tagline="It's a blog")
628-
self.first_entry = Entry.objects.create(
629-
blog=self.blog,
630-
headline="headline two",
631-
body_text="body_text two",
632-
)
633-
self.second_entry = Entry.objects.create(
634-
blog=self.blog,
635-
headline="headline two",
636-
body_text="body_text two",
637-
)
638-
self.maxDiff = None
639-
640-
def test_get_object_gives_correct_entry(self):
641-
url = reverse("entry-featured", kwargs={"entry_pk": self.first_entry.id})
642-
resp = self.client.get(url)
643-
expected = {
644-
"data": {
645-
"attributes": {
646-
"bodyText": self.second_entry.body_text,
647-
"headline": self.second_entry.headline,
648-
"modDate": self.second_entry.mod_date,
649-
"pubDate": self.second_entry.pub_date,
650-
},
651-
"id": f"{self.second_entry.id}",
652-
"meta": {"bodyFormat": "text"},
653-
"relationships": {
654-
"authors": {"data": [], "meta": {"count": 0}},
655-
"blog": {
656-
"data": {
657-
"id": f"{self.second_entry.blog_id}",
658-
"type": "blogs",
659-
}
660-
},
661-
"blogHyperlinked": {
662-
"links": {
663-
"related": "http://testserver/entries/{}"
664-
"/blog".format(self.second_entry.id),
665-
"self": "http://testserver/entries/{}"
666-
"/relationships/blog_hyperlinked".format(
667-
self.second_entry.id
668-
),
669-
}
670-
},
671-
"comments": {"data": [], "meta": {"count": 0}},
672-
"commentsHyperlinked": {
673-
"links": {
674-
"related": "http://testserver/entries/{}"
675-
"/comments".format(self.second_entry.id),
676-
"self": "http://testserver/entries/{}/relationships"
677-
"/comments_hyperlinked".format(self.second_entry.id),
678-
}
679-
},
680-
"featuredHyperlinked": {
681-
"links": {
682-
"related": "http://testserver/entries/{}"
683-
"/featured".format(self.second_entry.id),
684-
"self": "http://testserver/entries/{}/relationships"
685-
"/featured_hyperlinked".format(self.second_entry.id),
686-
}
687-
},
688-
"suggested": {
689-
"data": [{"id": "1", "type": "entries"}],
690-
"links": {
691-
"related": "http://testserver/entries/{}"
692-
"/suggested/".format(self.second_entry.id),
693-
"self": "http://testserver/entries/{}"
694-
"/relationships/suggested".format(self.second_entry.id),
695-
},
696-
},
697-
"suggestedHyperlinked": {
698-
"links": {
699-
"related": "http://testserver/entries/{}"
700-
"/suggested/".format(self.second_entry.id),
701-
"self": "http://testserver/entries/{}/relationships"
702-
"/suggested_hyperlinked".format(self.second_entry.id),
703-
}
704-
},
705-
"tags": {"data": [], "meta": {"count": 0}},
706-
},
707-
"type": "posts",
708-
}
709-
}
710-
got = resp.json()
711-
self.assertEqual(got, expected)

tests/models.py

+3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ class Meta:
1414
class BasicModel(DJAModel):
1515
text = models.CharField(max_length=100)
1616

17+
class Meta:
18+
ordering = ("id",)
19+
1720

1821
# Models for relations tests
1922
# ManyToMany

tests/test_views.py

+80-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from rest_framework import status
44
from rest_framework.decorators import action
55
from rest_framework.response import Response
6+
from rest_framework.routers import SimpleRouter
67
from rest_framework.views import APIView
78

89
from rest_framework_json_api import serializers
@@ -13,6 +14,7 @@
1314
from rest_framework_json_api.views import ModelViewSet, ReadOnlyModelViewSet
1415
from tests.models import BasicModel
1516
from tests.serializers import BasicModelSerializer
17+
from tests.views import BasicModelViewSet
1618

1719

1820
class TestModelViewSet:
@@ -56,6 +58,70 @@ class RelatedFieldNameView(ModelViewSet):
5658

5759
assert view.get_related_field_name() == related_model_field_name
5860

61+
@pytest.mark.urls(__name__)
62+
def test_list(self, client, model):
63+
url = reverse("basic-model-list")
64+
response = client.get(url)
65+
assert response.status_code == status.HTTP_200_OK
66+
assert response.json() == {
67+
"data": [
68+
{
69+
"type": "BasicModel",
70+
"id": str(model.pk),
71+
"attributes": {"text": "Model"},
72+
}
73+
],
74+
"links": {
75+
"first": "http://testserver/basic_models/?page%5Bnumber%5D=1",
76+
"last": "http://testserver/basic_models/?page%5Bnumber%5D=1",
77+
"next": None,
78+
"prev": None,
79+
},
80+
"meta": {"pagination": {"count": 1, "page": 1, "pages": 1}},
81+
}
82+
83+
@pytest.mark.urls(__name__)
84+
def test_retrieve(self, client, model):
85+
url = reverse("basic-model-detail", kwargs={"pk": model.pk})
86+
response = client.get(url)
87+
assert response.status_code == status.HTTP_200_OK
88+
assert response.json() == {
89+
"data": {
90+
"type": "BasicModel",
91+
"id": str(model.pk),
92+
"attributes": {"text": "Model"},
93+
}
94+
}
95+
96+
@pytest.mark.urls(__name__)
97+
def test_patch(self, client, model):
98+
data = {
99+
"data": {
100+
"id": str(model.pk),
101+
"type": "BasicModel",
102+
"attributes": {"text": "changed"},
103+
}
104+
}
105+
106+
url = reverse("basic-model-detail", kwargs={"pk": model.pk})
107+
response = client.patch(url, data=data)
108+
assert response.status_code == status.HTTP_200_OK
109+
assert response.json() == {
110+
"data": {
111+
"type": "BasicModel",
112+
"id": str(model.pk),
113+
"attributes": {"text": "changed"},
114+
}
115+
}
116+
117+
@pytest.mark.urls(__name__)
118+
def test_delete(self, client, model):
119+
url = reverse("basic-model-detail", kwargs={"pk": model.pk})
120+
response = client.delete(url)
121+
assert response.status_code == status.HTTP_204_NO_CONTENT
122+
assert BasicModel.objects.count() == 0
123+
assert len(response.rendered_content) == 0
124+
59125

60126
class TestReadonlyModelViewSet:
61127
@pytest.mark.parametrize(
@@ -108,11 +174,17 @@ def test_patch(self, client):
108174
url = reverse("custom")
109175

110176
response = client.patch(url, data=data)
111-
result = response.json()
177+
assert response.status_code == status.HTTP_200_OK
178+
assert response.json() == {
179+
"data": {
180+
"type": "custom",
181+
"id": "123",
182+
"attributes": {"body": "hello"},
183+
}
184+
}
185+
112186

113-
assert result["data"]["id"] == str(123)
114-
assert result["data"]["type"] == "custom"
115-
assert result["data"]["attributes"]["body"] == "hello"
187+
# Routing setup
116188

117189

118190
class CustomModel:
@@ -140,6 +212,10 @@ def patch(self, request, *args, **kwargs):
140212
return Response(status=status.HTTP_200_OK, data=serializer.data)
141213

142214

215+
router = SimpleRouter()
216+
router.register(r"basic_models", BasicModelViewSet, basename="basic-model")
217+
143218
urlpatterns = [
144219
path("custom", CustomAPIView.as_view(), name="custom"),
145220
]
221+
urlpatterns += router.urls

tests/views.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,4 @@
55

66
class BasicModelViewSet(ModelViewSet):
77
serializer_class = BasicModelSerializer
8-
9-
class Meta:
10-
model = BasicModel
8+
queryset = BasicModel.objects.all()

0 commit comments

Comments
 (0)