|
18 | 18 |
|
19 | 19 | from rest_framework import status
|
20 | 20 | from rest_framework.authentication import SessionAuthentication
|
| 21 | +from rest_framework.exceptions import ParseError |
21 | 22 | from rest_framework.parsers import BaseParser, FormParser, MultiPartParser
|
22 | 23 | from rest_framework.request import Request, WrappedAttributeError
|
23 | 24 | from rest_framework.response import Response
|
@@ -52,6 +53,13 @@ def parse(self, stream, media_type=None, parser_context=None):
|
52 | 53 | return stream.read()
|
53 | 54 |
|
54 | 55 |
|
| 56 | +class BrokenParser(BaseParser): |
| 57 | + media_type = 'text/plain' |
| 58 | + |
| 59 | + def parse(self, stream, media_type=None, parser_context=None): |
| 60 | + raise AttributeError |
| 61 | + |
| 62 | + |
55 | 63 | class TestContentParsing(TestCase):
|
56 | 64 | def test_standard_behaviour_determines_no_content_GET(self):
|
57 | 65 | """
|
@@ -126,6 +134,17 @@ def test_standard_behaviour_determines_non_form_content_PUT(self):
|
126 | 134 | request.parsers = (PlainTextParser(), )
|
127 | 135 | assert request.data == content
|
128 | 136 |
|
| 137 | + def test_request_data_with_broken_parser(self): |
| 138 | + """ |
| 139 | + Ensure request.data raise ParseError if anything went wrong during parsing |
| 140 | + """ |
| 141 | + content = b'qwerty' |
| 142 | + content_type = 'text/plain' |
| 143 | + request = Request(factory.post('/', content, content_type=content_type)) |
| 144 | + request.parsers = (BrokenParser(), ) |
| 145 | + with self.assertRaises(ParseError): |
| 146 | + request.data |
| 147 | + |
129 | 148 |
|
130 | 149 | class MockView(APIView):
|
131 | 150 | authentication_classes = (SessionAuthentication,)
|
|
0 commit comments