D2818: tests: add test coverage for parsing WSGI requests

2018-03-12 Thread indygreg (Gregory Szorc)
This revision was automatically updated to reflect the committed changes.
Closed by commit rHGb2a3308d6a21: tests: add test coverage for parsing WSGI 
requests (authored by indygreg, committed by ).

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D2818?vs=6884&id=6948

REVISION DETAIL
  https://phab.mercurial-scm.org/D2818

AFFECTED FILES
  mercurial/hgweb/request.py
  tests/test-wsgirequest.py

CHANGE DETAILS

diff --git a/tests/test-wsgirequest.py b/tests/test-wsgirequest.py
new file mode 100644
--- /dev/null
+++ b/tests/test-wsgirequest.py
@@ -0,0 +1,255 @@
+from __future__ import absolute_import, print_function
+
+import unittest
+
+from mercurial.hgweb import (
+request as requestmod,
+)
+
+DEFAULT_ENV = {
+r'REQUEST_METHOD': r'GET',
+r'SERVER_NAME': r'testserver',
+r'SERVER_PORT': r'80',
+r'SERVER_PROTOCOL': r'http',
+r'wsgi.version': (1, 0),
+r'wsgi.url_scheme': r'http',
+r'wsgi.input': None,
+r'wsgi.errors': None,
+r'wsgi.multithread': False,
+r'wsgi.multiprocess': True,
+r'wsgi.run_once': False,
+}
+
+def parse(env, bodyfh=None, extra=None):
+env = dict(env)
+env.update(extra or {})
+
+return requestmod.parserequestfromenv(env, bodyfh)
+
+class ParseRequestTests(unittest.TestCase):
+def testdefault(self):
+r = parse(DEFAULT_ENV)
+self.assertEqual(r.url, b'http://testserver')
+self.assertEqual(r.baseurl, b'http://testserver')
+self.assertEqual(r.advertisedurl, b'http://testserver')
+self.assertEqual(r.advertisedbaseurl, b'http://testserver')
+self.assertEqual(r.urlscheme, b'http')
+self.assertEqual(r.method, b'GET')
+self.assertIsNone(r.remoteuser)
+self.assertIsNone(r.remotehost)
+self.assertEqual(r.apppath, b'')
+self.assertEqual(r.dispatchparts, [])
+self.assertEqual(r.dispatchpath, b'')
+self.assertFalse(r.havepathinfo)
+self.assertIsNone(r.reponame)
+self.assertEqual(r.querystring, b'')
+self.assertEqual(len(r.qsparams), 0)
+self.assertEqual(len(r.headers), 0)
+
+def testcustomport(self):
+r = parse(DEFAULT_ENV, extra={
+r'SERVER_PORT': r'8000',
+})
+
+self.assertEqual(r.url, b'http://testserver:8000')
+self.assertEqual(r.baseurl, b'http://testserver:8000')
+self.assertEqual(r.advertisedurl, b'http://testserver:8000')
+self.assertEqual(r.advertisedbaseurl, b'http://testserver:8000')
+
+r = parse(DEFAULT_ENV, extra={
+r'SERVER_PORT': r'4000',
+r'wsgi.url_scheme': r'https',
+})
+
+self.assertEqual(r.url, b'https://testserver:4000')
+self.assertEqual(r.baseurl, b'https://testserver:4000')
+self.assertEqual(r.advertisedurl, b'https://testserver:4000')
+self.assertEqual(r.advertisedbaseurl, b'https://testserver:4000')
+
+def testhttphost(self):
+r = parse(DEFAULT_ENV, extra={
+r'HTTP_HOST': r'altserver',
+})
+
+self.assertEqual(r.url, b'http://altserver')
+self.assertEqual(r.baseurl, b'http://altserver')
+self.assertEqual(r.advertisedurl, b'http://testserver')
+self.assertEqual(r.advertisedbaseurl, b'http://testserver')
+
+def testscriptname(self):
+r = parse(DEFAULT_ENV, extra={
+r'SCRIPT_NAME': r'',
+})
+
+self.assertEqual(r.url, b'http://testserver')
+self.assertEqual(r.baseurl, b'http://testserver')
+self.assertEqual(r.advertisedurl, b'http://testserver')
+self.assertEqual(r.advertisedbaseurl, b'http://testserver')
+self.assertEqual(r.apppath, b'')
+self.assertEqual(r.dispatchparts, [])
+self.assertEqual(r.dispatchpath, b'')
+self.assertFalse(r.havepathinfo)
+
+r = parse(DEFAULT_ENV, extra={
+r'SCRIPT_NAME': r'/script',
+})
+
+self.assertEqual(r.url, b'http://testserver/script')
+self.assertEqual(r.baseurl, b'http://testserver')
+self.assertEqual(r.advertisedurl, b'http://testserver/script')
+self.assertEqual(r.advertisedbaseurl, b'http://testserver')
+self.assertEqual(r.apppath, b'/script')
+self.assertEqual(r.dispatchparts, [])
+self.assertEqual(r.dispatchpath, b'')
+self.assertFalse(r.havepathinfo)
+
+r = parse(DEFAULT_ENV, extra={
+r'SCRIPT_NAME': r'/multiple words',
+})
+
+self.assertEqual(r.url, b'http://testserver/multiple%20words')
+self.assertEqual(r.baseurl, b'http://testserver')
+self.assertEqual(r.advertisedurl, 
b'http://testserver/multiple%20words')
+self.assertEqual(r.advertisedbaseurl, b'http://testserver')
+self.assertEqual(r.apppath, b'/multiple words')
+self.assertEqual(r.dispatchparts, [])
+self.assertEqual(r.dispatchpath, b'')
+self.assertFalse(r.havepathinfo)
+
+

