示例#1
0
def test_rule_unhashable():
    rule = r.Rule('/foo', {'meh': 'muh'}, 'x', ['POST'], False, 'x', True,
                  None)
    pytest.raises(TypeError, hash, rule)
示例#2
0
 def test_uuid_converter(self):
     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
示例#3
0
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': '******'})
    assert adapter.match('/User:thomas/projects/werkzeug') == \
        ('userpage', {'username': '******', 'name': 'projects/werkzeug'})
    assert adapter.match('/User:thomas/comment/123-456') == \
        ('usercomment', {'username': '******', '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'})
示例#4
0
def Rule(path, handler, *args):
    return routing.Rule(path, endpoint=(handler, args))
示例#5
0
 def test_non_string_parts(self):
     m = r.Map([r.Rule('/<foo>', endpoint='foo')])
     a = m.bind('example.com')
     self.assert_equal(a.build('foo', {'foo': 42}), '/42')
示例#6
0
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
示例#7
0
def RegisterHttpRouteHandler(method, route, renderer_cls):
  """Registers given ApiCallRenderer for given method and route."""
  HTTP_ROUTING_MAP.add(routing.Rule(
      route, methods=[method],
      endpoint=renderer_cls))
示例#8
0
def test_build_url_with_arg_keyword():
    map = r.Map([r.Rule("/foo/<string:class>", endpoint="foo")])
    adapter = map.bind("example.org", "/", subdomain="blah")

    ret = adapter.build("foo", {"class": "bar"})
    assert ret == "http://example.org/foo/bar"
示例#9
0
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": "******"})
    assert adapter.match("/User:thomas/projects/werkzeug") == (
        "userpage",
        {
            "username": "******",
            "name": "projects/werkzeug"
        },
    )
    assert adapter.match("/User:thomas/comment/123-456") == (
        "usercomment",
        {
            "username": "******",
            "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"
        },
    )
示例#10
0
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']
示例#11
0
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", {}))
示例#12
0
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'
示例#13
0
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'
示例#14
0
def test_pass_str_as_router_methods():
    with pytest.raises(TypeError):
        r.Rule('/get', methods='GET')
示例#15
0
def test_pass_str_as_router_methods():
    with pytest.raises(TypeError):
        r.Rule("/get", methods="GET")
示例#16
0
def test_server_name_match_default_port(base, name):
    environ = create_environ("/foo", base_url=base)
    map = r.Map([r.Rule("/foo", endpoint="foo")])
    adapter = map.bind_to_environ(environ, server_name=name)
    assert adapter.match() == ("foo", {})
示例#17
0
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"
示例#18
0
def test_adapter_match_return_rule():
    rule = r.Rule("/foo/", endpoint="foo")
    map = r.Map([rule])
    adapter = map.bind("localhost", "/")
    assert adapter.match("/foo/", return_rule=True) == (rule, {})
示例#19
0
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/")
    adapter = map.bind_to_environ(environ, server_name="example.org")
    assert adapter.subdomain == "<invalid>"
示例#20
0
def test_rule_unhashable():
    rule = r.Rule("/foo", {"meh": "muh"}, "x", ["POST"], False, "x", True,
                  None)
    pytest.raises(TypeError, hash, rule)
