| # -*- coding: utf-8 -*- |
| import webapp2 |
| |
| import test_base |
| |
| |
| class NoStringOrUnicodeConversion(object): |
| pass |
| |
| |
| class StringConversion(object): |
| def __str__(self): |
| return 'foo'.encode('utf-8') |
| |
| |
| class UnicodeConversion(object): |
| def __unicode__(self): |
| return 'bar'.decode('utf-8') |
| |
| |
| class TestResponse(test_base.BaseTestCase): |
| def test_write(self): |
| var_1 = NoStringOrUnicodeConversion() |
| var_2 = StringConversion() |
| var_3 = UnicodeConversion() |
| |
| rsp = webapp2.Response() |
| rsp.write(var_1) |
| rsp.write(var_2) |
| rsp.write(var_3) |
| self.assertEqual(rsp.body, '%rfoobar' % var_1) |
| |
| rsp = webapp2.Response() |
| rsp.write(var_1) |
| rsp.write(var_3) |
| rsp.write(var_2) |
| self.assertEqual(rsp.body, '%rbarfoo' % var_1) |
| |
| rsp = webapp2.Response() |
| rsp.write(var_2) |
| rsp.write(var_1) |
| rsp.write(var_3) |
| self.assertEqual(rsp.body, 'foo%rbar' % var_1) |
| |
| rsp = webapp2.Response() |
| rsp.write(var_2) |
| rsp.write(var_3) |
| rsp.write(var_1) |
| self.assertEqual(rsp.body, 'foobar%r' % var_1) |
| |
| rsp = webapp2.Response() |
| rsp.write(var_3) |
| rsp.write(var_1) |
| rsp.write(var_2) |
| self.assertEqual(rsp.body, 'bar%rfoo' % var_1) |
| |
| rsp = webapp2.Response() |
| rsp.write(var_3) |
| rsp.write(var_2) |
| rsp.write(var_1) |
| self.assertEqual(rsp.body, 'barfoo%r' % var_1) |
| |
| def test_write2(self): |
| rsp = webapp2.Response() |
| rsp.charset = None |
| rsp.write(u'foo') |
| |
| self.assertEqual(rsp.body, u'foo') |
| self.assertEqual(rsp.charset, 'utf-8') |
| |
| def test_status(self): |
| rsp = webapp2.Response() |
| |
| self.assertEqual(rsp.status, '200 OK') |
| self.assertEqual(rsp.status_int, 200) |
| self.assertEqual(rsp.status_message, 'OK') |
| |
| rsp.status = u'200 OK' |
| self.assertEqual(rsp.status, '200 OK') |
| self.assertEqual(rsp.status_int, 200) |
| self.assertEqual(rsp.status_message, 'OK') |
| |
| rsp.status_message = 'Weee' |
| self.assertEqual(rsp.status, '200 Weee') |
| self.assertEqual(rsp.status_int, 200) |
| self.assertEqual(rsp.status_message, 'Weee') |
| |
| rsp.status = 404 |
| self.assertEqual(rsp.status, '404 Not Found') |
| self.assertEqual(rsp.status_int, 404) |
| self.assertEqual(rsp.status_message, 'Not Found') |
| |
| rsp.status = '403 Wooo' |
| self.assertEqual(rsp.status, '403 Wooo') |
| self.assertEqual(rsp.status_int, 403) |
| self.assertEqual(rsp.status_message, 'Wooo') |
| |
| rsp.status_int = 500 |
| self.assertEqual(rsp.status, '500 Internal Server Error') |
| self.assertEqual(rsp.status_int, 500) |
| self.assertEqual(rsp.status_message, 'Internal Server Error') |
| |
| self.assertRaises(TypeError, rsp._set_status, ()) |
| |
| def test_has_error(self): |
| rsp = webapp2.Response() |
| self.assertFalse(rsp.has_error()) |
| rsp.status = 400 |
| self.assertTrue(rsp.has_error()) |
| rsp.status = 404 |
| self.assertTrue(rsp.has_error()) |
| rsp.status = 500 |
| self.assertTrue(rsp.has_error()) |
| rsp.status = 200 |
| self.assertFalse(rsp.has_error()) |
| rsp.status = 302 |
| self.assertFalse(rsp.has_error()) |
| |
| def test_wsgi_write(self): |
| res = [] |
| |
| def write(status, headers, body): |
| return res.extend([status, headers, body]) |
| |
| def start_response(status, headers): |
| return lambda body: write(status, headers, body) |
| |
| rsp = webapp2.Response(body='Page not found!', status=404) |
| rsp.wsgi_write(start_response) |
| |
| rsp = webapp2.Response(status=res[0], body=res[2], headers=res[1]) |
| self.assertEqual(rsp.status, '404 Not Found') |
| self.assertEqual(rsp.body, 'Page not found!') |
| |
| ''' |
| # webob >= 1.0 |
| self.assertEqual(res, [ |
| '404 Not Found', |
| [ |
| ('Content-Type', 'text/html; charset=utf-8'), |
| ('Cache-Control', 'no-cache'), |
| ('Expires', 'Fri, 01 Jan 1990 00:00:00 GMT'), |
| ('Content-Length', '15') |
| ], |
| 'Page not found!' |
| ]) |
| ''' |
| |
| def test_get_all(self): |
| rsp = webapp2.Response() |
| rsp.headers.add('Set-Cookie', 'foo=bar;') |
| rsp.headers.add('Set-Cookie', 'baz=ding;') |
| |
| self.assertEqual(rsp.headers.get_all('set-cookie'), |
| ['foo=bar;', 'baz=ding;']) |
| |
| rsp = webapp2.Response() |
| rsp.headers = {'Set-Cookie': 'foo=bar;'} |
| self.assertEqual(rsp.headers.get_all('set-cookie'), ['foo=bar;']) |
| |
| def test_add_header(self): |
| rsp = webapp2.Response() |
| rsp.headers.add_header('Content-Disposition', 'attachment', |
| filename='bud.gif') |
| self.assertEqual(rsp.headers.get('content-disposition'), |
| 'attachment; filename="bud.gif"') |
| |
| rsp = webapp2.Response() |
| rsp.headers.add_header('Content-Disposition', 'attachment', |
| filename=None) |
| self.assertEqual(rsp.headers.get('content-disposition'), |
| 'attachment; filename') |
| |
| rsp = webapp2.Response() |
| rsp.headers.add_header('Set-Cookie', '', foo='') |
| self.assertEqual(rsp.headers.get_all('set-cookie'), ['; foo']) |
| |
| rsp = webapp2.Response() |
| rsp.headers.add_header('Set-Cookie', '', foo=';') |
| self.assertEqual(rsp.headers.get_all('set-cookie'), ['; foo=";"']) |
| |
| # Tests from Python source: wsgiref.headers.Headers |
| def test_headers_MappingInterface(self): |
| rsp = webapp2.Response() |
| test = [('x','y')] |
| self.assertEqual(len(rsp.headers), 3) |
| rsp.headers = test[:] |
| self.assertEqual(len(rsp.headers), 1) |
| self.assertEqual(rsp.headers.keys(), ['x']) |
| self.assertEqual(rsp.headers.values(), ['y']) |
| self.assertEqual(rsp.headers.items(), test) |
| rsp.headers = test |
| self.assertFalse(rsp.headers.items() is test) # must be copy! |
| |
| rsp = webapp2.Response() |
| h = rsp.headers |
| # this doesn't raise an error in wsgiref.headers.Headers |
| # del h['foo'] |
| |
| h['Foo'] = 'bar' |
| for m in h.has_key, h.__contains__, h.get, h.get_all, h.__getitem__: |
| self.assertTrue(m('foo')) |
| self.assertTrue(m('Foo')) |
| self.assertTrue(m('FOO')) |
| # this doesn't raise an error in wsgiref.headers.Headers |
| # self.assertFalse(m('bar')) |
| |
| self.assertEqual(h['foo'],'bar') |
| h['foo'] = 'baz' |
| self.assertEqual(h['FOO'],'baz') |
| self.assertEqual(h.get_all('foo'),['baz']) |
| |
| self.assertEqual(h.get("foo","whee"), "baz") |
| self.assertEqual(h.get("zoo","whee"), "whee") |
| self.assertEqual(h.setdefault("foo","whee"), "baz") |
| self.assertEqual(h.setdefault("zoo","whee"), "whee") |
| self.assertEqual(h["foo"],"baz") |
| self.assertEqual(h["zoo"],"whee") |
| |
| def test_headers_RequireList(self): |
| def set_headers(): |
| rsp = webapp2.Response() |
| rsp.headers = 'foo' |
| return rsp.headers |
| |
| self.assertRaises(TypeError, set_headers) |
| |
| def test_headers_Extras(self): |
| rsp = webapp2.Response() |
| rsp.headers = [] |
| h = rsp.headers |
| self.assertEqual(str(h),'\r\n') |
| |
| h.add_header('foo','bar',baz="spam") |
| self.assertEqual(h['foo'], 'bar; baz="spam"') |
| self.assertEqual(str(h),'foo: bar; baz="spam"\r\n\r\n') |
| |
| h.add_header('Foo','bar',cheese=None) |
| self.assertEqual(h.get_all('foo'), |
| ['bar; baz="spam"', 'bar; cheese']) |
| |
| self.assertEqual(str(h), |
| 'foo: bar; baz="spam"\r\n' |
| 'Foo: bar; cheese\r\n' |
| '\r\n' |
| ) |
| |
| |
| class TestReturnResponse(test_base.BaseTestCase): |
| def test_function_that_returns_response(self): |
| def myfunction(request, *args, **kwargs): |
| return webapp2.Response('Hello, custom response world!') |
| |
| app = webapp2.WSGIApplication([ |
| ('/', myfunction), |
| ]) |
| |
| req = webapp2.Request.blank('/') |
| rsp = req.get_response(app) |
| self.assertEqual(rsp.status_int, 200) |
| self.assertEqual(rsp.body, 'Hello, custom response world!') |
| |
| def test_function_that_returns_string(self): |
| def myfunction(request, *args, **kwargs): |
| return 'Hello, custom response world!' |
| |
| app = webapp2.WSGIApplication([ |
| ('/', myfunction), |
| ]) |
| |
| def custom_dispatcher(router, request, response): |
| response_str = router.default_dispatcher(request, response) |
| return request.app.response_class(response_str) |
| |
| app.router.set_dispatcher(custom_dispatcher) |
| |
| req = webapp2.Request.blank('/') |
| rsp = req.get_response(app) |
| self.assertEqual(rsp.status_int, 200) |
| self.assertEqual(rsp.body, 'Hello, custom response world!') |
| |
| def test_function_that_returns_tuple(self): |
| def myfunction(request, *args, **kwargs): |
| return 'Hello, custom response world!', 404 |
| |
| app = webapp2.WSGIApplication([ |
| ('/', myfunction), |
| ]) |
| |
| def custom_dispatcher(router, request, response): |
| response_tuple = router.default_dispatcher(request, response) |
| return request.app.response_class(*response_tuple) |
| |
| app.router.set_dispatcher(custom_dispatcher) |
| |
| req = webapp2.Request.blank('/') |
| rsp = req.get_response(app) |
| self.assertEqual(rsp.status_int, 404) |
| self.assertEqual(rsp.body, 'Hello, custom response world!') |
| |
| def test_handle_exception_that_returns_response(self): |
| class HomeHandler(webapp2.RequestHandler): |
| def get(self, **kwargs): |
| raise TypeError() |
| |
| app = webapp2.WSGIApplication([ |
| webapp2.Route('/', HomeHandler, name='home'), |
| ]) |
| app.error_handlers[500] = 'resources.handlers.handle_exception' |
| |
| req = webapp2.Request.blank('/') |
| rsp = req.get_response(app) |
| self.assertEqual(rsp.status_int, 200) |
| self.assertEqual(rsp.body, 'Hello, custom response world!') |
| |
| def test_return_is_not_wsgi_app(self): |
| class HomeHandler(webapp2.RequestHandler): |
| def get(self, **kwargs): |
| return '' |
| |
| app = webapp2.WSGIApplication([ |
| webapp2.Route('/', HomeHandler, name='home'), |
| ], debug=False) |
| |
| req = webapp2.Request.blank('/') |
| rsp = req.get_response(app) |
| self.assertEqual(rsp.status_int, 500) |
| |
| |
| if __name__ == '__main__': |
| test_base.main() |