D2818: tests: add test coverage for parsing WSGI requests

2018-03-12 Thread indygreg (Gregory Szorc)
indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  A subsequent commit will need to make this code more complicated
  in order to support alternate base URLs. Let's establish some test
  coverage before we diverge too far from PEP .
  
  As part of this, a minor bug related to a missing SCRIPT_NAME
  key has been squashed.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D2818

AFFECTED FILES
  mercurial/hgweb/request.py
  tests/test-wsgirequest.py

CHANGE DETAILS

diff --git a/tests/test-wsgirequest.py b/tests/test-wsgirequest.py
new file mode 100644
--- /dev/null
+++ b/tests/test-wsgirequest.py
@@ -0,0 +1,255 @@
+from __future__ import absolute_import, print_function
+
+import unittest
+
+from mercurial.hgweb import (
+request as requestmod,
+)
+
+DEFAULT_ENV = {
+r'REQUEST_METHOD': r'GET',
+r'SERVER_NAME': r'testserver',
+r'SERVER_PORT': r'80',
+r'SERVER_PROTOCOL': r'http',
+r'wsgi.version': (1, 0),
+r'wsgi.url_scheme': r'http',
+r'wsgi.input': None,
+r'wsgi.errors': None,
+r'wsgi.multithread': False,
+r'wsgi.multiprocess': True,
+r'wsgi.run_once': False,
+}
+
+def parse(env, bodyfh=None, extra=None):
+env = dict(env)
+env.update(extra or {})
+
+return requestmod.parserequestfromenv(env, bodyfh)
+
+class ParseRequestTests(unittest.TestCase):
+def testdefault(self):
+r = parse(DEFAULT_ENV)
+self.assertEqual(r.url, b'http://testserver')
+self.assertEqual(r.baseurl, b'http://testserver')
+self.assertEqual(r.advertisedurl, b'http://testserver')
+self.assertEqual(r.advertisedbaseurl, b'http://testserver')
+self.assertEqual(r.urlscheme, b'http')
+self.assertEqual(r.method, b'GET')
+self.assertIsNone(r.remoteuser)
+self.assertIsNone(r.remotehost)
+self.assertEqual(r.apppath, b'')
+self.assertEqual(r.dispatchparts, [])
+self.assertEqual(r.dispatchpath, b'')
+self.assertFalse(r.havepathinfo)
+self.assertIsNone(r.reponame)
+self.assertEqual(r.querystring, b'')
+self.assertEqual(len(r.qsparams), 0)
+self.assertEqual(len(r.headers), 0)
+
+def testcustomport(self):
+r = parse(DEFAULT_ENV, extra={
+r'SERVER_PORT': r'8000',
+})
+
+self.assertEqual(r.url, b'http://testserver:8000')
+self.assertEqual(r.baseurl, b'http://testserver:8000')
+self.assertEqual(r.advertisedurl, b'http://testserver:8000')
+self.assertEqual(r.advertisedbaseurl, b'http://testserver:8000')
+
+r = parse(DEFAULT_ENV, extra={
+r'SERVER_PORT': r'4000',
+r'wsgi.url_scheme': r'https',
+})
+
+self.assertEqual(r.url, b'https://testserver:4000')
+self.assertEqual(r.baseurl, b'https://testserver:4000')
+self.assertEqual(r.advertisedurl, b'https://testserver:4000')
+self.assertEqual(r.advertisedbaseurl, b'https://testserver:4000')
+
+def testhttphost(self):
+r = parse(DEFAULT_ENV, extra={
+r'HTTP_HOST': r'altserver',
+})
+
+self.assertEqual(r.url, b'http://altserver')
+self.assertEqual(r.baseurl, b'http://altserver')
+self.assertEqual(r.advertisedurl, b'http://testserver')
+self.assertEqual(r.advertisedbaseurl, b'http://testserver')
+
+def testscriptname(self):
+r = parse(DEFAULT_ENV, extra={
+r'SCRIPT_NAME': r'',
+})
+
+self.assertEqual(r.url, b'http://testserver')
+self.assertEqual(r.baseurl, b'http://testserver')
+self.assertEqual(r.advertisedurl, b'http://testserver')
+self.assertEqual(r.advertisedbaseurl, b'http://testserver')
+self.assertEqual(r.apppath, b'')
+self.assertEqual(r.dispatchparts, [])
+self.assertEqual(r.dispatchpath, b'')
+self.assertFalse(r.havepathinfo)
+
+r = parse(DEFAULT_ENV, extra={
+r'SCRIPT_NAME': r'/script',
+})
+
+self.assertEqual(r.url, b'http://testserver/script')
+self.assertEqual(r.baseurl, b'http://testserver')
+self.assertEqual(r.advertisedurl, b'http://testserver/script')
+self.assertEqual(r.advertisedbaseurl, b'http://testserver')
+self.assertEqual(r.apppath, b'/script')
+self.assertEqual(r.dispatchparts, [])
+self.assertEqual(r.dispatchpath, b'')
+self.assertFalse(r.havepathinfo)
+
+r = parse(DEFAULT_ENV, extra={
+r'SCRIPT_NAME': r'/multiple words',
+})
+
+self.assertEqual(r.url, b'http://testserver/multiple%20words')
+self.assertEqual(r.baseurl, b'http://testserver')
+self.assertEqual(r.advertisedurl, 
b'http://testserver/multiple%20words')
+self.assertEqual(r.advertisedbaseurl, b'http://testserver')
+self.assertEqual(r.apppath, b'/multiple words')
+se