mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-12-04 23:44:07 +03:00
136 lines
5.6 KiB
Python
136 lines
5.6 KiB
Python
from django.conf.urls.defaults import patterns, url
|
|
from django.test import TestCase
|
|
from django.test import Client
|
|
from django import forms
|
|
from django.db import models
|
|
|
|
from djangorestframework.views import View
|
|
from djangorestframework.parsers import JSONParser
|
|
from djangorestframework.resources import ModelResource
|
|
from djangorestframework.views import ListOrCreateModelView, InstanceModelView
|
|
|
|
from StringIO import StringIO
|
|
|
|
|
|
class MockView(View):
|
|
"""This is a basic mock view"""
|
|
pass
|
|
|
|
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('djangorestframework.utils.staticviews',
|
|
url(r'^robots.txt$', 'deny_robots'),
|
|
url(r'^favicon.ico$', 'favicon'),
|
|
url(r'^accounts/login$', 'api_login'),
|
|
url(r'^accounts/logout$', 'api_logout'),
|
|
url(r'^mock/$', MockView.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)),
|
|
)
|
|
|
|
class BaseViewTests(TestCase):
|
|
"""Test the base view class of djangorestframework"""
|
|
urls = 'djangorestframework.tests.views'
|
|
|
|
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)
|
|
parser = JSONParser(None)
|
|
(data, files) = parser.parse(StringIO(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_robots_view(self):
|
|
"""Ensure the robots view exists"""
|
|
response = self.client.get('/robots.txt')
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response['Content-Type'], 'text/plain')
|
|
|
|
def test_favicon_view(self):
|
|
"""Ensure the favicon view exists"""
|
|
response = self.client.get('/favicon.ico')
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response['Content-Type'], 'image/vnd.microsoft.icon')
|
|
|
|
def test_login_view(self):
|
|
"""Ensure the login view exists"""
|
|
response = self.client.get('/accounts/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('/accounts/logout')
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response['Content-Type'].split(';')[0], 'text/html')
|
|
|
|
# TODO: Add login/logout behaviour tests
|
|
|