From 98983cdf22a5222ad6fa46433ae33d05074df261 Mon Sep 17 00:00:00 2001 From: Oliver Sauder Date: Sun, 27 Mar 2022 23:22:01 +0400 Subject: [PATCH] Added TestModelViewSet action tests in pytest style --- example/tests/test_views.py | 131 ------------------------------------ tests/models.py | 3 + tests/test_views.py | 84 +++++++++++++++++++++-- tests/views.py | 4 +- 4 files changed, 84 insertions(+), 138 deletions(-) diff --git a/example/tests/test_views.py b/example/tests/test_views.py index 592a72bc..f6947fef 100644 --- a/example/tests/test_views.py +++ b/example/tests/test_views.py @@ -1,5 +1,4 @@ import json -from datetime import datetime from django.test import RequestFactory, override_settings from django.utils import timezone @@ -579,133 +578,3 @@ def _get_create_response(self, data, view): user = self.create_user("user", "pass") force_authenticate(request, user) return view(request) - - -class TestModelViewSet(TestBase): - def setUp(self): - self.author = Author.objects.create( - name="Super powerful superhero", email="i.am@lost.com" - ) - self.blog = Blog.objects.create(name="Some Blog", tagline="It's a blog") - - def test_no_content_response(self): - url = f"/blogs/{self.blog.pk}" - response = self.client.delete(url) - assert response.status_code == 204, response.rendered_content.decode() - assert len(response.rendered_content) == 0, response.rendered_content.decode() - - -class TestBlogViewSet(APITestCase): - def setUp(self): - self.blog = Blog.objects.create(name="Some Blog", tagline="It's a blog") - self.entry = Entry.objects.create( - blog=self.blog, - headline="headline one", - body_text="body_text two", - ) - - def test_get_object_gives_correct_blog(self): - url = reverse("entry-blog", kwargs={"entry_pk": self.entry.id}) - resp = self.client.get(url) - expected = { - "data": { - "attributes": {"name": self.blog.name}, - "id": f"{self.blog.id}", - "links": {"self": f"http://testserver/blogs/{self.blog.id}"}, - "meta": {"copyright": datetime.now().year}, - "relationships": {"tags": {"data": [], "meta": {"count": 0}}}, - "type": "blogs", - }, - "meta": {"apiDocs": "/docs/api/blogs"}, - } - got = resp.json() - self.assertEqual(got, expected) - - -class TestEntryViewSet(APITestCase): - def setUp(self): - self.blog = Blog.objects.create(name="Some Blog", tagline="It's a blog") - self.first_entry = Entry.objects.create( - blog=self.blog, - headline="headline two", - body_text="body_text two", - ) - self.second_entry = Entry.objects.create( - blog=self.blog, - headline="headline two", - body_text="body_text two", - ) - self.maxDiff = None - - def test_get_object_gives_correct_entry(self): - url = reverse("entry-featured", kwargs={"entry_pk": self.first_entry.id}) - resp = self.client.get(url) - expected = { - "data": { - "attributes": { - "bodyText": self.second_entry.body_text, - "headline": self.second_entry.headline, - "modDate": self.second_entry.mod_date, - "pubDate": self.second_entry.pub_date, - }, - "id": f"{self.second_entry.id}", - "meta": {"bodyFormat": "text"}, - "relationships": { - "authors": {"data": [], "meta": {"count": 0}}, - "blog": { - "data": { - "id": f"{self.second_entry.blog_id}", - "type": "blogs", - } - }, - "blogHyperlinked": { - "links": { - "related": "http://testserver/entries/{}" - "/blog".format(self.second_entry.id), - "self": "http://testserver/entries/{}" - "/relationships/blog_hyperlinked".format( - self.second_entry.id - ), - } - }, - "comments": {"data": [], "meta": {"count": 0}}, - "commentsHyperlinked": { - "links": { - "related": "http://testserver/entries/{}" - "/comments".format(self.second_entry.id), - "self": "http://testserver/entries/{}/relationships" - "/comments_hyperlinked".format(self.second_entry.id), - } - }, - "featuredHyperlinked": { - "links": { - "related": "http://testserver/entries/{}" - "/featured".format(self.second_entry.id), - "self": "http://testserver/entries/{}/relationships" - "/featured_hyperlinked".format(self.second_entry.id), - } - }, - "suggested": { - "data": [{"id": "1", "type": "entries"}], - "links": { - "related": "http://testserver/entries/{}" - "/suggested/".format(self.second_entry.id), - "self": "http://testserver/entries/{}" - "/relationships/suggested".format(self.second_entry.id), - }, - }, - "suggestedHyperlinked": { - "links": { - "related": "http://testserver/entries/{}" - "/suggested/".format(self.second_entry.id), - "self": "http://testserver/entries/{}/relationships" - "/suggested_hyperlinked".format(self.second_entry.id), - } - }, - "tags": {"data": [], "meta": {"count": 0}}, - }, - "type": "posts", - } - } - got = resp.json() - self.assertEqual(got, expected) diff --git a/tests/models.py b/tests/models.py index 3c3e6146..6ad9ad6a 100644 --- a/tests/models.py +++ b/tests/models.py @@ -14,6 +14,9 @@ class Meta: class BasicModel(DJAModel): text = models.CharField(max_length=100) + class Meta: + ordering = ("id",) + # Models for relations tests # ManyToMany diff --git a/tests/test_views.py b/tests/test_views.py index c4466f72..42680d6a 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -3,6 +3,7 @@ from rest_framework import status from rest_framework.decorators import action from rest_framework.response import Response +from rest_framework.routers import SimpleRouter from rest_framework.views import APIView from rest_framework_json_api import serializers @@ -13,6 +14,7 @@ from rest_framework_json_api.views import ModelViewSet, ReadOnlyModelViewSet from tests.models import BasicModel from tests.serializers import BasicModelSerializer +from tests.views import BasicModelViewSet class TestModelViewSet: @@ -56,6 +58,70 @@ class RelatedFieldNameView(ModelViewSet): assert view.get_related_field_name() == related_model_field_name + @pytest.mark.urls(__name__) + def test_list(self, client, model): + url = reverse("basic-model-list") + response = client.get(url) + assert response.status_code == status.HTTP_200_OK + assert response.json() == { + "data": [ + { + "type": "BasicModel", + "id": str(model.pk), + "attributes": {"text": "Model"}, + } + ], + "links": { + "first": "http://testserver/basic_models/?page%5Bnumber%5D=1", + "last": "http://testserver/basic_models/?page%5Bnumber%5D=1", + "next": None, + "prev": None, + }, + "meta": {"pagination": {"count": 1, "page": 1, "pages": 1}}, + } + + @pytest.mark.urls(__name__) + def test_retrieve(self, client, model): + url = reverse("basic-model-detail", kwargs={"pk": model.pk}) + response = client.get(url) + assert response.status_code == status.HTTP_200_OK + assert response.json() == { + "data": { + "type": "BasicModel", + "id": str(model.pk), + "attributes": {"text": "Model"}, + } + } + + @pytest.mark.urls(__name__) + def test_patch(self, client, model): + data = { + "data": { + "id": str(model.pk), + "type": "BasicModel", + "attributes": {"text": "changed"}, + } + } + + url = reverse("basic-model-detail", kwargs={"pk": model.pk}) + response = client.patch(url, data=data) + assert response.status_code == status.HTTP_200_OK + assert response.json() == { + "data": { + "type": "BasicModel", + "id": str(model.pk), + "attributes": {"text": "changed"}, + } + } + + @pytest.mark.urls(__name__) + def test_delete(self, client, model): + url = reverse("basic-model-detail", kwargs={"pk": model.pk}) + response = client.delete(url) + assert response.status_code == status.HTTP_204_NO_CONTENT + assert BasicModel.objects.count() == 0 + assert len(response.rendered_content) == 0 + class TestReadonlyModelViewSet: @pytest.mark.parametrize( @@ -108,11 +174,17 @@ def test_patch(self, client): url = reverse("custom") response = client.patch(url, data=data) - result = response.json() + assert response.status_code == status.HTTP_200_OK + assert response.json() == { + "data": { + "type": "custom", + "id": "123", + "attributes": {"body": "hello"}, + } + } + - assert result["data"]["id"] == str(123) - assert result["data"]["type"] == "custom" - assert result["data"]["attributes"]["body"] == "hello" +# Routing setup class CustomModel: @@ -140,6 +212,10 @@ def patch(self, request, *args, **kwargs): return Response(status=status.HTTP_200_OK, data=serializer.data) +router = SimpleRouter() +router.register(r"basic_models", BasicModelViewSet, basename="basic-model") + urlpatterns = [ path("custom", CustomAPIView.as_view(), name="custom"), ] +urlpatterns += router.urls diff --git a/tests/views.py b/tests/views.py index e7046a52..42d8a0b0 100644 --- a/tests/views.py +++ b/tests/views.py @@ -5,6 +5,4 @@ class BasicModelViewSet(ModelViewSet): serializer_class = BasicModelSerializer - - class Meta: - model = BasicModel + queryset = BasicModel.objects.all()