From e003cc91b627a64b6d4d364f9de936ed1bec03e1 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 28 Sep 2012 14:28:50 +0100 Subject: Get test-only models properly working --- rest_framework/tests/generics.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 rest_framework/tests/generics.py (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py new file mode 100644 index 00000000..dc9c6226 --- /dev/null +++ b/rest_framework/tests/generics.py @@ -0,0 +1,30 @@ +from django.test import TestCase +from django.test.client import RequestFactory +from rest_framework import generics, status +from rest_framework.tests.models import BasicModel + + +factory = RequestFactory() + + +class RootView(generics.RootAPIView): + model = BasicModel + + +class TestListView(TestCase): + def setUp(self): + items = ['foo', 'bar', 'baz'] + for item in items: + BasicModel(text=item).save() + self.objects = BasicModel.objects + self.data = [ + {'id': obj.id, 'text': obj.text} + for obj in self.objects.all() + ] + + def test_get_root_view(self): + view = RootView.as_view() + request = factory.get('/') + response = view(request).render() + self.assertEquals(response.status_code, status.HTTP_200_OK) + self.assertEquals(response.data, self.data) -- cgit v1.2.3 From 9f71f8e618555d888fff8edd322c440b49f331bc Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 28 Sep 2012 15:54:00 +0100 Subject: Fix broken bits of generic views --- rest_framework/tests/generics.py | 76 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index dc9c6226..fd1060a8 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -1,5 +1,6 @@ from django.test import TestCase from django.test.client import RequestFactory +from django.utils import simplejson as json from rest_framework import generics, status from rest_framework.tests.models import BasicModel @@ -11,8 +12,15 @@ class RootView(generics.RootAPIView): model = BasicModel -class TestListView(TestCase): +class InstanceView(generics.InstanceAPIView): + model = BasicModel + + +class TestRootView(TestCase): def setUp(self): + """ + Create 3 BasicModel intances. + """ items = ['foo', 'bar', 'baz'] for item in items: BasicModel(text=item).save() @@ -23,8 +31,74 @@ class TestListView(TestCase): ] def test_get_root_view(self): + """ + GET requests to RootAPIView should return list of objects. + """ view = RootView.as_view() request = factory.get('/') response = view(request).render() self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals(response.data, self.data) + + def test_post_root_view(self): + """ + POST requests to RootAPIView should create a new object. + """ + view = RootView.as_view() + content = {'text': 'foobar'} + request = factory.post('/', json.dumps(content), content_type='application/json') + response = view(request).render() + self.assertEquals(response.status_code, status.HTTP_201_CREATED) + self.assertEquals(response.data, {'id': 4, 'text': u'foobar'}) + created = self.objects.get(id=4) + self.assertEquals(created.text, 'foobar') + + +class TestInstanceView(TestCase): + def setUp(self): + """ + Create 3 BasicModel intances. + """ + items = ['foo', 'bar', 'baz'] + for item in items: + BasicModel(text=item).save() + self.objects = BasicModel.objects + self.data = [ + {'id': obj.id, 'text': obj.text} + for obj in self.objects.all() + ] + + def test_get_instance_view(self): + """ + GET requests to InstanceAPIView should return a single object. + """ + view = InstanceView.as_view() + request = factory.get('/1') + response = view(request, pk=1).render() + self.assertEquals(response.status_code, status.HTTP_200_OK) + self.assertEquals(response.data, self.data[0]) + + def test_put_instance_view(self): + """ + PUT requests to InstanceAPIView should update an object. + """ + view = InstanceView.as_view() + content = {'text': 'foobar'} + request = factory.put('/1', json.dumps(content), content_type='application/json') + response = view(request, pk=1).render() + self.assertEquals(response.status_code, status.HTTP_200_OK) + self.assertEquals(response.data, {'id': 1, 'text': 'foobar'}) + updated = self.objects.get(id=1) + self.assertEquals(updated.text, 'foobar') + + def test_delete_instance_view(self): + """ + DELETE requests to InstanceAPIView should delete an object. + """ + view = InstanceView.as_view() + request = factory.delete('/1') + response = view(request, pk=1).render() + self.assertEquals(response.status_code, status.HTTP_204_NO_CONTENT) + self.assertEquals(response.content, '') + ids = [obj.id for obj in self.objects.all()] + self.assertEquals(ids, [2, 3]) -- cgit v1.2.3 From 0853316545ad39c314f56ee559ce56596e578d2b Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 28 Sep 2012 16:23:46 +0100 Subject: Add more tests for generic views --- rest_framework/tests/generics.py | 46 +++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 10 deletions(-) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index fd1060a8..0ce297e0 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -29,14 +29,14 @@ class TestRootView(TestCase): {'id': obj.id, 'text': obj.text} for obj in self.objects.all() ] + self.view = RootView.as_view() def test_get_root_view(self): """ GET requests to RootAPIView should return list of objects. """ - view = RootView.as_view() request = factory.get('/') - response = view(request).render() + response = self.view(request).render() self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals(response.data, self.data) @@ -44,15 +44,33 @@ class TestRootView(TestCase): """ POST requests to RootAPIView should create a new object. """ - view = RootView.as_view() content = {'text': 'foobar'} request = factory.post('/', json.dumps(content), content_type='application/json') - response = view(request).render() + response = self.view(request).render() self.assertEquals(response.status_code, status.HTTP_201_CREATED) self.assertEquals(response.data, {'id': 4, 'text': u'foobar'}) created = self.objects.get(id=4) self.assertEquals(created.text, 'foobar') + def test_put_root_view(self): + """ + PUT requests to RootAPIView should not be allowed + """ + content = {'text': 'foobar'} + request = factory.put('/', json.dumps(content), content_type='application/json') + response = self.view(request).render() + self.assertEquals(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + self.assertEquals(response.content, '{"detail": "Method \'PUT\' not allowed."}') + + def test_delete_root_view(self): + """ + DELETE requests to RootAPIView should not be allowed + """ + request = factory.delete('/') + response = self.view(request).render() + self.assertEquals(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + self.assertEquals(response.content, '{"detail": "Method \'DELETE\' not allowed."}') + class TestInstanceView(TestCase): def setUp(self): @@ -67,25 +85,34 @@ class TestInstanceView(TestCase): {'id': obj.id, 'text': obj.text} for obj in self.objects.all() ] + self.view = InstanceView.as_view() def test_get_instance_view(self): """ GET requests to InstanceAPIView should return a single object. """ - view = InstanceView.as_view() request = factory.get('/1') - response = view(request, pk=1).render() + response = self.view(request, pk=1).render() self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals(response.data, self.data[0]) + def test_post_instance_view(self): + """ + POST requests to InstanceAPIView should not be allowed + """ + content = {'text': 'foobar'} + request = factory.post('/', json.dumps(content), content_type='application/json') + response = self.view(request).render() + self.assertEquals(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + self.assertEquals(response.content, '{"detail": "Method \'POST\' not allowed."}') + def test_put_instance_view(self): """ PUT requests to InstanceAPIView should update an object. """ - view = InstanceView.as_view() content = {'text': 'foobar'} request = factory.put('/1', json.dumps(content), content_type='application/json') - response = view(request, pk=1).render() + response = self.view(request, pk=1).render() self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals(response.data, {'id': 1, 'text': 'foobar'}) updated = self.objects.get(id=1) @@ -95,9 +122,8 @@ class TestInstanceView(TestCase): """ DELETE requests to InstanceAPIView should delete an object. """ - view = InstanceView.as_view() request = factory.delete('/1') - response = view(request, pk=1).render() + response = self.view(request, pk=1).render() self.assertEquals(response.status_code, status.HTTP_204_NO_CONTENT) self.assertEquals(response.content, '') ids = [obj.id for obj in self.objects.all()] -- cgit v1.2.3 From 224bc027cd611cf6ec7dcb7958a675bea39eeb97 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 28 Sep 2012 16:41:35 +0100 Subject: Add more tests for generic views --- rest_framework/tests/generics.py | 56 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 3 deletions(-) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index 0ce297e0..fee6e3a6 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -9,10 +9,16 @@ factory = RequestFactory() class RootView(generics.RootAPIView): + """ + Example description for OPTIONS. + """ model = BasicModel class InstanceView(generics.InstanceAPIView): + """ + Example description for OPTIONS. + """ model = BasicModel @@ -60,7 +66,7 @@ class TestRootView(TestCase): request = factory.put('/', json.dumps(content), content_type='application/json') response = self.view(request).render() self.assertEquals(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) - self.assertEquals(response.content, '{"detail": "Method \'PUT\' not allowed."}') + self.assertEquals(response.data, {"detail": "Method 'PUT' not allowed."}) def test_delete_root_view(self): """ @@ -69,7 +75,29 @@ class TestRootView(TestCase): request = factory.delete('/') response = self.view(request).render() self.assertEquals(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) - self.assertEquals(response.content, '{"detail": "Method \'DELETE\' not allowed."}') + self.assertEquals(response.data, {"detail": "Method 'DELETE' not allowed."}) + + def test_options_root_view(self): + """ + OPTIONS requests to RootAPIView should return metadata + """ + request = factory.options('/') + response = self.view(request).render() + expected = { + 'parses': [ + 'application/json', + 'application/x-www-form-urlencoded', + 'multipart/form-data' + ], + 'renders': [ + 'application/json', + 'text/html' + ], + 'name': 'Root', + 'description': 'Example description for OPTIONS.' + } + self.assertEquals(response.status_code, status.HTTP_200_OK) + self.assertEquals(response.data, expected) class TestInstanceView(TestCase): @@ -104,7 +132,7 @@ class TestInstanceView(TestCase): request = factory.post('/', json.dumps(content), content_type='application/json') response = self.view(request).render() self.assertEquals(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) - self.assertEquals(response.content, '{"detail": "Method \'POST\' not allowed."}') + self.assertEquals(response.data, {"detail": "Method 'POST' not allowed."}) def test_put_instance_view(self): """ @@ -128,3 +156,25 @@ class TestInstanceView(TestCase): self.assertEquals(response.content, '') ids = [obj.id for obj in self.objects.all()] self.assertEquals(ids, [2, 3]) + + def test_options_instance_view(self): + """ + OPTIONS requests to InstanceAPIView should return metadata + """ + request = factory.options('/') + response = self.view(request).render() + expected = { + 'parses': [ + 'application/json', + 'application/x-www-form-urlencoded', + 'multipart/form-data' + ], + 'renders': [ + 'application/json', + 'text/html' + ], + 'name': 'Instance', + 'description': 'Example description for OPTIONS.' + } + self.assertEquals(response.status_code, status.HTTP_200_OK) + self.assertEquals(response.data, expected) -- cgit v1.2.3 From b16fb5777168246b1e217640b818a82eb6e2141b Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 1 Oct 2012 15:49:19 +0100 Subject: Expand pagination support, add docs --- rest_framework/tests/generics.py | 1 + 1 file changed, 1 insertion(+) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index fee6e3a6..ec46b427 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -13,6 +13,7 @@ class RootView(generics.RootAPIView): Example description for OPTIONS. """ model = BasicModel + paginate_by = None class InstanceView(generics.InstanceAPIView): -- cgit v1.2.3 From ab173fd8f9070ccdb70f86f400d2ffa780977ce4 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Tue, 2 Oct 2012 15:37:13 +0100 Subject: Fix bug where pk could be set in post data --- rest_framework/tests/generics.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index ec46b427..79c01f9e 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -100,6 +100,18 @@ class TestRootView(TestCase): self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals(response.data, expected) + def test_post_cannot_set_id(self): + """ + POST requests to create a new object should not be able to set the id. + """ + content = {'id': 999, 'text': 'foobar'} + request = factory.post('/', json.dumps(content), content_type='application/json') + response = self.view(request).render() + self.assertEquals(response.status_code, status.HTTP_201_CREATED) + self.assertEquals(response.data, {'id': 4, 'text': u'foobar'}) + created = self.objects.get(id=4) + self.assertEquals(created.text, 'foobar') + class TestInstanceView(TestCase): def setUp(self): -- cgit v1.2.3 From f010a9553ec7ab1645c2bae4c959a19bb5117a21 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Tue, 2 Oct 2012 15:39:41 +0100 Subject: Add test to ensure that pk is readonly in PUT requests --- rest_framework/tests/generics.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index 79c01f9e..3c241f42 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -191,3 +191,15 @@ class TestInstanceView(TestCase): } self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals(response.data, expected) + + def test_put_cannot_set_id(self): + """ + POST requests to create a new object should not be able to set the id. + """ + content = {'id': 999, 'text': 'foobar'} + request = factory.put('/1', json.dumps(content), content_type='application/json') + response = self.view(request, pk=1).render() + self.assertEquals(response.status_code, status.HTTP_200_OK) + self.assertEquals(response.data, {'id': 1, 'text': 'foobar'}) + updated = self.objects.get(id=1) + self.assertEquals(updated.text, 'foobar') -- cgit v1.2.3 From d1b99f350aded62fe480f7dc4749cd63d52715d2 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Tue, 2 Oct 2012 16:16:49 +0100 Subject: Added model form field -> serializer form field mapping --- rest_framework/tests/generics.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index 3c241f42..76662373 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -52,7 +52,8 @@ class TestRootView(TestCase): POST requests to RootAPIView should create a new object. """ content = {'text': 'foobar'} - request = factory.post('/', json.dumps(content), content_type='application/json') + request = factory.post('/', json.dumps(content), + content_type='application/json') response = self.view(request).render() self.assertEquals(response.status_code, status.HTTP_201_CREATED) self.assertEquals(response.data, {'id': 4, 'text': u'foobar'}) @@ -64,7 +65,8 @@ class TestRootView(TestCase): PUT requests to RootAPIView should not be allowed """ content = {'text': 'foobar'} - request = factory.put('/', json.dumps(content), content_type='application/json') + request = factory.put('/', json.dumps(content), + content_type='application/json') response = self.view(request).render() self.assertEquals(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) self.assertEquals(response.data, {"detail": "Method 'PUT' not allowed."}) @@ -105,7 +107,8 @@ class TestRootView(TestCase): POST requests to create a new object should not be able to set the id. """ content = {'id': 999, 'text': 'foobar'} - request = factory.post('/', json.dumps(content), content_type='application/json') + request = factory.post('/', json.dumps(content), + content_type='application/json') response = self.view(request).render() self.assertEquals(response.status_code, status.HTTP_201_CREATED) self.assertEquals(response.data, {'id': 4, 'text': u'foobar'}) @@ -142,7 +145,8 @@ class TestInstanceView(TestCase): POST requests to InstanceAPIView should not be allowed """ content = {'text': 'foobar'} - request = factory.post('/', json.dumps(content), content_type='application/json') + request = factory.post('/', json.dumps(content), + content_type='application/json') response = self.view(request).render() self.assertEquals(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) self.assertEquals(response.data, {"detail": "Method 'POST' not allowed."}) @@ -152,7 +156,8 @@ class TestInstanceView(TestCase): PUT requests to InstanceAPIView should update an object. """ content = {'text': 'foobar'} - request = factory.put('/1', json.dumps(content), content_type='application/json') + request = factory.put('/1', json.dumps(content), + content_type='application/json') response = self.view(request, pk=1).render() self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals(response.data, {'id': 1, 'text': 'foobar'}) @@ -197,7 +202,8 @@ class TestInstanceView(TestCase): POST requests to create a new object should not be able to set the id. """ content = {'id': 999, 'text': 'foobar'} - request = factory.put('/1', json.dumps(content), content_type='application/json') + request = factory.put('/1', json.dumps(content), + content_type='application/json') response = self.view(request, pk=1).render() self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals(response.data, {'id': 1, 'text': 'foobar'}) -- cgit v1.2.3 From c30e0795bebd9980a66ae7db1a0d8c43f77d4c11 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Wed, 3 Oct 2012 09:26:15 +0100 Subject: Rename generic views --- rest_framework/tests/generics.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index 76662373..187465ed 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -8,7 +8,7 @@ from rest_framework.tests.models import BasicModel factory = RequestFactory() -class RootView(generics.RootAPIView): +class RootView(generics.ListCreateAPIView): """ Example description for OPTIONS. """ @@ -16,7 +16,7 @@ class RootView(generics.RootAPIView): paginate_by = None -class InstanceView(generics.InstanceAPIView): +class InstanceView(generics.RetrieveUpdateDestroyAPIView): """ Example description for OPTIONS. """ @@ -40,7 +40,7 @@ class TestRootView(TestCase): def test_get_root_view(self): """ - GET requests to RootAPIView should return list of objects. + GET requests to ListCreateAPIView should return list of objects. """ request = factory.get('/') response = self.view(request).render() @@ -49,7 +49,7 @@ class TestRootView(TestCase): def test_post_root_view(self): """ - POST requests to RootAPIView should create a new object. + POST requests to ListCreateAPIView should create a new object. """ content = {'text': 'foobar'} request = factory.post('/', json.dumps(content), @@ -62,7 +62,7 @@ class TestRootView(TestCase): def test_put_root_view(self): """ - PUT requests to RootAPIView should not be allowed + PUT requests to ListCreateAPIView should not be allowed """ content = {'text': 'foobar'} request = factory.put('/', json.dumps(content), @@ -73,7 +73,7 @@ class TestRootView(TestCase): def test_delete_root_view(self): """ - DELETE requests to RootAPIView should not be allowed + DELETE requests to ListCreateAPIView should not be allowed """ request = factory.delete('/') response = self.view(request).render() @@ -82,7 +82,7 @@ class TestRootView(TestCase): def test_options_root_view(self): """ - OPTIONS requests to RootAPIView should return metadata + OPTIONS requests to ListCreateAPIView should return metadata """ request = factory.options('/') response = self.view(request).render() @@ -133,7 +133,7 @@ class TestInstanceView(TestCase): def test_get_instance_view(self): """ - GET requests to InstanceAPIView should return a single object. + GET requests to RetrieveUpdateDestroyAPIView should return a single object. """ request = factory.get('/1') response = self.view(request, pk=1).render() @@ -142,7 +142,7 @@ class TestInstanceView(TestCase): def test_post_instance_view(self): """ - POST requests to InstanceAPIView should not be allowed + POST requests to RetrieveUpdateDestroyAPIView should not be allowed """ content = {'text': 'foobar'} request = factory.post('/', json.dumps(content), @@ -153,7 +153,7 @@ class TestInstanceView(TestCase): def test_put_instance_view(self): """ - PUT requests to InstanceAPIView should update an object. + PUT requests to RetrieveUpdateDestroyAPIView should update an object. """ content = {'text': 'foobar'} request = factory.put('/1', json.dumps(content), @@ -166,7 +166,7 @@ class TestInstanceView(TestCase): def test_delete_instance_view(self): """ - DELETE requests to InstanceAPIView should delete an object. + DELETE requests to RetrieveUpdateDestroyAPIView should delete an object. """ request = factory.delete('/1') response = self.view(request, pk=1).render() @@ -177,7 +177,7 @@ class TestInstanceView(TestCase): def test_options_instance_view(self): """ - OPTIONS requests to InstanceAPIView should return metadata + OPTIONS requests to RetrieveUpdateDestroyAPIView should return metadata """ request = factory.options('/') response = self.view(request).render() -- cgit v1.2.3 From d89d6887d2eb8293348cb1a7a043a05352819cb8 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 4 Oct 2012 11:26:41 +0100 Subject: HyperlinkedModelSerializer with working HyperlinkedIdentityField, but no hyperlinked relations --- rest_framework/tests/generics.py | 1 - 1 file changed, 1 deletion(-) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index 187465ed..c0645d6e 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -13,7 +13,6 @@ class RootView(generics.ListCreateAPIView): Example description for OPTIONS. """ model = BasicModel - paginate_by = None class InstanceView(generics.RetrieveUpdateDestroyAPIView): -- cgit v1.2.3 From 2533c2452b383771f80e6d40c93ae4a5ef6a8cf7 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 5 Oct 2012 16:24:52 +0100 Subject: Support PUT for create --- rest_framework/tests/generics.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index c0645d6e..2a6a0744 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -208,3 +208,18 @@ class TestInstanceView(TestCase): self.assertEquals(response.data, {'id': 1, 'text': 'foobar'}) updated = self.objects.get(id=1) self.assertEquals(updated.text, 'foobar') + + def test_put_to_deleted_instance(self): + """ + PUT requests to RetrieveUpdateDestroyAPIView should create an object + if it does not currently exist. + """ + self.objects.get(id=1).delete() + content = {'text': 'foobar'} + request = factory.put('/1', json.dumps(content), + content_type='application/json') + response = self.view(request, pk=1).render() + self.assertEquals(response.status_code, status.HTTP_200_OK) + self.assertEquals(response.data, {'id': 1, 'text': 'foobar'}) + updated = self.objects.get(id=1) + self.assertEquals(updated.text, 'foobar') -- cgit v1.2.3 From 52ba2e333375c6829fb89b6b43e4d19b2f2a86a4 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 8 Oct 2012 12:52:56 +0100 Subject: Fix #285 --- rest_framework/tests/generics.py | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index 2a6a0744..f4263478 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -1,8 +1,8 @@ from django.test import TestCase from django.test.client import RequestFactory from django.utils import simplejson as json -from rest_framework import generics, status -from rest_framework.tests.models import BasicModel +from rest_framework import generics, serializers, status +from rest_framework.tests.models import BasicModel, Comment factory = RequestFactory() @@ -223,3 +223,36 @@ class TestInstanceView(TestCase): self.assertEquals(response.data, {'id': 1, 'text': 'foobar'}) updated = self.objects.get(id=1) self.assertEquals(updated.text, 'foobar') + + +# Regression test for #285 + +class CommentSerializer(serializers.ModelSerializer): + class Meta: + model = Comment + exclude = ('created',) + + +class CommentView(generics.ListCreateAPIView): + serializer_class = CommentSerializer + model = Comment + + +class TestCreateModelWithAutoNowAddField(TestCase): + def setUp(self): + self.objects = Comment.objects + self.view = CommentView.as_view() + + def test_create_model_with_auto_now_add_field(self): + """ + Regression test for #285 + + https://github.com/tomchristie/django-rest-framework/issues/285 + """ + content = {'email': 'foobar@example.com', 'content': 'foobar'} + request = factory.post('/', json.dumps(content), + content_type='application/json') + response = self.view(request).render() + self.assertEquals(response.status_code, status.HTTP_201_CREATED) + created = self.objects.get(id=1) + self.assertEquals(created.content, 'foobar') -- cgit v1.2.3 From bc99142c7dc1ebf84ca0858ce32b400a537e1908 Mon Sep 17 00:00:00 2001 From: Marko Tibold Date: Sun, 28 Oct 2012 19:35:50 +0100 Subject: Added wo tests. One for PUTing on a non-existing id-based url. And another for PUTing on a non-existing slug-based url. Fix doctoring for 'test_put_cannot_set_id'. --- rest_framework/tests/generics.py | 44 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index f4263478..151532a7 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -2,7 +2,7 @@ from django.test import TestCase from django.test.client import RequestFactory from django.utils import simplejson as json from rest_framework import generics, serializers, status -from rest_framework.tests.models import BasicModel, Comment +from rest_framework.tests.models import BasicModel, Comment, SlugBasedModel factory = RequestFactory() @@ -22,6 +22,13 @@ class InstanceView(generics.RetrieveUpdateDestroyAPIView): model = BasicModel +class SlugBasedInstanceView(InstanceView): + """ + A model with a slug-field. + """ + model = SlugBasedModel + + class TestRootView(TestCase): def setUp(self): """ @@ -129,6 +136,7 @@ class TestInstanceView(TestCase): for obj in self.objects.all() ] self.view = InstanceView.as_view() + self.slug_based_view = SlugBasedInstanceView.as_view() def test_get_instance_view(self): """ @@ -198,7 +206,7 @@ class TestInstanceView(TestCase): def test_put_cannot_set_id(self): """ - POST requests to create a new object should not be able to set the id. + PUT requests to create a new object should not be able to set the id. """ content = {'id': 999, 'text': 'foobar'} request = factory.put('/1', json.dumps(content), @@ -224,6 +232,38 @@ class TestInstanceView(TestCase): updated = self.objects.get(id=1) self.assertEquals(updated.text, 'foobar') + def test_put_as_create_on_id_based_url(self): + """ + PUT requests to RetrieveUpdateDestroyAPIView should create an object + at the requested url if it doesn't exist, if creation is not possible, + e.g. the pk for an id-field is determined by the database, + a HTTP_403_FORBIDDEN error-response must be returned. + """ + content = {'text': 'foobar'} + # pk fields can not be created on demand, only the database can set th pk for a new object + request = factory.put('/5', json.dumps(content), + content_type='application/json') + response = self.view(request, pk=5).render() + expected = { + 'detail': u'A resource could not be created at the requested URI' + } + self.assertEquals(response.status_code, status.HTTP_403_FORBIDDEN) + self.assertEquals(response.data, expected) + + def test_put_as_create_on_slug_based_url(self): + """ + PUT requests to RetrieveUpdateDestroyAPIView should create an object + at the requested url if possible, else return HTTP_403_FORBIDDEN error-response. + """ + content = {'text': 'foobar'} + request = factory.put('/test_slug', json.dumps(content), + content_type='application/json') + response = self.slug_based_view(request, pk='test_slug').render() + self.assertEquals(response.status_code, status.HTTP_201_CREATED) + self.assertEquals(response.data, {'slug': 'test_slug', 'text': 'foobar'}) + updated = self.objects.get(slug='test_slug') + self.assertEquals(updated.text, 'foobar') + # Regression test for #285 -- cgit v1.2.3 From 5bb66803761c0536497158d14ce0a23665a335da Mon Sep 17 00:00:00 2001 From: Marko Tibold Date: Sun, 28 Oct 2012 20:45:42 +0100 Subject: test_put_as_create_on_id_based_url should check for a created-response. --- rest_framework/tests/generics.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index 151532a7..48805720 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -235,20 +235,16 @@ class TestInstanceView(TestCase): def test_put_as_create_on_id_based_url(self): """ PUT requests to RetrieveUpdateDestroyAPIView should create an object - at the requested url if it doesn't exist, if creation is not possible, - e.g. the pk for an id-field is determined by the database, - a HTTP_403_FORBIDDEN error-response must be returned. + at the requested url if it doesn't exist. """ content = {'text': 'foobar'} # pk fields can not be created on demand, only the database can set th pk for a new object request = factory.put('/5', json.dumps(content), content_type='application/json') response = self.view(request, pk=5).render() - expected = { - 'detail': u'A resource could not be created at the requested URI' - } - self.assertEquals(response.status_code, status.HTTP_403_FORBIDDEN) - self.assertEquals(response.data, expected) + self.assertEquals(response.status_code, status.HTTP_201_CREATED) + new_obj = self.objects.get(slug='test_slug') + self.assertEquals(new_obj.text, 'foobar') def test_put_as_create_on_slug_based_url(self): """ @@ -261,8 +257,8 @@ class TestInstanceView(TestCase): response = self.slug_based_view(request, pk='test_slug').render() self.assertEquals(response.status_code, status.HTTP_201_CREATED) self.assertEquals(response.data, {'slug': 'test_slug', 'text': 'foobar'}) - updated = self.objects.get(slug='test_slug') - self.assertEquals(updated.text, 'foobar') + new_obj = self.objects.get(slug='test_slug') + self.assertEquals(new_obj.text, 'foobar') # Regression test for #285 -- cgit v1.2.3 From 1a16289edeea73253826916ca230af2bf30ba39f Mon Sep 17 00:00:00 2001 From: Marko Tibold Date: Sun, 28 Oct 2012 20:56:48 +0100 Subject: Get the correct instance --- rest_framework/tests/generics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index 48805720..a0a4109d 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -243,7 +243,7 @@ class TestInstanceView(TestCase): content_type='application/json') response = self.view(request, pk=5).render() self.assertEquals(response.status_code, status.HTTP_201_CREATED) - new_obj = self.objects.get(slug='test_slug') + new_obj = self.objects.get(pk=5) self.assertEquals(new_obj.text, 'foobar') def test_put_as_create_on_slug_based_url(self): -- cgit v1.2.3 From 343da8e3cf0d50761cd5b15e168a104aad4e0ac5 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 29 Oct 2012 16:13:08 +0000 Subject: PUT as create should return 200 --- rest_framework/tests/generics.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index a0a4109d..ef5edd58 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -242,7 +242,7 @@ class TestInstanceView(TestCase): request = factory.put('/5', json.dumps(content), content_type='application/json') response = self.view(request, pk=5).render() - self.assertEquals(response.status_code, status.HTTP_201_CREATED) + self.assertEquals(response.status_code, status.HTTP_200_OK) new_obj = self.objects.get(pk=5) self.assertEquals(new_obj.text, 'foobar') @@ -255,7 +255,7 @@ class TestInstanceView(TestCase): request = factory.put('/test_slug', json.dumps(content), content_type='application/json') response = self.slug_based_view(request, pk='test_slug').render() - self.assertEquals(response.status_code, status.HTTP_201_CREATED) + self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals(response.data, {'slug': 'test_slug', 'text': 'foobar'}) new_obj = self.objects.get(slug='test_slug') self.assertEquals(new_obj.text, 'foobar') -- cgit v1.2.3 From b6c90c0d684cd036a2ce874fd9ace7a8a2bfda2f Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 29 Oct 2012 17:20:06 +0000 Subject: Fix slug based put as create test --- rest_framework/tests/generics.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'rest_framework/tests/generics.py') diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index ef5edd58..d45ea976 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -22,11 +22,20 @@ class InstanceView(generics.RetrieveUpdateDestroyAPIView): model = BasicModel +class SlugSerializer(serializers.ModelSerializer): + slug = serializers.Field() # read only + + class Meta: + model = SlugBasedModel + exclude = ('id',) + + class SlugBasedInstanceView(InstanceView): """ A model with a slug-field. """ model = SlugBasedModel + serializer_class = SlugSerializer class TestRootView(TestCase): @@ -254,10 +263,10 @@ class TestInstanceView(TestCase): content = {'text': 'foobar'} request = factory.put('/test_slug', json.dumps(content), content_type='application/json') - response = self.slug_based_view(request, pk='test_slug').render() + response = self.slug_based_view(request, slug='test_slug').render() self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals(response.data, {'slug': 'test_slug', 'text': 'foobar'}) - new_obj = self.objects.get(slug='test_slug') + new_obj = SlugBasedModel.objects.get(slug='test_slug') self.assertEquals(new_obj.text, 'foobar') -- cgit v1.2.3