# -*- 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()