#11371: Unable to put non-MULTIPART_CONTENT data in method
django.test.Client.put()
-------------------------------+--------------------------------------------
Reporter: vorushin | Owner: nobody
Status: new | Milestone:
Component: Testing framework | Version: SVN
Keywords: | Stage: Unreviewed
Has_patch: 0 |
-------------------------------+--------------------------------------------
I started to write tests for my RESTful web service, written in Django.
I use django.test.Client for making HTTP requests.
GET and POST methods works all right, but I didn't find any options to
send non-MULTIPART_CONTENT data in PUT request.
My code is:
{{{
from django.test import TestCase
from django.utils.http import urlencode
class UsersTest(TestCase):
def test_registration_and_management(self):
response = self.client.put('/users/1234567/',
urlencode({'password': '', 'wrong_attempts': 100},
doseq=True),
content_type='application/x-www-form-urlencoded')
self.failUnlessEqual(response.status_code, 200)
self.assertContains(response, 'raw_password')
}}}
When I launch tests (via python manage.py test), I receive error:
{{{
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/
python2.6/site-packages/django/test/client.py", line 370, in put
'QUERY_STRING': urlencode(data, doseq=True) or parsed[4],
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/
python2.6/site-packages/django/utils/http.py", line 42, in urlencode
for k, v in query],
ValueError: need more than 1 value to unpack
}}}
Problems seems to be in Client.put method, file django.test.client.py:
{{{
def put(self, path, data={}, content_type=MULTIPART_CONTENT,
follow=False, **extra):
"""
Send a resource to the server using PUT.
"""
if content_type is MULTIPART_CONTENT:
post_data = encode_multipart(BOUNDARY, data)
else:
post_data = data
parsed = urlparse(path)
r = {
'CONTENT_LENGTH': len(post_data),
'CONTENT_TYPE': content_type,
'PATH_INFO': urllib.unquote(parsed[2]),
'QUERY_STRING': urlencode(data, doseq=True) or parsed[4],
'REQUEST_METHOD': 'PUT',
'wsgi.input': FakePayload(post_data),
}
r.update(extra)
response = self.request(**r)
if follow:
response = self._handle_redirects(response)
return response
}}}
If I change line
{{{
'QUERY_STRING': urlencode(data, doseq=True) or parsed[4],
}}}
to
{{{
'QUERY_STRING': parsed[4],
}}}
everythings works all right in my case. Client.post() method uses the same
technology (no urlencode, only parsed[4]).
--
Ticket URL: <http://code.djangoproject.com/ticket/11371>
Django <http://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---