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