#28235: LiveServerTestCase crashes because it got a ParseResultBytes instance
---------------------------------------------+------------------------
               Reporter:  Curtis Maloney     |          Owner:  nobody
                   Type:  Bug                |         Status:  new
              Component:  Testing framework  |        Version:  1.11
               Severity:  Normal             |       Keywords:
           Triage Stage:  Unreviewed         |      Has patch:  1
    Needs documentation:  0                  |    Needs tests:  0
Patch needs improvement:  0                  |  Easy pickings:  0
                  UI/UX:  0                  |
---------------------------------------------+------------------------
 I'm not sure why urllib.parse.urlparse is returning a Bytes result in this
 case, but the result is the following error:

 {{{
 Traceback (most recent call last):
   File "/opt/python/3.3.5/lib/python3.3/wsgiref/handlers.py", line 137, in
 run
     self.result = application(self.environ, self.start_response)
   File "/home/travis/virtualenv/python3.3.5/lib/python3.3/site-
 packages/django/test/testcases.py", line 1106, in __call__
     if not self._should_handle(get_path_info(environ)):
   File "/home/travis/virtualenv/python3.3.5/lib/python3.3/site-
 packages/django/test/testcases.py", line 1077, in _should_handle
     return path.startswith(self.base_url[2]) and not self.base_url[1]
 TypeError: startswith first arg must be str or a tuple of str, not bytes
 }}}

 It's caused by a simple test case:

 {{{
 class RPCClientTest(LiveServerTestCase):

     def setUp(self):
         self.rpc = client.RPCClient(self.live_server_url + '/rpc/')

     def test_echo(self):
         resp = self.rpc.echo(foo='bar')
         self.assertEqual(resp, {'foo': 'bar'})
 }}}

 Where RPCClient uses a requests Session to post to the url.

 I've kludged the following patch to make it work:

 {{{
 diff -urw django/test/testcases.py /home/curtis/src/git/django-
 nap/venv/lib/python3.5/site-packages/django/test/testcases.py
 --- django/test/testcases.py    2017-05-24 12:08:14.870948448 +1000
 +++ /home/curtis/src/git/django-nap/venv/lib/python3.5/site-
 packages/django/test/testcases.py   2017-05-24 11:07:53.967738745 +1000
 @@ -41,6 +41,11 @@
  from django.utils.six.moves.urllib.parse import (
      unquote, urljoin, urlparse, urlsplit, urlunsplit,
  )
 +try:
 +    from urllib.parse import ParseResultBytes
 +except ImportError:
 +    class ParseResultBytes:
 +        pass
  from django.utils.six.moves.urllib.request import url2pathname
  from django.views.static import serve

 @@ -1183,6 +1188,8 @@
      def __init__(self, application):
          self.application = application
          self.base_url = urlparse(self.get_base_url())
 +        if isinstance(self.base_url, ParseResultBytes):
 +            self.base_url = self.base_url.decode('utf-8')
          super(FSFilesHandler, self).__init__()

      def _should_handle(self, path):
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/28235>
Django <https://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 unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/051.d194c422798235b99ad4f8f37fb5629d%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to