86
|
1 |
# :set charset=utf8
|
|
2 |
"""
|
|
3 |
Testing the basic wsgi.Application code
|
|
4 |
"""
|
|
5 |
|
|
6 |
import unittest, sys
|
|
7 |
import wsgi, handler, http
|
|
8 |
|
|
9 |
class _DummyHandler (handler.RequestHandler) :
|
|
10 |
def __init__ (self, response=None, error=None) :
|
|
11 |
self.response = response
|
|
12 |
self.error = error
|
|
13 |
|
|
14 |
def handle_request (self, req) :
|
|
15 |
if self.error :
|
|
16 |
raise self.error
|
|
17 |
|
|
18 |
elif self.response :
|
|
19 |
return self.response
|
|
20 |
|
|
21 |
else :
|
|
22 |
assert False
|
|
23 |
|
|
24 |
class TestWSGI (unittest.TestCase) :
|
|
25 |
def setUp (self) :
|
|
26 |
self.status = None
|
|
27 |
self.headers = None
|
|
28 |
|
|
29 |
def _build_exc_info (self) :
|
|
30 |
# generate some random exception
|
|
31 |
try :
|
|
32 |
int("xxx")
|
|
33 |
|
|
34 |
except ValueError, e :
|
|
35 |
return sys.exc_info()
|
|
36 |
|
|
37 |
def _build_env (self) :
|
|
38 |
return {
|
|
39 |
'REQUEST_METHOD': "GET",
|
|
40 |
'SCRIPT_NAME': "/index.cgi",
|
|
41 |
'PATH_INFO': "",
|
|
42 |
'REQUEST_URI': "/index.cgi",
|
|
43 |
}
|
|
44 |
|
|
45 |
def _build_app (self, **kwargs) :
|
|
46 |
return wsgi.Application(_DummyHandler(**kwargs))
|
|
47 |
|
|
48 |
def _start_response (self, status, headers, exc_info=None) :
|
|
49 |
self.assertEqual(self.status, None)
|
|
50 |
self.assertEqual(self.headers, None)
|
|
51 |
|
|
52 |
self.assertEqual(type(status), str)
|
|
53 |
self.assertEqual(type(headers), list)
|
|
54 |
|
|
55 |
for name, value in headers :
|
|
56 |
self.assertEqual(type(name), str)
|
|
57 |
self.assertEqual(type(value), str)
|
|
58 |
|
|
59 |
self.status = status
|
|
60 |
self.headers = headers
|
|
61 |
|
|
62 |
def test_handle_error (self) :
|
|
63 |
app = self._build_app()
|
|
64 |
env = self._build_env()
|
|
65 |
|
|
66 |
data = app.handle_error(self._build_exc_info(), env, self._start_response)
|
|
67 |
|
|
68 |
self.assertEqual(self.status[:3], "500")
|
|
69 |
self.assertEqual(type(data), str)
|
|
70 |
|
|
71 |
def test_handle_request_response (self) :
|
|
72 |
app = self._build_app(response=http.Response("foo"))
|
|
73 |
env = self._build_env()
|
|
74 |
|
|
75 |
data = list(app.handle_request(env, self._start_response))
|
|
76 |
|
|
77 |
self.assertEqual(self.status, "200 OK")
|
|
78 |
self.assertEqual(self.headers, [('Content-type', "text/html; charset=\"UTF-8\"")])
|
|
79 |
self.assertEqual(data, ["foo"])
|
|
80 |
|
|
81 |
def test_handle_request_response_error (self) :
|
|
82 |
app = self._build_app(error=http.ResponseError("--bar--"))
|
|
83 |
env = self._build_env()
|
|
84 |
|
|
85 |
data = list(app.handle_request(env, self._start_response))
|
|
86 |
|
|
87 |
self.assertEqual(self.status, "400 Bad Request")
|
|
88 |
self.assertEqual(self.headers, [('Content-type', "text/html; charset=\"UTF-8\"")])
|
|
89 |
self.assertTrue("--bar--" in ''.join(data))
|
|
90 |
|
|
91 |
def test_call (self) :
|
|
92 |
app = self._build_app(response=http.Response("foo"))
|
|
93 |
env = self._build_env()
|
|
94 |
|
|
95 |
data = list(app(env, self._start_response))
|
|
96 |
|
|
97 |
self.assertEqual(self.status, "200 OK")
|
|
98 |
self.assertEqual(self.headers, [('Content-type', "text/html; charset=\"UTF-8\"")])
|
|
99 |
self.assertEqual(data, ["foo"])
|
|
100 |
|
|
101 |
def test_call_error (self) :
|
|
102 |
app = self._build_app(error=ValueError("--foo--"))
|
|
103 |
env = self._build_env()
|
|
104 |
|
|
105 |
data = list(app(env, self._start_response))
|
|
106 |
|
|
107 |
self.assertEqual(self.status, "500 Internal Server Error")
|
|
108 |
self.assertEqual(self.headers, [('Content-type', "text/plain; charset=UTF-8")])
|
|
109 |
self.assertTrue("ValueError: --foo--" in ''.join(data))
|
|
110 |
|