# -*- coding: utf-8 -*-
import webapp2
from webapp2_extras.routes import (DomainRoute, HandlerPrefixRoute,
RedirectRoute, NamePrefixRoute, PathPrefixRoute)
import test_base
class HomeHandler(webapp2.RequestHandler):
def get(self, **kwargs):
self.response.out.write('home sweet home')
app = webapp2.WSGIApplication([
#RedirectRoute('/', name='home', handler=HomeHandler),
RedirectRoute('/redirect-me-easily', redirect_to='/i-was-redirected-easily'),
RedirectRoute('/redirect-me-easily2', redirect_to='/i-was-redirected-easily', defaults={'_code': 302}),
RedirectRoute('/redirect-me-easily3', redirect_to='/i-was-redirected-easily', defaults={'_permanent': False}),
RedirectRoute('/strict-foo', HomeHandler, 'foo-strict', strict_slash=True),
RedirectRoute('/strict-bar/', HomeHandler, 'bar-strict', strict_slash=True),
RedirectRoute('/redirect-to-name-destination', name='redirect-to-name-destination', handler=HomeHandler),
RedirectRoute('/redirect-to-name', redirect_to_name='redirect-to-name-destination'),
])
class TestRedirectRoute(test_base.BaseTestCase):
def test_route_redirect_to(self):
route = RedirectRoute('/foo', redirect_to='/bar')
router = webapp2.Router([route])
route_match, args, kwargs = router.match(webapp2.Request.blank('/foo'))
self.assertEqual(route_match, route)
self.assertEqual(args, ())
self.assertEqual(kwargs, {'_uri': '/bar'})
def test_easy_redirect_to(self):
req = webapp2.Request.blank('/redirect-me-easily')
rsp = req.get_response(app)
self.assertEqual(rsp.status_int, 301)
self.assertEqual(rsp.body, '')
self.assertEqual(rsp.headers['Location'], 'http://localhost/i-was-redirected-easily')
req = webapp2.Request.blank('/redirect-me-easily2')
rsp = req.get_response(app)
self.assertEqual(rsp.status_int, 302)
self.assertEqual(rsp.body, '')
self.assertEqual(rsp.headers['Location'], 'http://localhost/i-was-redirected-easily')
req = webapp2.Request.blank('/redirect-me-easily3')
rsp = req.get_response(app)
self.assertEqual(rsp.status_int, 302)
self.assertEqual(rsp.body, '')
self.assertEqual(rsp.headers['Location'], 'http://localhost/i-was-redirected-easily')
def test_redirect_to_name(self):
req = webapp2.Request.blank('/redirect-to-name')
rsp = req.get_response(app)
self.assertEqual(rsp.status_int, 301)
self.assertEqual(rsp.body, '')
self.assertEqual(rsp.headers['Location'], 'http://localhost/redirect-to-name-destination')
def test_strict_slash(self):
req = webapp2.Request.blank('/strict-foo')
rsp = req.get_response(app)
self.assertEqual(rsp.status_int, 200)
self.assertEqual(rsp.body, 'home sweet home')
req = webapp2.Request.blank('/strict-bar/')
rsp = req.get_response(app)
self.assertEqual(rsp.status_int, 200)
self.assertEqual(rsp.body, 'home sweet home')
# Now the non-strict...
req = webapp2.Request.blank('/strict-foo/')
rsp = req.get_response(app)
self.assertEqual(rsp.status_int, 301)
self.assertEqual(rsp.body, '')
self.assertEqual(rsp.headers['Location'], 'http://localhost/strict-foo')
req = webapp2.Request.blank('/strict-bar')
rsp = req.get_response(app)
self.assertEqual(rsp.status_int, 301)
self.assertEqual(rsp.body, '')
self.assertEqual(rsp.headers['Location'], 'http://localhost/strict-bar/')
# Strict slash routes must have a name.
self.assertRaises(ValueError, RedirectRoute, '/strict-bar/', handler=HomeHandler, strict_slash=True)
def test_build_only(self):
self.assertRaises(ValueError, RedirectRoute, '/', handler=HomeHandler, build_only=True)
class TestPrefixRoutes(test_base.BaseTestCase):
def test_simple(self):
router = webapp2.Router([
PathPrefixRoute('/a', [
webapp2.Route('/', 'a', 'name-a'),
webapp2.Route('/b', 'a/b', 'name-a/b'),
webapp2.Route('/c', 'a/c', 'name-a/c'),
PathPrefixRoute('/d', [
webapp2.Route('/', 'a/d', 'name-a/d'),
webapp2.Route('/b', 'a/d/b', 'name-a/d/b'),
webapp2.Route('/c', 'a/d/c', 'name-a/d/c'),
]),
])
])
path = '/a/'
match = ((), {})
self.assertEqual(router.match(webapp2.Request.blank(path))[1:], match)
self.assertEqual(router.build(webapp2.Request.blank('/'), 'name-a', match[0], match[1]), path)
path = '/a/b'
match = ((), {})
self.assertEqual(router.match(webapp2.Request.blank(path))[1:], match)
self.assertEqual(router.build(webapp2.Request.blank('/'), 'name-a/b', match[0], match[1]), path)
path = '/a/c'
match = ((), {})
self.assertEqual(router.match(webapp2.Request.blank(path))[1:], match)
self.assertEqual(router.build(webapp2.Request.blank('/'), 'name-a/c', match[0], match[1]), path)
path = '/a/d/'
match = ((), {})
self.assertEqual(router.match(webapp2.Request.blank(path))[1:], match)
self.assertEqual(router.build(webapp2.Request.blank('/'), 'name-a/d', match[0], match[1]), path)
path = '/a/d/b'
match = ((), {})
self.assertEqual(router.match(webapp2.Request.blank(path))[1:], match)
self.assertEqual(router.build(webapp2.Request.blank('/'), 'name-a/d/b', match[0], match[1]), path)
path = '/a/d/c'
match = ((), {})
self.assertEqual(router.match(webapp2.Request.blank(path))[1:], match)
self.assertEqual(router.build(webapp2.Request.blank('/'), 'name-a/d/c', match[0], match[1]), path)
def test_with_variables_name_and_handler(self):
router = webapp2.Router([
PathPrefixRoute('/user/<username:\w+>', [
HandlerPrefixRoute('apps.users.', [
NamePrefixRoute('user-', [
webapp2.Route('/', 'UserOverviewHandler', 'overview'),
webapp2.Route('/profile', 'UserProfileHandler', 'profile'),
webapp2.Route('/projects', 'UserProjectsHandler', 'projects'),
]),
]),
])
])
path = '/user/calvin/'
match = ((), {'username': 'calvin'})
self.assertEqual(router.match(webapp2.Request.blank(path))[1:], match)
self.assertEqual(router.build(webapp2.Request.blank('/'), 'user-overview', match[0], match[1]), path)
path = '/user/calvin/profile'
match = ((), {'username': 'calvin'})
self.assertEqual(router.match(webapp2.Request.blank(path))[1:], match)
self.assertEqual(router.build(webapp2.Request.blank('/'), 'user-profile', match[0], match[1]), path)
path = '/user/calvin/projects'
match = ((), {'username': 'calvin'})
self.assertEqual(router.match(webapp2.Request.blank(path))[1:], match)
self.assertEqual(router.build(webapp2.Request.blank('/'), 'user-projects', match[0], match[1]), path)
class TestDomainRoute(test_base.BaseTestCase):
def test_simple(self):
router = webapp2.Router([
DomainRoute('<subdomain>.<:.*>', [
webapp2.Route('/foo', 'FooHandler', 'subdomain-thingie'),
])
])
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank('/foo'))
match = router.match(webapp2.Request.blank('http://my-subdomain.app-id.appspot.com/foo'))
self.assertEqual(match[1:], ((), {'subdomain': 'my-subdomain'}))
match = router.match(webapp2.Request.blank('http://another-subdomain.app-id.appspot.com/foo'))
self.assertEqual(match[1:], ((), {'subdomain': 'another-subdomain'}))
url = router.build(webapp2.Request.blank('/'), 'subdomain-thingie', (), {'_netloc': 'another-subdomain.app-id.appspot.com'})
self.assertEqual(url, 'http://another-subdomain.app-id.appspot.com/foo')
def test_with_variables_name_and_handler(self):
router = webapp2.Router([
DomainRoute('<subdomain>.<:.*>', [
PathPrefixRoute('/user/<username:\w+>', [
HandlerPrefixRoute('apps.users.', [
NamePrefixRoute('user-', [
webapp2.Route('/', 'UserOverviewHandler', 'overview'),
webapp2.Route('/profile', 'UserProfileHandler', 'profile'),
webapp2.Route('/projects', 'UserProjectsHandler', 'projects'),
]),
]),
])
]),
])
path = 'http://my-subdomain.app-id.appspot.com/user/calvin/'
match = ((), {'username': 'calvin', 'subdomain': 'my-subdomain'})
self.assertEqual(router.match(webapp2.Request.blank(path))[1:], match)
match[1].pop('subdomain')
match[1]['_netloc'] = 'my-subdomain.app-id.appspot.com'
self.assertEqual(router.build(webapp2.Request.blank('/'), 'user-overview', match[0], match[1]), path)
path = 'http://my-subdomain.app-id.appspot.com/user/calvin/profile'
match = ((), {'username': 'calvin', 'subdomain': 'my-subdomain'})
self.assertEqual(router.match(webapp2.Request.blank(path))[1:], match)
match[1].pop('subdomain')
match[1]['_netloc'] = 'my-subdomain.app-id.appspot.com'
self.assertEqual(router.build(webapp2.Request.blank('/'), 'user-profile', match[0], match[1]), path)
path = 'http://my-subdomain.app-id.appspot.com/user/calvin/projects'
match = ((), {'username': 'calvin', 'subdomain': 'my-subdomain'})
self.assertEqual(router.match(webapp2.Request.blank(path))[1:], match)
match[1].pop('subdomain')
match[1]['_netloc'] = 'my-subdomain.app-id.appspot.com'
self.assertEqual(router.build(webapp2.Request.blank('/'), 'user-projects', match[0], match[1]), path)
def test_guide_examples(self):
router = webapp2.Router([
DomainRoute(r'www.mydomain.com', [
webapp2.Route('/path1', 'Path1', 'path1'),
]),
DomainRoute(r'<subdomain:(?!www\.)[^.]+>.mydomain.com', [
webapp2.Route('/path2', 'Path2', 'path2'),
]),
DomainRoute(r'<:(app-id\.appspot\.com|www\.mydomain\.com)>', [
webapp2.Route('/path3', 'Path3', 'path3'),
]),
DomainRoute(r'<subdomain:(?!www)[^.]+>.<:(app-id\.appspot\.com|mydomain\.com)>', [
webapp2.Route('/path4', 'Path4', 'path4'),
]),
])
uri1a = 'http://www.mydomain.com/path1'
uri1b = 'http://sub.mydomain.com/path1'
uri1c = 'http://www.mydomain.com/invalid-path'
uri2a = 'http://sub.mydomain.com/path2'
uri2b = 'http://www.mydomain.com/path2'
uri2c = 'http://sub.mydomain.com/invalid-path'
uri2d = 'http://www.mydomain.com/invalid-path'
uri3a = 'http://app-id.appspot.com/path3'
uri3b = 'http://www.mydomain.com/path3'
uri3c = 'http://sub.app-id.appspot.com/path3'
uri3d = 'http://sub.mydomain.com/path3'
uri3e = 'http://app-id.appspot.com/invalid-path'
uri3f = 'http://www.mydomain.com/invalid-path'
uri4a = 'http://sub.app-id.appspot.com/path4'
uri4b = 'http://sub.mydomain.com/path4'
uri4c = 'http://app-id.appspot.com/path4'
uri4d = 'http://www.app-id.appspot.com/path4'
uri4e = 'http://www.mydomain.com/path4'
uri4f = 'http://sub.app-id.appspot.com/invalid-path'
uri4g = 'http://sub.mydomain.com/invalid-path'
self.assertEqual(router.match(webapp2.Request.blank(uri1a))[1:], ((), {}))
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank(uri1b))
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank(uri1c))
self.assertEqual(router.match(webapp2.Request.blank(uri2a))[1:], ((), {'subdomain': 'sub'}))
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank(uri2b))
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank(uri2c))
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank(uri2d))
self.assertEqual(router.match(webapp2.Request.blank(uri3a))[1:], ((), {}))
self.assertEqual(router.match(webapp2.Request.blank(uri3b))[1:], ((), {}))
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank(uri3c))
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank(uri3d))
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank(uri3e))
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank(uri3f))
self.assertEqual(router.match(webapp2.Request.blank(uri4a))[1:], ((), {'subdomain': 'sub'}))
self.assertEqual(router.match(webapp2.Request.blank(uri4b))[1:], ((), {'subdomain': 'sub'}))
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank(uri4c))
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank(uri4d))
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank(uri4e))
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank(uri4f))
self.assertRaises(webapp2.exc.HTTPNotFound, router.match, webapp2.Request.blank(uri4g))
if __name__ == '__main__':
test_base.main()