# -*- coding: utf-8 -*- # # Copyright (C) 2015 Thomas Amland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . from __future__ import absolute_import, division, print_function, unicode_literals import pytest import mock from routing import Plugin, UrlRule, RoutingError @pytest.fixture() def plugin(): return Plugin('plugin://py.test') def test_match(): assert UrlRule("/p/").match("/p/bar") == {'foo': 'bar'} def test_make_path(): rule = UrlRule("/p//") assert rule.make_path(bar=2, foo=1) == "/p/1/2" assert rule.make_path(1, 2) == "/p/1/2" assert rule.make_path(baz=3, foo=1, bar=2) == "/p/1/2?baz=3" assert rule.make_path(1) is None def test_make_path_should_urlencode_args(): rule = UrlRule("/foo") assert rule.make_path(bar="b a&r") == "/foo?bar=b+a%26r" def test_url_for_path(): plugin = Plugin('plugin://foo.bar') assert plugin.url_for_path("/baz") == "plugin://foo.bar/baz" def test_url_for(plugin): f = lambda: None plugin.route("/foo")(f) assert plugin.url_for(f) == plugin.base_url + "/foo" def test_url_for_kwargs(plugin): f = lambda a, b: None plugin.route("/foo//")(f) assert plugin.url_for(f, a=1, b=2) == plugin.base_url + "/foo/1/2" def test_url_for_args(plugin): f = lambda a, b: None plugin.route("//")(f) assert plugin.url_for(f, 1, 2) == plugin.base_url + "/1/2" def test_route_for(plugin): f = lambda: None plugin.route("/foo")(f) assert plugin.route_for(plugin.base_url + "/foo") is f def test_route_for_args(plugin): f = lambda: None plugin.route("/foo//")(f) assert plugin.route_for(plugin.base_url + "/foo/1/2") is f def test_dispatch(plugin): f = mock.create_autospec(lambda: None) plugin.route("/foo")(f) plugin.run(['plugin://py.test/foo', '0', '?bar=baz']) f.assert_called_with() def test_path(plugin): f = mock.create_autospec(lambda: None) plugin.route("/foo")(f) plugin.run(['plugin://py.test/foo', '0']) assert plugin.path == '/foo' plugin.route("/foo/bar/baz")(f) plugin.run(['plugin://py.test/foo/bar/baz', '0']) assert plugin.path == '/foo/bar/baz' def test_no_route(plugin): f = lambda a: None plugin.route("/foo//")(f) with pytest.raises(RoutingError): plugin.url_for(f, 1) with pytest.raises(RoutingError): plugin.run([plugin.base_url + "/foo"]) assert plugin.route_for(plugin.base_url + "/foo") is None def test_arg_parsing(plugin): f = mock.create_autospec(lambda: None) plugin.route("/foo")(f) plugin.run(['plugin://py.test/foo', '0', '?bar=baz']) assert plugin.args['bar'][0] == 'baz' def test_trailing_slash_in_route_definition(plugin): """ Should call registered route with trailing slash. """ f = mock.create_autospec(lambda: None) plugin.route("/foo/")(f) plugin.run(['plugin://py.test/foo', '0']) assert f.call_count == 1 def test_trailing_slashes_in_run(plugin): """ Should call registered route without trailing slash. """ f = mock.create_autospec(lambda: None) plugin.route("/foo")(f) plugin.run(['plugin://py.test/foo/', '0']) assert f.call_count == 1 def test_trailing_slash_handling_for_root(plugin): f = mock.create_autospec(lambda: None) plugin.route("/")(lambda: None) plugin.route("/")(f) plugin.run(['plugin://py.test/', '0']) plugin.run(['plugin://py.test', '0']) assert f.call_count == 2 with pytest.raises(RoutingError): plugin.run(['plugin://py.test/a/b', '0'])