mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-11-04 09:57:55 +03:00 
			
		
		
		
	form overloading tests passing
This commit is contained in:
		
							parent
							
								
									e29a3f4cf1
								
							
						
					
					
						commit
						0fe8d1a15d
					
				| 
						 | 
				
			
			@ -63,7 +63,7 @@ class MediaType(object):
 | 
			
		|||
        """
 | 
			
		||||
        return self.media_type == 'application/x-www-form-urlencoded' or \
 | 
			
		||||
               self.media_type == 'multipart/form-data'
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    def as_tuple(self):
 | 
			
		||||
        return (self.main_type, self.sub_type, self.params)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
from djangorestframework.mediatypes import MediaType
 | 
			
		||||
from djangorestframework.utils import as_tuple
 | 
			
		||||
from djangorestframework.response import ResponseException
 | 
			
		||||
from djangorestframework.parsers import FormParser, MultipartParser
 | 
			
		||||
from djangorestframework import status
 | 
			
		||||
 | 
			
		||||
#from djangorestframework.requestparsing import parse, load_parser
 | 
			
		||||
| 
						 | 
				
			
			@ -151,11 +152,18 @@ class RequestMixin(object):
 | 
			
		|||
        if not self.USE_FORM_OVERLOADING or self.method != 'POST' or not self.content_type.is_form():
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        # Temporarily switch to using the form parsers, then parse the content
 | 
			
		||||
        parsers = self.parsers
 | 
			
		||||
        self.parsers = (FormParser, MultipartParser)
 | 
			
		||||
        content = self.RAW_CONTENT
 | 
			
		||||
        self.parsers = parsers
 | 
			
		||||
 | 
			
		||||
        # Method overloading - change the method and remove the param from the content
 | 
			
		||||
        if self.METHOD_PARAM in content:
 | 
			
		||||
            self.method = content[self.METHOD_PARAM].upper()
 | 
			
		||||
            del self._raw_content[self.METHOD_PARAM]
 | 
			
		||||
 | 
			
		||||
        # Content overloading - rewind the stream and modify the content type
 | 
			
		||||
        if self.CONTENT_PARAM in content and self.CONTENTTYPE_PARAM in content:
 | 
			
		||||
            self._content_type = MediaType(content[self.CONTENTTYPE_PARAM])
 | 
			
		||||
            self._stream = StringIO(content[self.CONTENT_PARAM])
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,25 +67,25 @@ class TestContentMixins(TestCase):
 | 
			
		|||
        self.assertEqual(view.RAW_CONTENT, content)
 | 
			
		||||
 | 
			
		||||
    def test_standard_behaviour_determines_no_content_GET(self):
 | 
			
		||||
        """Ensure request.RAW_CONTENT returns None for GET request with no content."""
 | 
			
		||||
        """Ensure view.RAW_CONTENT returns None for GET request with no content."""
 | 
			
		||||
        self.ensure_determines_no_content_GET(RequestMixin())
 | 
			
		||||
 | 
			
		||||
    def test_standard_behaviour_determines_form_content_POST(self):
 | 
			
		||||
        """Ensure request.RAW_CONTENT returns content for POST request with form content."""
 | 
			
		||||
        """Ensure view.RAW_CONTENT returns content for POST request with form content."""
 | 
			
		||||
        self.ensure_determines_form_content_POST(RequestMixin())
 | 
			
		||||
 | 
			
		||||
    def test_standard_behaviour_determines_non_form_content_POST(self):
 | 
			
		||||
        """Ensure StandardContentMixin.determine_content(request) returns (content type, content) for POST request with content."""
 | 
			
		||||
        """Ensure view.RAW_CONTENT returns content for POST request with non-form content."""
 | 
			
		||||
        self.ensure_determines_non_form_content_POST(RequestMixin())
 | 
			
		||||
 | 
			
		||||
    def test_standard_behaviour_determines_form_content_PUT(self):
 | 
			
		||||
        """Ensure StandardContentMixin.determine_content(request) returns content for PUT request with content."""
 | 
			
		||||
        """Ensure view.RAW_CONTENT returns content for PUT request with form content."""
 | 
			
		||||
        self.ensure_determines_form_content_PUT(RequestMixin())
 | 
			
		||||
 | 
			
		||||
#    def test_standard_behaviour_determines_non_form_content_PUT(self):
 | 
			
		||||
#        """Ensure StandardContentMixin.determine_content(request) returns (content type, content) for PUT request with content."""
 | 
			
		||||
#        self.ensure_determines_non_form_content_PUT(StandardContentMixin())
 | 
			
		||||
#
 | 
			
		||||
    def test_standard_behaviour_determines_non_form_content_PUT(self):
 | 
			
		||||
        """Ensure view.RAW_CONTENT returns content for PUT request with non-form content."""
 | 
			
		||||
        self.ensure_determines_non_form_content_PUT(RequestMixin())
 | 
			
		||||
 | 
			
		||||
#    # OverloadedContentMixin behavioural tests
 | 
			
		||||
#
 | 
			
		||||
#    def test_overloaded_behaviour_determines_no_content_GET(self):
 | 
			
		||||
| 
						 | 
				
			
			@ -108,16 +108,18 @@ class TestContentMixins(TestCase):
 | 
			
		|||
#        """Ensure StandardContentMixin.determine_content(request) returns (content type, content) for PUT request with content."""
 | 
			
		||||
#        self.ensure_determines_non_form_content_PUT(OverloadedContentMixin())
 | 
			
		||||
#
 | 
			
		||||
#    def test_overloaded_behaviour_allows_content_tunnelling(self):
 | 
			
		||||
#        """Ensure determine_content(request) returns (content type, content) for overloaded POST request"""
 | 
			
		||||
#        content = 'qwerty'
 | 
			
		||||
#        content_type = 'text/plain'
 | 
			
		||||
#        form_data = {OverloadedContentMixin.CONTENT_PARAM: content,
 | 
			
		||||
#                     OverloadedContentMixin.CONTENTTYPE_PARAM: content_type}
 | 
			
		||||
#        request = self.req.post('/', form_data)
 | 
			
		||||
#        self.assertEqual(OverloadedContentMixin().determine_content(request), (content_type, content))
 | 
			
		||||
#        self.assertEqual(request.META['CONTENT_TYPE'], content_type)
 | 
			
		||||
# 
 | 
			
		||||
    def test_overloaded_behaviour_allows_content_tunnelling(self):
 | 
			
		||||
        """Ensure request.RAW_CONTENT returns content for overloaded POST request"""
 | 
			
		||||
        content = 'qwerty'
 | 
			
		||||
        content_type = 'text/plain'
 | 
			
		||||
        view = RequestMixin()
 | 
			
		||||
        form_data = {view.CONTENT_PARAM: content,
 | 
			
		||||
                     view.CONTENTTYPE_PARAM: content_type}
 | 
			
		||||
        view.request = self.req.post('/', form_data)
 | 
			
		||||
        view.parsers = (PlainTextParser,)
 | 
			
		||||
        view.perform_form_overloading()
 | 
			
		||||
        self.assertEqual(view.RAW_CONTENT, content)
 | 
			
		||||
 | 
			
		||||
#    def test_overloaded_behaviour_allows_content_tunnelling_content_type_not_set(self):
 | 
			
		||||
#        """Ensure determine_content(request) returns (None, content) for overloaded POST request with content type not set"""
 | 
			
		||||
#        content = 'qwerty'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user