39
|
1 # -*- coding: utf-8 -*-
|
|
2
|
|
3 from trac.test import Mock
|
|
4 from trac.web.api import Request, RequestDone
|
|
5 from trac.web.clearsilver import HDFWrapper
|
|
6
|
|
7 from Cookie import SimpleCookie as Cookie
|
|
8 from StringIO import StringIO
|
|
9 import unittest
|
|
10
|
|
11
|
|
12 class RequestTestCase(unittest.TestCase):
|
|
13
|
|
14 def _make_environ(self, scheme='http', server_name='example.org',
|
|
15 server_port=80, method='GET', script_name='/trac',
|
|
16 **kwargs):
|
|
17 environ = {'wsgi.url_scheme': scheme, 'wsgi.input': StringIO(''),
|
|
18 'REQUEST_METHOD': method, 'SERVER_NAME': server_name,
|
|
19 'SERVER_PORT': server_port, 'SCRIPT_NAME': script_name}
|
|
20 environ.update(kwargs)
|
|
21 return environ
|
|
22
|
|
23 def test_base_url(self):
|
|
24 environ = self._make_environ()
|
|
25 req = Request(environ, None)
|
|
26 self.assertEqual('http://example.org/trac', req.base_url)
|
|
27
|
|
28 def test_base_url_host(self):
|
|
29 environ = self._make_environ(server_port=8080, HTTP_HOST='example.com')
|
|
30 req = Request(environ, None)
|
|
31 self.assertEqual('http://example.com/trac', req.base_url)
|
|
32
|
|
33 def test_base_url_nondefaultport(self):
|
|
34 environ = self._make_environ(server_port=8080)
|
|
35 req = Request(environ, None)
|
|
36 self.assertEqual('http://example.org:8080/trac', req.base_url)
|
|
37
|
|
38 def test_base_url_https(self):
|
|
39 environ = self._make_environ(scheme='https', server_port=443)
|
|
40 req = Request(environ, None)
|
|
41 self.assertEqual('https://example.org/trac', req.base_url)
|
|
42
|
|
43 def test_base_url_https_host(self):
|
|
44 environ = self._make_environ(scheme='https', server_port=443,
|
|
45 HTTP_HOST='example.com')
|
|
46 req = Request(environ, None)
|
|
47 self.assertEqual('https://example.com/trac', req.base_url)
|
|
48
|
|
49 def test_base_url_https_nondefaultport(self):
|
|
50 environ = self._make_environ(scheme='https', server_port=8443)
|
|
51 req = Request(environ, None)
|
|
52 self.assertEqual('https://example.org:8443/trac', req.base_url)
|
|
53
|
|
54 def test_base_url_proxy(self):
|
|
55 environ = self._make_environ(HTTP_HOST='localhost',
|
|
56 HTTP_X_FORWARDED_HOST='example.com')
|
|
57 req = Request(environ, None)
|
|
58 self.assertEqual('http://localhost/trac', req.base_url)
|
|
59
|
|
60 def test_redirect(self):
|
|
61 status_sent = []
|
|
62 headers_sent = {}
|
|
63 def start_response(status, headers):
|
|
64 status_sent.append(status)
|
|
65 headers_sent.update(dict(headers))
|
|
66 environ = self._make_environ(method='HEAD')
|
|
67 req = Request(environ, start_response)
|
|
68 self.assertRaises(RequestDone, req.redirect, '/trac/test')
|
|
69 self.assertEqual('302 Found', status_sent[0])
|
|
70 self.assertEqual('http://example.org/trac/test',
|
|
71 headers_sent['Location'])
|
|
72
|
|
73 def test_redirect_absolute(self):
|
|
74 status_sent = []
|
|
75 headers_sent = {}
|
|
76 def start_response(status, headers):
|
|
77 status_sent.append(status)
|
|
78 headers_sent.update(dict(headers))
|
|
79 environ = self._make_environ(method='HEAD')
|
|
80 req = Request(environ, start_response)
|
|
81 self.assertRaises(RequestDone, req.redirect,
|
|
82 'http://example.com/trac/test')
|
|
83 self.assertEqual('302 Found', status_sent[0])
|
|
84 self.assertEqual('http://example.com/trac/test',
|
|
85 headers_sent['Location'])
|
|
86
|
|
87 def test_write_unicode(self):
|
|
88 buf = StringIO()
|
|
89 def write(data):
|
|
90 buf.write(data)
|
|
91 def start_response(status, headers):
|
|
92 return write
|
|
93 environ = self._make_environ(method='HEAD')
|
|
94 req = Request(environ, start_response)
|
|
95 req.send_header('Content-Type', 'text/plain;charset=utf-8')
|
|
96 req.write(u'Föö')
|
|
97 self.assertEqual('Föö', buf.getvalue())
|
|
98
|
|
99
|
|
100 def suite():
|
|
101 suite = unittest.TestSuite()
|
|
102 suite.addTest(unittest.makeSuite(RequestTestCase, 'test'))
|
|
103 return suite
|
|
104
|
|
105 if __name__ == '__main__':
|
|
106 unittest.main()
|