Skip to content

Commit 73ffde9

Browse files
committed
Added tests
1 parent a210e63 commit 73ffde9

File tree

1 file changed

+85
-1
lines changed

1 file changed

+85
-1
lines changed

example/tests/test_views.py

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@
22

33
from django.test import RequestFactory
44
from django.utils import timezone
5+
from rest_framework.exceptions import NotFound
6+
from rest_framework.request import Request
57
from rest_framework.reverse import reverse
6-
from rest_framework.test import APITestCase, force_authenticate
8+
from rest_framework.test import APIRequestFactory, APITestCase, force_authenticate
79

10+
from example.factories import AuthorFactory, EntryFactory
11+
from example.serializers import AuthorBioSerializer, EntrySerializer
12+
from example.views import AuthorViewSet
813
from rest_framework_json_api.utils import format_resource_type
914

1015
from . import TestBase
@@ -225,6 +230,85 @@ def test_delete_to_many_relationship_with_change(self):
225230
assert response.status_code == 200, response.content.decode()
226231

227232

233+
class TestRelatedMixin(APITestCase):
234+
235+
def setUp(self):
236+
self.author = AuthorFactory()
237+
238+
def _get_view(self, kwargs):
239+
factory = APIRequestFactory()
240+
request = Request(factory.get('', content_type='application/vnd.api+json'))
241+
return AuthorViewSet(request=request, kwargs=kwargs)
242+
243+
def test_get_related_field_name(self):
244+
kwargs = {'pk': self.author.id, 'related_field': 'bio'}
245+
view = self._get_view(kwargs)
246+
got = view.get_related_field_name()
247+
self.assertEqual(got, kwargs['related_field'])
248+
249+
def test_get_related_instance_serializer_field(self):
250+
kwargs = {'pk': self.author.id, 'related_field': 'bio'}
251+
view = self._get_view(kwargs)
252+
got = view.get_related_instance()
253+
self.assertEqual(got, self.author.bio)
254+
255+
def test_get_related_instance_model_field(self):
256+
kwargs = {'pk': self.author.id, 'related_field': 'id'}
257+
view = self._get_view(kwargs)
258+
got = view.get_related_instance()
259+
self.assertEqual(got, self.author.id)
260+
261+
def test_get_serializer_class(self):
262+
kwargs = {'pk': self.author.id, 'related_field': 'bio'}
263+
view = self._get_view(kwargs)
264+
got = view.get_serializer_class()
265+
self.assertEqual(got, AuthorBioSerializer)
266+
267+
def test_get_serializer_class_many(self):
268+
kwargs = {'pk': self.author.id, 'related_field': 'entries'}
269+
view = self._get_view(kwargs)
270+
got = view.get_serializer_class()
271+
self.assertEqual(got, EntrySerializer)
272+
273+
def test_get_serializer_class_raises_error(self):
274+
kwargs = {'pk': self.author.id, 'related_field': 'type'}
275+
view = self._get_view(kwargs)
276+
self.assertRaises(NotFound, view.get_serializer_class)
277+
278+
def test_retrieve_related_single(self):
279+
url = reverse('author-related', kwargs={'pk': self.author.pk, 'related_field': 'bio'})
280+
resp = self.client.get(url)
281+
expected = {
282+
'data': {
283+
'type': 'authorBios', 'id': str(self.author.bio.id),
284+
'relationships': {
285+
'author': {'data': {'type': 'authors', 'id': str(self.author.id)}}},
286+
'attributes': {
287+
'body': str(self.author.bio.body)
288+
},
289+
}
290+
}
291+
self.assertEqual(resp.status_code, 200)
292+
self.assertEqual(resp.json(), expected)
293+
294+
def test_retrieve_related_many(self):
295+
entry = EntryFactory(authors=self.author)
296+
url = reverse('author-related', kwargs={'pk': self.author.pk, 'related_field': 'entries'})
297+
resp = self.client.get(url)
298+
299+
self.assertEqual(resp.status_code, 200)
300+
self.assertTrue(isinstance(resp.json()['data'], list))
301+
self.assertEqual(len(resp.json()['data']), 1)
302+
self.assertEqual(resp.json()['data'][0]['id'], str(entry.id))
303+
304+
def test_retrieve_related_None(self):
305+
url = reverse('author-related', kwargs={'pk': self.author.pk, 'related_field': 'first_entry'})
306+
resp = self.client.get(url)
307+
308+
self.assertEqual(resp.status_code, 200)
309+
self.assertEqual(resp.json(), {'data': None})
310+
311+
228312
class TestValidationErrorResponses(TestBase):
229313
def test_if_returns_error_on_empty_post(self):
230314
view = views.BlogViewSet.as_view({'post': 'create'})

0 commit comments

Comments
 (0)