# :set charset=utf8
"""
Testing the basic wsgi.Application code
"""
import unittest, sys
import wsgi, handler, http
class _DummyHandler (handler.RequestHandler) :
def __init__ (self, response=None, error=None) :
self.response = response
self.error = error
def handle_request (self, req) :
if self.error :
raise self.error
elif self.response :
return self.response
else :
assert False
class TestWSGI (unittest.TestCase) :
def setUp (self) :
self.status = None
self.headers = None
def _build_exc_info (self) :
# generate some random exception
try :
int("xxx")
except ValueError, e :
return sys.exc_info()
def _build_env (self) :
return {
'REQUEST_METHOD': "GET",
'SCRIPT_NAME': "/index.cgi",
'PATH_INFO': "",
'REQUEST_URI': "/index.cgi",
}
def _build_app (self, **kwargs) :
return wsgi.Application(_DummyHandler(**kwargs))
def _start_response (self, status, headers, exc_info=None) :
self.assertEqual(self.status, None)
self.assertEqual(self.headers, None)
self.assertEqual(type(status), str)
self.assertEqual(type(headers), list)
for name, value in headers :
self.assertEqual(type(name), str)
self.assertEqual(type(value), str)
self.status = status
self.headers = headers
def test_handle_error (self) :
app = self._build_app()
env = self._build_env()
data = app.handle_error(self._build_exc_info(), env, self._start_response)
self.assertEqual(self.status[:3], "500")
self.assertEqual(type(data), str)
def test_handle_request_response (self) :
app = self._build_app(response=http.Response("foo"))
env = self._build_env()
data = list(app.handle_request(env, self._start_response))
self.assertEqual(self.status, "200 OK")
self.assertEqual(self.headers, [('Content-type', "text/html; charset=\"UTF-8\"")])
self.assertEqual(data, ["foo"])
def test_handle_request_response_error (self) :
app = self._build_app(error=http.ResponseError("--bar--"))
env = self._build_env()
data = list(app.handle_request(env, self._start_response))
self.assertEqual(self.status, "400 Bad Request")
self.assertEqual(self.headers, [('Content-type', "text/html; charset=\"UTF-8\"")])
self.assertTrue("--bar--" in ''.join(data))
def test_call (self) :
app = self._build_app(response=http.Response("foo"))
env = self._build_env()
data = list(app(env, self._start_response))
self.assertEqual(self.status, "200 OK")
self.assertEqual(self.headers, [('Content-type', "text/html; charset=\"UTF-8\"")])
self.assertEqual(data, ["foo"])
def test_call_error (self) :
app = self._build_app(error=ValueError("--foo--"))
env = self._build_env()
data = list(app(env, self._start_response))
self.assertEqual(self.status, "500 Internal Server Error")
self.assertEqual(self.headers, [('Content-type', "text/plain; charset=UTF-8")])
self.assertTrue("ValueError: --foo--" in ''.join(data))