示例#21
0
class HttpConnector(connector.Connector):
    """API connector implementation that works through HTTP API."""
    class ResponseFormat(object):
        JSON = 0
        TYPED_JSON = 1

    HANDLERS_MAP = routing.Map([
        routing.Rule("/api/clients", methods=["GET"],
                     endpoint="SearchClients"),
        routing.Rule("/api/clients/<client_id>",
                     methods=["GET"],
                     endpoint="GetClient"),
        routing.Rule("/api/clients/<client_id>/flows",
                     methods=["GET"],
                     endpoint="ListFlows"),
        routing.Rule("/api/clients/<client_id>/flows",
                     methods=["POST"],
                     endpoint="CreateFlow"),
    ])

    JSON_PREFIX = ")]}\'\n"
    DEFAULT_PAGE_SIZE = 50

    def __init__(self,
                 api_endpoint=None,
                 auth=None,
                 response_format=ResponseFormat.JSON,
                 page_size=None):
        super(HttpConnector, self).__init__()

        self.api_endpoint = api_endpoint
        self.auth = auth
        self.response_format = response_format
        self.page_size = page_size or self.DEFAULT_PAGE_SIZE

        self.csrf_token = None

        parsed_url = urlparse.urlparse(api_endpoint)
        self.urls = self.HANDLERS_MAP.bind(parsed_url.netloc, "/")

    def _GetCSRFToken(self):
        logger.debug("Fetching CSRF token from %s...", self.api_endpoint)

        index_response = requests.get(self.api_endpoint, auth=self.auth)
        csrf_token = index_response.cookies.get("csrftoken")

        if not csrf_token:
            raise RuntimeError("Can't get CSRF token.")

        logger.debug("Got CSRF token: %s", csrf_token)

        return csrf_token

    def _GetMethodUrlAndQueryParams(self, handler_name, args):
        path_params = {}
        query_params = {}
        for field, value in args.ListFields():
            if self.HANDLERS_MAP.is_endpoint_expecting(handler_name,
                                                       field.name):
                path_params[field.name] = value
            else:
                query_params[field.name] = value

        url = self.urls.build(handler_name, path_params, force_external=True)

        method = None
        for rule in self.HANDLERS_MAP.iter_rules():
            if rule.endpoint == handler_name:
                method = [m for m in rule.methods if m != "HEAD"][0]

        if not method:
            raise RuntimeError("Can't find method for %s" % handler_name)

        return method, url, query_params

    def _QueryParamsToBody(self, query_params):
        result = {}
        for k, v in query_params.items():
            result[k] = self._ToJSON(v)

        return result

    def _ToJSON(self, value):
        if isinstance(value, semantic_pb2.AnyValue):
            proto = utils.TypeUrlToMessage(value.type_url)
            proto.ParseFromString(value.value)
            return self._ToJSON(proto)
        elif isinstance(value, message.Message):
            result = {}
            for descriptor, value in value.ListFields():
                result[descriptor.name] = self._ToJSON(value)
            return result
        else:
            return value

    def SendRequest(self, handler_name, args):
        if not self.csrf_token:
            self.csrf_token = self._GetCSRFToken()

        headers = {
            "x-csrftoken": self.csrf_token,
            "x-requested-with": "XMLHttpRequest"
        }
        cookies = {"csrftoken": self.csrf_token}

        method, url, query_params = self._GetMethodUrlAndQueryParams(
            handler_name, args)

        body = None
        if method != "GET":
            body = self._QueryParamsToBody(query_params)
            query_params = {}

        if self.response_format == self.ResponseFormat.JSON:
            query_params["strip_type_info"] = "1"

        logger.debug("%s request: %s (query: %s, body: %s, headers %s)",
                     method, url, query_params, body, headers)
        request = requests.Request(method,
                                   url,
                                   json=body,
                                   params=query_params,
                                   headers=headers,
                                   cookies=cookies)
        prepped_request = request.prepare()

        session = requests.Session()
        response = session.send(prepped_request)
        content = response.content

        logger.debug("%s response (%s, %d):\n%s", method, url,
                     response.status_code, content)
        if content[:len(self.JSON_PREFIX)] != self.JSON_PREFIX:
            raise RuntimeError("JSON prefix %s is not in response:\n%s" %
                               (self.JSON_PREFIX, content))

        json_str = content[len(self.JSON_PREFIX):]
        parsed_json = json.loads(json_str)

        if response.status_code == 200:
            return parsed_json
        else:
            raise RuntimeError("Server error: " + parsed_json["message"])

    def SendIteratorRequest(self, handler_name, args):
        response = self.SendRequest(handler_name, args)

        total_count = None
        try:
            total_count = response["total_count"]
        except KeyError:
            pass

        return utils.ItemsIterator(items=response["items"],
                                   total_count=total_count)

    def GetDataAttribute(self, data, attribute_name):
        if self.response_format == self.ResponseFormat.JSON:
            return data[attribute_name]
        elif self.response_format == self.ResponseFormat.TYPED_JSON:
            return data[attribute_name]["value"]
        else:
            raise RuntimeError("Unexpected response_format: %d",
                               self.response_format)
示例#22
0
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")
            ],
        ),
    ])

    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"),
    ]
示例#23
0
    def test_path(self):
        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>', 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('/Files/<path:file>', endpoint='files'),
        ])
        adapter = map.bind('example.org', '/')

        assert adapter.match('/') == ('page', {'name': 'FrontPage'})
        self.assert_raises(r.RequestRedirect,
                           lambda: adapter.match('/FrontPage'))
        assert adapter.match('/Special') == ('special', {})
        assert adapter.match('/2007') == ('year', {'year': 2007})
        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': '******'
        })
        assert adapter.match('/User:thomas/projects/werkzeug') == \
            ('userpage', {'username':'******', 'name':'projects/werkzeug'})
        assert adapter.match('/Files/downloads/werkzeug/0.2.zip') == \
            ('files', {'file':'downloads/werkzeug/0.2.zip'})
示例#24
0
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"
示例#25
0
    def test_complex_routing_rules(self):
        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'
示例#26
0
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"
示例#27
0
 def test_protocol_joining_bug(self):
     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'
示例#28
0
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
示例#29
0
def test_adapter_match_return_rule():
    rule = r.Rule('/foo/', endpoint='foo')
    map = r.Map([rule])
    adapter = map.bind('localhost', '/')
    assert adapter.match('/foo/', return_rule=True) == (rule, {})
示例#30
0
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', {}))