1 #!/usr/bin/env python2.5 |
|
2 # :set encoding=utf8 |
|
3 |
|
4 """ |
|
5 General unit tests |
|
6 """ |
|
7 |
|
8 import unittest |
|
9 from cStringIO import StringIO |
|
10 |
|
11 import http |
|
12 |
|
13 class TestHttpUtil (unittest.TestCase) : |
|
14 def test_request_url (self) : |
|
15 for env, url in ( |
|
16 ({ |
|
17 'wsgi.url_scheme': "https", |
|
18 'HTTP_HOST': "testhost", |
|
19 'REQUEST_URI': "/test" |
|
20 }, "https://testhost/test"), |
|
21 ({ |
|
22 'HTTP_HOST': "-" |
|
23 }, "[???]://-[???]") |
|
24 ) : |
|
25 self.assertEqual(http.request_url(env), url) |
|
26 |
|
27 class TestHttpRequest (unittest.TestCase) : |
|
28 def build_request (self, env_dict={}, **env_kw) : |
|
29 env = { |
|
30 'wsgi.url_scheme': "http", |
|
31 'HTTP_HOST': "testhost", |
|
32 'REQUEST_METHOD': "GET", |
|
33 } |
|
34 env.update(env_dict) |
|
35 env.update(env_kw) |
|
36 |
|
37 return http.Request(env) |
|
38 |
|
39 def test_site_host (self) : |
|
40 self.assertEqual(self.build_request(HTTP_HOST='testhost').site_host, "testhost") |
|
41 self.assertEqual(self.build_request(HTTP_HOST='testhost:13').site_host, "testhost:13") |
|
42 |
|
43 def test_site_root (self) : |
|
44 for script_name, site_root in ( |
|
45 ('', "" ), |
|
46 ('/foo', "" ), |
|
47 ('/foo/bar/', "/foo/bar" ), |
|
48 ) : |
|
49 self.assertEqual(self.build_request(SCRIPT_NAME=script_name).site_root, site_root) |
|
50 |
|
51 def test_get_page_name (self) : |
|
52 for path_info, page_name in ( |
|
53 ('', ""), |
|
54 ('/', ""), |
|
55 ('/foo1/bar', "foo1/bar"), |
|
56 ('/foo2/bar/', "foo2/bar/"), |
|
57 ('/foo3/bar/../', "foo3/"), |
|
58 ('/foo4/bar/..', "foo4"), |
|
59 ('//', ""), |
|
60 ) : |
|
61 self.assertEqual(self.build_request(PATH_INFO=path_info).get_page_name(), page_name) |
|
62 |
|
63 def _test_page_prefix (self, request_uri, path_info, page_prefix) : |
|
64 self.assertEqual(self.build_request(REQUEST_URI=request_uri, PATH_INFO=path_info).page_prefix, page_prefix) |
|
65 |
|
66 def test_page_prefix_empty (self) : |
|
67 self._test_page_prefix('', '', "") |
|
68 |
|
69 def test_page_prefix_root_dir (self) : |
|
70 self._test_page_prefix('/foo/', '/foo/', "") |
|
71 |
|
72 def test_page_prefix_cgi (self) : |
|
73 self._test_page_prefix('/foo.cgi/quux', '/quux', "/foo.cgi") |
|
74 |
|
75 def test_page_prefix_qargs (self) : |
|
76 self._test_page_prefix('/foo.cgi/?foo', '/', "/foo.cgi") |
|
77 |
|
78 def test_get_arg (self) : |
|
79 for query_string, key, value in ( |
|
80 ('', 'foo', None), |
|
81 ('foo', 'foo', ''), |
|
82 ('foo=', 'foo', ''), |
|
83 ('foo=bar', 'foo', 'bar'), |
|
84 ('foo=&bar=.', 'bar', '.'), |
|
85 ) : |
|
86 self.assertEqual(self.build_request(QUERY_STRING=query_string).get_arg(key, None), value) |
|
87 |
|
88 def test_get_args (self) : |
|
89 for query_string, keyvals in ( |
|
90 ('', []), |
|
91 ('foo1=&bar', [('foo1', ''), ('bar', '')]), |
|
92 ('foo2=bar', [('foo2', 'bar')]), |
|
93 ('foo3=bar&foo3', [('foo3', 'bar'), ('foo3', '')]), |
|
94 ) : |
|
95 self.assertEqual(self.build_request(QUERY_STRING=query_string).get_args(), keyvals) |
|
96 |
|
97 def _build_post (self, method='POST', **vals) : |
|
98 data = '&'.join('%s=%s' % kv for kv in vals.iteritems()) |
|
99 |
|
100 return self.build_request({'wsgi.input': StringIO(data)}, REQUEST_METHOD=method, CONTENT_TYPE='application/x-www-form-urlencoded') |
|
101 |
|
102 def test_is_post (self) : |
|
103 for request_method, bool in ( |
|
104 ('GET', False), |
|
105 ('POST', True), |
|
106 ('post', True), |
|
107 ) : |
|
108 self.assertEqual(self._build_post(method=request_method).is_post(), bool) |
|
109 |
|
110 def _test_post (self, **vals) : |
|
111 req = self._build_post(**vals) |
|
112 |
|
113 def test_post_empty (self) : |
|
114 req = self._build_post() |
|
115 |
|
116 self.assertTrue(req.is_post()) |
|
117 self.assertEqual(req.get_post('foo', None), None) |
|
118 |
|
119 def test_post_simple (self) : |
|
120 req = self._build_post(foo='bar') |
|
121 |
|
122 self.assertTrue(req.is_post()) |
|
123 self.assertEqual(req.get_post('foo', None), 'bar') |
|
124 |
|
125 class TestHttpResponse (unittest.TestCase) : |
|
126 def test_status (self) : |
|
127 response = http.Response(None, status='100 Continue') |
|
128 |
|
129 self.assertEqual(response.get_status(), '100 Continue') |
|
130 |
|
131 def test_data_empty (self) : |
|
132 self.assertEqual(http.Response(None).get_data(), '') |
|
133 |
|
134 def test_data_str (self) : |
|
135 self.assertEqual(http.Response('foo').get_data(), 'foo') |
|
136 |
|
137 def test_data_utf8 (self) : |
|
138 data = u'föö' |
|
139 |
|
140 self.assertEqual(http.Response(data).get_data(), data.encode('utf8')) |
|
141 |
|
142 def test_data_utf16 (self) : |
|
143 data = u'fåå' |
|
144 |
|
145 self.assertEqual(http.Response(data, charset='utf16').get_data(), data.encode('utf16')) |
|
146 |
|
147 def test_data_binary (self) : |
|
148 data = '\x01\x00' |
|
149 |
|
150 self.assertEqual(http.Response(data, charset=None).get_data(), data) |
|
151 |
|
152 def test_content_type_none (self) : |
|
153 response = http.Response(None, content_type=None) |
|
154 |
|
155 self.assertEqual(response.get_headers(), []) |
|
156 |
|
157 def test_content_type_default (self) : |
|
158 self.assertEqual(http.Response(None).get_headers(), [('Content-type', "text/html; charset=\"UTF-8\"")]) |
|
159 |
|
160 def test_content_type_weird (self) : |
|
161 self.assertEqual(http.Response(None, content_type="foo/x-bar").get_headers(), [('Content-type', "foo/x-bar; charset=\"UTF-8\"")]) |
|
162 |
|
163 def test_content_type_charset (self) : |
|
164 self.assertEqual(http.Response(None, content_type="foo/x-bar", charset="---").get_headers(), [('Content-type', "foo/x-bar; charset=\"---\"")]) |
|
165 |
|
166 def _build_headers (self, tlist=None, **map) : |
|
167 response = http.Response(None) |
|
168 |
|
169 if tlist : |
|
170 for name, value, params in tlist : |
|
171 response.add_header(name, value, **params) |
|
172 |
|
173 for name, value in map.iteritems() : |
|
174 response.add_header(name, value) |
|
175 |
|
176 return response |
|
177 |
|
178 def test_headers_simple (self) : |
|
179 self.assertEqual(self._build_headers(**{'X-Foo': 'bar, never'}).get_headers(), [ |
|
180 ('Content-type', "text/html; charset=\"UTF-8\""), |
|
181 ('X-Foo', "bar, never") |
|
182 ]) |
|
183 |
|
184 def test_headers_params (self) : |
|
185 self.assertEqual(self._build_headers([('X-Bar', 'bar', dict(never='yes'))]).get_headers(), [ |
|
186 ('Content-type', "text/html; charset=\"UTF-8\""), |
|
187 ('X-Bar', "bar; never=\"yes\"") |
|
188 ]) |
|
189 |
|
190 def test_headers_multi (self) : |
|
191 self.assertEqual(self._build_headers([('X-Bar', 'bar', {}), ('X-bar', 'foo', {})]).get_headers(), [ |
|
192 ('Content-type', "text/html; charset=\"UTF-8\""), |
|
193 ('X-Bar', "bar"), |
|
194 ('X-bar', "foo"), |
|
195 ]) |
|
196 |
|
197 if __name__ == '__main__' : |
|
198 unittest.main() |
|
199 |
|