mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-26 11:33:59 +03:00
Added APIRequestFactory
This commit is contained in:
parent
4ee9cdc7af
commit
7224b20d58
|
@ -8,6 +8,7 @@ from __future__ import unicode_literals
|
||||||
|
|
||||||
import django
|
import django
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
# Try to import six from Django, fallback to included `six`.
|
# Try to import six from Django, fallback to included `six`.
|
||||||
try:
|
try:
|
||||||
|
@ -83,7 +84,6 @@ def get_concrete_model(model_cls):
|
||||||
|
|
||||||
# Django 1.5 add support for custom auth user model
|
# Django 1.5 add support for custom auth user model
|
||||||
if django.VERSION >= (1, 5):
|
if django.VERSION >= (1, 5):
|
||||||
from django.conf import settings
|
|
||||||
AUTH_USER_MODEL = settings.AUTH_USER_MODEL
|
AUTH_USER_MODEL = settings.AUTH_USER_MODEL
|
||||||
else:
|
else:
|
||||||
AUTH_USER_MODEL = 'auth.User'
|
AUTH_USER_MODEL = 'auth.User'
|
||||||
|
@ -436,6 +436,42 @@ except ImportError:
|
||||||
return force_text(url)
|
return force_text(url)
|
||||||
|
|
||||||
|
|
||||||
|
# RequestFactory only provide `generic` from 1.5 onwards
|
||||||
|
|
||||||
|
from django.test.client import RequestFactory as DjangoRequestFactory
|
||||||
|
from django.test.client import FakePayload
|
||||||
|
try:
|
||||||
|
# In 1.5 the test client uses force_bytes
|
||||||
|
from django.utils.encoding import force_bytes_or_smart_bytes
|
||||||
|
except ImportError:
|
||||||
|
# In 1.3 and 1.4 the test client just uses smart_str
|
||||||
|
from django.utils.encoding import smart_str as force_bytes_or_smart_bytes
|
||||||
|
|
||||||
|
|
||||||
|
class RequestFactory(DjangoRequestFactory):
|
||||||
|
def generic(self, method, path,
|
||||||
|
data='', content_type='application/octet-stream', **extra):
|
||||||
|
parsed = urlparse.urlparse(path)
|
||||||
|
data = force_bytes_or_smart_bytes(data, settings.DEFAULT_CHARSET)
|
||||||
|
r = {
|
||||||
|
'PATH_INFO': self._get_path(parsed),
|
||||||
|
'QUERY_STRING': force_text(parsed[4]),
|
||||||
|
'REQUEST_METHOD': str(method),
|
||||||
|
}
|
||||||
|
if data:
|
||||||
|
r.update({
|
||||||
|
'CONTENT_LENGTH': len(data),
|
||||||
|
'CONTENT_TYPE': str(content_type),
|
||||||
|
'wsgi.input': FakePayload(data),
|
||||||
|
})
|
||||||
|
elif django.VERSION <= (1, 4):
|
||||||
|
# For 1.3 we need an empty WSGI payload
|
||||||
|
r.update({
|
||||||
|
'wsgi.input': FakePayload('')
|
||||||
|
})
|
||||||
|
r.update(extra)
|
||||||
|
return self.request(**r)
|
||||||
|
|
||||||
# Markdown is optional
|
# Markdown is optional
|
||||||
try:
|
try:
|
||||||
import markdown
|
import markdown
|
||||||
|
|
|
@ -14,6 +14,7 @@ from django import forms
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.http.multipartparser import parse_header
|
from django.http.multipartparser import parse_header
|
||||||
from django.template import RequestContext, loader, Template
|
from django.template import RequestContext, loader, Template
|
||||||
|
from django.test.client import encode_multipart
|
||||||
from django.utils.xmlutils import SimplerXMLGenerator
|
from django.utils.xmlutils import SimplerXMLGenerator
|
||||||
from rest_framework.compat import StringIO
|
from rest_framework.compat import StringIO
|
||||||
from rest_framework.compat import six
|
from rest_framework.compat import six
|
||||||
|
@ -571,3 +572,13 @@ class BrowsableAPIRenderer(BaseRenderer):
|
||||||
response.status_code = status.HTTP_200_OK
|
response.status_code = status.HTTP_200_OK
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
class MultiPartRenderer(BaseRenderer):
|
||||||
|
media_type = 'multipart/form-data; boundary=BoUnDaRyStRiNg'
|
||||||
|
format = 'form'
|
||||||
|
charset = 'utf-8'
|
||||||
|
BOUNDARY = 'BoUnDaRyStRiNg'
|
||||||
|
|
||||||
|
def render(self, data, accepted_media_type=None, renderer_context=None):
|
||||||
|
return encode_multipart(self.BOUNDARY, data)
|
||||||
|
|
|
@ -50,7 +50,7 @@ class Response(SimpleTemplateResponse):
|
||||||
charset = renderer.charset
|
charset = renderer.charset
|
||||||
content_type = self.content_type
|
content_type = self.content_type
|
||||||
|
|
||||||
if content_type is None and charset is not None:
|
if content_type is None and charset is not None and ';' not in media_type:
|
||||||
content_type = "{0}; charset={1}".format(media_type, charset)
|
content_type = "{0}; charset={1}".format(media_type, charset)
|
||||||
elif content_type is None:
|
elif content_type is None:
|
||||||
content_type = media_type
|
content_type = media_type
|
||||||
|
|
48
rest_framework/test.py
Normal file
48
rest_framework/test.py
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
from rest_framework.compat import six, RequestFactory
|
||||||
|
from rest_framework.renderers import JSONRenderer, MultiPartRenderer
|
||||||
|
|
||||||
|
|
||||||
|
class APIRequestFactory(RequestFactory):
|
||||||
|
renderer_classes = {
|
||||||
|
'json': JSONRenderer,
|
||||||
|
'form': MultiPartRenderer
|
||||||
|
}
|
||||||
|
default_format = 'form'
|
||||||
|
|
||||||
|
def __init__(self, format=None, **defaults):
|
||||||
|
self.format = format or self.default_format
|
||||||
|
super(APIRequestFactory, self).__init__(**defaults)
|
||||||
|
|
||||||
|
def _encode_data(self, data, format, content_type):
|
||||||
|
if not data:
|
||||||
|
return ('', None)
|
||||||
|
|
||||||
|
format = format or self.format
|
||||||
|
|
||||||
|
if content_type is None and data is not None:
|
||||||
|
renderer = self.renderer_classes[format]()
|
||||||
|
data = renderer.render(data)
|
||||||
|
# Determine the content-type header
|
||||||
|
if ';' in renderer.media_type:
|
||||||
|
content_type = renderer.media_type
|
||||||
|
else:
|
||||||
|
content_type = "{0}; charset={1}".format(
|
||||||
|
renderer.media_type, renderer.charset
|
||||||
|
)
|
||||||
|
# Coerce text to bytes if required.
|
||||||
|
if isinstance(data, six.text_type):
|
||||||
|
data = bytes(data.encode(renderer.charset))
|
||||||
|
|
||||||
|
return data, content_type
|
||||||
|
|
||||||
|
def post(self, path, data=None, format=None, content_type=None, **extra):
|
||||||
|
data, content_type = self._encode_data(data, format, content_type)
|
||||||
|
return self.generic('POST', path, data, content_type, **extra)
|
||||||
|
|
||||||
|
def put(self, path, data=None, format=None, content_type=None, **extra):
|
||||||
|
data, content_type = self._encode_data(data, format, content_type)
|
||||||
|
return self.generic('PUT', path, data, content_type, **extra)
|
||||||
|
|
||||||
|
def patch(self, path, data=None, format=None, content_type=None, **extra):
|
||||||
|
data, content_type = self._encode_data(data, format, content_type)
|
||||||
|
return self.generic('PATCH', path, data, content_type, **extra)
|
|
@ -21,14 +21,14 @@ from rest_framework.authtoken.models import Token
|
||||||
from rest_framework.compat import patterns, url, include
|
from rest_framework.compat import patterns, url, include
|
||||||
from rest_framework.compat import oauth2_provider, oauth2_provider_models, oauth2_provider_scope
|
from rest_framework.compat import oauth2_provider, oauth2_provider_models, oauth2_provider_scope
|
||||||
from rest_framework.compat import oauth, oauth_provider
|
from rest_framework.compat import oauth, oauth_provider
|
||||||
from rest_framework.tests.utils import RequestFactory
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
import json
|
|
||||||
import base64
|
import base64
|
||||||
import time
|
import time
|
||||||
import datetime
|
import datetime
|
||||||
|
import json
|
||||||
|
|
||||||
factory = RequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
|
||||||
|
|
||||||
class MockView(APIView):
|
class MockView(APIView):
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
|
from rest_framework.authentication import BasicAuthentication
|
||||||
|
from rest_framework.parsers import JSONParser
|
||||||
|
from rest_framework.permissions import IsAuthenticated
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.renderers import JSONRenderer
|
from rest_framework.renderers import JSONRenderer
|
||||||
from rest_framework.parsers import JSONParser
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.authentication import BasicAuthentication
|
|
||||||
from rest_framework.throttling import UserRateThrottle
|
from rest_framework.throttling import UserRateThrottle
|
||||||
from rest_framework.permissions import IsAuthenticated
|
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from rest_framework.decorators import (
|
from rest_framework.decorators import (
|
||||||
api_view,
|
api_view,
|
||||||
|
@ -17,13 +18,11 @@ from rest_framework.decorators import (
|
||||||
permission_classes,
|
permission_classes,
|
||||||
)
|
)
|
||||||
|
|
||||||
from rest_framework.tests.utils import RequestFactory
|
|
||||||
|
|
||||||
|
|
||||||
class DecoratorTestCase(TestCase):
|
class DecoratorTestCase(TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.factory = RequestFactory()
|
self.factory = APIRequestFactory()
|
||||||
|
|
||||||
def _finalize_response(self, request, response, *args, **kwargs):
|
def _finalize_response(self, request, response, *args, **kwargs):
|
||||||
response.request = request
|
response.request = request
|
||||||
|
|
|
@ -4,13 +4,13 @@ from decimal import Decimal
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import RequestFactory
|
|
||||||
from django.utils import unittest
|
from django.utils import unittest
|
||||||
from rest_framework import generics, serializers, status, filters
|
from rest_framework import generics, serializers, status, filters
|
||||||
from rest_framework.compat import django_filters, patterns, url
|
from rest_framework.compat import django_filters, patterns, url
|
||||||
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.tests.models import BasicModel
|
from rest_framework.tests.models import BasicModel
|
||||||
|
|
||||||
factory = RequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
|
||||||
|
|
||||||
class FilterableItem(models.Model):
|
class FilterableItem(models.Model):
|
||||||
|
|
|
@ -3,12 +3,11 @@ from django.db import models
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from rest_framework import generics, renderers, serializers, status
|
from rest_framework import generics, renderers, serializers, status
|
||||||
from rest_framework.tests.utils import RequestFactory
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.tests.models import BasicModel, Comment, SlugBasedModel
|
from rest_framework.tests.models import BasicModel, Comment, SlugBasedModel
|
||||||
from rest_framework.compat import six
|
from rest_framework.compat import six
|
||||||
import json
|
|
||||||
|
|
||||||
factory = RequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
|
||||||
|
|
||||||
class RootView(generics.ListCreateAPIView):
|
class RootView(generics.ListCreateAPIView):
|
||||||
|
@ -71,9 +70,8 @@ class TestRootView(TestCase):
|
||||||
"""
|
"""
|
||||||
POST requests to ListCreateAPIView should create a new object.
|
POST requests to ListCreateAPIView should create a new object.
|
||||||
"""
|
"""
|
||||||
content = {'text': 'foobar'}
|
data = {'text': 'foobar'}
|
||||||
request = factory.post('/', json.dumps(content),
|
request = factory.post('/', data, format='json')
|
||||||
content_type='application/json')
|
|
||||||
with self.assertNumQueries(1):
|
with self.assertNumQueries(1):
|
||||||
response = self.view(request).render()
|
response = self.view(request).render()
|
||||||
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||||
|
@ -85,9 +83,8 @@ class TestRootView(TestCase):
|
||||||
"""
|
"""
|
||||||
PUT requests to ListCreateAPIView should not be allowed
|
PUT requests to ListCreateAPIView should not be allowed
|
||||||
"""
|
"""
|
||||||
content = {'text': 'foobar'}
|
data = {'text': 'foobar'}
|
||||||
request = factory.put('/', json.dumps(content),
|
request = factory.put('/', data, format='json')
|
||||||
content_type='application/json')
|
|
||||||
with self.assertNumQueries(0):
|
with self.assertNumQueries(0):
|
||||||
response = self.view(request).render()
|
response = self.view(request).render()
|
||||||
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
|
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
|
||||||
|
@ -148,9 +145,8 @@ class TestRootView(TestCase):
|
||||||
"""
|
"""
|
||||||
POST requests to create a new object should not be able to set the id.
|
POST requests to create a new object should not be able to set the id.
|
||||||
"""
|
"""
|
||||||
content = {'id': 999, 'text': 'foobar'}
|
data = {'id': 999, 'text': 'foobar'}
|
||||||
request = factory.post('/', json.dumps(content),
|
request = factory.post('/', data, format='json')
|
||||||
content_type='application/json')
|
|
||||||
with self.assertNumQueries(1):
|
with self.assertNumQueries(1):
|
||||||
response = self.view(request).render()
|
response = self.view(request).render()
|
||||||
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||||
|
@ -189,9 +185,8 @@ class TestInstanceView(TestCase):
|
||||||
"""
|
"""
|
||||||
POST requests to RetrieveUpdateDestroyAPIView should not be allowed
|
POST requests to RetrieveUpdateDestroyAPIView should not be allowed
|
||||||
"""
|
"""
|
||||||
content = {'text': 'foobar'}
|
data = {'text': 'foobar'}
|
||||||
request = factory.post('/', json.dumps(content),
|
request = factory.post('/', data, format='json')
|
||||||
content_type='application/json')
|
|
||||||
with self.assertNumQueries(0):
|
with self.assertNumQueries(0):
|
||||||
response = self.view(request).render()
|
response = self.view(request).render()
|
||||||
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
|
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
|
||||||
|
@ -201,9 +196,8 @@ class TestInstanceView(TestCase):
|
||||||
"""
|
"""
|
||||||
PUT requests to RetrieveUpdateDestroyAPIView should update an object.
|
PUT requests to RetrieveUpdateDestroyAPIView should update an object.
|
||||||
"""
|
"""
|
||||||
content = {'text': 'foobar'}
|
data = {'text': 'foobar'}
|
||||||
request = factory.put('/1', json.dumps(content),
|
request = factory.put('/1', data, format='json')
|
||||||
content_type='application/json')
|
|
||||||
with self.assertNumQueries(2):
|
with self.assertNumQueries(2):
|
||||||
response = self.view(request, pk='1').render()
|
response = self.view(request, pk='1').render()
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
@ -215,9 +209,8 @@ class TestInstanceView(TestCase):
|
||||||
"""
|
"""
|
||||||
PATCH requests to RetrieveUpdateDestroyAPIView should update an object.
|
PATCH requests to RetrieveUpdateDestroyAPIView should update an object.
|
||||||
"""
|
"""
|
||||||
content = {'text': 'foobar'}
|
data = {'text': 'foobar'}
|
||||||
request = factory.patch('/1', json.dumps(content),
|
request = factory.patch('/1', data, format='json')
|
||||||
content_type='application/json')
|
|
||||||
|
|
||||||
with self.assertNumQueries(2):
|
with self.assertNumQueries(2):
|
||||||
response = self.view(request, pk=1).render()
|
response = self.view(request, pk=1).render()
|
||||||
|
@ -293,9 +286,8 @@ class TestInstanceView(TestCase):
|
||||||
"""
|
"""
|
||||||
PUT requests to create a new object should not be able to set the id.
|
PUT requests to create a new object should not be able to set the id.
|
||||||
"""
|
"""
|
||||||
content = {'id': 999, 'text': 'foobar'}
|
data = {'id': 999, 'text': 'foobar'}
|
||||||
request = factory.put('/1', json.dumps(content),
|
request = factory.put('/1', data, format='json')
|
||||||
content_type='application/json')
|
|
||||||
with self.assertNumQueries(2):
|
with self.assertNumQueries(2):
|
||||||
response = self.view(request, pk=1).render()
|
response = self.view(request, pk=1).render()
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
@ -309,9 +301,8 @@ class TestInstanceView(TestCase):
|
||||||
if it does not currently exist.
|
if it does not currently exist.
|
||||||
"""
|
"""
|
||||||
self.objects.get(id=1).delete()
|
self.objects.get(id=1).delete()
|
||||||
content = {'text': 'foobar'}
|
data = {'text': 'foobar'}
|
||||||
request = factory.put('/1', json.dumps(content),
|
request = factory.put('/1', data, format='json')
|
||||||
content_type='application/json')
|
|
||||||
with self.assertNumQueries(3):
|
with self.assertNumQueries(3):
|
||||||
response = self.view(request, pk=1).render()
|
response = self.view(request, pk=1).render()
|
||||||
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||||
|
@ -324,10 +315,9 @@ class TestInstanceView(TestCase):
|
||||||
PUT requests to RetrieveUpdateDestroyAPIView should create an object
|
PUT requests to RetrieveUpdateDestroyAPIView should create an object
|
||||||
at the requested url if it doesn't exist.
|
at the requested url if it doesn't exist.
|
||||||
"""
|
"""
|
||||||
content = {'text': 'foobar'}
|
data = {'text': 'foobar'}
|
||||||
# pk fields can not be created on demand, only the database can set the pk for a new object
|
# pk fields can not be created on demand, only the database can set the pk for a new object
|
||||||
request = factory.put('/5', json.dumps(content),
|
request = factory.put('/5', data, format='json')
|
||||||
content_type='application/json')
|
|
||||||
with self.assertNumQueries(3):
|
with self.assertNumQueries(3):
|
||||||
response = self.view(request, pk=5).render()
|
response = self.view(request, pk=5).render()
|
||||||
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||||
|
@ -339,9 +329,8 @@ class TestInstanceView(TestCase):
|
||||||
PUT requests to RetrieveUpdateDestroyAPIView should create an object
|
PUT requests to RetrieveUpdateDestroyAPIView should create an object
|
||||||
at the requested url if possible, else return HTTP_403_FORBIDDEN error-response.
|
at the requested url if possible, else return HTTP_403_FORBIDDEN error-response.
|
||||||
"""
|
"""
|
||||||
content = {'text': 'foobar'}
|
data = {'text': 'foobar'}
|
||||||
request = factory.put('/test_slug', json.dumps(content),
|
request = factory.put('/test_slug', data, format='json')
|
||||||
content_type='application/json')
|
|
||||||
with self.assertNumQueries(2):
|
with self.assertNumQueries(2):
|
||||||
response = self.slug_based_view(request, slug='test_slug').render()
|
response = self.slug_based_view(request, slug='test_slug').render()
|
||||||
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||||
|
@ -415,9 +404,8 @@ class TestCreateModelWithAutoNowAddField(TestCase):
|
||||||
|
|
||||||
https://github.com/tomchristie/django-rest-framework/issues/285
|
https://github.com/tomchristie/django-rest-framework/issues/285
|
||||||
"""
|
"""
|
||||||
content = {'email': 'foobar@example.com', 'content': 'foobar'}
|
data = {'email': 'foobar@example.com', 'content': 'foobar'}
|
||||||
request = factory.post('/', json.dumps(content),
|
request = factory.post('/', data, format='json')
|
||||||
content_type='application/json')
|
|
||||||
response = self.view(request).render()
|
response = self.view(request).render()
|
||||||
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||||
created = self.objects.get(id=1)
|
created = self.objects.get(id=1)
|
||||||
|
|
|
@ -1,12 +1,15 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import json
|
import json
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import RequestFactory
|
|
||||||
from rest_framework import generics, status, serializers
|
from rest_framework import generics, status, serializers
|
||||||
from rest_framework.compat import patterns, url
|
from rest_framework.compat import patterns, url
|
||||||
from rest_framework.tests.models import Anchor, BasicModel, ManyToManyModel, BlogPost, BlogPostComment, Album, Photo, OptionalRelationModel
|
from rest_framework.test import APIRequestFactory
|
||||||
|
from rest_framework.tests.models import (
|
||||||
|
Anchor, BasicModel, ManyToManyModel, BlogPost, BlogPostComment,
|
||||||
|
Album, Photo, OptionalRelationModel
|
||||||
|
)
|
||||||
|
|
||||||
factory = RequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
|
||||||
|
|
||||||
class BlogPostCommentSerializer(serializers.ModelSerializer):
|
class BlogPostCommentSerializer(serializers.ModelSerializer):
|
||||||
|
@ -21,7 +24,7 @@ class BlogPostCommentSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class PhotoSerializer(serializers.Serializer):
|
class PhotoSerializer(serializers.Serializer):
|
||||||
description = serializers.CharField()
|
description = serializers.CharField()
|
||||||
album_url = serializers.HyperlinkedRelatedField(source='album', view_name='album-detail', queryset=Album.objects.all(), slug_field='title', slug_url_kwarg='title')
|
album_url = serializers.HyperlinkedRelatedField(source='album', view_name='album-detail', queryset=Album.objects.all(), lookup_field='title', slug_url_kwarg='title')
|
||||||
|
|
||||||
def restore_object(self, attrs, instance=None):
|
def restore_object(self, attrs, instance=None):
|
||||||
return Photo(**attrs)
|
return Photo(**attrs)
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import RequestFactory
|
|
||||||
from rest_framework.negotiation import DefaultContentNegotiation
|
from rest_framework.negotiation import DefaultContentNegotiation
|
||||||
from rest_framework.request import Request
|
from rest_framework.request import Request
|
||||||
from rest_framework.renderers import BaseRenderer
|
from rest_framework.renderers import BaseRenderer
|
||||||
|
from rest_framework.test import APIRequestFactory
|
||||||
|
|
||||||
|
|
||||||
factory = RequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
|
||||||
|
|
||||||
class MockJSONRenderer(BaseRenderer):
|
class MockJSONRenderer(BaseRenderer):
|
||||||
|
|
|
@ -4,13 +4,13 @@ from decimal import Decimal
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.core.paginator import Paginator
|
from django.core.paginator import Paginator
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import RequestFactory
|
|
||||||
from django.utils import unittest
|
from django.utils import unittest
|
||||||
from rest_framework import generics, status, pagination, filters, serializers
|
from rest_framework import generics, status, pagination, filters, serializers
|
||||||
from rest_framework.compat import django_filters
|
from rest_framework.compat import django_filters
|
||||||
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.tests.models import BasicModel
|
from rest_framework.tests.models import BasicModel
|
||||||
|
|
||||||
factory = RequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
|
||||||
|
|
||||||
class FilterableItem(models.Model):
|
class FilterableItem(models.Model):
|
||||||
|
@ -369,7 +369,7 @@ class TestCustomPaginationSerializer(TestCase):
|
||||||
self.page = paginator.page(1)
|
self.page = paginator.page(1)
|
||||||
|
|
||||||
def test_custom_pagination_serializer(self):
|
def test_custom_pagination_serializer(self):
|
||||||
request = RequestFactory().get('/foobar')
|
request = APIRequestFactory().get('/foobar')
|
||||||
serializer = CustomPaginationSerializer(
|
serializer = CustomPaginationSerializer(
|
||||||
instance=self.page,
|
instance=self.page,
|
||||||
context={'request': request}
|
context={'request': request}
|
||||||
|
|
|
@ -3,11 +3,10 @@ from django.contrib.auth.models import User, Permission
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from rest_framework import generics, status, permissions, authentication, HTTP_HEADER_ENCODING
|
from rest_framework import generics, status, permissions, authentication, HTTP_HEADER_ENCODING
|
||||||
from rest_framework.tests.utils import RequestFactory
|
from rest_framework.test import APIRequestFactory
|
||||||
import base64
|
import base64
|
||||||
import json
|
|
||||||
|
|
||||||
factory = RequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
|
||||||
|
|
||||||
class BasicModel(models.Model):
|
class BasicModel(models.Model):
|
||||||
|
@ -56,15 +55,13 @@ class ModelPermissionsIntegrationTests(TestCase):
|
||||||
BasicModel(text='foo').save()
|
BasicModel(text='foo').save()
|
||||||
|
|
||||||
def test_has_create_permissions(self):
|
def test_has_create_permissions(self):
|
||||||
request = factory.post('/', json.dumps({'text': 'foobar'}),
|
request = factory.post('/', {'text': 'foobar'}, format='json',
|
||||||
content_type='application/json',
|
|
||||||
HTTP_AUTHORIZATION=self.permitted_credentials)
|
HTTP_AUTHORIZATION=self.permitted_credentials)
|
||||||
response = root_view(request, pk=1)
|
response = root_view(request, pk=1)
|
||||||
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||||
|
|
||||||
def test_has_put_permissions(self):
|
def test_has_put_permissions(self):
|
||||||
request = factory.put('/1', json.dumps({'text': 'foobar'}),
|
request = factory.put('/1', {'text': 'foobar'}, format='json',
|
||||||
content_type='application/json',
|
|
||||||
HTTP_AUTHORIZATION=self.permitted_credentials)
|
HTTP_AUTHORIZATION=self.permitted_credentials)
|
||||||
response = instance_view(request, pk='1')
|
response = instance_view(request, pk='1')
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
@ -75,15 +72,13 @@ class ModelPermissionsIntegrationTests(TestCase):
|
||||||
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
|
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
def test_does_not_have_create_permissions(self):
|
def test_does_not_have_create_permissions(self):
|
||||||
request = factory.post('/', json.dumps({'text': 'foobar'}),
|
request = factory.post('/', {'text': 'foobar'}, format='json',
|
||||||
content_type='application/json',
|
|
||||||
HTTP_AUTHORIZATION=self.disallowed_credentials)
|
HTTP_AUTHORIZATION=self.disallowed_credentials)
|
||||||
response = root_view(request, pk=1)
|
response = root_view(request, pk=1)
|
||||||
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
|
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
|
||||||
|
|
||||||
def test_does_not_have_put_permissions(self):
|
def test_does_not_have_put_permissions(self):
|
||||||
request = factory.put('/1', json.dumps({'text': 'foobar'}),
|
request = factory.put('/1', {'text': 'foobar'}, format='json',
|
||||||
content_type='application/json',
|
|
||||||
HTTP_AUTHORIZATION=self.disallowed_credentials)
|
HTTP_AUTHORIZATION=self.disallowed_credentials)
|
||||||
response = instance_view(request, pk='1')
|
response = instance_view(request, pk='1')
|
||||||
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
|
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
|
||||||
|
@ -95,28 +90,26 @@ class ModelPermissionsIntegrationTests(TestCase):
|
||||||
|
|
||||||
def test_has_put_as_create_permissions(self):
|
def test_has_put_as_create_permissions(self):
|
||||||
# User only has update permissions - should be able to update an entity.
|
# User only has update permissions - should be able to update an entity.
|
||||||
request = factory.put('/1', json.dumps({'text': 'foobar'}),
|
request = factory.put('/1', {'text': 'foobar'}, format='json',
|
||||||
content_type='application/json',
|
|
||||||
HTTP_AUTHORIZATION=self.updateonly_credentials)
|
HTTP_AUTHORIZATION=self.updateonly_credentials)
|
||||||
response = instance_view(request, pk='1')
|
response = instance_view(request, pk='1')
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
|
||||||
# But if PUTing to a new entity, permission should be denied.
|
# But if PUTing to a new entity, permission should be denied.
|
||||||
request = factory.put('/2', json.dumps({'text': 'foobar'}),
|
request = factory.put('/2', {'text': 'foobar'}, format='json',
|
||||||
content_type='application/json',
|
|
||||||
HTTP_AUTHORIZATION=self.updateonly_credentials)
|
HTTP_AUTHORIZATION=self.updateonly_credentials)
|
||||||
response = instance_view(request, pk='2')
|
response = instance_view(request, pk='2')
|
||||||
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
|
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
|
||||||
|
|
||||||
def test_options_permitted(self):
|
def test_options_permitted(self):
|
||||||
request = factory.options('/', content_type='application/json',
|
request = factory.options('/',
|
||||||
HTTP_AUTHORIZATION=self.permitted_credentials)
|
HTTP_AUTHORIZATION=self.permitted_credentials)
|
||||||
response = root_view(request, pk='1')
|
response = root_view(request, pk='1')
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
self.assertIn('actions', response.data)
|
self.assertIn('actions', response.data)
|
||||||
self.assertEqual(list(response.data['actions'].keys()), ['POST'])
|
self.assertEqual(list(response.data['actions'].keys()), ['POST'])
|
||||||
|
|
||||||
request = factory.options('/1', content_type='application/json',
|
request = factory.options('/1',
|
||||||
HTTP_AUTHORIZATION=self.permitted_credentials)
|
HTTP_AUTHORIZATION=self.permitted_credentials)
|
||||||
response = instance_view(request, pk='1')
|
response = instance_view(request, pk='1')
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
@ -124,26 +117,26 @@ class ModelPermissionsIntegrationTests(TestCase):
|
||||||
self.assertEqual(list(response.data['actions'].keys()), ['PUT'])
|
self.assertEqual(list(response.data['actions'].keys()), ['PUT'])
|
||||||
|
|
||||||
def test_options_disallowed(self):
|
def test_options_disallowed(self):
|
||||||
request = factory.options('/', content_type='application/json',
|
request = factory.options('/',
|
||||||
HTTP_AUTHORIZATION=self.disallowed_credentials)
|
HTTP_AUTHORIZATION=self.disallowed_credentials)
|
||||||
response = root_view(request, pk='1')
|
response = root_view(request, pk='1')
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
self.assertNotIn('actions', response.data)
|
self.assertNotIn('actions', response.data)
|
||||||
|
|
||||||
request = factory.options('/1', content_type='application/json',
|
request = factory.options('/1',
|
||||||
HTTP_AUTHORIZATION=self.disallowed_credentials)
|
HTTP_AUTHORIZATION=self.disallowed_credentials)
|
||||||
response = instance_view(request, pk='1')
|
response = instance_view(request, pk='1')
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
self.assertNotIn('actions', response.data)
|
self.assertNotIn('actions', response.data)
|
||||||
|
|
||||||
def test_options_updateonly(self):
|
def test_options_updateonly(self):
|
||||||
request = factory.options('/', content_type='application/json',
|
request = factory.options('/',
|
||||||
HTTP_AUTHORIZATION=self.updateonly_credentials)
|
HTTP_AUTHORIZATION=self.updateonly_credentials)
|
||||||
response = root_view(request, pk='1')
|
response = root_view(request, pk='1')
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
self.assertNotIn('actions', response.data)
|
self.assertNotIn('actions', response.data)
|
||||||
|
|
||||||
request = factory.options('/1', content_type='application/json',
|
request = factory.options('/1',
|
||||||
HTTP_AUTHORIZATION=self.updateonly_credentials)
|
HTTP_AUTHORIZATION=self.updateonly_credentials)
|
||||||
response = instance_view(request, pk='1')
|
response = instance_view(request, pk='1')
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import RequestFactory
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from rest_framework.compat import patterns, url
|
from rest_framework.compat import patterns, url
|
||||||
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.tests.models import (
|
from rest_framework.tests.models import (
|
||||||
BlogPost,
|
BlogPost,
|
||||||
ManyToManyTarget, ManyToManySource, ForeignKeyTarget, ForeignKeySource,
|
ManyToManyTarget, ManyToManySource, ForeignKeyTarget, ForeignKeySource,
|
||||||
NullableForeignKeySource, OneToOneTarget, NullableOneToOneSource
|
NullableForeignKeySource, OneToOneTarget, NullableOneToOneSource
|
||||||
)
|
)
|
||||||
|
|
||||||
factory = RequestFactory()
|
factory = APIRequestFactory()
|
||||||
request = factory.get('/') # Just to ensure we have a request in the serializer context
|
request = factory.get('/') # Just to ensure we have a request in the serializer context
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,19 +4,17 @@ from __future__ import unicode_literals
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import RequestFactory
|
|
||||||
from django.utils import unittest
|
from django.utils import unittest
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from rest_framework import status, permissions
|
from rest_framework import status, permissions
|
||||||
from rest_framework.compat import yaml, etree, patterns, url, include
|
from rest_framework.compat import yaml, etree, patterns, url, include, six, StringIO
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from rest_framework.renderers import BaseRenderer, JSONRenderer, YAMLRenderer, \
|
from rest_framework.renderers import BaseRenderer, JSONRenderer, YAMLRenderer, \
|
||||||
XMLRenderer, JSONPRenderer, BrowsableAPIRenderer, UnicodeJSONRenderer
|
XMLRenderer, JSONPRenderer, BrowsableAPIRenderer, UnicodeJSONRenderer
|
||||||
from rest_framework.parsers import YAMLParser, XMLParser
|
from rest_framework.parsers import YAMLParser, XMLParser
|
||||||
from rest_framework.settings import api_settings
|
from rest_framework.settings import api_settings
|
||||||
from rest_framework.compat import StringIO
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.compat import six
|
|
||||||
import datetime
|
import datetime
|
||||||
import pickle
|
import pickle
|
||||||
import re
|
import re
|
||||||
|
@ -121,7 +119,7 @@ class POSTDeniedView(APIView):
|
||||||
class DocumentingRendererTests(TestCase):
|
class DocumentingRendererTests(TestCase):
|
||||||
def test_only_permitted_forms_are_displayed(self):
|
def test_only_permitted_forms_are_displayed(self):
|
||||||
view = POSTDeniedView.as_view()
|
view = POSTDeniedView.as_view()
|
||||||
request = RequestFactory().get('/')
|
request = APIRequestFactory().get('/')
|
||||||
response = view(request).render()
|
response = view(request).render()
|
||||||
self.assertNotContains(response, '>POST<')
|
self.assertNotContains(response, '>POST<')
|
||||||
self.assertContains(response, '>PUT<')
|
self.assertContains(response, '>PUT<')
|
||||||
|
|
|
@ -6,7 +6,6 @@ from django.contrib.auth.models import User
|
||||||
from django.contrib.auth import authenticate, login, logout
|
from django.contrib.auth import authenticate, login, logout
|
||||||
from django.contrib.sessions.middleware import SessionMiddleware
|
from django.contrib.sessions.middleware import SessionMiddleware
|
||||||
from django.test import TestCase, Client
|
from django.test import TestCase, Client
|
||||||
from django.test.client import RequestFactory
|
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.authentication import SessionAuthentication
|
from rest_framework.authentication import SessionAuthentication
|
||||||
from rest_framework.compat import patterns
|
from rest_framework.compat import patterns
|
||||||
|
@ -19,12 +18,13 @@ from rest_framework.parsers import (
|
||||||
from rest_framework.request import Request
|
from rest_framework.request import Request
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.settings import api_settings
|
from rest_framework.settings import api_settings
|
||||||
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from rest_framework.compat import six
|
from rest_framework.compat import six
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
|
||||||
factory = RequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
|
||||||
|
|
||||||
class PlainTextParser(BaseParser):
|
class PlainTextParser(BaseParser):
|
||||||
|
@ -116,16 +116,7 @@ class TestContentParsing(TestCase):
|
||||||
Ensure request.DATA returns content for PUT request with form content.
|
Ensure request.DATA returns content for PUT request with form content.
|
||||||
"""
|
"""
|
||||||
data = {'qwerty': 'uiop'}
|
data = {'qwerty': 'uiop'}
|
||||||
|
|
||||||
from django import VERSION
|
|
||||||
|
|
||||||
if VERSION >= (1, 5):
|
|
||||||
from django.test.client import MULTIPART_CONTENT, BOUNDARY, encode_multipart
|
|
||||||
request = Request(factory.put('/', encode_multipart(BOUNDARY, data),
|
|
||||||
content_type=MULTIPART_CONTENT))
|
|
||||||
else:
|
|
||||||
request = Request(factory.put('/', data))
|
request = Request(factory.put('/', data))
|
||||||
|
|
||||||
request.parsers = (FormParser(), MultiPartParser())
|
request.parsers = (FormParser(), MultiPartParser())
|
||||||
self.assertEqual(list(request.DATA.items()), list(data.items()))
|
self.assertEqual(list(request.DATA.items()), list(data.items()))
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import RequestFactory
|
|
||||||
from rest_framework.compat import patterns, url
|
from rest_framework.compat import patterns, url
|
||||||
from rest_framework.reverse import reverse
|
from rest_framework.reverse import reverse
|
||||||
|
from rest_framework.test import APIRequestFactory
|
||||||
|
|
||||||
factory = RequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
|
||||||
|
|
||||||
def null_view(request):
|
def null_view(request):
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import RequestFactory
|
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from rest_framework import serializers, viewsets, permissions
|
from rest_framework import serializers, viewsets, permissions
|
||||||
from rest_framework.compat import include, patterns, url
|
from rest_framework.compat import include, patterns, url
|
||||||
from rest_framework.decorators import link, action
|
from rest_framework.decorators import link, action
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.routers import SimpleRouter, DefaultRouter
|
from rest_framework.routers import SimpleRouter, DefaultRouter
|
||||||
|
from rest_framework.test import APIRequestFactory
|
||||||
|
|
||||||
factory = RequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
|
||||||
urlpatterns = patterns('',)
|
urlpatterns = patterns('',)
|
||||||
|
|
||||||
|
@ -193,6 +193,7 @@ class TestActionKeywordArgs(TestCase):
|
||||||
{'permission_classes': [permissions.AllowAny]}
|
{'permission_classes': [permissions.AllowAny]}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestActionAppliedToExistingRoute(TestCase):
|
class TestActionAppliedToExistingRoute(TestCase):
|
||||||
"""
|
"""
|
||||||
Ensure `@action` decorator raises an except when applied
|
Ensure `@action` decorator raises an except when applied
|
||||||
|
|
|
@ -5,7 +5,7 @@ from __future__ import unicode_literals
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
from django.test.client import RequestFactory
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from rest_framework.throttling import UserRateThrottle, ScopedRateThrottle
|
from rest_framework.throttling import UserRateThrottle, ScopedRateThrottle
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
@ -41,7 +41,7 @@ class ThrottlingTests(TestCase):
|
||||||
Reset the cache so that no throttles will be active
|
Reset the cache so that no throttles will be active
|
||||||
"""
|
"""
|
||||||
cache.clear()
|
cache.clear()
|
||||||
self.factory = RequestFactory()
|
self.factory = APIRequestFactory()
|
||||||
|
|
||||||
def test_requests_are_throttled(self):
|
def test_requests_are_throttled(self):
|
||||||
"""
|
"""
|
||||||
|
@ -173,7 +173,7 @@ class ScopedRateThrottleTests(TestCase):
|
||||||
return Response('y')
|
return Response('y')
|
||||||
|
|
||||||
self.throttle_class = XYScopedRateThrottle
|
self.throttle_class = XYScopedRateThrottle
|
||||||
self.factory = RequestFactory()
|
self.factory = APIRequestFactory()
|
||||||
self.x_view = XView.as_view()
|
self.x_view = XView.as_view()
|
||||||
self.y_view = YView.as_view()
|
self.y_view = YView.as_view()
|
||||||
self.unscoped_view = UnscopedView.as_view()
|
self.unscoped_view = UnscopedView.as_view()
|
||||||
|
|
|
@ -2,7 +2,7 @@ from __future__ import unicode_literals
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
from django.core import urlresolvers
|
from django.core import urlresolvers
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import RequestFactory
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.compat import patterns, url, include
|
from rest_framework.compat import patterns, url, include
|
||||||
from rest_framework.urlpatterns import format_suffix_patterns
|
from rest_framework.urlpatterns import format_suffix_patterns
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ class FormatSuffixTests(TestCase):
|
||||||
Tests `format_suffix_patterns` against different URLPatterns to ensure the URLs still resolve properly, including any captured parameters.
|
Tests `format_suffix_patterns` against different URLPatterns to ensure the URLs still resolve properly, including any captured parameters.
|
||||||
"""
|
"""
|
||||||
def _resolve_urlpatterns(self, urlpatterns, test_paths):
|
def _resolve_urlpatterns(self, urlpatterns, test_paths):
|
||||||
factory = RequestFactory()
|
factory = APIRequestFactory()
|
||||||
try:
|
try:
|
||||||
urlpatterns = format_suffix_patterns(urlpatterns)
|
urlpatterns = format_suffix_patterns(urlpatterns)
|
||||||
except Exception:
|
except Exception:
|
||||||
|
|
|
@ -2,10 +2,9 @@ from __future__ import unicode_literals
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from rest_framework import generics, serializers, status
|
from rest_framework import generics, serializers, status
|
||||||
from rest_framework.tests.utils import RequestFactory
|
from rest_framework.test import APIRequestFactory
|
||||||
import json
|
|
||||||
|
|
||||||
factory = RequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
|
||||||
|
|
||||||
# Regression for #666
|
# Regression for #666
|
||||||
|
@ -33,8 +32,7 @@ class TestPreSaveValidationExclusions(TestCase):
|
||||||
validation on read only fields.
|
validation on read only fields.
|
||||||
"""
|
"""
|
||||||
obj = ValidationModel.objects.create(blank_validated_field='')
|
obj = ValidationModel.objects.create(blank_validated_field='')
|
||||||
request = factory.put('/', json.dumps({}),
|
request = factory.put('/', {}, format='json')
|
||||||
content_type='application/json')
|
|
||||||
view = UpdateValidationModel().as_view()
|
view = UpdateValidationModel().as_view()
|
||||||
response = view(request, pk=obj.pk).render()
|
response = view(request, pk=obj.pk).render()
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
|
|
@ -1,17 +1,15 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import copy
|
import copy
|
||||||
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import RequestFactory
|
|
||||||
|
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.decorators import api_view
|
from rest_framework.decorators import api_view
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.settings import api_settings
|
from rest_framework.settings import api_settings
|
||||||
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
|
|
||||||
factory = RequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
|
||||||
|
|
||||||
class BasicView(APIView):
|
class BasicView(APIView):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user