diff options
| author | Tom Christie | 2013-05-24 21:21:56 +0100 |
|---|---|---|
| committer | Tom Christie | 2013-05-24 21:21:56 +0100 |
| commit | 760e8642bd04b5e03409601a8d378799c36eac1b (patch) | |
| tree | 69857f97ba5702fe040167a058fae0431abfe588 /rest_framework/tests | |
| parent | 78c53d530ff3d7a4a443b104ad73952d0b5b5b8b (diff) | |
| parent | a1deb5eac7d6d00c6269d88fce1cc6818d8ec04a (diff) | |
| download | django-rest-framework-760e8642bd04b5e03409601a8d378799c36eac1b.tar.bz2 | |
Merge branch 'issue-192-expose-fields-for-options' of https://github.com/grimborg/django-rest-framework into improved-options-support
Diffstat (limited to 'rest_framework/tests')
| -rw-r--r-- | rest_framework/tests/fields.py | 81 | ||||
| -rw-r--r-- | rest_framework/tests/generics.py | 36 | ||||
| -rw-r--r-- | rest_framework/tests/permissions.py | 45 | ||||
| -rw-r--r-- | rest_framework/tests/views.py | 5 |
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() |
