diff options
Diffstat (limited to 'djangorestframework/tests')
| -rw-r--r-- | djangorestframework/tests/files.py | 51 | ||||
| -rw-r--r-- | djangorestframework/tests/mixins.py | 565 | ||||
| -rw-r--r-- | djangorestframework/tests/modelviews.py | 132 | ||||
| -rw-r--r-- | djangorestframework/tests/serializer.py | 297 | ||||
| -rw-r--r-- | djangorestframework/tests/throttling.py | 14 | ||||
| -rw-r--r-- | djangorestframework/tests/validators.py | 639 | ||||
| -rw-r--r-- | djangorestframework/tests/views.py | 263 |
7 files changed, 970 insertions, 991 deletions
diff --git a/djangorestframework/tests/files.py b/djangorestframework/tests/files.py index bbdff70b..90a613b9 100644 --- a/djangorestframework/tests/files.py +++ b/djangorestframework/tests/files.py @@ -1,35 +1,34 @@ -from django.test import TestCase -from django import forms +# from django.test import TestCase +# from django import forms -from djangorestframework.compat import RequestFactory -from djangorestframework.views import View -from djangorestframework.resources import FormResource -from djangorestframework.response import Response +# from djangorestframework.compat import RequestFactory +# from djangorestframework.views import View +# from djangorestframework.response import Response -import StringIO +# import StringIO -class UploadFilesTests(TestCase): - """Check uploading of files""" - def setUp(self): - self.factory = RequestFactory() - def test_upload_file(self): +# class UploadFilesTests(TestCase): +# """Check uploading of files""" +# def setUp(self): +# self.factory = RequestFactory() - class FileForm(forms.Form): - file = forms.FileField() +# def test_upload_file(self): - class MockView(View): - permissions = () - form = FileForm +# class FileForm(forms.Form): +# file = forms.FileField() - def post(self, request, *args, **kwargs): - return Response({'FILE_NAME': self.CONTENT['file'].name, - 'FILE_CONTENT': self.CONTENT['file'].read()}) +# class MockView(View): +# permissions = () +# form = FileForm - file = StringIO.StringIO('stuff') - file.name = 'stuff.txt' - request = self.factory.post('/', {'file': file}) - view = MockView.as_view() - response = view(request) - self.assertEquals(response.raw_content, {"FILE_CONTENT": "stuff", "FILE_NAME": "stuff.txt"}) +# def post(self, request, *args, **kwargs): +# return Response({'FILE_NAME': self.CONTENT['file'].name, +# 'FILE_CONTENT': self.CONTENT['file'].read()}) +# file = StringIO.StringIO('stuff') +# file.name = 'stuff.txt' +# request = self.factory.post('/', {'file': file}) +# view = MockView.as_view() +# response = view(request) +# self.assertEquals(response.raw_content, {"FILE_CONTENT": "stuff", "FILE_NAME": "stuff.txt"}) diff --git a/djangorestframework/tests/mixins.py b/djangorestframework/tests/mixins.py index 25c57bd6..05ce655d 100644 --- a/djangorestframework/tests/mixins.py +++ b/djangorestframework/tests/mixins.py @@ -1,286 +1,285 @@ -"""Tests for the mixin module""" -from django.test import TestCase -from django.utils import simplejson as json -from djangorestframework import status -from djangorestframework.compat import RequestFactory -from django.contrib.auth.models import Group, User -from djangorestframework.mixins import CreateModelMixin, PaginatorMixin, ReadModelMixin -from djangorestframework.resources import ModelResource -from djangorestframework.response import Response, ImmediateResponse -from djangorestframework.tests.models import CustomUser -from djangorestframework.tests.testcases import TestModelsTestCase -from djangorestframework.views import View - - -class TestModelRead(TestModelsTestCase): - """Tests on ReadModelMixin""" - - def setUp(self): - super(TestModelRead, self).setUp() - self.req = RequestFactory() - - def test_read(self): - Group.objects.create(name='other group') - group = Group.objects.create(name='my group') - - class GroupResource(ModelResource): - model = Group - - request = self.req.get('/groups') - mixin = ReadModelMixin() - mixin.resource = GroupResource - - response = mixin.get(request, id=group.id) - self.assertEquals(group.name, response.raw_content.name) - - def test_read_404(self): - class GroupResource(ModelResource): - model = Group - - request = self.req.get('/groups') - mixin = ReadModelMixin() - mixin.resource = GroupResource - - self.assertRaises(ImmediateResponse, mixin.get, request, id=12345) - - -class TestModelCreation(TestModelsTestCase): - """Tests on CreateModelMixin""" - - def setUp(self): - super(TestModelsTestCase, self).setUp() - self.req = RequestFactory() - - def test_creation(self): - self.assertEquals(0, Group.objects.count()) - - class GroupResource(ModelResource): - model = Group - - form_data = {'name': 'foo'} - request = self.req.post('/groups', data=form_data) - mixin = CreateModelMixin() - mixin.resource = GroupResource - mixin.CONTENT = form_data - - response = mixin.post(request) - self.assertEquals(1, Group.objects.count()) - self.assertEquals('foo', response.raw_content.name) - - def test_creation_with_m2m_relation(self): - class UserResource(ModelResource): - model = User - - def url(self, instance): - return "/users/%i" % instance.id - - group = Group(name='foo') - group.save() - - form_data = { - 'username': 'bar', - 'password': 'baz', - 'groups': [group.id] - } - request = self.req.post('/groups', data=form_data) - cleaned_data = dict(form_data) - cleaned_data['groups'] = [group] - mixin = CreateModelMixin() - mixin.resource = UserResource - mixin.CONTENT = cleaned_data - - response = mixin.post(request) - self.assertEquals(1, User.objects.count()) - self.assertEquals(1, response.raw_content.groups.count()) - self.assertEquals('foo', response.raw_content.groups.all()[0].name) - - def test_creation_with_m2m_relation_through(self): - """ - Tests creation where the m2m relation uses a through table - """ - class UserResource(ModelResource): - model = CustomUser - - def url(self, instance): - return "/customusers/%i" % instance.id - - form_data = {'username': 'bar0', 'groups': []} - request = self.req.post('/groups', data=form_data) - cleaned_data = dict(form_data) - cleaned_data['groups'] = [] - mixin = CreateModelMixin() - mixin.resource = UserResource - mixin.CONTENT = cleaned_data +# """Tests for the mixin module""" +# from django.test import TestCase +# from djangorestframework import status +# from djangorestframework.compat import RequestFactory +# from django.contrib.auth.models import Group, User +# from djangorestframework.mixins import CreateModelMixin, PaginatorMixin, ReadModelMixin +# from djangorestframework.resources import ModelResource +# from djangorestframework.response import Response, ImmediateResponse +# from djangorestframework.tests.models import CustomUser +# from djangorestframework.tests.testcases import TestModelsTestCase +# from djangorestframework.views import View + + +# class TestModelRead(TestModelsTestCase): +# """Tests on ReadModelMixin""" + +# def setUp(self): +# super(TestModelRead, self).setUp() +# self.req = RequestFactory() + +# def test_read(self): +# Group.objects.create(name='other group') +# group = Group.objects.create(name='my group') + +# class GroupResource(ModelResource): +# model = Group + +# request = self.req.get('/groups') +# mixin = ReadModelMixin() +# mixin.resource = GroupResource + +# response = mixin.get(request, id=group.id) +# self.assertEquals(group.name, response.raw_content.name) + +# def test_read_404(self): +# class GroupResource(ModelResource): +# model = Group + +# request = self.req.get('/groups') +# mixin = ReadModelMixin() +# mixin.resource = GroupResource + +# self.assertRaises(ImmediateResponse, mixin.get, request, id=12345) + + +# class TestModelCreation(TestModelsTestCase): +# """Tests on CreateModelMixin""" + +# def setUp(self): +# super(TestModelsTestCase, self).setUp() +# self.req = RequestFactory() + +# def test_creation(self): +# self.assertEquals(0, Group.objects.count()) + +# class GroupResource(ModelResource): +# model = Group + +# form_data = {'name': 'foo'} +# request = self.req.post('/groups', data=form_data) +# mixin = CreateModelMixin() +# mixin.resource = GroupResource +# mixin.CONTENT = form_data + +# response = mixin.post(request) +# self.assertEquals(1, Group.objects.count()) +# self.assertEquals('foo', response.raw_content.name) + +# def test_creation_with_m2m_relation(self): +# class UserResource(ModelResource): +# model = User + +# def url(self, instance): +# return "/users/%i" % instance.id + +# group = Group(name='foo') +# group.save() + +# form_data = { +# 'username': 'bar', +# 'password': 'baz', +# 'groups': [group.id] +# } +# request = self.req.post('/groups', data=form_data) +# cleaned_data = dict(form_data) +# cleaned_data['groups'] = [group] +# mixin = CreateModelMixin() +# mixin.resource = UserResource +# mixin.CONTENT = cleaned_data + +# response = mixin.post(request) +# self.assertEquals(1, User.objects.count()) +# self.assertEquals(1, response.raw_content.groups.count()) +# self.assertEquals('foo', response.raw_content.groups.all()[0].name) + +# def test_creation_with_m2m_relation_through(self): +# """ +# Tests creation where the m2m relation uses a through table +# """ +# class UserResource(ModelResource): +# model = CustomUser + +# def url(self, instance): +# return "/customusers/%i" % instance.id + +# form_data = {'username': 'bar0', 'groups': []} +# request = self.req.post('/groups', data=form_data) +# cleaned_data = dict(form_data) +# cleaned_data['groups'] = [] +# mixin = CreateModelMixin() +# mixin.resource = UserResource +# mixin.CONTENT = cleaned_data - response = mixin.post(request) - self.assertEquals(1, CustomUser.objects.count()) - self.assertEquals(0, response.raw_content.groups.count()) +# response = mixin.post(request) +# self.assertEquals(1, CustomUser.objects.count()) +# self.assertEquals(0, response.raw_content.groups.count()) - group = Group(name='foo1') - group.save() +# group = Group(name='foo1') +# group.save() - form_data = {'username': 'bar1', 'groups': [group.id]} - request = self.req.post('/groups', data=form_data) - cleaned_data = dict(form_data) - cleaned_data['groups'] = [group] - mixin = CreateModelMixin() - mixin.resource = UserResource - mixin.CONTENT = cleaned_data - - response = mixin.post(request) - self.assertEquals(2, CustomUser.objects.count()) - self.assertEquals(1, response.raw_content.groups.count()) - self.assertEquals('foo1', response.raw_content.groups.all()[0].name) - - group2 = Group(name='foo2') - group2.save() - - form_data = {'username': 'bar2', 'groups': [group.id, group2.id]} - request = self.req.post('/groups', data=form_data) - cleaned_data = dict(form_data) - cleaned_data['groups'] = [group, group2] - mixin = CreateModelMixin() - mixin.resource = UserResource - mixin.CONTENT = cleaned_data - - response = mixin.post(request) - self.assertEquals(3, CustomUser.objects.count()) - self.assertEquals(2, response.raw_content.groups.count()) - self.assertEquals('foo1', response.raw_content.groups.all()[0].name) - self.assertEquals('foo2', response.raw_content.groups.all()[1].name) - - -class MockPaginatorView(PaginatorMixin, View): - total = 60 - - def get(self, request): - return Response(range(0, self.total)) - - def post(self, request): - return Response({'status': 'OK'}, status=status.HTTP_201_CREATED) - - -class TestPagination(TestCase): - def setUp(self): - self.req = RequestFactory() - - def test_default_limit(self): - """ Tests if pagination works without overwriting the limit """ - request = self.req.get('/paginator') - response = MockPaginatorView.as_view()(request) - content = response.raw_content - - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(MockPaginatorView.total, content['total']) - self.assertEqual(MockPaginatorView.limit, content['per_page']) - - self.assertEqual(range(0, MockPaginatorView.limit), content['results']) - - def test_overwriting_limit(self): - """ Tests if the limit can be overwritten """ - limit = 10 - - request = self.req.get('/paginator') - response = MockPaginatorView.as_view(limit=limit)(request) - content = response.raw_content - - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(content['per_page'], limit) - - self.assertEqual(range(0, limit), content['results']) - - def test_limit_param(self): - """ Tests if the client can set the limit """ - from math import ceil - - limit = 5 - num_pages = int(ceil(MockPaginatorView.total / float(limit))) - - request = self.req.get('/paginator/?limit=%d' % limit) - response = MockPaginatorView.as_view()(request) - content = response.raw_content - - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(MockPaginatorView.total, content['total']) - self.assertEqual(limit, content['per_page']) - self.assertEqual(num_pages, content['pages']) - - def test_exceeding_limit(self): - """ Makes sure the client cannot exceed the default limit """ - from math import ceil - - limit = MockPaginatorView.limit + 10 - num_pages = int(ceil(MockPaginatorView.total / float(limit))) - - request = self.req.get('/paginator/?limit=%d' % limit) - response = MockPaginatorView.as_view()(request) - content = response.raw_content - - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(MockPaginatorView.total, content['total']) - self.assertNotEqual(limit, content['per_page']) - self.assertNotEqual(num_pages, content['pages']) - self.assertEqual(MockPaginatorView.limit, content['per_page']) - - def test_only_works_for_get(self): - """ Pagination should only work for GET requests """ - request = self.req.post('/paginator', data={'content': 'spam'}) - response = MockPaginatorView.as_view()(request) - content = response.raw_content - - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(None, content.get('per_page')) - self.assertEqual('OK', content['status']) - - def test_non_int_page(self): - """ Tests that it can handle invalid values """ - request = self.req.get('/paginator/?page=spam') - response = MockPaginatorView.as_view()(request) - - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_page_range(self): - """ Tests that the page range is handle correctly """ - request = self.req.get('/paginator/?page=0') - response = MockPaginatorView.as_view()(request) - content = response.raw_content - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - request = self.req.get('/paginator/') - response = MockPaginatorView.as_view()(request) - content = response.raw_content - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(range(0, MockPaginatorView.limit), content['results']) - - num_pages = content['pages'] - - request = self.req.get('/paginator/?page=%d' % num_pages) - response = MockPaginatorView.as_view()(request) - content = response.raw_content - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(range(MockPaginatorView.limit*(num_pages-1), MockPaginatorView.total), content['results']) - - request = self.req.get('/paginator/?page=%d' % (num_pages + 1,)) - response = MockPaginatorView.as_view()(request) - content = response.raw_content - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_existing_query_parameters_are_preserved(self): - """ Tests that existing query parameters are preserved when - generating next/previous page links """ - request = self.req.get('/paginator/?foo=bar&another=something') - response = MockPaginatorView.as_view()(request) - content = response.raw_content - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertTrue('foo=bar' in content['next']) - self.assertTrue('another=something' in content['next']) - self.assertTrue('page=2' in content['next']) - - def test_duplicate_parameters_are_not_created(self): - """ Regression: ensure duplicate "page" parameters are not added to - paginated URLs. So page 1 should contain ?page=2, not ?page=1&page=2 """ - request = self.req.get('/paginator/?page=1') - response = MockPaginatorView.as_view()(request) - content = response.raw_content - self.assertTrue('page=2' in content['next']) - self.assertFalse('page=1' in content['next']) +# form_data = {'username': 'bar1', 'groups': [group.id]} +# request = self.req.post('/groups', data=form_data) +# cleaned_data = dict(form_data) +# cleaned_data['groups'] = [group] +# mixin = CreateModelMixin() +# mixin.resource = UserResource +# mixin.CONTENT = cleaned_data + +# response = mixin.post(request) +# self.assertEquals(2, CustomUser.objects.count()) +# self.assertEquals(1, response.raw_content.groups.count()) +# self.assertEquals('foo1', response.raw_content.groups.all()[0].name) + +# group2 = Group(name='foo2') +# group2.save() + +# form_data = {'username': 'bar2', 'groups': [group.id, group2.id]} +# request = self.req.post('/groups', data=form_data) +# cleaned_data = dict(form_data) +# cleaned_data['groups'] = [group, group2] +# mixin = CreateModelMixin() +# mixin.resource = UserResource +# mixin.CONTENT = cleaned_data + +# response = mixin.post(request) +# self.assertEquals(3, CustomUser.objects.count()) +# self.assertEquals(2, response.raw_content.groups.count()) +# self.assertEquals('foo1', response.raw_content.groups.all()[0].name) +# self.assertEquals('foo2', response.raw_content.groups.all()[1].name) + + +# class MockPaginatorView(PaginatorMixin, View): +# total = 60 + +# def get(self, request): +# return Response(range(0, self.total)) + +# def post(self, request): +# return Response({'status': 'OK'}, status=status.HTTP_201_CREATED) + + +# class TestPagination(TestCase): +# def setUp(self): +# self.req = RequestFactory() + +# def test_default_limit(self): +# """ Tests if pagination works without overwriting the limit """ +# request = self.req.get('/paginator') +# response = MockPaginatorView.as_view()(request) +# content = response.raw_content + +# self.assertEqual(response.status_code, status.HTTP_200_OK) +# self.assertEqual(MockPaginatorView.total, content['total']) +# self.assertEqual(MockPaginatorView.limit, content['per_page']) + +# self.assertEqual(range(0, MockPaginatorView.limit), content['results']) + +# def test_overwriting_limit(self): +# """ Tests if the limit can be overwritten """ +# limit = 10 + +# request = self.req.get('/paginator') +# response = MockPaginatorView.as_view(limit=limit)(request) +# content = response.raw_content + +# self.assertEqual(response.status_code, status.HTTP_200_OK) +# self.assertEqual(content['per_page'], limit) + +# self.assertEqual(range(0, limit), content['results']) + +# def test_limit_param(self): +# """ Tests if the client can set the limit """ +# from math import ceil + +# limit = 5 +# num_pages = int(ceil(MockPaginatorView.total / float(limit))) + +# request = self.req.get('/paginator/?limit=%d' % limit) +# response = MockPaginatorView.as_view()(request) +# content = response.raw_content + +# self.assertEqual(response.status_code, status.HTTP_200_OK) +# self.assertEqual(MockPaginatorView.total, content['total']) +# self.assertEqual(limit, content['per_page']) +# self.assertEqual(num_pages, content['pages']) + +# def test_exceeding_limit(self): +# """ Makes sure the client cannot exceed the default limit """ +# from math import ceil + +# limit = MockPaginatorView.limit + 10 +# num_pages = int(ceil(MockPaginatorView.total / float(limit))) + +# request = self.req.get('/paginator/?limit=%d' % limit) +# response = MockPaginatorView.as_view()(request) +# content = response.raw_content + +# self.assertEqual(response.status_code, status.HTTP_200_OK) +# self.assertEqual(MockPaginatorView.total, content['total']) +# self.assertNotEqual(limit, content['per_page']) +# self.assertNotEqual(num_pages, content['pages']) +# self.assertEqual(MockPaginatorView.limit, content['per_page']) + +# def test_only_works_for_get(self): +# """ Pagination should only work for GET requests """ +# request = self.req.post('/paginator', data={'content': 'spam'}) +# response = MockPaginatorView.as_view()(request) +# content = response.raw_content + +# self.assertEqual(response.status_code, status.HTTP_201_CREATED) +# self.assertEqual(None, content.get('per_page')) +# self.assertEqual('OK', content['status']) + +# def test_non_int_page(self): +# """ Tests that it can handle invalid values """ +# request = self.req.get('/paginator/?page=spam') +# response = MockPaginatorView.as_view()(request) + +# self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + +# def test_page_range(self): +# """ Tests that the page range is handle correctly """ +# request = self.req.get('/paginator/?page=0') +# response = MockPaginatorView.as_view()(request) +# content = response.raw_content +# self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + +# request = self.req.get('/paginator/') +# response = MockPaginatorView.as_view()(request) +# content = response.raw_content +# self.assertEqual(response.status_code, status.HTTP_200_OK) +# self.assertEqual(range(0, MockPaginatorView.limit), content['results']) + +# num_pages = content['pages'] + +# request = self.req.get('/paginator/?page=%d' % num_pages) +# response = MockPaginatorView.as_view()(request) +# content = response.raw_content +# self.assertEqual(response.status_code, status.HTTP_200_OK) +# self.assertEqual(range(MockPaginatorView.limit*(num_pages-1), MockPaginatorView.total), content['results']) + +# request = self.req.get('/paginator/?page=%d' % (num_pages + 1,)) +# response = MockPaginatorView.as_view()(request) +# content = response.raw_content +# self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + +# def test_existing_query_parameters_are_preserved(self): +# """ Tests that existing query parameters are preserved when +# generating next/previous page links """ +# request = self.req.get('/paginator/?foo=bar&another=something') +# response = MockPaginatorView.as_view()(request) +# content = response.raw_content +# self.assertEqual(response.status_code, status.HTTP_200_OK) +# self.assertTrue('foo=bar' in content['next']) +# self.assertTrue('another=something' in content['next']) +# self.assertTrue('page=2' in content['next']) + +# def test_duplicate_parameters_are_not_created(self): +# """ Regression: ensure duplicate "page" parameters are not added to +# paginated URLs. So page 1 should contain ?page=2, not ?page=1&page=2 """ +# request = self.req.get('/paginator/?page=1') +# response = MockPaginatorView.as_view()(request) +# content = response.raw_content +# self.assertTrue('page=2' in content['next']) +# self.assertFalse('page=1' in content['next']) diff --git a/djangorestframework/tests/modelviews.py b/djangorestframework/tests/modelviews.py index ccd8513f..73cb0b2b 100644 --- a/djangorestframework/tests/modelviews.py +++ b/djangorestframework/tests/modelviews.py @@ -1,90 +1,90 @@ -from django.conf.urls.defaults import patterns, url -from django.forms import ModelForm -from django.contrib.auth.models import Group, User -from djangorestframework.resources import ModelResource -from djangorestframework.views import ListOrCreateModelView, InstanceModelView -from djangorestframework.tests.models import CustomUser -from djangorestframework.tests.testcases import TestModelsTestCase +# from django.conf.urls.defaults import patterns, url +# from django.forms import ModelForm +# from django.contrib.auth.models import Group, User +# from djangorestframework.resources import ModelResource +# from djangorestframework.views import ListOrCreateModelView, InstanceModelView +# from djangorestframework.tests.models import CustomUser +# from djangorestframework.tests.testcases import TestModelsTestCase -class GroupResource(ModelResource): - model = Group +# class GroupResource(ModelResource): +# model = Group -class UserForm(ModelForm): - class Meta: - model = User - exclude = ('last_login', 'date_joined') +# class UserForm(ModelForm): +# class Meta: +# model = User +# exclude = ('last_login', 'date_joined') -class UserResource(ModelResource): - model = User - form = UserForm +# class UserResource(ModelResource): +# model = User +# form = UserForm -class CustomUserResource(ModelResource): - model = CustomUser +# class CustomUserResource(ModelResource): +# model = CustomUser -urlpatterns = patterns('', - url(r'^users/$', ListOrCreateModelView.as_view(resource=UserResource), name='users'), - url(r'^users/(?P<id>[0-9]+)/$', InstanceModelView.as_view(resource=UserResource)), - url(r'^customusers/$', ListOrCreateModelView.as_view(resource=CustomUserResource), name='customusers'), - url(r'^customusers/(?P<id>[0-9]+)/$', InstanceModelView.as_view(resource=CustomUserResource)), - url(r'^groups/$', ListOrCreateModelView.as_view(resource=GroupResource), name='groups'), - url(r'^groups/(?P<id>[0-9]+)/$', InstanceModelView.as_view(resource=GroupResource)), -) +# urlpatterns = patterns('', +# url(r'^users/$', ListOrCreateModelView.as_view(resource=UserResource), name='users'), +# url(r'^users/(?P<id>[0-9]+)/$', InstanceModelView.as_view(resource=UserResource)), +# url(r'^customusers/$', ListOrCreateModelView.as_view(resource=CustomUserResource), name='customusers'), +# url(r'^customusers/(?P<id>[0-9]+)/$', InstanceModelView.as_view(resource=CustomUserResource)), +# url(r'^groups/$', ListOrCreateModelView.as_view(resource=GroupResource), name='groups'), +# url(r'^groups/(?P<id>[0-9]+)/$', InstanceModelView.as_view(resource=GroupResource)), +# ) -class ModelViewTests(TestModelsTestCase): - """Test the model views djangorestframework provides""" - urls = 'djangorestframework.tests.modelviews' +# class ModelViewTests(TestModelsTestCase): +# """Test the model views djangorestframework provides""" +# urls = 'djangorestframework.tests.modelviews' - def test_creation(self): - """Ensure that a model object can be created""" - self.assertEqual(0, Group.objects.count()) +# def test_creation(self): +# """Ensure that a model object can be created""" +# self.assertEqual(0, Group.objects.count()) - response = self.client.post('/groups/', {'name': 'foo'}) +# response = self.client.post('/groups/', {'name': 'foo'}) - self.assertEqual(response.status_code, 201) - self.assertEqual(1, Group.objects.count()) - self.assertEqual('foo', Group.objects.all()[0].name) +# self.assertEqual(response.status_code, 201) +# self.assertEqual(1, Group.objects.count()) +# self.assertEqual('foo', Group.objects.all()[0].name) - def test_creation_with_m2m_relation(self): - """Ensure that a model object with a m2m relation can be created""" - group = Group(name='foo') - group.save() - self.assertEqual(0, User.objects.count()) +# def test_creation_with_m2m_relation(self): +# """Ensure that a model object with a m2m relation can be created""" +# group = Group(name='foo') +# group.save() +# self.assertEqual(0, User.objects.count()) - response = self.client.post('/users/', {'username': 'bar', 'password': 'baz', 'groups': [group.id]}) +# response = self.client.post('/users/', {'username': 'bar', 'password': 'baz', 'groups': [group.id]}) - self.assertEqual(response.status_code, 201) - self.assertEqual(1, User.objects.count()) +# self.assertEqual(response.status_code, 201) +# self.assertEqual(1, User.objects.count()) - user = User.objects.all()[0] - self.assertEqual('bar', user.username) - self.assertEqual('baz', user.password) - self.assertEqual(1, user.groups.count()) +# user = User.objects.all()[0] +# self.assertEqual('bar', user.username) +# self.assertEqual('baz', user.password) +# self.assertEqual(1, user.groups.count()) - group = user.groups.all()[0] - self.assertEqual('foo', group.name) +# group = user.groups.all()[0] +# self.assertEqual('foo', group.name) - def test_creation_with_m2m_relation_through(self): - """ - Ensure that a model object with a m2m relation can be created where that - relation uses a through table - """ - group = Group(name='foo') - group.save() - self.assertEqual(0, User.objects.count()) +# def test_creation_with_m2m_relation_through(self): +# """ +# Ensure that a model object with a m2m relation can be created where that +# relation uses a through table +# """ +# group = Group(name='foo') +# group.save() +# self.assertEqual(0, User.objects.count()) - response = self.client.post('/customusers/', {'username': 'bar', 'groups': [group.id]}) +# response = self.client.post('/customusers/', {'username': 'bar', 'groups': [group.id]}) - self.assertEqual(response.status_code, 201) - self.assertEqual(1, CustomUser.objects.count()) +# self.assertEqual(response.status_code, 201) +# self.assertEqual(1, CustomUser.objects.count()) - user = CustomUser.objects.all()[0] - self.assertEqual('bar', user.username) - self.assertEqual(1, user.groups.count()) +# user = CustomUser.objects.all()[0] +# self.assertEqual('bar', user.username) +# self.assertEqual(1, user.groups.count()) - group = user.groups.all()[0] - self.assertEqual('foo', group.name) +# group = user.groups.all()[0] +# self.assertEqual('foo', group.name) diff --git a/djangorestframework/tests/serializer.py b/djangorestframework/tests/serializer.py index 834a60d0..7e9f4149 100644 --- a/djangorestframework/tests/serializer.py +++ b/djangorestframework/tests/serializer.py @@ -1,160 +1,161 @@ -"""Tests for the resource module""" -from django.db import models -from django.test import TestCase -from django.utils.translation import ugettext_lazy -from djangorestframework.serializer import Serializer +# """Tests for the resource module""" +# from django.db import models +# from django.test import TestCase +# from django.utils.translation import ugettext_lazy +# from djangorestframework.serializer import Serializer -import datetime -import decimal - -class TestObjectToData(TestCase): - """ - Tests for the Serializer class. - """ - - def setUp(self): - self.serializer = Serializer() - self.serialize = self.serializer.serialize - - def test_decimal(self): - """Decimals need to be converted to a string representation.""" - self.assertEquals(self.serialize(decimal.Decimal('1.5')), decimal.Decimal('1.5')) - - def test_function(self): - """Functions with no arguments should be called.""" - def foo(): - return 1 - self.assertEquals(self.serialize(foo), 1) - - def test_method(self): - """Methods with only a ``self`` argument should be called.""" - class Foo(object): - def foo(self): - return 1 - self.assertEquals(self.serialize(Foo().foo), 1) - - def test_datetime(self): - """datetime objects are left as-is.""" - now = datetime.datetime.now() - self.assertEquals(self.serialize(now), now) - - def test_dict_method_name_collision(self): - """dict with key that collides with dict method name""" - self.assertEquals(self.serialize({'items': 'foo'}), {'items': u'foo'}) - self.assertEquals(self.serialize({'keys': 'foo'}), {'keys': u'foo'}) - self.assertEquals(self.serialize({'values': 'foo'}), {'values': u'foo'}) +# import datetime +# import decimal - def test_ugettext_lazy(self): - self.assertEquals(self.serialize(ugettext_lazy('foobar')), u'foobar') - - -class TestFieldNesting(TestCase): - """ - Test nesting the fields in the Serializer class - """ - def setUp(self): - self.serializer = Serializer() - self.serialize = self.serializer.serialize - - class M1(models.Model): - field1 = models.CharField(max_length=256) - field2 = models.CharField(max_length=256) - - class M2(models.Model): - field = models.OneToOneField(M1) - - class M3(models.Model): - field = models.ForeignKey(M1) - - self.m1 = M1(field1='foo', field2='bar') - self.m2 = M2(field=self.m1) - self.m3 = M3(field=self.m1) - - - def test_tuple_nesting(self): - """ - Test tuple nesting on `fields` attr - """ - class SerializerM2(Serializer): - fields = (('field', ('field1',)),) - - class SerializerM3(Serializer): - fields = (('field', ('field2',)),) - - self.assertEqual(SerializerM2().serialize(self.m2), {'field': {'field1': u'foo'}}) - self.assertEqual(SerializerM3().serialize(self.m3), {'field': {'field2': u'bar'}}) - - - def test_serializer_class_nesting(self): - """ - Test related model serialization - """ - class NestedM2(Serializer): - fields = ('field1', ) - - class NestedM3(Serializer): - fields = ('field2', ) - - class SerializerM2(Serializer): - fields = [('field', NestedM2)] - - class SerializerM3(Serializer): - fields = [('field', NestedM3)] - - self.assertEqual(SerializerM2().serialize(self.m2), {'field': {'field1': u'foo'}}) - self.assertEqual(SerializerM3().serialize(self.m3), {'field': {'field2': u'bar'}}) - def test_serializer_no_fields(self): - """ - Test related serializer works when the fields attr isn't present. Fix for - #178. - """ - class NestedM2(Serializer): - fields = ('field1', ) +# class TestObjectToData(TestCase): +# """ +# Tests for the Serializer class. +# """ - class NestedM3(Serializer): - fields = ('field2', ) - - class SerializerM2(Serializer): - include = [('field', NestedM2)] - exclude = ('id', ) - - class SerializerM3(Serializer): - fields = [('field', NestedM3)] - - self.assertEqual(SerializerM2().serialize(self.m2), {'field': {'field1': u'foo'}}) - self.assertEqual(SerializerM3().serialize(self.m3), {'field': {'field2': u'bar'}}) +# def setUp(self): +# self.serializer = Serializer() +# self.serialize = self.serializer.serialize - def test_serializer_classname_nesting(self): - """ - Test related model serialization - """ - class SerializerM2(Serializer): - fields = [('field', 'NestedM2')] +# def test_decimal(self): +# """Decimals need to be converted to a string representation.""" +# self.assertEquals(self.serialize(decimal.Decimal('1.5')), decimal.Decimal('1.5')) - class SerializerM3(Serializer): - fields = [('field', 'NestedM3')] +# def test_function(self): +# """Functions with no arguments should be called.""" +# def foo(): +# return 1 +# self.assertEquals(self.serialize(foo), 1) - class NestedM2(Serializer): - fields = ('field1', ) +# def test_method(self): +# """Methods with only a ``self`` argument should be called.""" +# class Foo(object): +# def foo(self): +# return 1 +# self.assertEquals(self.serialize(Foo().foo), 1) + +# def test_datetime(self): +# """datetime objects are left as-is.""" +# now = datetime.datetime.now() +# self.assertEquals(self.serialize(now), now) - class NestedM3(Serializer): - fields = ('field2', ) +# def test_dict_method_name_collision(self): +# """dict with key that collides with dict method name""" +# self.assertEquals(self.serialize({'items': 'foo'}), {'items': u'foo'}) +# self.assertEquals(self.serialize({'keys': 'foo'}), {'keys': u'foo'}) +# self.assertEquals(self.serialize({'values': 'foo'}), {'values': u'foo'}) - self.assertEqual(SerializerM2().serialize(self.m2), {'field': {'field1': u'foo'}}) - self.assertEqual(SerializerM3().serialize(self.m3), {'field': {'field2': u'bar'}}) +# def test_ugettext_lazy(self): +# self.assertEquals(self.serialize(ugettext_lazy('foobar')), u'foobar') - def test_serializer_overridden_hook_method(self): - """ - Test serializing a model instance which overrides a class method on the - serializer. Checks for correct behaviour in odd edge case. - """ - class SerializerM2(Serializer): - fields = ('overridden', ) - def overridden(self): - return False +# class TestFieldNesting(TestCase): +# """ +# Test nesting the fields in the Serializer class +# """ +# def setUp(self): +# self.serializer = Serializer() +# self.serialize = self.serializer.serialize - self.m2.overridden = True - self.assertEqual(SerializerM2().serialize_model(self.m2), - {'overridden': True}) +# class M1(models.Model): +# field1 = models.CharField(max_length=256) +# field2 = models.CharField(max_length=256) + +# class M2(models.Model): +# field = models.OneToOneField(M1) + +# class M3(models.Model): +# field = models.ForeignKey(M1) + +# self.m1 = M1(field1='foo', field2='bar') +# self.m2 = M2(field=self.m1) +# self.m3 = M3(field=self.m1) + + +# def test_tuple_nesting(self): +# """ +# Test tuple nesting on `fields` attr +# """ +# class SerializerM2(Serializer): +# fields = (('field', ('field1',)),) + +# class SerializerM3(Serializer): +# fields = (('field', ('field2',)),) + +# self.assertEqual(SerializerM2().serialize(self.m2), {'field': {'field1': u'foo'}}) +# self.assertEqual(SerializerM3().serialize(self.m3), {'field': {'field2': u'bar'}}) + + +# def test_serializer_class_nesting(self): +# """ +# Test related model serialization +# """ +# class NestedM2(Serializer): +# fields = ('field1', ) + +# class NestedM3(Serializer): +# fields = ('field2', ) + +# class SerializerM2(Serializer): +# fields = [('field', NestedM2)] + +# class SerializerM3(Serializer): +# fields = [('field', NestedM3)] + +# self.assertEqual(SerializerM2().serialize(self.m2), {'field': {'field1': u'foo'}}) +# self.assertEqual(SerializerM3().serialize(self.m3), {'field': {'field2': u'bar'}}) + +# def test_serializer_no_fields(self): +# """ +# Test related serializer works when the fields attr isn't present. Fix for +# #178. +# """ +# class NestedM2(Serializer): +# fields = ('field1', ) + +# class NestedM3(Serializer): +# fields = ('field2', ) + +# class SerializerM2(Serializer): +# include = [('field', NestedM2)] +# exclude = ('id', ) + +# class SerializerM3(Serializer): +# fields = [('field', NestedM3)] + +# self.assertEqual(SerializerM2().serialize(self.m2), {'field': {'field1': u'foo'}}) +# self.assertEqual(SerializerM3().serialize(self.m3), {'field': {'field2': u'bar'}}) + +# def test_serializer_classname_nesting(self): +# """ +# Test related model serialization +# """ +# class SerializerM2(Serializer): +# fields = [('field', 'NestedM2')] + +# class SerializerM3(Serializer): +# fields = [('field', 'NestedM3')] + +# class NestedM2(Serializer): +# fields = ('field1', ) + +# class NestedM3(Serializer): +# fields = ('field2', ) + +# self.assertEqual(SerializerM2().serialize(self.m2), {'field': {'field1': u'foo'}}) +# self.assertEqual(SerializerM3().serialize(self.m3), {'field': {'field2': u'bar'}}) + +# def test_serializer_overridden_hook_method(self): +# """ +# Test serializing a model instance which overrides a class method on the +# serializer. Checks for correct behaviour in odd edge case. +# """ +# class SerializerM2(Serializer): +# fields = ('overridden', ) + +# def overridden(self): +# return False + +# self.m2.overridden = True +# self.assertEqual(SerializerM2().serialize_model(self.m2), +# {'overridden': True}) diff --git a/djangorestframework/tests/throttling.py b/djangorestframework/tests/throttling.py index 8c5457d3..d307cd32 100644 --- a/djangorestframework/tests/throttling.py +++ b/djangorestframework/tests/throttling.py @@ -8,8 +8,7 @@ from django.core.cache import cache from djangorestframework.compat import RequestFactory from djangorestframework.views import View -from djangorestframework.permissions import PerUserThrottling, PerViewThrottling, PerResourceThrottling -from djangorestframework.resources import FormResource +from djangorestframework.permissions import PerUserThrottling, PerViewThrottling from djangorestframework.response import Response @@ -25,11 +24,6 @@ class MockView_PerViewThrottling(MockView): permission_classes = (PerViewThrottling,) -class MockView_PerResourceThrottling(MockView): - permission_classes = (PerResourceThrottling,) - resource = FormResource - - class MockView_MinuteThrottling(MockView): throttle = '3/min' @@ -98,12 +92,6 @@ class ThrottlingTests(TestCase): """ self.ensure_is_throttled(MockView_PerViewThrottling, 503) - def test_request_throttling_is_per_resource(self): - """ - Ensure request rate is limited globally per Resource for PerResourceThrottles - """ - self.ensure_is_throttled(MockView_PerResourceThrottling, 503) - def ensure_response_header_contains_proper_throttle_field(self, view, expected_headers): """ Ensure the response returns an X-Throttle field with status and next attributes diff --git a/djangorestframework/tests/validators.py b/djangorestframework/tests/validators.py index bf2bf8b7..80ad2b17 100644 --- a/djangorestframework/tests/validators.py +++ b/djangorestframework/tests/validators.py @@ -1,330 +1,329 @@ -from django import forms -from django.db import models -from django.test import TestCase -from djangorestframework.resources import FormResource, ModelResource -from djangorestframework.response import ImmediateResponse -from djangorestframework.views import View +# from django import forms +# from django.db import models +# from django.test import TestCase +# from djangorestframework.response import ImmediateResponse +# from djangorestframework.views import View -class TestDisabledValidations(TestCase): - """Tests on FormValidator with validation disabled by setting form to None""" - - def test_disabled_form_validator_returns_content_unchanged(self): - """If the view's form attribute is None then FormValidator(view).validate_request(content, None) - should just return the content unmodified.""" - class DisabledFormResource(FormResource): - form = None - - class MockView(View): - resource = DisabledFormResource - - view = MockView() - content = {'qwerty': 'uiop'} - self.assertEqual(FormResource(view).validate_request(content, None), content) - - def test_disabled_form_validator_get_bound_form_returns_none(self): - """If the view's form attribute is None on then - FormValidator(view).get_bound_form(content) should just return None.""" - class DisabledFormResource(FormResource): - form = None - - class MockView(View): - resource = DisabledFormResource - - view = MockView() - content = {'qwerty': 'uiop'} - self.assertEqual(FormResource(view).get_bound_form(content), None) - - def test_disabled_model_form_validator_returns_content_unchanged(self): - """If the view's form is None and does not have a Resource with a model set then - ModelFormValidator(view).validate_request(content, None) should just return the content unmodified.""" - - class DisabledModelFormView(View): - resource = ModelResource - - view = DisabledModelFormView() - content = {'qwerty': 'uiop'} - self.assertEqual(ModelResource(view).get_bound_form(content), None) - - def test_disabled_model_form_validator_get_bound_form_returns_none(self): - """If the form attribute is None on FormValidatorMixin then get_bound_form(content) should just return None.""" - class DisabledModelFormView(View): - resource = ModelResource - - view = DisabledModelFormView() - content = {'qwerty': 'uiop'} - self.assertEqual(ModelResource(view).get_bound_form(content), None) - - -class TestNonFieldErrors(TestCase): - """Tests against form validation errors caused by non-field errors. (eg as might be caused by some custom form validation)""" - - def test_validate_failed_due_to_non_field_error_returns_appropriate_message(self): - """If validation fails with a non-field error, ensure the response a non-field error""" - class MockForm(forms.Form): - field1 = forms.CharField(required=False) - field2 = forms.CharField(required=False) - ERROR_TEXT = 'You may not supply both field1 and field2' - - def clean(self): - if 'field1' in self.cleaned_data and 'field2' in self.cleaned_data: - raise forms.ValidationError(self.ERROR_TEXT) - return self.cleaned_data - - class MockResource(FormResource): - form = MockForm - - class MockView(View): - pass - - view = MockView() - content = {'field1': 'example1', 'field2': 'example2'} - try: - MockResource(view).validate_request(content, None) - except ImmediateResponse, exc: - response = exc.response - self.assertEqual(response.raw_content, {'errors': [MockForm.ERROR_TEXT]}) - else: - self.fail('ImmediateResponse was not raised') - - -class TestFormValidation(TestCase): - """Tests which check basic form validation. - Also includes the same set of tests with a ModelFormValidator for which the form has been explicitly set. - (ModelFormValidator should behave as FormValidator if a form is set rather than relying on the default ModelForm)""" - def setUp(self): - class MockForm(forms.Form): - qwerty = forms.CharField(required=True) - - class MockFormResource(FormResource): - form = MockForm - - class MockModelResource(ModelResource): - form = MockForm - - class MockFormView(View): - resource = MockFormResource - - class MockModelFormView(View): - resource = MockModelResource - - self.MockFormResource = MockFormResource - self.MockModelResource = MockModelResource - self.MockFormView = MockFormView - self.MockModelFormView = MockModelFormView - - def validation_returns_content_unchanged_if_already_valid_and_clean(self, validator): - """If the content is already valid and clean then validate(content) should just return the content unmodified.""" - content = {'qwerty': 'uiop'} - self.assertEqual(validator.validate_request(content, None), content) - - def validation_failure_raises_response_exception(self, validator): - """If form validation fails a ResourceException 400 (Bad Request) should be raised.""" - content = {} - self.assertRaises(ImmediateResponse, validator.validate_request, content, None) - - def validation_does_not_allow_extra_fields_by_default(self, validator): - """If some (otherwise valid) content includes fields that are not in the form then validation should fail. - It might be okay on normal form submission, but for Web APIs we oughta get strict, as it'll help show up - broken clients more easily (eg submitting content with a misnamed field)""" - content = {'qwerty': 'uiop', 'extra': 'extra'} - self.assertRaises(ImmediateResponse, validator.validate_request, content, None) - - def validation_allows_extra_fields_if_explicitly_set(self, validator): - """If we include an allowed_extra_fields paramater on _validate, then allow fields with those names.""" - content = {'qwerty': 'uiop', 'extra': 'extra'} - validator._validate(content, None, allowed_extra_fields=('extra',)) - - def validation_allows_unknown_fields_if_explicitly_allowed(self, validator): - """If we set ``unknown_form_fields`` on the form resource, then don't - raise errors on unexpected request data""" - content = {'qwerty': 'uiop', 'extra': 'extra'} - validator.allow_unknown_form_fields = True - self.assertEqual({'qwerty': u'uiop'}, - validator.validate_request(content, None), - "Resource didn't accept unknown fields.") - validator.allow_unknown_form_fields = False - - def validation_does_not_require_extra_fields_if_explicitly_set(self, validator): - """If we include an allowed_extra_fields paramater on _validate, then do not fail if we do not have fields with those names.""" - content = {'qwerty': 'uiop'} - self.assertEqual(validator._validate(content, None, allowed_extra_fields=('extra',)), content) - - def validation_failed_due_to_no_content_returns_appropriate_message(self, validator): - """If validation fails due to no content, ensure the response contains a single non-field error""" - content = {} - try: - validator.validate_request(content, None) - except ImmediateResponse, exc: - response = exc.response - self.assertEqual(response.raw_content, {'field_errors': {'qwerty': ['This field is required.']}}) - else: - self.fail('ResourceException was not raised') - - def validation_failed_due_to_field_error_returns_appropriate_message(self, validator): - """If validation fails due to a field error, ensure the response contains a single field error""" - content = {'qwerty': ''} - try: - validator.validate_request(content, None) - except ImmediateResponse, exc: - response = exc.response - self.assertEqual(response.raw_content, {'field_errors': {'qwerty': ['This field is required.']}}) - else: - self.fail('ResourceException was not raised') - - def validation_failed_due_to_invalid_field_returns_appropriate_message(self, validator): - """If validation fails due to an invalid field, ensure the response contains a single field error""" - content = {'qwerty': 'uiop', 'extra': 'extra'} - try: - validator.validate_request(content, None) - except ImmediateResponse, exc: - response = exc.response - self.assertEqual(response.raw_content, {'field_errors': {'extra': ['This field does not exist.']}}) - else: - self.fail('ResourceException was not raised') - - def validation_failed_due_to_multiple_errors_returns_appropriate_message(self, validator): - """If validation for multiple reasons, ensure the response contains each error""" - content = {'qwerty': '', 'extra': 'extra'} - try: - validator.validate_request(content, None) - except ImmediateResponse, exc: - response = exc.response - self.assertEqual(response.raw_content, {'field_errors': {'qwerty': ['This field is required.'], - 'extra': ['This field does not exist.']}}) - else: - self.fail('ResourceException was not raised') - - # Tests on FormResource - - def test_form_validation_returns_content_unchanged_if_already_valid_and_clean(self): - validator = self.MockFormResource(self.MockFormView()) - self.validation_returns_content_unchanged_if_already_valid_and_clean(validator) - - def test_form_validation_failure_raises_response_exception(self): - validator = self.MockFormResource(self.MockFormView()) - self.validation_failure_raises_response_exception(validator) - - def test_validation_does_not_allow_extra_fields_by_default(self): - validator = self.MockFormResource(self.MockFormView()) - self.validation_does_not_allow_extra_fields_by_default(validator) - - def test_validation_allows_extra_fields_if_explicitly_set(self): - validator = self.MockFormResource(self.MockFormView()) - self.validation_allows_extra_fields_if_explicitly_set(validator) - - def test_validation_allows_unknown_fields_if_explicitly_allowed(self): - validator = self.MockFormResource(self.MockFormView()) - self.validation_allows_unknown_fields_if_explicitly_allowed(validator) - - def test_validation_does_not_require_extra_fields_if_explicitly_set(self): - validator = self.MockFormResource(self.MockFormView()) - self.validation_does_not_require_extra_fields_if_explicitly_set(validator) - - def test_validation_failed_due_to_no_content_returns_appropriate_message(self): - validator = self.MockFormResource(self.MockFormView()) - self.validation_failed_due_to_no_content_returns_appropriate_message(validator) - - def test_validation_failed_due_to_field_error_returns_appropriate_message(self): - validator = self.MockFormResource(self.MockFormView()) - self.validation_failed_due_to_field_error_returns_appropriate_message(validator) - - def test_validation_failed_due_to_invalid_field_returns_appropriate_message(self): - validator = self.MockFormResource(self.MockFormView()) - self.validation_failed_due_to_invalid_field_returns_appropriate_message(validator) - - def test_validation_failed_due_to_multiple_errors_returns_appropriate_message(self): - validator = self.MockFormResource(self.MockFormView()) - self.validation_failed_due_to_multiple_errors_returns_appropriate_message(validator) - - # Same tests on ModelResource - - def test_modelform_validation_returns_content_unchanged_if_already_valid_and_clean(self): - validator = self.MockModelResource(self.MockModelFormView()) - self.validation_returns_content_unchanged_if_already_valid_and_clean(validator) - - def test_modelform_validation_failure_raises_response_exception(self): - validator = self.MockModelResource(self.MockModelFormView()) - self.validation_failure_raises_response_exception(validator) - - def test_modelform_validation_does_not_allow_extra_fields_by_default(self): - validator = self.MockModelResource(self.MockModelFormView()) - self.validation_does_not_allow_extra_fields_by_default(validator) - - def test_modelform_validation_allows_extra_fields_if_explicitly_set(self): - validator = self.MockModelResource(self.MockModelFormView()) - self.validation_allows_extra_fields_if_explicitly_set(validator) - - def test_modelform_validation_does_not_require_extra_fields_if_explicitly_set(self): - validator = self.MockModelResource(self.MockModelFormView()) - self.validation_does_not_require_extra_fields_if_explicitly_set(validator) - - def test_modelform_validation_failed_due_to_no_content_returns_appropriate_message(self): - validator = self.MockModelResource(self.MockModelFormView()) - self.validation_failed_due_to_no_content_returns_appropriate_message(validator) - - def test_modelform_validation_failed_due_to_field_error_returns_appropriate_message(self): - validator = self.MockModelResource(self.MockModelFormView()) - self.validation_failed_due_to_field_error_returns_appropriate_message(validator) - - def test_modelform_validation_failed_due_to_invalid_field_returns_appropriate_message(self): - validator = self.MockModelResource(self.MockModelFormView()) - self.validation_failed_due_to_invalid_field_returns_appropriate_message(validator) - - def test_modelform_validation_failed_due_to_multiple_errors_returns_appropriate_message(self): - validator = self.MockModelResource(self.MockModelFormView()) - self.validation_failed_due_to_multiple_errors_returns_appropriate_message(validator) - - -class TestModelFormValidator(TestCase): - """Tests specific to ModelFormValidatorMixin""" - - def setUp(self): - """Create a validator for a model with two fields and a property.""" - class MockModel(models.Model): - qwerty = models.CharField(max_length=256) - uiop = models.CharField(max_length=256, blank=True) - - @property - def readonly(self): - return 'read only' - - class MockResource(ModelResource): - model = MockModel +# class TestDisabledValidations(TestCase): +# """Tests on FormValidator with validation disabled by setting form to None""" - class MockView(View): - resource = MockResource +# def test_disabled_form_validator_returns_content_unchanged(self): +# """If the view's form attribute is None then FormValidator(view).validate_request(content, None) +# should just return the content unmodified.""" +# class DisabledFormResource(FormResource): +# form = None + +# class MockView(View): +# resource = DisabledFormResource - self.validator = MockResource(MockView) +# view = MockView() +# content = {'qwerty': 'uiop'} +# self.assertEqual(FormResource(view).validate_request(content, None), content) + +# def test_disabled_form_validator_get_bound_form_returns_none(self): +# """If the view's form attribute is None on then +# FormValidator(view).get_bound_form(content) should just return None.""" +# class DisabledFormResource(FormResource): +# form = None + +# class MockView(View): +# resource = DisabledFormResource + +# view = MockView() +# content = {'qwerty': 'uiop'} +# self.assertEqual(FormResource(view).get_bound_form(content), None) + +# def test_disabled_model_form_validator_returns_content_unchanged(self): +# """If the view's form is None and does not have a Resource with a model set then +# ModelFormValidator(view).validate_request(content, None) should just return the content unmodified.""" + +# class DisabledModelFormView(View): +# resource = ModelResource + +# view = DisabledModelFormView() +# content = {'qwerty': 'uiop'} +# self.assertEqual(ModelResource(view).get_bound_form(content), None) + +# def test_disabled_model_form_validator_get_bound_form_returns_none(self): +# """If the form attribute is None on FormValidatorMixin then get_bound_form(content) should just return None.""" +# class DisabledModelFormView(View): +# resource = ModelResource + +# view = DisabledModelFormView() +# content = {'qwerty': 'uiop'} +# self.assertEqual(ModelResource(view).get_bound_form(content), None) + + +# class TestNonFieldErrors(TestCase): +# """Tests against form validation errors caused by non-field errors. (eg as might be caused by some custom form validation)""" + +# def test_validate_failed_due_to_non_field_error_returns_appropriate_message(self): +# """If validation fails with a non-field error, ensure the response a non-field error""" +# class MockForm(forms.Form): +# field1 = forms.CharField(required=False) +# field2 = forms.CharField(required=False) +# ERROR_TEXT = 'You may not supply both field1 and field2' + +# def clean(self): +# if 'field1' in self.cleaned_data and 'field2' in self.cleaned_data: +# raise forms.ValidationError(self.ERROR_TEXT) +# return self.cleaned_data + +# class MockResource(FormResource): +# form = MockForm + +# class MockView(View): +# pass + +# view = MockView() +# content = {'field1': 'example1', 'field2': 'example2'} +# try: +# MockResource(view).validate_request(content, None) +# except ImmediateResponse, exc: +# response = exc.response +# self.assertEqual(response.raw_content, {'errors': [MockForm.ERROR_TEXT]}) +# else: +# self.fail('ImmediateResponse was not raised') + + +# class TestFormValidation(TestCase): +# """Tests which check basic form validation. +# Also includes the same set of tests with a ModelFormValidator for which the form has been explicitly set. +# (ModelFormValidator should behave as FormValidator if a form is set rather than relying on the default ModelForm)""" +# def setUp(self): +# class MockForm(forms.Form): +# qwerty = forms.CharField(required=True) + +# class MockFormResource(FormResource): +# form = MockForm + +# class MockModelResource(ModelResource): +# form = MockForm + +# class MockFormView(View): +# resource = MockFormResource + +# class MockModelFormView(View): +# resource = MockModelResource + +# self.MockFormResource = MockFormResource +# self.MockModelResource = MockModelResource +# self.MockFormView = MockFormView +# self.MockModelFormView = MockModelFormView + +# def validation_returns_content_unchanged_if_already_valid_and_clean(self, validator): +# """If the content is already valid and clean then validate(content) should just return the content unmodified.""" +# content = {'qwerty': 'uiop'} +# self.assertEqual(validator.validate_request(content, None), content) + +# def validation_failure_raises_response_exception(self, validator): +# """If form validation fails a ResourceException 400 (Bad Request) should be raised.""" +# content = {} +# self.assertRaises(ImmediateResponse, validator.validate_request, content, None) + +# def validation_does_not_allow_extra_fields_by_default(self, validator): +# """If some (otherwise valid) content includes fields that are not in the form then validation should fail. +# It might be okay on normal form submission, but for Web APIs we oughta get strict, as it'll help show up +# broken clients more easily (eg submitting content with a misnamed field)""" +# content = {'qwerty': 'uiop', 'extra': 'extra'} +# self.assertRaises(ImmediateResponse, validator.validate_request, content, None) + +# def validation_allows_extra_fields_if_explicitly_set(self, validator): +# """If we include an allowed_extra_fields paramater on _validate, then allow fields with those names.""" +# content = {'qwerty': 'uiop', 'extra': 'extra'} +# validator._validate(content, None, allowed_extra_fields=('extra',)) + +# def validation_allows_unknown_fields_if_explicitly_allowed(self, validator): +# """If we set ``unknown_form_fields`` on the form resource, then don't +# raise errors on unexpected request data""" +# content = {'qwerty': 'uiop', 'extra': 'extra'} +# validator.allow_unknown_form_fields = True +# self.assertEqual({'qwerty': u'uiop'}, +# validator.validate_request(content, None), +# "Resource didn't accept unknown fields.") +# validator.allow_unknown_form_fields = False + +# def validation_does_not_require_extra_fields_if_explicitly_set(self, validator): +# """If we include an allowed_extra_fields paramater on _validate, then do not fail if we do not have fields with those names.""" +# content = {'qwerty': 'uiop'} +# self.assertEqual(validator._validate(content, None, allowed_extra_fields=('extra',)), content) + +# def validation_failed_due_to_no_content_returns_appropriate_message(self, validator): +# """If validation fails due to no content, ensure the response contains a single non-field error""" +# content = {} +# try: +# validator.validate_request(content, None) +# except ImmediateResponse, exc: +# response = exc.response +# self.assertEqual(response.raw_content, {'field_errors': {'qwerty': ['This field is required.']}}) +# else: +# self.fail('ResourceException was not raised') + +# def validation_failed_due_to_field_error_returns_appropriate_message(self, validator): +# """If validation fails due to a field error, ensure the response contains a single field error""" +# content = {'qwerty': ''} +# try: +# validator.validate_request(content, None) +# except ImmediateResponse, exc: +# response = exc.response +# self.assertEqual(response.raw_content, {'field_errors': {'qwerty': ['This field is required.']}}) +# else: +# self.fail('ResourceException was not raised') + +# def validation_failed_due_to_invalid_field_returns_appropriate_message(self, validator): +# """If validation fails due to an invalid field, ensure the response contains a single field error""" +# content = {'qwerty': 'uiop', 'extra': 'extra'} +# try: +# validator.validate_request(content, None) +# except ImmediateResponse, exc: +# response = exc.response +# self.assertEqual(response.raw_content, {'field_errors': {'extra': ['This field does not exist.']}}) +# else: +# self.fail('ResourceException was not raised') + +# def validation_failed_due_to_multiple_errors_returns_appropriate_message(self, validator): +# """If validation for multiple reasons, ensure the response contains each error""" +# content = {'qwerty': '', 'extra': 'extra'} +# try: +# validator.validate_request(content, None) +# except ImmediateResponse, exc: +# response = exc.response +# self.assertEqual(response.raw_content, {'field_errors': {'qwerty': ['This field is required.'], +# 'extra': ['This field does not exist.']}}) +# else: +# self.fail('ResourceException was not raised') + +# # Tests on FormResource + +# def test_form_validation_returns_content_unchanged_if_already_valid_and_clean(self): +# validator = self.MockFormResource(self.MockFormView()) +# self.validation_returns_content_unchanged_if_already_valid_and_clean(validator) + +# def test_form_validation_failure_raises_response_exception(self): +# validator = self.MockFormResource(self.MockFormView()) +# self.validation_failure_raises_response_exception(validator) + +# def test_validation_does_not_allow_extra_fields_by_default(self): +# validator = self.MockFormResource(self.MockFormView()) +# self.validation_does_not_allow_extra_fields_by_default(validator) + +# def test_validation_allows_extra_fields_if_explicitly_set(self): +# validator = self.MockFormResource(self.MockFormView()) +# self.validation_allows_extra_fields_if_explicitly_set(validator) + +# def test_validation_allows_unknown_fields_if_explicitly_allowed(self): +# validator = self.MockFormResource(self.MockFormView()) +# self.validation_allows_unknown_fields_if_explicitly_allowed(validator) + +# def test_validation_does_not_require_extra_fields_if_explicitly_set(self): +# validator = self.MockFormResource(self.MockFormView()) +# self.validation_does_not_require_extra_fields_if_explicitly_set(validator) + +# def test_validation_failed_due_to_no_content_returns_appropriate_message(self): +# validator = self.MockFormResource(self.MockFormView()) +# self.validation_failed_due_to_no_content_returns_appropriate_message(validator) + +# def test_validation_failed_due_to_field_error_returns_appropriate_message(self): +# validator = self.MockFormResource(self.MockFormView()) +# self.validation_failed_due_to_field_error_returns_appropriate_message(validator) + +# def test_validation_failed_due_to_invalid_field_returns_appropriate_message(self): +# validator = self.MockFormResource(self.MockFormView()) +# self.validation_failed_due_to_invalid_field_returns_appropriate_message(validator) + +# def test_validation_failed_due_to_multiple_errors_returns_appropriate_message(self): +# validator = self.MockFormResource(self.MockFormView()) +# self.validation_failed_due_to_multiple_errors_returns_appropriate_message(validator) + +# # Same tests on ModelResource + +# def test_modelform_validation_returns_content_unchanged_if_already_valid_and_clean(self): +# validator = self.MockModelResource(self.MockModelFormView()) +# self.validation_returns_content_unchanged_if_already_valid_and_clean(validator) + +# def test_modelform_validation_failure_raises_response_exception(self): +# validator = self.MockModelResource(self.MockModelFormView()) +# self.validation_failure_raises_response_exception(validator) + +# def test_modelform_validation_does_not_allow_extra_fields_by_default(self): +# validator = self.MockModelResource(self.MockModelFormView()) +# self.validation_does_not_allow_extra_fields_by_default(validator) + +# def test_modelform_validation_allows_extra_fields_if_explicitly_set(self): +# validator = self.MockModelResource(self.MockModelFormView()) +# self.validation_allows_extra_fields_if_explicitly_set(validator) + +# def test_modelform_validation_does_not_require_extra_fields_if_explicitly_set(self): +# validator = self.MockModelResource(self.MockModelFormView()) +# self.validation_does_not_require_extra_fields_if_explicitly_set(validator) + +# def test_modelform_validation_failed_due_to_no_content_returns_appropriate_message(self): +# validator = self.MockModelResource(self.MockModelFormView()) +# self.validation_failed_due_to_no_content_returns_appropriate_message(validator) + +# def test_modelform_validation_failed_due_to_field_error_returns_appropriate_message(self): +# validator = self.MockModelResource(self.MockModelFormView()) +# self.validation_failed_due_to_field_error_returns_appropriate_message(validator) + +# def test_modelform_validation_failed_due_to_invalid_field_returns_appropriate_message(self): +# validator = self.MockModelResource(self.MockModelFormView()) +# self.validation_failed_due_to_invalid_field_returns_appropriate_message(validator) + +# def test_modelform_validation_failed_due_to_multiple_errors_returns_appropriate_message(self): +# validator = self.MockModelResource(self.MockModelFormView()) +# self.validation_failed_due_to_multiple_errors_returns_appropriate_message(validator) + + +# class TestModelFormValidator(TestCase): +# """Tests specific to ModelFormValidatorMixin""" + +# def setUp(self): +# """Create a validator for a model with two fields and a property.""" +# class MockModel(models.Model): +# qwerty = models.CharField(max_length=256) +# uiop = models.CharField(max_length=256, blank=True) + +# @property +# def readonly(self): +# return 'read only' + +# class MockResource(ModelResource): +# model = MockModel - def test_property_fields_are_allowed_on_model_forms(self): - """Validation on ModelForms may include property fields that exist on the Model to be included in the input.""" - content = {'qwerty': 'example', 'uiop': 'example', 'readonly': 'read only'} - self.assertEqual(self.validator.validate_request(content, None), content) +# class MockView(View): +# resource = MockResource - def test_property_fields_are_not_required_on_model_forms(self): - """Validation on ModelForms does not require property fields that exist on the Model to be included in the input.""" - content = {'qwerty': 'example', 'uiop': 'example'} - self.assertEqual(self.validator.validate_request(content, None), content) +# self.validator = MockResource(MockView) - def test_extra_fields_not_allowed_on_model_forms(self): - """If some (otherwise valid) content includes fields that are not in the form then validation should fail. - It might be okay on normal form submission, but for Web APIs we oughta get strict, as it'll help show up - broken clients more easily (eg submitting content with a misnamed field)""" - content = {'qwerty': 'example', 'uiop': 'example', 'readonly': 'read only', 'extra': 'extra'} - self.assertRaises(ImmediateResponse, self.validator.validate_request, content, None) +# def test_property_fields_are_allowed_on_model_forms(self): +# """Validation on ModelForms may include property fields that exist on the Model to be included in the input.""" +# content = {'qwerty': 'example', 'uiop': 'example', 'readonly': 'read only'} +# self.assertEqual(self.validator.validate_request(content, None), content) - def test_validate_requires_fields_on_model_forms(self): - """If some (otherwise valid) content includes fields that are not in the form then validation should fail. - It might be okay on normal form submission, but for Web APIs we oughta get strict, as it'll help show up - broken clients more easily (eg submitting content with a misnamed field)""" - content = {'readonly': 'read only'} - self.assertRaises(ImmediateResponse, self.validator.validate_request, content, None) +# def test_property_fields_are_not_required_on_model_forms(self): +# """Validation on ModelForms does not require property fields that exist on the Model to be included in the input.""" +# content = {'qwerty': 'example', 'uiop': 'example'} +# self.assertEqual(self.validator.validate_request(content, None), content) - def test_validate_does_not_require_blankable_fields_on_model_forms(self): - """Test standard ModelForm validation behaviour - fields with blank=True are not required.""" - content = {'qwerty': 'example', 'readonly': 'read only'} - self.validator.validate_request(content, None) +# def test_extra_fields_not_allowed_on_model_forms(self): +# """If some (otherwise valid) content includes fields that are not in the form then validation should fail. +# It might be okay on normal form submission, but for Web APIs we oughta get strict, as it'll help show up +# broken clients more easily (eg submitting content with a misnamed field)""" +# content = {'qwerty': 'example', 'uiop': 'example', 'readonly': 'read only', 'extra': 'extra'} +# self.assertRaises(ImmediateResponse, self.validator.validate_request, content, None) - def test_model_form_validator_uses_model_forms(self): - self.assertTrue(isinstance(self.validator.get_bound_form(), forms.ModelForm)) +# def test_validate_requires_fields_on_model_forms(self): +# """If some (otherwise valid) content includes fields that are not in the form then validation should fail. +# It might be okay on normal form submission, but for Web APIs we oughta get strict, as it'll help show up +# broken clients more easily (eg submitting content with a misnamed field)""" +# content = {'readonly': 'read only'} +# self.assertRaises(ImmediateResponse, self.validator.validate_request, content, None) + +# def test_validate_does_not_require_blankable_fields_on_model_forms(self): +# """Test standard ModelForm validation behaviour - fields with blank=True are not required.""" +# content = {'qwerty': 'example', 'readonly': 'read only'} +# self.validator.validate_request(content, None) + +# def test_model_form_validator_uses_model_forms(self): +# self.assertTrue(isinstance(self.validator.get_bound_form(), forms.ModelForm)) diff --git a/djangorestframework/tests/views.py b/djangorestframework/tests/views.py index 00bce002..d4e4098a 100644 --- a/djangorestframework/tests/views.py +++ b/djangorestframework/tests/views.py @@ -1,135 +1,128 @@ -from django.core.urlresolvers import reverse -from django.conf.urls.defaults import patterns, url, include -from django.http import HttpResponse -from django.test import TestCase -from django import forms -from django.db import models -from django.utils import simplejson as json - -from djangorestframework.resources import ModelResource -from djangorestframework.views import ( - View, - ListOrCreateModelView, - InstanceModelView -) - - -class MockView(View): - """This is a basic mock view""" - pass - - -class MockViewFinal(View): - """View with final() override""" - - def final(self, request, response, *args, **kwargs): - return HttpResponse('{"test": "passed"}', content_type="application/json") - - -class ResourceMockView(View): - """This is a resource-based mock view""" - - class MockForm(forms.Form): - foo = forms.BooleanField(required=False) - bar = forms.IntegerField(help_text='Must be an integer.') - baz = forms.CharField(max_length=32) - - form = MockForm - - -class MockResource(ModelResource): - """This is a mock model-based resource""" - - class MockResourceModel(models.Model): - foo = models.BooleanField() - bar = models.IntegerField(help_text='Must be an integer.') - baz = models.CharField(max_length=32, help_text='Free text. Max length 32 chars.') - - model = MockResourceModel - fields = ('foo', 'bar', 'baz') - -urlpatterns = patterns('', - url(r'^mock/$', MockView.as_view()), - url(r'^mock/final/$', MockViewFinal.as_view()), - url(r'^resourcemock/$', ResourceMockView.as_view()), - url(r'^model/$', ListOrCreateModelView.as_view(resource=MockResource)), - url(r'^model/(?P<pk>[^/]+)/$', InstanceModelView.as_view(resource=MockResource)), - url(r'^restframework/', include('djangorestframework.urls', namespace='djangorestframework')), -) - - -class BaseViewTests(TestCase): - """Test the base view class of djangorestframework""" - urls = 'djangorestframework.tests.views' - - def test_view_call_final(self): - response = self.client.options('/mock/final/') - self.assertEqual(response['Content-Type'].split(';')[0], "application/json") - data = json.loads(response.content) - self.assertEqual(data['test'], 'passed') - - def test_options_method_simple_view(self): - response = self.client.options('/mock/') - self._verify_options_response(response, - name='Mock', - description='This is a basic mock view') - - def test_options_method_resource_view(self): - response = self.client.options('/resourcemock/') - self._verify_options_response(response, - name='Resource Mock', - description='This is a resource-based mock view', - fields={'foo': 'BooleanField', - 'bar': 'IntegerField', - 'baz': 'CharField', - }) - - def test_options_method_model_resource_list_view(self): - response = self.client.options('/model/') - self._verify_options_response(response, - name='Mock List', - description='This is a mock model-based resource', - fields={'foo': 'BooleanField', - 'bar': 'IntegerField', - 'baz': 'CharField', - }) - - def test_options_method_model_resource_detail_view(self): - response = self.client.options('/model/0/') - self._verify_options_response(response, - name='Mock Instance', - description='This is a mock model-based resource', - fields={'foo': 'BooleanField', - 'bar': 'IntegerField', - 'baz': 'CharField', - }) - - def _verify_options_response(self, response, name, description, fields=None, status=200, - mime_type='application/json'): - self.assertEqual(response.status_code, status) - self.assertEqual(response['Content-Type'].split(';')[0], mime_type) - data = json.loads(response.content) - self.assertTrue('application/json' in data['renders']) - self.assertEqual(name, data['name']) - self.assertEqual(description, data['description']) - if fields is None: - self.assertFalse(hasattr(data, 'fields')) - else: - self.assertEqual(data['fields'], fields) - - -class ExtraViewsTests(TestCase): - """Test the extra views djangorestframework provides""" - urls = 'djangorestframework.tests.views' - - def test_login_view(self): - """Ensure the login view exists""" - response = self.client.get(reverse('djangorestframework:login')) - self.assertEqual(response.status_code, 200) - self.assertEqual(response['Content-Type'].split(';')[0], 'text/html') - - def test_logout_view(self): - """Ensure the logout view exists""" - response = self.client.get(reverse('djangorestframework:logout')) - self.assertEqual(response.status_code, 200) - self.assertEqual(response['Content-Type'].split(';')[0], 'text/html') +# from django.core.urlresolvers import reverse +# from django.conf.urls.defaults import patterns, url, include +# from django.http import HttpResponse +# from django.test import TestCase +# from django.utils import simplejson as json + +# from djangorestframework.views import View + + +# class MockView(View): +# """This is a basic mock view""" +# pass + + +# class MockViewFinal(View): +# """View with final() override""" + +# def final(self, request, response, *args, **kwargs): +# return HttpResponse('{"test": "passed"}', content_type="application/json") + + +# # class ResourceMockView(View): +# # """This is a resource-based mock view""" + +# # class MockForm(forms.Form): +# # foo = forms.BooleanField(required=False) +# # bar = forms.IntegerField(help_text='Must be an integer.') +# # baz = forms.CharField(max_length=32) + +# # form = MockForm + + +# # class MockResource(ModelResource): +# # """This is a mock model-based resource""" + +# # class MockResourceModel(models.Model): +# # foo = models.BooleanField() +# # bar = models.IntegerField(help_text='Must be an integer.') +# # baz = models.CharField(max_length=32, help_text='Free text. Max length 32 chars.') + +# # model = MockResourceModel +# # fields = ('foo', 'bar', 'baz') + +# urlpatterns = patterns('', +# url(r'^mock/$', MockView.as_view()), +# url(r'^mock/final/$', MockViewFinal.as_view()), +# # url(r'^resourcemock/$', ResourceMockView.as_view()), +# # url(r'^model/$', ListOrCreateModelView.as_view(resource=MockResource)), +# # url(r'^model/(?P<pk>[^/]+)/$', InstanceModelView.as_view(resource=MockResource)), +# url(r'^restframework/', include('djangorestframework.urls', namespace='djangorestframework')), +# ) + + +# class BaseViewTests(TestCase): +# """Test the base view class of djangorestframework""" +# urls = 'djangorestframework.tests.views' + +# def test_view_call_final(self): +# response = self.client.options('/mock/final/') +# self.assertEqual(response['Content-Type'].split(';')[0], "application/json") +# data = json.loads(response.content) +# self.assertEqual(data['test'], 'passed') + +# def test_options_method_simple_view(self): +# response = self.client.options('/mock/') +# self._verify_options_response(response, +# name='Mock', +# description='This is a basic mock view') + +# def test_options_method_resource_view(self): +# response = self.client.options('/resourcemock/') +# self._verify_options_response(response, +# name='Resource Mock', +# description='This is a resource-based mock view', +# fields={'foo': 'BooleanField', +# 'bar': 'IntegerField', +# 'baz': 'CharField', +# }) + +# def test_options_method_model_resource_list_view(self): +# response = self.client.options('/model/') +# self._verify_options_response(response, +# name='Mock List', +# description='This is a mock model-based resource', +# fields={'foo': 'BooleanField', +# 'bar': 'IntegerField', +# 'baz': 'CharField', +# }) + +# def test_options_method_model_resource_detail_view(self): +# response = self.client.options('/model/0/') +# self._verify_options_response(response, +# name='Mock Instance', +# description='This is a mock model-based resource', +# fields={'foo': 'BooleanField', +# 'bar': 'IntegerField', +# 'baz': 'CharField', +# }) + +# def _verify_options_response(self, response, name, description, fields=None, status=200, +# mime_type='application/json'): +# self.assertEqual(response.status_code, status) +# self.assertEqual(response['Content-Type'].split(';')[0], mime_type) +# data = json.loads(response.content) +# self.assertTrue('application/json' in data['renders']) +# self.assertEqual(name, data['name']) +# self.assertEqual(description, data['description']) +# if fields is None: +# self.assertFalse(hasattr(data, 'fields')) +# else: +# self.assertEqual(data['fields'], fields) + + +# class ExtraViewsTests(TestCase): +# """Test the extra views djangorestframework provides""" +# urls = 'djangorestframework.tests.views' + +# def test_login_view(self): +# """Ensure the login view exists""" +# response = self.client.get(reverse('djangorestframework:login')) +# self.assertEqual(response.status_code, 200) +# self.assertEqual(response['Content-Type'].split(';')[0], 'text/html') + +# def test_logout_view(self): +# """Ensure the logout view exists""" +# response = self.client.get(reverse('djangorestframework:logout')) +# self.assertEqual(response.status_code, 200) +# self.assertEqual(response['Content-Type'].split(';')[0], 'text/html') |
