Skip to content

Added TestModelViewSet action tests in pytest style #1060

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 0 additions & 131 deletions example/tests/test_views.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import json
from datetime import datetime

from django.test import RequestFactory, override_settings
from django.utils import timezone
Expand Down Expand Up @@ -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="[email protected]"
)
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)
3 changes: 3 additions & 0 deletions tests/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ class Meta:
class BasicModel(DJAModel):
text = models.CharField(max_length=100)

class Meta:
ordering = ("id",)


# Models for relations tests
# ManyToMany
Expand Down
84 changes: 80 additions & 4 deletions tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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:
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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
4 changes: 1 addition & 3 deletions tests/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,4 @@

class BasicModelViewSet(ModelViewSet):
serializer_class = BasicModelSerializer

class Meta:
model = BasicModel
queryset = BasicModel.objects.all()