| # -*- coding: utf-8 -*- |
| from google.appengine.ext import webapp |
| |
| import webapp2 |
| |
| import test_base |
| |
| |
| # Old WSGIApplication, new RequestHandler. |
| class NewStyleHandler(webapp2.RequestHandler): |
| def get(self, text): |
| self.response.out.write(text) |
| |
| app = webapp.WSGIApplication([ |
| (r'/test/(.*)', NewStyleHandler), |
| ]) |
| |
| # New WSGIApplication, old RequestHandler. |
| class OldStyleHandler(webapp.RequestHandler): |
| def get(self, text): |
| self.response.out.write(text) |
| |
| class OldStyleHandler2(webapp.RequestHandler): |
| def get(self, text=None): |
| self.response.out.write(text) |
| |
| class OldStyleHandlerWithError(webapp.RequestHandler): |
| def get(self, text): |
| raise ValueError() |
| |
| def handle_exception(self, e, debug): |
| self.response.set_status(500) |
| self.response.out.write('ValueError!') |
| |
| app2 = webapp2.WSGIApplication([ |
| (r'/test/error', OldStyleHandlerWithError), |
| (r'/test/(.*)', OldStyleHandler), |
| webapp2.Route(r'/test2/<text>', OldStyleHandler2), |
| ]) |
| |
| |
| class TestWebapp1(test_base.BaseTestCase): |
| def test_old_app_new_handler(self): |
| req = webapp2.Request.blank('/test/foo') |
| rsp = req.get_response(app) |
| self.assertEqual(rsp.status_int, 200) |
| self.assertEqual(rsp.body, 'foo') |
| |
| req = webapp2.Request.blank('/test/bar') |
| rsp = req.get_response(app) |
| self.assertEqual(rsp.status_int, 200) |
| self.assertEqual(rsp.body, 'bar') |
| |
| self.assertTrue(issubclass(OldStyleHandler, webapp.RequestHandler)) |
| |
| def test_new_app_old_handler(self): |
| req = webapp2.Request.blank('/test/foo') |
| rsp = req.get_response(app2) |
| self.assertEqual(rsp.status_int, 200) |
| self.assertEqual(rsp.body, 'foo') |
| |
| req = webapp2.Request.blank('/test/bar') |
| rsp = req.get_response(app2) |
| self.assertEqual(rsp.status_int, 200) |
| self.assertEqual(rsp.body, 'bar') |
| |
| def test_new_app_old_handler_405(self): |
| req = webapp2.Request.blank('/test/foo') |
| req.method = 'POST' |
| rsp = req.get_response(app2) |
| self.assertEqual(rsp.status_int, 405) |
| self.assertEqual(rsp.headers.get('Allow'), None) |
| |
| def test_new_app_old_handler_501(self): |
| app2.allowed_methods = list(app2.allowed_methods) + ['NEW_METHOD'] |
| req = webapp2.Request.blank('/test/foo') |
| req.method = 'NEW_METHOD' |
| rsp = req.get_response(app2) |
| self.assertEqual(rsp.status_int, 501) |
| |
| def test_new_app_old_handler_501_2(self): |
| req = webapp2.Request.blank('/test/foo') |
| req.method = 'WHATMETHODISTHIS' |
| rsp = req.get_response(app2) |
| self.assertEqual(rsp.status_int, 501) |
| |
| def test_new_app_old_handler_with_error(self): |
| req = webapp2.Request.blank('/test/error') |
| rsp = req.get_response(app2) |
| self.assertEqual(rsp.status_int, 500) |
| self.assertEqual(rsp.body, 'ValueError!') |
| |
| def test_new_app_old_kwargs(self): |
| req = webapp2.Request.blank('/test2/foo') |
| rsp = req.get_response(app2) |
| self.assertEqual(rsp.status_int, 200) |
| self.assertEqual(rsp.body, 'foo') |
| |
| def test_unicode_cookie(self): |
| # see http://stackoverflow.com/questions/6839922/unicodedecodeerror-is-raised-when-getting-a-cookie-in-google-app-engine |
| import urllib |
| |
| # This is the value we want to set. |
| initial_value = u'äëïöü' |
| # WebOb version that comes with SDK doesn't quote cookie values. |
| # So we have to do it. |
| quoted_value = urllib.quote(initial_value.encode('utf-8')) |
| |
| rsp = webapp.Response() |
| rsp.headers['Set-Cookie'] = 'app=%s; Path=/' % quoted_value |
| |
| cookie = rsp.headers.get('Set-Cookie') |
| req = webapp.Request.blank('/', headers=[('Cookie', cookie)]) |
| |
| # The stored value is the same quoted value from before. |
| # Notice that here we use .str_cookies, not .cookies. |
| stored_value = req.str_cookies.get('app') |
| self.assertEqual(stored_value, quoted_value) |
| |
| # And we can get the initial value unquoting and decoding. |
| final_value = urllib.unquote(stored_value).decode('utf-8') |
| self.assertEqual(final_value, initial_value) |
| |
| |
| if __name__ == '__main__': |
| test_base.main() |