diff options
Diffstat (limited to 'tests/test_routing.py')
| -rw-r--r-- | tests/test_routing.py | 1336 |
1 files changed, 689 insertions, 647 deletions
diff --git a/tests/test_routing.py b/tests/test_routing.py index fa604ee0..835ca684 100644 --- a/tests/test_routing.py +++ b/tests/test_routing.py @@ -8,286 +8,313 @@ :copyright: 2007 Pallets :license: BSD-3-Clause """ -import pytest - import uuid -from tests import strict_eq +import pytest +from . import strict_eq from werkzeug import routing as r -from werkzeug.wrappers import Response -from werkzeug.datastructures import ImmutableDict, MultiDict +from werkzeug.datastructures import ImmutableDict +from werkzeug.datastructures import MultiDict from werkzeug.test import create_environ +from werkzeug.wrappers import Response def test_basic_routing(): - map = r.Map([ - r.Rule('/', endpoint='index'), - r.Rule('/foo', endpoint='foo'), - r.Rule('/bar/', endpoint='bar') - ]) - adapter = map.bind('example.org', '/') - assert adapter.match('/') == ('index', {}) - assert adapter.match('/foo') == ('foo', {}) - assert adapter.match('/bar/') == ('bar', {}) - pytest.raises(r.RequestRedirect, lambda: adapter.match('/bar')) - pytest.raises(r.NotFound, lambda: adapter.match('/blub')) - - adapter = map.bind('example.org', '/test') + map = r.Map( + [ + r.Rule("/", endpoint="index"), + r.Rule("/foo", endpoint="foo"), + r.Rule("/bar/", endpoint="bar"), + ] + ) + adapter = map.bind("example.org", "/") + assert adapter.match("/") == ("index", {}) + assert adapter.match("/foo") == ("foo", {}) + assert adapter.match("/bar/") == ("bar", {}) + pytest.raises(r.RequestRedirect, lambda: adapter.match("/bar")) + pytest.raises(r.NotFound, lambda: adapter.match("/blub")) + + adapter = map.bind("example.org", "/test") with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match('/bar') - assert excinfo.value.new_url == 'http://example.org/test/bar/' + adapter.match("/bar") + assert excinfo.value.new_url == "http://example.org/test/bar/" - adapter = map.bind('example.org', '/') + adapter = map.bind("example.org", "/") with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match('/bar') - assert excinfo.value.new_url == 'http://example.org/bar/' + adapter.match("/bar") + assert excinfo.value.new_url == "http://example.org/bar/" - adapter = map.bind('example.org', '/') + adapter = map.bind("example.org", "/") with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match('/bar', query_args={'aha': 'muhaha'}) - assert excinfo.value.new_url == 'http://example.org/bar/?aha=muhaha' + adapter.match("/bar", query_args={"aha": "muhaha"}) + assert excinfo.value.new_url == "http://example.org/bar/?aha=muhaha" - adapter = map.bind('example.org', '/') + adapter = map.bind("example.org", "/") with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match('/bar', query_args='aha=muhaha') - assert excinfo.value.new_url == 'http://example.org/bar/?aha=muhaha' + adapter.match("/bar", query_args="aha=muhaha") + assert excinfo.value.new_url == "http://example.org/bar/?aha=muhaha" - adapter = map.bind_to_environ(create_environ('/bar?foo=bar', - 'http://example.org/')) + adapter = map.bind_to_environ(create_environ("/bar?foo=bar", "http://example.org/")) with pytest.raises(r.RequestRedirect) as excinfo: adapter.match() - assert excinfo.value.new_url == 'http://example.org/bar/?foo=bar' + assert excinfo.value.new_url == "http://example.org/bar/?foo=bar" def test_strict_slashes_redirect(): - map = r.Map([ - r.Rule('/bar/', endpoint='get', methods=["GET"]), - r.Rule('/bar', endpoint='post', methods=["POST"]), - r.Rule('/foo/', endpoint='foo', methods=["POST"]), - ]) - adapter = map.bind('example.org', '/') + map = r.Map( + [ + r.Rule("/bar/", endpoint="get", methods=["GET"]), + r.Rule("/bar", endpoint="post", methods=["POST"]), + r.Rule("/foo/", endpoint="foo", methods=["POST"]), + ] + ) + adapter = map.bind("example.org", "/") # Check if the actual routes works - assert adapter.match('/bar/', method='GET') == ('get', {}) - assert adapter.match('/bar', method='POST') == ('post', {}) + assert adapter.match("/bar/", method="GET") == ("get", {}) + assert adapter.match("/bar", method="POST") == ("post", {}) # Check if exceptions are correct - pytest.raises(r.RequestRedirect, adapter.match, '/bar', method='GET') - pytest.raises(r.MethodNotAllowed, adapter.match, '/bar/', method='POST') + pytest.raises(r.RequestRedirect, adapter.match, "/bar", method="GET") + pytest.raises(r.MethodNotAllowed, adapter.match, "/bar/", method="POST") with pytest.raises(r.RequestRedirect) as error_info: - adapter.match('/foo', method='POST') + adapter.match("/foo", method="POST") assert error_info.value.code == 308 # Check differently defined order - map = r.Map([ - r.Rule('/bar', endpoint='post', methods=["POST"]), - r.Rule('/bar/', endpoint='get', methods=["GET"]), - ]) - adapter = map.bind('example.org', '/') + map = r.Map( + [ + r.Rule("/bar", endpoint="post", methods=["POST"]), + r.Rule("/bar/", endpoint="get", methods=["GET"]), + ] + ) + adapter = map.bind("example.org", "/") # Check if the actual routes works - assert adapter.match('/bar/', method='GET') == ('get', {}) - assert adapter.match('/bar', method='POST') == ('post', {}) + assert adapter.match("/bar/", method="GET") == ("get", {}) + assert adapter.match("/bar", method="POST") == ("post", {}) # Check if exceptions are correct - pytest.raises(r.RequestRedirect, adapter.match, '/bar', method='GET') - pytest.raises(r.MethodNotAllowed, adapter.match, '/bar/', method='POST') + pytest.raises(r.RequestRedirect, adapter.match, "/bar", method="GET") + pytest.raises(r.MethodNotAllowed, adapter.match, "/bar/", method="POST") # Check what happens when only slash route is defined - map = r.Map([ - r.Rule('/bar/', endpoint='get', methods=["GET"]), - ]) - adapter = map.bind('example.org', '/') + map = r.Map([r.Rule("/bar/", endpoint="get", methods=["GET"])]) + adapter = map.bind("example.org", "/") # Check if the actual routes works - assert adapter.match('/bar/', method='GET') == ('get', {}) + assert adapter.match("/bar/", method="GET") == ("get", {}) # Check if exceptions are correct - pytest.raises(r.RequestRedirect, adapter.match, '/bar', method='GET') - pytest.raises(r.MethodNotAllowed, adapter.match, '/bar/', method='POST') - pytest.raises(r.MethodNotAllowed, adapter.match, '/bar', method='POST') + pytest.raises(r.RequestRedirect, adapter.match, "/bar", method="GET") + pytest.raises(r.MethodNotAllowed, adapter.match, "/bar/", method="POST") + pytest.raises(r.MethodNotAllowed, adapter.match, "/bar", method="POST") def test_environ_defaults(): environ = create_environ("/foo") - strict_eq(environ["PATH_INFO"], '/foo') + strict_eq(environ["PATH_INFO"], "/foo") m = r.Map([r.Rule("/foo", endpoint="foo"), r.Rule("/bar", endpoint="bar")]) a = m.bind_to_environ(environ) - strict_eq(a.match("/foo"), ('foo', {})) - strict_eq(a.match(), ('foo', {})) - strict_eq(a.match("/bar"), ('bar', {})) + strict_eq(a.match("/foo"), ("foo", {})) + strict_eq(a.match(), ("foo", {})) + strict_eq(a.match("/bar"), ("bar", {})) pytest.raises(r.NotFound, a.match, "/bars") def test_environ_nonascii_pathinfo(): - environ = create_environ(u'/лошадь') - m = r.Map([ - r.Rule(u'/', endpoint='index'), - r.Rule(u'/лошадь', endpoint='horse') - ]) + environ = create_environ(u"/лошадь") + m = r.Map([r.Rule(u"/", endpoint="index"), r.Rule(u"/лошадь", endpoint="horse")]) a = m.bind_to_environ(environ) - strict_eq(a.match(u'/'), ('index', {})) - strict_eq(a.match(u'/лошадь'), ('horse', {})) - pytest.raises(r.NotFound, a.match, u'/барсук') + strict_eq(a.match(u"/"), ("index", {})) + strict_eq(a.match(u"/лошадь"), ("horse", {})) + pytest.raises(r.NotFound, a.match, u"/барсук") def test_basic_building(): - map = r.Map([ - r.Rule('/', endpoint='index'), - r.Rule('/foo', endpoint='foo'), - r.Rule('/bar/<baz>', endpoint='bar'), - r.Rule('/bar/<int:bazi>', endpoint='bari'), - r.Rule('/bar/<float:bazf>', endpoint='barf'), - r.Rule('/bar/<path:bazp>', endpoint='barp'), - r.Rule('/hehe', endpoint='blah', subdomain='blah') - ]) - adapter = map.bind('example.org', '/', subdomain='blah') - - assert adapter.build('index', {}) == 'http://example.org/' - assert adapter.build('foo', {}) == 'http://example.org/foo' - assert adapter.build('bar', {'baz': 'blub'}) == \ - 'http://example.org/bar/blub' - assert adapter.build('bari', {'bazi': 50}) == 'http://example.org/bar/50' - assert adapter.build('barf', {'bazf': 0.815}) == \ - 'http://example.org/bar/0.815' - assert adapter.build('barp', {'bazp': 'la/di'}) == \ - 'http://example.org/bar/la/di' - assert adapter.build('blah', {}) == '/hehe' - pytest.raises(r.BuildError, lambda: adapter.build('urks')) - - adapter = map.bind('example.org', '/test', subdomain='blah') - assert adapter.build('index', {}) == 'http://example.org/test/' - assert adapter.build('foo', {}) == 'http://example.org/test/foo' - assert adapter.build('bar', {'baz': 'blub'}) == \ - 'http://example.org/test/bar/blub' - assert adapter.build('bari', {'bazi': 50}) == 'http://example.org/test/bar/50' - assert adapter.build('barf', {'bazf': 0.815}) == 'http://example.org/test/bar/0.815' - assert adapter.build('barp', {'bazp': 'la/di'}) == 'http://example.org/test/bar/la/di' - assert adapter.build('blah', {}) == '/test/hehe' - - adapter = map.bind('example.org') - assert adapter.build('foo', {}) == '/foo' - assert adapter.build('foo', {}, force_external=True) == 'http://example.org/foo' - adapter = map.bind('example.org', url_scheme='') - assert adapter.build('foo', {}) == '/foo' - assert adapter.build('foo', {}, force_external=True) == '//example.org/foo' + map = r.Map( + [ + r.Rule("/", endpoint="index"), + r.Rule("/foo", endpoint="foo"), + r.Rule("/bar/<baz>", endpoint="bar"), + r.Rule("/bar/<int:bazi>", endpoint="bari"), + r.Rule("/bar/<float:bazf>", endpoint="barf"), + r.Rule("/bar/<path:bazp>", endpoint="barp"), + r.Rule("/hehe", endpoint="blah", subdomain="blah"), + ] + ) + adapter = map.bind("example.org", "/", subdomain="blah") + + assert adapter.build("index", {}) == "http://example.org/" + assert adapter.build("foo", {}) == "http://example.org/foo" + assert adapter.build("bar", {"baz": "blub"}) == "http://example.org/bar/blub" + assert adapter.build("bari", {"bazi": 50}) == "http://example.org/bar/50" + assert adapter.build("barf", {"bazf": 0.815}) == "http://example.org/bar/0.815" + assert adapter.build("barp", {"bazp": "la/di"}) == "http://example.org/bar/la/di" + assert adapter.build("blah", {}) == "/hehe" + pytest.raises(r.BuildError, lambda: adapter.build("urks")) + + adapter = map.bind("example.org", "/test", subdomain="blah") + assert adapter.build("index", {}) == "http://example.org/test/" + assert adapter.build("foo", {}) == "http://example.org/test/foo" + assert adapter.build("bar", {"baz": "blub"}) == "http://example.org/test/bar/blub" + assert adapter.build("bari", {"bazi": 50}) == "http://example.org/test/bar/50" + assert adapter.build("barf", {"bazf": 0.815}) == "http://example.org/test/bar/0.815" + assert ( + adapter.build("barp", {"bazp": "la/di"}) == "http://example.org/test/bar/la/di" + ) + assert adapter.build("blah", {}) == "/test/hehe" + + adapter = map.bind("example.org") + assert adapter.build("foo", {}) == "/foo" + assert adapter.build("foo", {}, force_external=True) == "http://example.org/foo" + adapter = map.bind("example.org", url_scheme="") + assert adapter.build("foo", {}) == "/foo" + assert adapter.build("foo", {}, force_external=True) == "//example.org/foo" def test_long_build(): - long_args = dict(('v%d' % x, x) for x in range(10000)) - map = r.Map([ - r.Rule(''.join('/<%s>' % k for k in long_args.keys()), endpoint='bleep', build_only=True) - ]) - adapter = map.bind('localhost', '/') - url = adapter.build('bleep', long_args) - url += '/' + long_args = dict(("v%d" % x, x) for x in range(10000)) + map = r.Map( + [ + r.Rule( + "".join("/<%s>" % k for k in long_args.keys()), + endpoint="bleep", + build_only=True, + ) + ] + ) + adapter = map.bind("localhost", "/") + url = adapter.build("bleep", long_args) + url += "/" for v in long_args.values(): - assert '/%d' % v in url + assert "/%d" % v in url def test_defaults(): - map = r.Map([ - r.Rule('/foo/', defaults={'page': 1}, endpoint='foo'), - r.Rule('/foo/<int:page>', endpoint='foo') - ]) - adapter = map.bind('example.org', '/') + map = r.Map( + [ + r.Rule("/foo/", defaults={"page": 1}, endpoint="foo"), + r.Rule("/foo/<int:page>", endpoint="foo"), + ] + ) + adapter = map.bind("example.org", "/") - assert adapter.match('/foo/') == ('foo', {'page': 1}) - pytest.raises(r.RequestRedirect, lambda: adapter.match('/foo/1')) - assert adapter.match('/foo/2') == ('foo', {'page': 2}) - assert adapter.build('foo', {}) == '/foo/' - assert adapter.build('foo', {'page': 1}) == '/foo/' - assert adapter.build('foo', {'page': 2}) == '/foo/2' + assert adapter.match("/foo/") == ("foo", {"page": 1}) + pytest.raises(r.RequestRedirect, lambda: adapter.match("/foo/1")) + assert adapter.match("/foo/2") == ("foo", {"page": 2}) + assert adapter.build("foo", {}) == "/foo/" + assert adapter.build("foo", {"page": 1}) == "/foo/" + assert adapter.build("foo", {"page": 2}) == "/foo/2" def test_negative(): - map = r.Map([ - r.Rule('/foos/<int(signed=True):page>', endpoint='foos'), - r.Rule('/bars/<float(signed=True):page>', endpoint='bars'), - r.Rule('/foo/<int:page>', endpoint='foo'), - r.Rule('/bar/<float:page>', endpoint='bar') - ]) - adapter = map.bind('example.org', '/') - - assert adapter.match('/foos/-2') == ('foos', {'page': -2}) - assert adapter.match('/foos/-50') == ('foos', {'page': -50}) - assert adapter.match('/bars/-2.0') == ('bars', {'page': -2.0}) - assert adapter.match('/bars/-0.185') == ('bars', {'page': -0.185}) + map = r.Map( + [ + r.Rule("/foos/<int(signed=True):page>", endpoint="foos"), + r.Rule("/bars/<float(signed=True):page>", endpoint="bars"), + r.Rule("/foo/<int:page>", endpoint="foo"), + r.Rule("/bar/<float:page>", endpoint="bar"), + ] + ) + adapter = map.bind("example.org", "/") + + assert adapter.match("/foos/-2") == ("foos", {"page": -2}) + assert adapter.match("/foos/-50") == ("foos", {"page": -50}) + assert adapter.match("/bars/-2.0") == ("bars", {"page": -2.0}) + assert adapter.match("/bars/-0.185") == ("bars", {"page": -0.185}) # Make sure signed values are rejected in unsigned mode - pytest.raises(r.NotFound, lambda: adapter.match('/foo/-2')) - pytest.raises(r.NotFound, lambda: adapter.match('/foo/-50')) - pytest.raises(r.NotFound, lambda: adapter.match('/bar/-0.185')) - pytest.raises(r.NotFound, lambda: adapter.match('/bar/-2.0')) + pytest.raises(r.NotFound, lambda: adapter.match("/foo/-2")) + pytest.raises(r.NotFound, lambda: adapter.match("/foo/-50")) + pytest.raises(r.NotFound, lambda: adapter.match("/bar/-0.185")) + pytest.raises(r.NotFound, lambda: adapter.match("/bar/-2.0")) def test_greedy(): - map = r.Map([ - r.Rule('/foo', endpoint='foo'), - r.Rule('/<path:bar>', endpoint='bar'), - r.Rule('/<path:bar>/<path:blub>', endpoint='bar') - ]) - adapter = map.bind('example.org', '/') + map = r.Map( + [ + r.Rule("/foo", endpoint="foo"), + r.Rule("/<path:bar>", endpoint="bar"), + r.Rule("/<path:bar>/<path:blub>", endpoint="bar"), + ] + ) + adapter = map.bind("example.org", "/") - assert adapter.match('/foo') == ('foo', {}) - assert adapter.match('/blub') == ('bar', {'bar': 'blub'}) - assert adapter.match('/he/he') == ('bar', {'bar': 'he', 'blub': 'he'}) + assert adapter.match("/foo") == ("foo", {}) + assert adapter.match("/blub") == ("bar", {"bar": "blub"}) + assert adapter.match("/he/he") == ("bar", {"bar": "he", "blub": "he"}) - assert adapter.build('foo', {}) == '/foo' - assert adapter.build('bar', {'bar': 'blub'}) == '/blub' - assert adapter.build('bar', {'bar': 'blub', 'blub': 'bar'}) == '/blub/bar' + assert adapter.build("foo", {}) == "/foo" + assert adapter.build("bar", {"bar": "blub"}) == "/blub" + assert adapter.build("bar", {"bar": "blub", "blub": "bar"}) == "/blub/bar" def test_path(): - map = r.Map([ - r.Rule('/', defaults={'name': 'FrontPage'}, endpoint='page'), - r.Rule('/Special', endpoint='special'), - r.Rule('/<int:year>', endpoint='year'), - r.Rule('/<path:name>:foo', endpoint='foopage'), - r.Rule('/<path:name>:<path:name2>', endpoint='twopage'), - r.Rule('/<path:name>', endpoint='page'), - r.Rule('/<path:name>/edit', endpoint='editpage'), - r.Rule('/<path:name>/silly/<path:name2>', endpoint='sillypage'), - r.Rule('/<path:name>/silly/<path:name2>/edit', endpoint='editsillypage'), - r.Rule('/Talk:<path:name>', endpoint='talk'), - r.Rule('/User:<username>', endpoint='user'), - r.Rule('/User:<username>/<path:name>', endpoint='userpage'), - r.Rule('/User:<username>/comment/<int:id>-<int:replyId>', endpoint='usercomment'), - r.Rule('/Files/<path:file>', endpoint='files'), - r.Rule('/<admin>/<manage>/<things>', endpoint='admin'), - ]) - adapter = map.bind('example.org', '/') - - assert adapter.match('/') == ('page', {'name': 'FrontPage'}) - pytest.raises(r.RequestRedirect, lambda: adapter.match('/FrontPage')) - assert adapter.match('/Special') == ('special', {}) - assert adapter.match('/2007') == ('year', {'year': 2007}) - assert adapter.match('/Some:foo') == ('foopage', {'name': 'Some'}) - assert adapter.match('/Some:bar') == ('twopage', {'name': 'Some', 'name2': 'bar'}) - assert adapter.match('/Some/Page') == ('page', {'name': 'Some/Page'}) - assert adapter.match('/Some/Page/edit') == ('editpage', {'name': 'Some/Page'}) - assert adapter.match('/Foo/silly/bar') == ('sillypage', {'name': 'Foo', 'name2': 'bar'}) - assert adapter.match( - '/Foo/silly/bar/edit') == ('editsillypage', {'name': 'Foo', 'name2': 'bar'}) - assert adapter.match('/Talk:Foo/Bar') == ('talk', {'name': 'Foo/Bar'}) - assert adapter.match('/User:thomas') == ('user', {'username': 'thomas'}) - assert adapter.match('/User:thomas/projects/werkzeug') == \ - ('userpage', {'username': 'thomas', 'name': 'projects/werkzeug'}) - assert adapter.match('/User:thomas/comment/123-456') == \ - ('usercomment', {'username': 'thomas', 'id': 123, 'replyId': 456}) - assert adapter.match('/Files/downloads/werkzeug/0.2.zip') == \ - ('files', {'file': 'downloads/werkzeug/0.2.zip'}) - assert adapter.match('/Jerry/eats/cheese') == \ - ('admin', {'admin': 'Jerry', 'manage': 'eats', 'things': 'cheese'}) + map = r.Map( + [ + r.Rule("/", defaults={"name": "FrontPage"}, endpoint="page"), + r.Rule("/Special", endpoint="special"), + r.Rule("/<int:year>", endpoint="year"), + r.Rule("/<path:name>:foo", endpoint="foopage"), + r.Rule("/<path:name>:<path:name2>", endpoint="twopage"), + r.Rule("/<path:name>", endpoint="page"), + r.Rule("/<path:name>/edit", endpoint="editpage"), + r.Rule("/<path:name>/silly/<path:name2>", endpoint="sillypage"), + r.Rule("/<path:name>/silly/<path:name2>/edit", endpoint="editsillypage"), + r.Rule("/Talk:<path:name>", endpoint="talk"), + r.Rule("/User:<username>", endpoint="user"), + r.Rule("/User:<username>/<path:name>", endpoint="userpage"), + r.Rule( + "/User:<username>/comment/<int:id>-<int:replyId>", + endpoint="usercomment", + ), + r.Rule("/Files/<path:file>", endpoint="files"), + r.Rule("/<admin>/<manage>/<things>", endpoint="admin"), + ] + ) + adapter = map.bind("example.org", "/") + + assert adapter.match("/") == ("page", {"name": "FrontPage"}) + pytest.raises(r.RequestRedirect, lambda: adapter.match("/FrontPage")) + assert adapter.match("/Special") == ("special", {}) + assert adapter.match("/2007") == ("year", {"year": 2007}) + assert adapter.match("/Some:foo") == ("foopage", {"name": "Some"}) + assert adapter.match("/Some:bar") == ("twopage", {"name": "Some", "name2": "bar"}) + assert adapter.match("/Some/Page") == ("page", {"name": "Some/Page"}) + assert adapter.match("/Some/Page/edit") == ("editpage", {"name": "Some/Page"}) + assert adapter.match("/Foo/silly/bar") == ( + "sillypage", + {"name": "Foo", "name2": "bar"}, + ) + assert adapter.match("/Foo/silly/bar/edit") == ( + "editsillypage", + {"name": "Foo", "name2": "bar"}, + ) + assert adapter.match("/Talk:Foo/Bar") == ("talk", {"name": "Foo/Bar"}) + assert adapter.match("/User:thomas") == ("user", {"username": "thomas"}) + assert adapter.match("/User:thomas/projects/werkzeug") == ( + "userpage", + {"username": "thomas", "name": "projects/werkzeug"}, + ) + assert adapter.match("/User:thomas/comment/123-456") == ( + "usercomment", + {"username": "thomas", "id": 123, "replyId": 456}, + ) + assert adapter.match("/Files/downloads/werkzeug/0.2.zip") == ( + "files", + {"file": "downloads/werkzeug/0.2.zip"}, + ) + assert adapter.match("/Jerry/eats/cheese") == ( + "admin", + {"admin": "Jerry", "manage": "eats", "things": "cheese"}, + ) def test_dispatch(): - env = create_environ('/') - map = r.Map([ - r.Rule('/', endpoint='root'), - r.Rule('/foo/', endpoint='foo') - ]) + env = create_environ("/") + map = r.Map([r.Rule("/", endpoint="root"), r.Rule("/foo/", endpoint="foo")]) adapter = map.bind_to_environ(env) raise_this = None @@ -296,602 +323,625 @@ def test_dispatch(): if raise_this is not None: raise raise_this return Response(repr((endpoint, values))) - dispatch = lambda p, q=False: Response.force_type( - adapter.dispatch(view_func, p, catch_http_exceptions=q), - env - ) - assert dispatch('/').data == b"('root', {})" - assert dispatch('/foo').status_code == 308 + def dispatch(path, quiet=False): + return Response.force_type( + adapter.dispatch(view_func, path, catch_http_exceptions=quiet), env + ) + + assert dispatch("/").data == b"('root', {})" + assert dispatch("/foo").status_code == 308 raise_this = r.NotFound() - pytest.raises(r.NotFound, lambda: dispatch('/bar')) - assert dispatch('/bar', True).status_code == 404 + pytest.raises(r.NotFound, lambda: dispatch("/bar")) + assert dispatch("/bar", True).status_code == 404 def test_http_host_before_server_name(): env = { - 'HTTP_HOST': 'wiki.example.com', - 'SERVER_NAME': 'web0.example.com', - 'SERVER_PORT': '80', - 'SCRIPT_NAME': '', - 'PATH_INFO': '', - 'REQUEST_METHOD': 'GET', - 'wsgi.url_scheme': 'http' + "HTTP_HOST": "wiki.example.com", + "SERVER_NAME": "web0.example.com", + "SERVER_PORT": "80", + "SCRIPT_NAME": "", + "PATH_INFO": "", + "REQUEST_METHOD": "GET", + "wsgi.url_scheme": "http", } - map = r.Map([r.Rule('/', endpoint='index', subdomain='wiki')]) - adapter = map.bind_to_environ(env, server_name='example.com') - assert adapter.match('/') == ('index', {}) - assert adapter.build('index', force_external=True) == 'http://wiki.example.com/' - assert adapter.build('index') == '/' + map = r.Map([r.Rule("/", endpoint="index", subdomain="wiki")]) + adapter = map.bind_to_environ(env, server_name="example.com") + assert adapter.match("/") == ("index", {}) + assert adapter.build("index", force_external=True) == "http://wiki.example.com/" + assert adapter.build("index") == "/" - env['HTTP_HOST'] = 'admin.example.com' - adapter = map.bind_to_environ(env, server_name='example.com') - assert adapter.build('index') == 'http://wiki.example.com/' + env["HTTP_HOST"] = "admin.example.com" + adapter = map.bind_to_environ(env, server_name="example.com") + assert adapter.build("index") == "http://wiki.example.com/" def test_adapter_url_parameter_sorting(): - map = r.Map([r.Rule('/', endpoint='index')], sort_parameters=True, - sort_key=lambda x: x[1]) - adapter = map.bind('localhost', '/') - assert adapter.build('index', {'x': 20, 'y': 10, 'z': 30}, - force_external=True) == 'http://localhost/?y=10&x=20&z=30' + map = r.Map( + [r.Rule("/", endpoint="index")], sort_parameters=True, sort_key=lambda x: x[1] + ) + adapter = map.bind("localhost", "/") + assert ( + adapter.build("index", {"x": 20, "y": 10, "z": 30}, force_external=True) + == "http://localhost/?y=10&x=20&z=30" + ) def test_request_direct_charset_bug(): - map = r.Map([r.Rule(u'/öäü/')]) - adapter = map.bind('localhost', '/') + map = r.Map([r.Rule(u"/öäü/")]) + adapter = map.bind("localhost", "/") with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match(u'/öäü') - assert excinfo.value.new_url == 'http://localhost/%C3%B6%C3%A4%C3%BC/' + adapter.match(u"/öäü") + assert excinfo.value.new_url == "http://localhost/%C3%B6%C3%A4%C3%BC/" def test_request_redirect_default(): - map = r.Map([r.Rule(u'/foo', defaults={'bar': 42}), - r.Rule(u'/foo/<int:bar>')]) - adapter = map.bind('localhost', '/') + map = r.Map([r.Rule(u"/foo", defaults={"bar": 42}), r.Rule(u"/foo/<int:bar>")]) + adapter = map.bind("localhost", "/") with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match(u'/foo/42') - assert excinfo.value.new_url == 'http://localhost/foo' + adapter.match(u"/foo/42") + assert excinfo.value.new_url == "http://localhost/foo" def test_request_redirect_default_subdomain(): - map = r.Map([r.Rule(u'/foo', defaults={'bar': 42}, subdomain='test'), - r.Rule(u'/foo/<int:bar>', subdomain='other')]) - adapter = map.bind('localhost', '/', subdomain='other') + map = r.Map( + [ + r.Rule(u"/foo", defaults={"bar": 42}, subdomain="test"), + r.Rule(u"/foo/<int:bar>", subdomain="other"), + ] + ) + adapter = map.bind("localhost", "/", subdomain="other") with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match(u'/foo/42') - assert excinfo.value.new_url == 'http://test.localhost/foo' + adapter.match(u"/foo/42") + assert excinfo.value.new_url == "http://test.localhost/foo" def test_adapter_match_return_rule(): - rule = r.Rule('/foo/', endpoint='foo') + rule = r.Rule("/foo/", endpoint="foo") map = r.Map([rule]) - adapter = map.bind('localhost', '/') - assert adapter.match('/foo/', return_rule=True) == (rule, {}) + adapter = map.bind("localhost", "/") + assert adapter.match("/foo/", return_rule=True) == (rule, {}) def test_server_name_interpolation(): - server_name = 'example.invalid' - map = r.Map([r.Rule('/', endpoint='index'), - r.Rule('/', endpoint='alt', subdomain='alt')]) + server_name = "example.invalid" + map = r.Map( + [r.Rule("/", endpoint="index"), r.Rule("/", endpoint="alt", subdomain="alt")] + ) - env = create_environ('/', 'http://%s/' % server_name) + env = create_environ("/", "http://%s/" % server_name) adapter = map.bind_to_environ(env, server_name=server_name) - assert adapter.match() == ('index', {}) + assert adapter.match() == ("index", {}) - env = create_environ('/', 'http://alt.%s/' % server_name) + env = create_environ("/", "http://alt.%s/" % server_name) adapter = map.bind_to_environ(env, server_name=server_name) - assert adapter.match() == ('alt', {}) + assert adapter.match() == ("alt", {}) - env = create_environ('/', 'http://%s/' % server_name) - adapter = map.bind_to_environ(env, server_name='foo') - assert adapter.subdomain == '<invalid>' + env = create_environ("/", "http://%s/" % server_name) + adapter = map.bind_to_environ(env, server_name="foo") + assert adapter.subdomain == "<invalid>" def test_rule_emptying(): - rule = r.Rule('/foo', {'meh': 'muh'}, 'x', ['POST'], - False, 'x', True, None) + rule = r.Rule("/foo", {"meh": "muh"}, "x", ["POST"], False, "x", True, None) rule2 = rule.empty() assert rule.__dict__ == rule2.__dict__ - rule.methods.add('GET') + rule.methods.add("GET") assert rule.__dict__ != rule2.__dict__ - rule.methods.discard('GET') - rule.defaults['meh'] = 'aha' + rule.methods.discard("GET") + rule.defaults["meh"] = "aha" assert rule.__dict__ != rule2.__dict__ def test_rule_unhashable(): - rule = r.Rule('/foo', {'meh': 'muh'}, 'x', ['POST'], - False, 'x', True, None) + rule = r.Rule("/foo", {"meh": "muh"}, "x", ["POST"], False, "x", True, None) pytest.raises(TypeError, hash, rule) def test_rule_templates(): - testcase = r.RuleTemplate([ - r.Submount( - '/test/$app', - [r.Rule('/foo/', endpoint='handle_foo'), - r.Rule('/bar/', endpoint='handle_bar'), - r.Rule('/baz/', endpoint='handle_baz')]), - r.EndpointPrefix( - '${app}', - [r.Rule('/${app}-blah', endpoint='bar'), - r.Rule('/${app}-meh', endpoint='baz')]), - r.Subdomain( - '$app', - [r.Rule('/blah', endpoint='x_bar'), - r.Rule('/meh', endpoint='x_baz')]) - ]) + testcase = r.RuleTemplate( + [ + r.Submount( + "/test/$app", + [ + r.Rule("/foo/", endpoint="handle_foo"), + r.Rule("/bar/", endpoint="handle_bar"), + r.Rule("/baz/", endpoint="handle_baz"), + ], + ), + r.EndpointPrefix( + "${app}", + [ + r.Rule("/${app}-blah", endpoint="bar"), + r.Rule("/${app}-meh", endpoint="baz"), + ], + ), + r.Subdomain( + "$app", + [r.Rule("/blah", endpoint="x_bar"), r.Rule("/meh", endpoint="x_baz")], + ), + ] + ) url_map = r.Map( - [testcase(app='test1'), testcase(app='test2'), testcase(app='test3'), testcase(app='test4') - ]) - - out = sorted([(x.rule, x.subdomain, x.endpoint) - for x in url_map.iter_rules()]) - - assert out == ([ - ('/blah', 'test1', 'x_bar'), - ('/blah', 'test2', 'x_bar'), - ('/blah', 'test3', 'x_bar'), - ('/blah', 'test4', 'x_bar'), - ('/meh', 'test1', 'x_baz'), - ('/meh', 'test2', 'x_baz'), - ('/meh', 'test3', 'x_baz'), - ('/meh', 'test4', 'x_baz'), - ('/test/test1/bar/', '', 'handle_bar'), - ('/test/test1/baz/', '', 'handle_baz'), - ('/test/test1/foo/', '', 'handle_foo'), - ('/test/test2/bar/', '', 'handle_bar'), - ('/test/test2/baz/', '', 'handle_baz'), - ('/test/test2/foo/', '', 'handle_foo'), - ('/test/test3/bar/', '', 'handle_bar'), - ('/test/test3/baz/', '', 'handle_baz'), - ('/test/test3/foo/', '', 'handle_foo'), - ('/test/test4/bar/', '', 'handle_bar'), - ('/test/test4/baz/', '', 'handle_baz'), - ('/test/test4/foo/', '', 'handle_foo'), - ('/test1-blah', '', 'test1bar'), - ('/test1-meh', '', 'test1baz'), - ('/test2-blah', '', 'test2bar'), - ('/test2-meh', '', 'test2baz'), - ('/test3-blah', '', 'test3bar'), - ('/test3-meh', '', 'test3baz'), - ('/test4-blah', '', 'test4bar'), - ('/test4-meh', '', 'test4baz') - ]) + [ + testcase(app="test1"), + testcase(app="test2"), + testcase(app="test3"), + testcase(app="test4"), + ] + ) + + out = sorted([(x.rule, x.subdomain, x.endpoint) for x in url_map.iter_rules()]) + + assert out == [ + ("/blah", "test1", "x_bar"), + ("/blah", "test2", "x_bar"), + ("/blah", "test3", "x_bar"), + ("/blah", "test4", "x_bar"), + ("/meh", "test1", "x_baz"), + ("/meh", "test2", "x_baz"), + ("/meh", "test3", "x_baz"), + ("/meh", "test4", "x_baz"), + ("/test/test1/bar/", "", "handle_bar"), + ("/test/test1/baz/", "", "handle_baz"), + ("/test/test1/foo/", "", "handle_foo"), + ("/test/test2/bar/", "", "handle_bar"), + ("/test/test2/baz/", "", "handle_baz"), + ("/test/test2/foo/", "", "handle_foo"), + ("/test/test3/bar/", "", "handle_bar"), + ("/test/test3/baz/", "", "handle_baz"), + ("/test/test3/foo/", "", "handle_foo"), + ("/test/test4/bar/", "", "handle_bar"), + ("/test/test4/baz/", "", "handle_baz"), + ("/test/test4/foo/", "", "handle_foo"), + ("/test1-blah", "", "test1bar"), + ("/test1-meh", "", "test1baz"), + ("/test2-blah", "", "test2bar"), + ("/test2-meh", "", "test2baz"), + ("/test3-blah", "", "test3bar"), + ("/test3-meh", "", "test3baz"), + ("/test4-blah", "", "test4bar"), + ("/test4-meh", "", "test4baz"), + ] def test_non_string_parts(): - m = r.Map([ - r.Rule('/<foo>', endpoint='foo') - ]) - a = m.bind('example.com') - assert a.build('foo', {'foo': 42}) == '/42' + m = r.Map([r.Rule("/<foo>", endpoint="foo")]) + a = m.bind("example.com") + assert a.build("foo", {"foo": 42}) == "/42" def test_complex_routing_rules(): - m = r.Map([ - r.Rule('/', endpoint='index'), - r.Rule('/<int:blub>', endpoint='an_int'), - r.Rule('/<blub>', endpoint='a_string'), - r.Rule('/foo/', endpoint='nested'), - r.Rule('/foobar/', endpoint='nestedbar'), - r.Rule('/foo/<path:testing>/', endpoint='nested_show'), - r.Rule('/foo/<path:testing>/edit', endpoint='nested_edit'), - r.Rule('/users/', endpoint='users', defaults={'page': 1}), - r.Rule('/users/page/<int:page>', endpoint='users'), - r.Rule('/foox', endpoint='foox'), - r.Rule('/<path:bar>/<path:blub>', endpoint='barx_path_path') - ]) - a = m.bind('example.com') - - assert a.match('/') == ('index', {}) - assert a.match('/42') == ('an_int', {'blub': 42}) - assert a.match('/blub') == ('a_string', {'blub': 'blub'}) - assert a.match('/foo/') == ('nested', {}) - assert a.match('/foobar/') == ('nestedbar', {}) - assert a.match('/foo/1/2/3/') == ('nested_show', {'testing': '1/2/3'}) - assert a.match('/foo/1/2/3/edit') == ('nested_edit', {'testing': '1/2/3'}) - assert a.match('/users/') == ('users', {'page': 1}) - assert a.match('/users/page/2') == ('users', {'page': 2}) - assert a.match('/foox') == ('foox', {}) - assert a.match('/1/2/3') == ('barx_path_path', {'bar': '1', 'blub': '2/3'}) - - assert a.build('index') == '/' - assert a.build('an_int', {'blub': 42}) == '/42' - assert a.build('a_string', {'blub': 'test'}) == '/test' - assert a.build('nested') == '/foo/' - assert a.build('nestedbar') == '/foobar/' - assert a.build('nested_show', {'testing': '1/2/3'}) == '/foo/1/2/3/' - assert a.build('nested_edit', {'testing': '1/2/3'}) == '/foo/1/2/3/edit' - assert a.build('users', {'page': 1}) == '/users/' - assert a.build('users', {'page': 2}) == '/users/page/2' - assert a.build('foox') == '/foox' - assert a.build('barx_path_path', {'bar': '1', 'blub': '2/3'}) == '/1/2/3' + m = r.Map( + [ + r.Rule("/", endpoint="index"), + r.Rule("/<int:blub>", endpoint="an_int"), + r.Rule("/<blub>", endpoint="a_string"), + r.Rule("/foo/", endpoint="nested"), + r.Rule("/foobar/", endpoint="nestedbar"), + r.Rule("/foo/<path:testing>/", endpoint="nested_show"), + r.Rule("/foo/<path:testing>/edit", endpoint="nested_edit"), + r.Rule("/users/", endpoint="users", defaults={"page": 1}), + r.Rule("/users/page/<int:page>", endpoint="users"), + r.Rule("/foox", endpoint="foox"), + r.Rule("/<path:bar>/<path:blub>", endpoint="barx_path_path"), + ] + ) + a = m.bind("example.com") + + assert a.match("/") == ("index", {}) + assert a.match("/42") == ("an_int", {"blub": 42}) + assert a.match("/blub") == ("a_string", {"blub": "blub"}) + assert a.match("/foo/") == ("nested", {}) + assert a.match("/foobar/") == ("nestedbar", {}) + assert a.match("/foo/1/2/3/") == ("nested_show", {"testing": "1/2/3"}) + assert a.match("/foo/1/2/3/edit") == ("nested_edit", {"testing": "1/2/3"}) + assert a.match("/users/") == ("users", {"page": 1}) + assert a.match("/users/page/2") == ("users", {"page": 2}) + assert a.match("/foox") == ("foox", {}) + assert a.match("/1/2/3") == ("barx_path_path", {"bar": "1", "blub": "2/3"}) + + assert a.build("index") == "/" + assert a.build("an_int", {"blub": 42}) == "/42" + assert a.build("a_string", {"blub": "test"}) == "/test" + assert a.build("nested") == "/foo/" + assert a.build("nestedbar") == "/foobar/" + assert a.build("nested_show", {"testing": "1/2/3"}) == "/foo/1/2/3/" + assert a.build("nested_edit", {"testing": "1/2/3"}) == "/foo/1/2/3/edit" + assert a.build("users", {"page": 1}) == "/users/" + assert a.build("users", {"page": 2}) == "/users/page/2" + assert a.build("foox") == "/foox" + assert a.build("barx_path_path", {"bar": "1", "blub": "2/3"}) == "/1/2/3" def test_default_converters(): class MyMap(r.Map): default_converters = r.Map.default_converters.copy() - default_converters['foo'] = r.UnicodeConverter + default_converters["foo"] = r.UnicodeConverter + assert isinstance(r.Map.default_converters, ImmutableDict) - m = MyMap([ - r.Rule('/a/<foo:a>', endpoint='a'), - r.Rule('/b/<foo:b>', endpoint='b'), - r.Rule('/c/<c>', endpoint='c') - ], converters={'bar': r.UnicodeConverter}) - a = m.bind('example.org', '/') - assert a.match('/a/1') == ('a', {'a': '1'}) - assert a.match('/b/2') == ('b', {'b': '2'}) - assert a.match('/c/3') == ('c', {'c': '3'}) - assert 'foo' not in r.Map.default_converters + m = MyMap( + [ + r.Rule("/a/<foo:a>", endpoint="a"), + r.Rule("/b/<foo:b>", endpoint="b"), + r.Rule("/c/<c>", endpoint="c"), + ], + converters={"bar": r.UnicodeConverter}, + ) + a = m.bind("example.org", "/") + assert a.match("/a/1") == ("a", {"a": "1"}) + assert a.match("/b/2") == ("b", {"b": "2"}) + assert a.match("/c/3") == ("c", {"c": "3"}) + assert "foo" not in r.Map.default_converters def test_uuid_converter(): - m = r.Map([ - r.Rule('/a/<uuid:a_uuid>', endpoint='a') - ]) - a = m.bind('example.org', '/') - rooute, kwargs = a.match('/a/a8098c1a-f86e-11da-bd1a-00112444be1e') - assert type(kwargs['a_uuid']) == uuid.UUID + m = r.Map([r.Rule("/a/<uuid:a_uuid>", endpoint="a")]) + a = m.bind("example.org", "/") + rooute, kwargs = a.match("/a/a8098c1a-f86e-11da-bd1a-00112444be1e") + assert type(kwargs["a_uuid"]) == uuid.UUID def test_converter_with_tuples(): - ''' + """ Regression test for https://github.com/pallets/werkzeug/issues/709 - ''' - class TwoValueConverter(r.BaseConverter): + """ + class TwoValueConverter(r.BaseConverter): def __init__(self, *args, **kwargs): super(TwoValueConverter, self).__init__(*args, **kwargs) - self.regex = r'(\w\w+)/(\w\w+)' + self.regex = r"(\w\w+)/(\w\w+)" def to_python(self, two_values): - one, two = two_values.split('/') + one, two = two_values.split("/") return one, two def to_url(self, values): return "%s/%s" % (values[0], values[1]) - map = r.Map([ - r.Rule('/<two:foo>/', endpoint='handler') - ], converters={'two': TwoValueConverter}) - a = map.bind('example.org', '/') - route, kwargs = a.match('/qwert/yuiop/') - assert kwargs['foo'] == ('qwert', 'yuiop') + map = r.Map( + [r.Rule("/<two:foo>/", endpoint="handler")], + converters={"two": TwoValueConverter}, + ) + a = map.bind("example.org", "/") + route, kwargs = a.match("/qwert/yuiop/") + assert kwargs["foo"] == ("qwert", "yuiop") def test_anyconverter(): - m = r.Map([ - r.Rule('/<any(a1, a2):a>', endpoint='no_dot'), - r.Rule('/<any(a.1, a.2):a>', endpoint='yes_dot') - ]) - a = m.bind('example.org', '/') - assert a.match('/a1') == ('no_dot', {'a': 'a1'}) - assert a.match('/a2') == ('no_dot', {'a': 'a2'}) - assert a.match('/a.1') == ('yes_dot', {'a': 'a.1'}) - assert a.match('/a.2') == ('yes_dot', {'a': 'a.2'}) + m = r.Map( + [ + r.Rule("/<any(a1, a2):a>", endpoint="no_dot"), + r.Rule("/<any(a.1, a.2):a>", endpoint="yes_dot"), + ] + ) + a = m.bind("example.org", "/") + assert a.match("/a1") == ("no_dot", {"a": "a1"}) + assert a.match("/a2") == ("no_dot", {"a": "a2"}) + assert a.match("/a.1") == ("yes_dot", {"a": "a.1"}) + assert a.match("/a.2") == ("yes_dot", {"a": "a.2"}) def test_build_append_unknown(): - map = r.Map([ - r.Rule('/bar/<float:bazf>', endpoint='barf') - ]) - adapter = map.bind('example.org', '/', subdomain='blah') - assert adapter.build('barf', {'bazf': 0.815, 'bif': 1.0}) == \ - 'http://example.org/bar/0.815?bif=1.0' - assert adapter.build('barf', {'bazf': 0.815, 'bif': 1.0}, - append_unknown=False) == 'http://example.org/bar/0.815' + map = r.Map([r.Rule("/bar/<float:bazf>", endpoint="barf")]) + adapter = map.bind("example.org", "/", subdomain="blah") + assert ( + adapter.build("barf", {"bazf": 0.815, "bif": 1.0}) + == "http://example.org/bar/0.815?bif=1.0" + ) + assert ( + adapter.build("barf", {"bazf": 0.815, "bif": 1.0}, append_unknown=False) + == "http://example.org/bar/0.815" + ) def test_build_append_multiple(): - map = r.Map([ - r.Rule('/bar/<float:foo>', endpoint='endp') - ]) - adapter = map.bind('example.org', '/', subdomain='subd') - params = {'foo': 0.815, 'x': [1.0, 3.0], 'y': 2.0} - a, b = adapter.build('endp', params).split('?') - assert a == 'http://example.org/bar/0.815' - assert set(b.split('&')) == set('y=2.0&x=1.0&x=3.0'.split('&')) + map = r.Map([r.Rule("/bar/<float:foo>", endpoint="endp")]) + adapter = map.bind("example.org", "/", subdomain="subd") + params = {"foo": 0.815, "x": [1.0, 3.0], "y": 2.0} + a, b = adapter.build("endp", params).split("?") + assert a == "http://example.org/bar/0.815" + assert set(b.split("&")) == set("y=2.0&x=1.0&x=3.0".split("&")) def test_build_append_multidict(): - map = r.Map([ - r.Rule('/bar/<float:foo>', endpoint='endp') - ]) - adapter = map.bind('example.org', '/', subdomain='subd') - params = MultiDict( - (('foo', 0.815), ('x', 1.0), ('x', 3.0), ('y', 2.0))) - a, b = adapter.build('endp', params).split('?') - assert a == 'http://example.org/bar/0.815' - assert set(b.split('&')) == set('y=2.0&x=1.0&x=3.0'.split('&')) + map = r.Map([r.Rule("/bar/<float:foo>", endpoint="endp")]) + adapter = map.bind("example.org", "/", subdomain="subd") + params = MultiDict((("foo", 0.815), ("x", 1.0), ("x", 3.0), ("y", 2.0))) + a, b = adapter.build("endp", params).split("?") + assert a == "http://example.org/bar/0.815" + assert set(b.split("&")) == set("y=2.0&x=1.0&x=3.0".split("&")) def test_build_drop_none(): - map = r.Map([ - r.Rule('/flob/<flub>', endpoint='endp') - ]) - adapter = map.bind('', '/') - params = {'flub': None, 'flop': None} + map = r.Map([r.Rule("/flob/<flub>", endpoint="endp")]) + adapter = map.bind("", "/") + params = {"flub": None, "flop": None} with pytest.raises(r.BuildError): - x = adapter.build('endp', params) + x = adapter.build("endp", params) assert not x - params = {'flub': 'x', 'flop': None} - url = adapter.build('endp', params) - assert 'flop' not in url + params = {"flub": "x", "flop": None} + url = adapter.build("endp", params) + assert "flop" not in url def test_method_fallback(): - map = r.Map([ - r.Rule('/', endpoint='index', methods=['GET']), - r.Rule('/<name>', endpoint='hello_name', methods=['GET']), - r.Rule('/select', endpoint='hello_select', methods=['POST']), - r.Rule('/search_get', endpoint='search', methods=['GET']), - r.Rule('/search_post', endpoint='search', methods=['POST']) - ]) - adapter = map.bind('example.com') - assert adapter.build('index') == '/' - assert adapter.build('index', method='GET') == '/' - assert adapter.build('hello_name', {'name': 'foo'}) == '/foo' - assert adapter.build('hello_select') == '/select' - assert adapter.build('hello_select', method='POST') == '/select' - assert adapter.build('search') == '/search_get' - assert adapter.build('search', method='GET') == '/search_get' - assert adapter.build('search', method='POST') == '/search_post' + map = r.Map( + [ + r.Rule("/", endpoint="index", methods=["GET"]), + r.Rule("/<name>", endpoint="hello_name", methods=["GET"]), + r.Rule("/select", endpoint="hello_select", methods=["POST"]), + r.Rule("/search_get", endpoint="search", methods=["GET"]), + r.Rule("/search_post", endpoint="search", methods=["POST"]), + ] + ) + adapter = map.bind("example.com") + assert adapter.build("index") == "/" + assert adapter.build("index", method="GET") == "/" + assert adapter.build("hello_name", {"name": "foo"}) == "/foo" + assert adapter.build("hello_select") == "/select" + assert adapter.build("hello_select", method="POST") == "/select" + assert adapter.build("search") == "/search_get" + assert adapter.build("search", method="GET") == "/search_get" + assert adapter.build("search", method="POST") == "/search_post" def test_implicit_head(): - url_map = r.Map([ - r.Rule('/get', methods=['GET'], endpoint='a'), - r.Rule('/post', methods=['POST'], endpoint='b') - ]) - adapter = url_map.bind('example.org') - assert adapter.match('/get', method='HEAD') == ('a', {}) - pytest.raises(r.MethodNotAllowed, adapter.match, - '/post', method='HEAD') + url_map = r.Map( + [ + r.Rule("/get", methods=["GET"], endpoint="a"), + r.Rule("/post", methods=["POST"], endpoint="b"), + ] + ) + adapter = url_map.bind("example.org") + assert adapter.match("/get", method="HEAD") == ("a", {}) + pytest.raises(r.MethodNotAllowed, adapter.match, "/post", method="HEAD") def test_pass_str_as_router_methods(): with pytest.raises(TypeError): - r.Rule('/get', methods='GET') + r.Rule("/get", methods="GET") def test_protocol_joining_bug(): - m = r.Map([r.Rule('/<foo>', endpoint='x')]) - a = m.bind('example.org') - assert a.build('x', {'foo': 'x:y'}) == '/x:y' - assert a.build('x', {'foo': 'x:y'}, force_external=True) == \ - 'http://example.org/x:y' + m = r.Map([r.Rule("/<foo>", endpoint="x")]) + a = m.bind("example.org") + assert a.build("x", {"foo": "x:y"}) == "/x:y" + assert a.build("x", {"foo": "x:y"}, force_external=True) == "http://example.org/x:y" def test_allowed_methods_querying(): - m = r.Map([r.Rule('/<foo>', methods=['GET', 'HEAD']), - r.Rule('/foo', methods=['POST'])]) - a = m.bind('example.org') - assert sorted(a.allowed_methods('/foo')) == ['GET', 'HEAD', 'POST'] + m = r.Map( + [r.Rule("/<foo>", methods=["GET", "HEAD"]), r.Rule("/foo", methods=["POST"])] + ) + a = m.bind("example.org") + assert sorted(a.allowed_methods("/foo")) == ["GET", "HEAD", "POST"] def test_external_building_with_port(): - map = r.Map([ - r.Rule('/', endpoint='index'), - ]) - adapter = map.bind('example.org:5000', '/') - built_url = adapter.build('index', {}, force_external=True) - assert built_url == 'http://example.org:5000/', built_url + map = r.Map([r.Rule("/", endpoint="index")]) + adapter = map.bind("example.org:5000", "/") + built_url = adapter.build("index", {}, force_external=True) + assert built_url == "http://example.org:5000/", built_url def test_external_building_with_port_bind_to_environ(): - map = r.Map([ - r.Rule('/', endpoint='index'), - ]) + map = r.Map([r.Rule("/", endpoint="index")]) adapter = map.bind_to_environ( - create_environ('/', 'http://example.org:5000/'), - server_name="example.org:5000" + create_environ("/", "http://example.org:5000/"), server_name="example.org:5000" ) - built_url = adapter.build('index', {}, force_external=True) - assert built_url == 'http://example.org:5000/', built_url + built_url = adapter.build("index", {}, force_external=True) + assert built_url == "http://example.org:5000/", built_url def test_external_building_with_port_bind_to_environ_wrong_servername(): - map = r.Map([ - r.Rule('/', endpoint='index'), - ]) - environ = create_environ('/', 'http://example.org:5000/') + map = r.Map([r.Rule("/", endpoint="index")]) + environ = create_environ("/", "http://example.org:5000/") adapter = map.bind_to_environ(environ, server_name="example.org") - assert adapter.subdomain == '<invalid>' + assert adapter.subdomain == "<invalid>" def test_converter_parser(): - args, kwargs = r.parse_converter_args(u'test, a=1, b=3.0') + args, kwargs = r.parse_converter_args(u"test, a=1, b=3.0") - assert args == ('test',) - assert kwargs == {'a': 1, 'b': 3.0} + assert args == ("test",) + assert kwargs == {"a": 1, "b": 3.0} - args, kwargs = r.parse_converter_args('') + args, kwargs = r.parse_converter_args("") assert not args and not kwargs - args, kwargs = r.parse_converter_args('a, b, c,') - assert args == ('a', 'b', 'c') + args, kwargs = r.parse_converter_args("a, b, c,") + assert args == ("a", "b", "c") assert not kwargs - args, kwargs = r.parse_converter_args('True, False, None') + args, kwargs = r.parse_converter_args("True, False, None") assert args == (True, False, None) args, kwargs = r.parse_converter_args('"foo", u"bar"') - assert args == ('foo', 'bar') + assert args == ("foo", "bar") def test_alias_redirects(): - m = r.Map([ - r.Rule('/', endpoint='index'), - r.Rule('/index.html', endpoint='index', alias=True), - r.Rule('/users/', defaults={'page': 1}, endpoint='users'), - r.Rule('/users/index.html', defaults={'page': 1}, alias=True, - endpoint='users'), - r.Rule('/users/page/<int:page>', endpoint='users'), - r.Rule('/users/page-<int:page>.html', alias=True, endpoint='users'), - ]) - a = m.bind('example.com') + m = r.Map( + [ + r.Rule("/", endpoint="index"), + r.Rule("/index.html", endpoint="index", alias=True), + r.Rule("/users/", defaults={"page": 1}, endpoint="users"), + r.Rule( + "/users/index.html", defaults={"page": 1}, alias=True, endpoint="users" + ), + r.Rule("/users/page/<int:page>", endpoint="users"), + r.Rule("/users/page-<int:page>.html", alias=True, endpoint="users"), + ] + ) + a = m.bind("example.com") def ensure_redirect(path, new_url, args=None): with pytest.raises(r.RequestRedirect) as excinfo: a.match(path, query_args=args) - assert excinfo.value.new_url == 'http://example.com' + new_url + assert excinfo.value.new_url == "http://example.com" + new_url - ensure_redirect('/index.html', '/') - ensure_redirect('/users/index.html', '/users/') - ensure_redirect('/users/page-2.html', '/users/page/2') - ensure_redirect('/users/page-1.html', '/users/') - ensure_redirect('/users/page-1.html', '/users/?foo=bar', {'foo': 'bar'}) + ensure_redirect("/index.html", "/") + ensure_redirect("/users/index.html", "/users/") + ensure_redirect("/users/page-2.html", "/users/page/2") + ensure_redirect("/users/page-1.html", "/users/") + ensure_redirect("/users/page-1.html", "/users/?foo=bar", {"foo": "bar"}) - assert a.build('index') == '/' - assert a.build('users', {'page': 1}) == '/users/' - assert a.build('users', {'page': 2}) == '/users/page/2' + assert a.build("index") == "/" + assert a.build("users", {"page": 1}) == "/users/" + assert a.build("users", {"page": 2}) == "/users/page/2" -@pytest.mark.parametrize('prefix', ('', '/aaa')) +@pytest.mark.parametrize("prefix", ("", "/aaa")) def test_double_defaults(prefix): - m = r.Map([ - r.Rule(prefix + '/', defaults={'foo': 1, 'bar': False}, endpoint='x'), - r.Rule(prefix + '/<int:foo>', defaults={'bar': False}, endpoint='x'), - r.Rule(prefix + '/bar/', defaults={'foo': 1, 'bar': True}, endpoint='x'), - r.Rule(prefix + '/bar/<int:foo>', defaults={'bar': True}, endpoint='x') - ]) - a = m.bind('example.com') - - assert a.match(prefix + '/') == ('x', {'foo': 1, 'bar': False}) - assert a.match(prefix + '/2') == ('x', {'foo': 2, 'bar': False}) - assert a.match(prefix + '/bar/') == ('x', {'foo': 1, 'bar': True}) - assert a.match(prefix + '/bar/2') == ('x', {'foo': 2, 'bar': True}) - - assert a.build('x', {'foo': 1, 'bar': False}) == prefix + '/' - assert a.build('x', {'foo': 2, 'bar': False}) == prefix + '/2' - assert a.build('x', {'bar': False}) == prefix + '/' - assert a.build('x', {'foo': 1, 'bar': True}) == prefix + '/bar/' - assert a.build('x', {'foo': 2, 'bar': True}) == prefix + '/bar/2' - assert a.build('x', {'bar': True}) == prefix + '/bar/' + m = r.Map( + [ + r.Rule(prefix + "/", defaults={"foo": 1, "bar": False}, endpoint="x"), + r.Rule(prefix + "/<int:foo>", defaults={"bar": False}, endpoint="x"), + r.Rule(prefix + "/bar/", defaults={"foo": 1, "bar": True}, endpoint="x"), + r.Rule(prefix + "/bar/<int:foo>", defaults={"bar": True}, endpoint="x"), + ] + ) + a = m.bind("example.com") + + assert a.match(prefix + "/") == ("x", {"foo": 1, "bar": False}) + assert a.match(prefix + "/2") == ("x", {"foo": 2, "bar": False}) + assert a.match(prefix + "/bar/") == ("x", {"foo": 1, "bar": True}) + assert a.match(prefix + "/bar/2") == ("x", {"foo": 2, "bar": True}) + + assert a.build("x", {"foo": 1, "bar": False}) == prefix + "/" + assert a.build("x", {"foo": 2, "bar": False}) == prefix + "/2" + assert a.build("x", {"bar": False}) == prefix + "/" + assert a.build("x", {"foo": 1, "bar": True}) == prefix + "/bar/" + assert a.build("x", {"foo": 2, "bar": True}) == prefix + "/bar/2" + assert a.build("x", {"bar": True}) == prefix + "/bar/" def test_host_matching(): - m = r.Map([ - r.Rule('/', endpoint='index', host='www.<domain>'), - r.Rule('/', endpoint='files', host='files.<domain>'), - r.Rule('/foo/', defaults={'page': 1}, host='www.<domain>', endpoint='x'), - r.Rule('/<int:page>', host='files.<domain>', endpoint='x') - ], host_matching=True) + m = r.Map( + [ + r.Rule("/", endpoint="index", host="www.<domain>"), + r.Rule("/", endpoint="files", host="files.<domain>"), + r.Rule("/foo/", defaults={"page": 1}, host="www.<domain>", endpoint="x"), + r.Rule("/<int:page>", host="files.<domain>", endpoint="x"), + ], + host_matching=True, + ) - a = m.bind('www.example.com') - assert a.match('/') == ('index', {'domain': 'example.com'}) - assert a.match('/foo/') == ('x', {'domain': 'example.com', 'page': 1}) + a = m.bind("www.example.com") + assert a.match("/") == ("index", {"domain": "example.com"}) + assert a.match("/foo/") == ("x", {"domain": "example.com", "page": 1}) with pytest.raises(r.RequestRedirect) as excinfo: - a.match('/foo') - assert excinfo.value.new_url == 'http://www.example.com/foo/' + a.match("/foo") + assert excinfo.value.new_url == "http://www.example.com/foo/" - a = m.bind('files.example.com') - assert a.match('/') == ('files', {'domain': 'example.com'}) - assert a.match('/2') == ('x', {'domain': 'example.com', 'page': 2}) + a = m.bind("files.example.com") + assert a.match("/") == ("files", {"domain": "example.com"}) + assert a.match("/2") == ("x", {"domain": "example.com", "page": 2}) with pytest.raises(r.RequestRedirect) as excinfo: - a.match('/1') - assert excinfo.value.new_url == 'http://www.example.com/foo/' + a.match("/1") + assert excinfo.value.new_url == "http://www.example.com/foo/" def test_host_matching_building(): - m = r.Map([ - r.Rule('/', endpoint='index', host='www.domain.com'), - r.Rule('/', endpoint='foo', host='my.domain.com') - ], host_matching=True) + m = r.Map( + [ + r.Rule("/", endpoint="index", host="www.domain.com"), + r.Rule("/", endpoint="foo", host="my.domain.com"), + ], + host_matching=True, + ) - www = m.bind('www.domain.com') - assert www.match('/') == ('index', {}) - assert www.build('index') == '/' - assert www.build('foo') == 'http://my.domain.com/' + www = m.bind("www.domain.com") + assert www.match("/") == ("index", {}) + assert www.build("index") == "/" + assert www.build("foo") == "http://my.domain.com/" - my = m.bind('my.domain.com') - assert my.match('/') == ('foo', {}) - assert my.build('foo') == '/' - assert my.build('index') == 'http://www.domain.com/' + my = m.bind("my.domain.com") + assert my.match("/") == ("foo", {}) + assert my.build("foo") == "/" + assert my.build("index") == "http://www.domain.com/" def test_server_name_casing(): - m = r.Map([ - r.Rule('/', endpoint='index', subdomain='foo') - ]) + m = r.Map([r.Rule("/", endpoint="index", subdomain="foo")]) env = create_environ() - env['SERVER_NAME'] = env['HTTP_HOST'] = 'FOO.EXAMPLE.COM' - a = m.bind_to_environ(env, server_name='example.com') - assert a.match('/') == ('index', {}) + env["SERVER_NAME"] = env["HTTP_HOST"] = "FOO.EXAMPLE.COM" + a = m.bind_to_environ(env, server_name="example.com") + assert a.match("/") == ("index", {}) env = create_environ() - env['SERVER_NAME'] = '127.0.0.1' - env['SERVER_PORT'] = '5000' - del env['HTTP_HOST'] - a = m.bind_to_environ(env, server_name='example.com') + env["SERVER_NAME"] = "127.0.0.1" + env["SERVER_PORT"] = "5000" + del env["HTTP_HOST"] + a = m.bind_to_environ(env, server_name="example.com") with pytest.raises(r.NotFound): a.match() def test_redirect_request_exception_code(): - exc = r.RequestRedirect('http://www.google.com/') + exc = r.RequestRedirect("http://www.google.com/") exc.code = 307 env = create_environ() strict_eq(exc.get_response(env).status_code, exc.code) def test_redirect_path_quoting(): - url_map = r.Map([ - r.Rule('/<category>', defaults={'page': 1}, endpoint='category'), - r.Rule('/<category>/page/<int:page>', endpoint='category') - ]) - adapter = url_map.bind('example.com') + url_map = r.Map( + [ + r.Rule("/<category>", defaults={"page": 1}, endpoint="category"), + r.Rule("/<category>/page/<int:page>", endpoint="category"), + ] + ) + adapter = url_map.bind("example.com") with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match('/foo bar/page/1') + adapter.match("/foo bar/page/1") response = excinfo.value.get_response({}) - strict_eq(response.headers['location'], - u'http://example.com/foo%20bar') + strict_eq(response.headers["location"], u"http://example.com/foo%20bar") def test_unicode_rules(): - m = r.Map([ - r.Rule(u'/войти/', endpoint='enter'), - r.Rule(u'/foo+bar/', endpoint='foobar') - ]) - a = m.bind(u'☃.example.com') + m = r.Map( + [r.Rule(u"/войти/", endpoint="enter"), r.Rule(u"/foo+bar/", endpoint="foobar")] + ) + a = m.bind(u"☃.example.com") with pytest.raises(r.RequestRedirect) as excinfo: - a.match(u'/войти') - strict_eq(excinfo.value.new_url, - 'http://xn--n3h.example.com/%D0%B2%D0%BE%D0%B9%D1%82%D0%B8/') + a.match(u"/войти") + strict_eq( + excinfo.value.new_url, + "http://xn--n3h.example.com/%D0%B2%D0%BE%D0%B9%D1%82%D0%B8/", + ) - endpoint, values = a.match(u'/войти/') - strict_eq(endpoint, 'enter') + endpoint, values = a.match(u"/войти/") + strict_eq(endpoint, "enter") strict_eq(values, {}) with pytest.raises(r.RequestRedirect) as excinfo: - a.match(u'/foo+bar') - strict_eq(excinfo.value.new_url, 'http://xn--n3h.example.com/foo+bar/') + a.match(u"/foo+bar") + strict_eq(excinfo.value.new_url, "http://xn--n3h.example.com/foo+bar/") - endpoint, values = a.match(u'/foo+bar/') - strict_eq(endpoint, 'foobar') + endpoint, values = a.match(u"/foo+bar/") + strict_eq(endpoint, "foobar") strict_eq(values, {}) - url = a.build('enter', {}, force_external=True) - strict_eq(url, 'http://xn--n3h.example.com/%D0%B2%D0%BE%D0%B9%D1%82%D0%B8/') + url = a.build("enter", {}, force_external=True) + strict_eq(url, "http://xn--n3h.example.com/%D0%B2%D0%BE%D0%B9%D1%82%D0%B8/") - url = a.build('foobar', {}, force_external=True) - strict_eq(url, 'http://xn--n3h.example.com/foo+bar/') + url = a.build("foobar", {}, force_external=True) + strict_eq(url, "http://xn--n3h.example.com/foo+bar/") def test_empty_path_info(): - m = r.Map([ - r.Rule("/", endpoint="index"), - ]) + m = r.Map([r.Rule("/", endpoint="index")]) b = m.bind("example.com", script_name="/approot") with pytest.raises(r.RequestRedirect) as excinfo: @@ -905,29 +955,24 @@ def test_empty_path_info(): def test_both_bind_and_match_path_info_are_none(): - m = r.Map([r.Rule(u'/', endpoint='index')]) - ma = m.bind('example.org') - strict_eq(ma.match(), ('index', {})) + m = r.Map([r.Rule(u"/", endpoint="index")]) + ma = m.bind("example.org") + strict_eq(ma.match(), ("index", {})) def test_map_repr(): - m = r.Map([ - r.Rule(u'/wat', endpoint='enter'), - r.Rule(u'/woop', endpoint='foobar') - ]) + m = r.Map([r.Rule(u"/wat", endpoint="enter"), r.Rule(u"/woop", endpoint="foobar")]) rv = repr(m) - strict_eq(rv, - "Map([<Rule '/woop' -> foobar>, <Rule '/wat' -> enter>])") + strict_eq(rv, "Map([<Rule '/woop' -> foobar>, <Rule '/wat' -> enter>])") def test_empty_subclass_rules_with_custom_kwargs(): class CustomRule(r.Rule): - def __init__(self, string=None, custom=None, *args, **kwargs): self.custom = custom super(CustomRule, self).__init__(string, *args, **kwargs) - rule1 = CustomRule(u'/foo', endpoint='bar') + rule1 = CustomRule(u"/foo", endpoint="bar") try: rule2 = rule1.empty() assert rule1.rule == rule2.rule @@ -936,82 +981,79 @@ def test_empty_subclass_rules_with_custom_kwargs(): def test_finding_closest_match_by_endpoint(): - m = r.Map([ - r.Rule(u'/foo/', endpoint='users.here'), - r.Rule(u'/wat/', endpoint='admin.users'), - r.Rule(u'/woop', endpoint='foo.users'), - ]) - adapter = m.bind('example.com') - assert r.BuildError('admin.user', None, None, adapter).suggested.endpoint \ - == 'admin.users' + m = r.Map( + [ + r.Rule(u"/foo/", endpoint="users.here"), + r.Rule(u"/wat/", endpoint="admin.users"), + r.Rule(u"/woop", endpoint="foo.users"), + ] + ) + adapter = m.bind("example.com") + assert ( + r.BuildError("admin.user", None, None, adapter).suggested.endpoint + == "admin.users" + ) def test_finding_closest_match_by_values(): - rule_id = r.Rule(u'/user/id/<id>/', endpoint='users') - rule_slug = r.Rule(u'/user/<slug>/', endpoint='users') - rule_random = r.Rule(u'/user/emails/<email>/', endpoint='users') + rule_id = r.Rule(u"/user/id/<id>/", endpoint="users") + rule_slug = r.Rule(u"/user/<slug>/", endpoint="users") + rule_random = r.Rule(u"/user/emails/<email>/", endpoint="users") m = r.Map([rule_id, rule_slug, rule_random]) - adapter = m.bind('example.com') - assert r.BuildError('x', {'slug': ''}, None, adapter).suggested == \ - rule_slug + adapter = m.bind("example.com") + assert r.BuildError("x", {"slug": ""}, None, adapter).suggested == rule_slug def test_finding_closest_match_by_method(): - post = r.Rule(u'/post/', endpoint='foobar', methods=['POST']) - get = r.Rule(u'/get/', endpoint='foobar', methods=['GET']) - put = r.Rule(u'/put/', endpoint='foobar', methods=['PUT']) + post = r.Rule(u"/post/", endpoint="foobar", methods=["POST"]) + get = r.Rule(u"/get/", endpoint="foobar", methods=["GET"]) + put = r.Rule(u"/put/", endpoint="foobar", methods=["PUT"]) m = r.Map([post, get, put]) - adapter = m.bind('example.com') - assert r.BuildError('invalid', {}, 'POST', adapter).suggested == post - assert r.BuildError('invalid', {}, 'GET', adapter).suggested == get - assert r.BuildError('invalid', {}, 'PUT', adapter).suggested == put + adapter = m.bind("example.com") + assert r.BuildError("invalid", {}, "POST", adapter).suggested == post + assert r.BuildError("invalid", {}, "GET", adapter).suggested == get + assert r.BuildError("invalid", {}, "PUT", adapter).suggested == put def test_finding_closest_match_when_none_exist(): m = r.Map([]) - assert not r.BuildError('invalid', {}, None, m.bind('test.com')).suggested + assert not r.BuildError("invalid", {}, None, m.bind("test.com")).suggested def test_error_message_without_suggested_rule(): - m = r.Map([ - r.Rule(u'/foo/', endpoint='world', methods=['GET']), - ]) - adapter = m.bind('example.com') + m = r.Map([r.Rule(u"/foo/", endpoint="world", methods=["GET"])]) + adapter = m.bind("example.com") with pytest.raises(r.BuildError) as excinfo: - adapter.build('urks') - assert str(excinfo.value).startswith( - "Could not build url for endpoint 'urks'." - ) + adapter.build("urks") + assert str(excinfo.value).startswith("Could not build url for endpoint 'urks'.") with pytest.raises(r.BuildError) as excinfo: - adapter.build('world', method='POST') + adapter.build("world", method="POST") assert str(excinfo.value).startswith( "Could not build url for endpoint 'world' ('POST')." ) with pytest.raises(r.BuildError) as excinfo: - adapter.build('urks', values={'user_id': 5}) + adapter.build("urks", values={"user_id": 5}) assert str(excinfo.value).startswith( "Could not build url for endpoint 'urks' with values ['user_id']." ) def test_error_message_suggestion(): - m = r.Map([ - r.Rule(u'/foo/<id>/', endpoint='world', methods=['GET']), - ]) - adapter = m.bind('example.com') + m = r.Map([r.Rule(u"/foo/<id>/", endpoint="world", methods=["GET"])]) + adapter = m.bind("example.com") with pytest.raises(r.BuildError) as excinfo: - adapter.build('helloworld') + adapter.build("helloworld") assert "Did you mean 'world' instead?" in str(excinfo.value) with pytest.raises(r.BuildError) as excinfo: - adapter.build('world') + adapter.build("world") assert "Did you forget to specify values ['id']?" in str(excinfo.value) assert "Did you mean to use methods" not in str(excinfo.value) with pytest.raises(r.BuildError) as excinfo: - adapter.build('world', {'id': 2}, method='POST') + adapter.build("world", {"id": 2}, method="POST") assert "Did you mean to use methods ['GET', 'HEAD']?" in str(excinfo.value) |
