aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/tests
diff options
context:
space:
mode:
Diffstat (limited to 'rest_framework/tests')
-rw-r--r--rest_framework/tests/fields.py81
-rw-r--r--rest_framework/tests/generics.py36
-rw-r--r--rest_framework/tests/permissions.py45
-rw-r--r--rest_framework/tests/views.py5
4 files changed, 155 insertions, 12 deletions
diff --git a/rest_framework/tests/fields.py b/rest_framework/tests/fields.py
index a3104206..22c515a9 100644
--- a/rest_framework/tests/fields.py
+++ b/rest_framework/tests/fields.py
@@ -2,13 +2,20 @@
General serializer field tests.
"""
from __future__ import unicode_literals
-from django.utils.datastructures import SortedDict
-import datetime
+
+from collections import namedtuple
from decimal import Decimal
+from uuid import uuid4
+
+import datetime
+from django import forms
+from django.core import validators
from django.db import models
from django.test import TestCase
-from django.core import validators
+from django.utils.datastructures import SortedDict
+
from rest_framework import serializers
+from rest_framework.fields import Field, CharField
from rest_framework.serializers import Serializer
from rest_framework.tests.models import RESTFrameworkModel
@@ -760,14 +767,16 @@ class SlugFieldTests(TestCase):
def test_given_serializer_value(self):
class SlugFieldSerializer(serializers.ModelSerializer):
- slug_field = serializers.SlugField(source='slug_field', max_length=20, required=False)
+ slug_field = serializers.SlugField(source='slug_field',
+ max_length=20, required=False)
class Meta:
model = self.SlugFieldModel
serializer = SlugFieldSerializer(data={})
self.assertEqual(serializer.is_valid(), True)
- self.assertEqual(getattr(serializer.fields['slug_field'], 'max_length'), 20)
+ self.assertEqual(getattr(serializer.fields['slug_field'],
+ 'max_length'), 20)
def test_invalid_slug(self):
"""
@@ -803,7 +812,8 @@ class URLFieldTests(TestCase):
serializer = URLFieldSerializer(data={})
self.assertEqual(serializer.is_valid(), True)
- self.assertEqual(getattr(serializer.fields['url_field'], 'max_length'), 200)
+ self.assertEqual(getattr(serializer.fields['url_field'],
+ 'max_length'), 200)
def test_given_model_value(self):
class URLFieldSerializer(serializers.ModelSerializer):
@@ -812,15 +822,68 @@ class URLFieldTests(TestCase):
serializer = URLFieldSerializer(data={})
self.assertEqual(serializer.is_valid(), True)
- self.assertEqual(getattr(serializer.fields['url_field'], 'max_length'), 128)
+ self.assertEqual(getattr(serializer.fields['url_field'],
+ 'max_length'), 128)
def test_given_serializer_value(self):
class URLFieldSerializer(serializers.ModelSerializer):
- url_field = serializers.URLField(source='url_field', max_length=20, required=False)
+ url_field = serializers.URLField(source='url_field',
+ max_length=20, required=False)
class Meta:
model = self.URLFieldWithGivenMaxLengthModel
serializer = URLFieldSerializer(data={})
self.assertEqual(serializer.is_valid(), True)
- self.assertEqual(getattr(serializer.fields['url_field'], 'max_length'), 20)
+ self.assertEqual(getattr(serializer.fields['url_field'],
+ 'max_length'), 20)
+
+
+class HumanizedField(TestCase):
+ def setUp(self):
+ self.required_field = Field()
+ self.required_field.label = uuid4().hex
+ self.required_field.required = True
+
+ self.optional_field = Field()
+ self.optional_field.label = uuid4().hex
+ self.optional_field.required = False
+
+ def test_type(self):
+ for field in (self.required_field, self.optional_field):
+ self.assertEqual(field.humanized['type'], field.type_name)
+
+ def test_required(self):
+ self.assertEqual(self.required_field.humanized['required'], True)
+
+ def test_optional(self):
+ self.assertEqual(self.optional_field.humanized['required'], False)
+
+ def test_label(self):
+ for field in (self.required_field, self.optional_field):
+ self.assertEqual(field.humanized['label'], field.label)
+
+
+class HumanizableSerializer(Serializer):
+ field1 = CharField(3, required=True)
+ field2 = CharField(10, required=False)
+
+
+class HumanizedSerializer(TestCase):
+ def setUp(self):
+ self.serializer = HumanizableSerializer()
+
+ def test_humanized(self):
+ humanized = self.serializer.humanized
+ expected = {
+ 'field1': {u'required': True,
+ u'max_length': 3,
+ u'type': u'CharField',
+ u'read_only': False},
+ 'field2': {u'required': False,
+ u'max_length': 10,
+ u'type': u'CharField',
+ u'read_only': False}}
+ self.assertEqual(set(expected.keys()), set(humanized.keys()))
+ for k, v in humanized.iteritems():
+ self.assertEqual(v, expected[k])
diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py
index 15d87e86..a2f8fb4b 100644
--- a/rest_framework/tests/generics.py
+++ b/rest_framework/tests/generics.py
@@ -121,7 +121,22 @@ class TestRootView(TestCase):
'text/html'
],
'name': 'Root',
- 'description': 'Example description for OPTIONS.'
+ 'description': 'Example description for OPTIONS.',
+ 'actions': {}
+ }
+ expected['actions']['GET'] = {}
+ expected['actions']['POST'] = {
+ 'text': {
+ 'max_length': 100,
+ 'read_only': False,
+ 'required': True,
+ 'type': 'String',
+ },
+ 'id': {
+ 'read_only': True,
+ 'required': False,
+ 'type': 'Integer',
+ },
}
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data, expected)
@@ -238,8 +253,25 @@ class TestInstanceView(TestCase):
'text/html'
],
'name': 'Instance',
- 'description': 'Example description for OPTIONS.'
+ 'description': 'Example description for OPTIONS.',
+ 'actions': {}
}
+ for method in ('GET', 'DELETE'):
+ expected['actions'][method] = {}
+ for method in ('PATCH', 'PUT'):
+ expected['actions'][method] = {
+ 'text': {
+ 'max_length': 100,
+ 'read_only': False,
+ 'required': True,
+ 'type': 'String',
+ },
+ 'id': {
+ 'read_only': True,
+ 'required': False,
+ 'type': 'Integer',
+ },
+ }
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data, expected)
diff --git a/rest_framework/tests/permissions.py b/rest_framework/tests/permissions.py
index b3993be5..5a18182b 100644
--- a/rest_framework/tests/permissions.py
+++ b/rest_framework/tests/permissions.py
@@ -108,6 +108,51 @@ class ModelPermissionsIntegrationTests(TestCase):
response = instance_view(request, pk='2')
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
+ def test_options_permitted(self):
+ request = factory.options('/', content_type='application/json',
+ HTTP_AUTHORIZATION=self.permitted_credentials)
+ response = root_view(request, pk='1')
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertIn('actions', response.data)
+ self.assertEquals(response.data['actions'].keys(), ['POST', 'GET',])
+
+ request = factory.options('/1', content_type='application/json',
+ HTTP_AUTHORIZATION=self.permitted_credentials)
+ response = instance_view(request, pk='1')
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertIn('actions', response.data)
+ self.assertEquals(response.data['actions'].keys(), ['PUT', 'PATCH', 'DELETE', 'GET',])
+
+ def test_options_disallowed(self):
+ request = factory.options('/', content_type='application/json',
+ HTTP_AUTHORIZATION=self.disallowed_credentials)
+ response = root_view(request, pk='1')
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertIn('actions', response.data)
+ self.assertEquals(response.data['actions'].keys(), ['GET',])
+
+ request = factory.options('/1', content_type='application/json',
+ HTTP_AUTHORIZATION=self.disallowed_credentials)
+ response = instance_view(request, pk='1')
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertIn('actions', response.data)
+ self.assertEquals(response.data['actions'].keys(), ['GET',])
+
+ def test_options_updateonly(self):
+ request = factory.options('/', content_type='application/json',
+ HTTP_AUTHORIZATION=self.updateonly_credentials)
+ response = root_view(request, pk='1')
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertIn('actions', response.data)
+ self.assertEquals(response.data['actions'].keys(), ['GET',])
+
+ request = factory.options('/1', content_type='application/json',
+ HTTP_AUTHORIZATION=self.updateonly_credentials)
+ response = instance_view(request, pk='1')
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertIn('actions', response.data)
+ self.assertEquals(response.data['actions'].keys(), ['PUT', 'PATCH', 'GET',])
+
class OwnerModel(models.Model):
text = models.CharField(max_length=100)
diff --git a/rest_framework/tests/views.py b/rest_framework/tests/views.py
index 994cf6dc..2767d24c 100644
--- a/rest_framework/tests/views.py
+++ b/rest_framework/tests/views.py
@@ -1,12 +1,15 @@
from __future__ import unicode_literals
+
+import copy
+
from django.test import TestCase
from django.test.client import RequestFactory
+
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.settings import api_settings
from rest_framework.views import APIView
-import copy
factory = RequestFactory()