Mercurial > hg
comparison tests/test-wsgirequest.py @ 36896:b2a3308d6a21
tests: add test coverage for parsing WSGI requests
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 3333.
As part of this, a minor bug related to a missing SCRIPT_NAME
key has been squashed.
Differential Revision: https://phab.mercurial-scm.org/D2818
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sun, 11 Mar 2018 12:53:47 -0700 |
parents | |
children | d7fd203e36cc |
comparison
equal
deleted
inserted
replaced
36895:a5c478843c82 | 36896:b2a3308d6a21 |
---|---|
1 from __future__ import absolute_import, print_function | |
2 | |
3 import unittest | |
4 | |
5 from mercurial.hgweb import ( | |
6 request as requestmod, | |
7 ) | |
8 | |
9 DEFAULT_ENV = { | |
10 r'REQUEST_METHOD': r'GET', | |
11 r'SERVER_NAME': r'testserver', | |
12 r'SERVER_PORT': r'80', | |
13 r'SERVER_PROTOCOL': r'http', | |
14 r'wsgi.version': (1, 0), | |
15 r'wsgi.url_scheme': r'http', | |
16 r'wsgi.input': None, | |
17 r'wsgi.errors': None, | |
18 r'wsgi.multithread': False, | |
19 r'wsgi.multiprocess': True, | |
20 r'wsgi.run_once': False, | |
21 } | |
22 | |
23 def parse(env, bodyfh=None, extra=None): | |
24 env = dict(env) | |
25 env.update(extra or {}) | |
26 | |
27 return requestmod.parserequestfromenv(env, bodyfh) | |
28 | |
29 class ParseRequestTests(unittest.TestCase): | |
30 def testdefault(self): | |
31 r = parse(DEFAULT_ENV) | |
32 self.assertEqual(r.url, b'http://testserver') | |
33 self.assertEqual(r.baseurl, b'http://testserver') | |
34 self.assertEqual(r.advertisedurl, b'http://testserver') | |
35 self.assertEqual(r.advertisedbaseurl, b'http://testserver') | |
36 self.assertEqual(r.urlscheme, b'http') | |
37 self.assertEqual(r.method, b'GET') | |
38 self.assertIsNone(r.remoteuser) | |
39 self.assertIsNone(r.remotehost) | |
40 self.assertEqual(r.apppath, b'') | |
41 self.assertEqual(r.dispatchparts, []) | |
42 self.assertEqual(r.dispatchpath, b'') | |
43 self.assertFalse(r.havepathinfo) | |
44 self.assertIsNone(r.reponame) | |
45 self.assertEqual(r.querystring, b'') | |
46 self.assertEqual(len(r.qsparams), 0) | |
47 self.assertEqual(len(r.headers), 0) | |
48 | |
49 def testcustomport(self): | |
50 r = parse(DEFAULT_ENV, extra={ | |
51 r'SERVER_PORT': r'8000', | |
52 }) | |
53 | |
54 self.assertEqual(r.url, b'http://testserver:8000') | |
55 self.assertEqual(r.baseurl, b'http://testserver:8000') | |
56 self.assertEqual(r.advertisedurl, b'http://testserver:8000') | |
57 self.assertEqual(r.advertisedbaseurl, b'http://testserver:8000') | |
58 | |
59 r = parse(DEFAULT_ENV, extra={ | |
60 r'SERVER_PORT': r'4000', | |
61 r'wsgi.url_scheme': r'https', | |
62 }) | |
63 | |
64 self.assertEqual(r.url, b'https://testserver:4000') | |
65 self.assertEqual(r.baseurl, b'https://testserver:4000') | |
66 self.assertEqual(r.advertisedurl, b'https://testserver:4000') | |
67 self.assertEqual(r.advertisedbaseurl, b'https://testserver:4000') | |
68 | |
69 def testhttphost(self): | |
70 r = parse(DEFAULT_ENV, extra={ | |
71 r'HTTP_HOST': r'altserver', | |
72 }) | |
73 | |
74 self.assertEqual(r.url, b'http://altserver') | |
75 self.assertEqual(r.baseurl, b'http://altserver') | |
76 self.assertEqual(r.advertisedurl, b'http://testserver') | |
77 self.assertEqual(r.advertisedbaseurl, b'http://testserver') | |
78 | |
79 def testscriptname(self): | |
80 r = parse(DEFAULT_ENV, extra={ | |
81 r'SCRIPT_NAME': r'', | |
82 }) | |
83 | |
84 self.assertEqual(r.url, b'http://testserver') | |
85 self.assertEqual(r.baseurl, b'http://testserver') | |
86 self.assertEqual(r.advertisedurl, b'http://testserver') | |
87 self.assertEqual(r.advertisedbaseurl, b'http://testserver') | |
88 self.assertEqual(r.apppath, b'') | |
89 self.assertEqual(r.dispatchparts, []) | |
90 self.assertEqual(r.dispatchpath, b'') | |
91 self.assertFalse(r.havepathinfo) | |
92 | |
93 r = parse(DEFAULT_ENV, extra={ | |
94 r'SCRIPT_NAME': r'/script', | |
95 }) | |
96 | |
97 self.assertEqual(r.url, b'http://testserver/script') | |
98 self.assertEqual(r.baseurl, b'http://testserver') | |
99 self.assertEqual(r.advertisedurl, b'http://testserver/script') | |
100 self.assertEqual(r.advertisedbaseurl, b'http://testserver') | |
101 self.assertEqual(r.apppath, b'/script') | |
102 self.assertEqual(r.dispatchparts, []) | |
103 self.assertEqual(r.dispatchpath, b'') | |
104 self.assertFalse(r.havepathinfo) | |
105 | |
106 r = parse(DEFAULT_ENV, extra={ | |
107 r'SCRIPT_NAME': r'/multiple words', | |
108 }) | |
109 | |
110 self.assertEqual(r.url, b'http://testserver/multiple%20words') | |
111 self.assertEqual(r.baseurl, b'http://testserver') | |
112 self.assertEqual(r.advertisedurl, b'http://testserver/multiple%20words') | |
113 self.assertEqual(r.advertisedbaseurl, b'http://testserver') | |
114 self.assertEqual(r.apppath, b'/multiple words') | |
115 self.assertEqual(r.dispatchparts, []) | |
116 self.assertEqual(r.dispatchpath, b'') | |
117 self.assertFalse(r.havepathinfo) | |
118 | |
119 def testpathinfo(self): | |
120 r = parse(DEFAULT_ENV, extra={ | |
121 r'PATH_INFO': r'', | |
122 }) | |
123 | |
124 self.assertEqual(r.url, b'http://testserver') | |
125 self.assertEqual(r.baseurl, b'http://testserver') | |
126 self.assertEqual(r.advertisedurl, b'http://testserver') | |
127 self.assertEqual(r.advertisedbaseurl, b'http://testserver') | |
128 self.assertEqual(r.apppath, b'') | |
129 self.assertEqual(r.dispatchparts, []) | |
130 self.assertEqual(r.dispatchpath, b'') | |
131 self.assertTrue(r.havepathinfo) | |
132 | |
133 r = parse(DEFAULT_ENV, extra={ | |
134 r'PATH_INFO': r'/pathinfo', | |
135 }) | |
136 | |
137 self.assertEqual(r.url, b'http://testserver/pathinfo') | |
138 self.assertEqual(r.baseurl, b'http://testserver') | |
139 self.assertEqual(r.advertisedurl, b'http://testserver/pathinfo') | |
140 self.assertEqual(r.advertisedbaseurl, b'http://testserver') | |
141 self.assertEqual(r.apppath, b'') | |
142 self.assertEqual(r.dispatchparts, [b'pathinfo']) | |
143 self.assertEqual(r.dispatchpath, b'pathinfo') | |
144 self.assertTrue(r.havepathinfo) | |
145 | |
146 r = parse(DEFAULT_ENV, extra={ | |
147 r'PATH_INFO': r'/one/two/', | |
148 }) | |
149 | |
150 self.assertEqual(r.url, b'http://testserver/one/two/') | |
151 self.assertEqual(r.baseurl, b'http://testserver') | |
152 self.assertEqual(r.advertisedurl, b'http://testserver/one/two/') | |
153 self.assertEqual(r.advertisedbaseurl, b'http://testserver') | |
154 self.assertEqual(r.apppath, b'') | |
155 self.assertEqual(r.dispatchparts, [b'one', b'two']) | |
156 self.assertEqual(r.dispatchpath, b'one/two') | |
157 self.assertTrue(r.havepathinfo) | |
158 | |
159 def testscriptandpathinfo(self): | |
160 r = parse(DEFAULT_ENV, extra={ | |
161 r'SCRIPT_NAME': r'/script', | |
162 r'PATH_INFO': r'/pathinfo', | |
163 }) | |
164 | |
165 self.assertEqual(r.url, b'http://testserver/script/pathinfo') | |
166 self.assertEqual(r.baseurl, b'http://testserver') | |
167 self.assertEqual(r.advertisedurl, b'http://testserver/script/pathinfo') | |
168 self.assertEqual(r.advertisedbaseurl, b'http://testserver') | |
169 self.assertEqual(r.apppath, b'/script') | |
170 self.assertEqual(r.dispatchparts, [b'pathinfo']) | |
171 self.assertEqual(r.dispatchpath, b'pathinfo') | |
172 self.assertTrue(r.havepathinfo) | |
173 | |
174 r = parse(DEFAULT_ENV, extra={ | |
175 r'SCRIPT_NAME': r'/script1/script2', | |
176 r'PATH_INFO': r'/path1/path2', | |
177 }) | |
178 | |
179 self.assertEqual(r.url, | |
180 b'http://testserver/script1/script2/path1/path2') | |
181 self.assertEqual(r.baseurl, b'http://testserver') | |
182 self.assertEqual(r.advertisedurl, | |
183 b'http://testserver/script1/script2/path1/path2') | |
184 self.assertEqual(r.advertisedbaseurl, b'http://testserver') | |
185 self.assertEqual(r.apppath, b'/script1/script2') | |
186 self.assertEqual(r.dispatchparts, [b'path1', b'path2']) | |
187 self.assertEqual(r.dispatchpath, b'path1/path2') | |
188 self.assertTrue(r.havepathinfo) | |
189 | |
190 r = parse(DEFAULT_ENV, extra={ | |
191 r'HTTP_HOST': r'hostserver', | |
192 r'SCRIPT_NAME': r'/script', | |
193 r'PATH_INFO': r'/pathinfo', | |
194 }) | |
195 | |
196 self.assertEqual(r.url, b'http://hostserver/script/pathinfo') | |
197 self.assertEqual(r.baseurl, b'http://hostserver') | |
198 self.assertEqual(r.advertisedurl, b'http://testserver/script/pathinfo') | |
199 self.assertEqual(r.advertisedbaseurl, b'http://testserver') | |
200 self.assertEqual(r.apppath, b'/script') | |
201 self.assertEqual(r.dispatchparts, [b'pathinfo']) | |
202 self.assertEqual(r.dispatchpath, b'pathinfo') | |
203 self.assertTrue(r.havepathinfo) | |
204 | |
205 def testreponame(self): | |
206 """REPO_NAME path components get stripped from URL.""" | |
207 r = parse(DEFAULT_ENV, extra={ | |
208 r'REPO_NAME': r'repo', | |
209 r'PATH_INFO': r'/path1/path2' | |
210 }) | |
211 | |
212 self.assertEqual(r.url, b'http://testserver/path1/path2') | |
213 self.assertEqual(r.baseurl, b'http://testserver') | |
214 self.assertEqual(r.advertisedurl, b'http://testserver/path1/path2') | |
215 self.assertEqual(r.advertisedbaseurl, b'http://testserver') | |
216 self.assertEqual(r.apppath, b'/repo') | |
217 self.assertEqual(r.dispatchparts, [b'path1', b'path2']) | |
218 self.assertEqual(r.dispatchpath, b'path1/path2') | |
219 self.assertTrue(r.havepathinfo) | |
220 self.assertEqual(r.reponame, b'repo') | |
221 | |
222 r = parse(DEFAULT_ENV, extra={ | |
223 r'REPO_NAME': r'repo', | |
224 r'PATH_INFO': r'/repo/path1/path2', | |
225 }) | |
226 | |
227 self.assertEqual(r.url, b'http://testserver/repo/path1/path2') | |
228 self.assertEqual(r.baseurl, b'http://testserver') | |
229 self.assertEqual(r.advertisedurl, b'http://testserver/repo/path1/path2') | |
230 self.assertEqual(r.advertisedbaseurl, b'http://testserver') | |
231 self.assertEqual(r.apppath, b'/repo') | |
232 self.assertEqual(r.dispatchparts, [b'path1', b'path2']) | |
233 self.assertEqual(r.dispatchpath, b'path1/path2') | |
234 self.assertTrue(r.havepathinfo) | |
235 self.assertEqual(r.reponame, b'repo') | |
236 | |
237 r = parse(DEFAULT_ENV, extra={ | |
238 r'REPO_NAME': r'prefix/repo', | |
239 r'PATH_INFO': r'/prefix/repo/path1/path2', | |
240 }) | |
241 | |
242 self.assertEqual(r.url, b'http://testserver/prefix/repo/path1/path2') | |
243 self.assertEqual(r.baseurl, b'http://testserver') | |
244 self.assertEqual(r.advertisedurl, | |
245 b'http://testserver/prefix/repo/path1/path2') | |
246 self.assertEqual(r.advertisedbaseurl, b'http://testserver') | |
247 self.assertEqual(r.apppath, b'/prefix/repo') | |
248 self.assertEqual(r.dispatchparts, [b'path1', b'path2']) | |
249 self.assertEqual(r.dispatchpath, b'path1/path2') | |
250 self.assertTrue(r.havepathinfo) | |
251 self.assertEqual(r.reponame, b'prefix/repo') | |
252 | |
253 if __name__ == '__main__': | |
254 import silenttestrunner | |
255 silenttestrunner.main(__name__) |