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