def test_match_from_begining_without_params(self): 'UrlTemplate match method without params (from begining of str)' ut = UrlTemplate('simple', match_whole_str=False) self.assertEqual(ut.match('simple'), ('simple', {})) self.assertEqual(ut.match('simple/sdffds'), ('simple', {})) self.assertEqual(ut.match('/simple'), (None, {})) self.assertEqual(ut.match('/simple/'), (None, {}))
def test_match_from_begining_with_params(self): 'UrlTemplate match method with params (from begining of str)' ut = UrlTemplate('/simple/<int:id>', match_whole_str=False) self.assertEqual(ut.match('/simple/2'), ('/simple/2', {'id':2})) self.assertEqual(ut.match('/simple/2/sdfsf'), ('/simple/2', {'id':2})) self.assertEqual(ut.match('/simple'), (None, {})) self.assertEqual(ut.match('/simple/d'), (None, {})) self.assertEqual(ut.match('/simple/d/sdfsdf'), (None, {}))
def test_match_from_begining_with_params(self): 'UrlTemplate match method with params (from begining of str)' ut = UrlTemplate('/simple/<int:id>', match_whole_str=False) self.assertEqual(ut.match('/simple/2'), ('/simple/2', {'id': 2})) self.assertEqual(ut.match('/simple/2/sdfsf'), ('/simple/2', {'id': 2})) self.assertEqual(ut.match('/simple'), (None, {})) self.assertEqual(ut.match('/simple/d'), (None, {})) self.assertEqual(ut.match('/simple/d/sdfsdf'), (None, {}))
def test_multiple_converters_postfix(self): 'Multiple converters with postfix data' t = UrlTemplate('/<name>/text/<action>/post') self.assertEqual(t.match('/this/text/edit/post'), ('/this/text/edit/post', { 'name': 'this', 'action': 'edit' })) self.assertEqual(t.match('/this/text/edit'), (None, {}))
def test_incorrect_urlencoded_path(self): 'Incorrect url encoded path' t = UrlTemplate('/<name>') value = quote(u'/имя'.encode('utf-8')) + '%r1' self.assertEqual(t.match(value), (value, { 'name': u'\u0438\u043c\u044f%r1' }))
def test_incorrect_value(self): 'Incorrect url encoded value' t = UrlTemplate('/<name>') value = quote(u'/имя'.encode('utf-8'))[:-1] self.assertEqual(t.match(value), (value, { 'name': u'\u0438\u043c\ufffd%8' }))
def test_multiple_converters(self): 'Multiple converters' t = UrlTemplate('/<name>/text/<action>') self.assertEqual(t.match('/this/text/edit'), ('/this/text/edit', { 'name': 'this', 'action': 'edit' }))
def test_unicode(self): 'Unicode values of converters' t = UrlTemplate('/<name>/text/<action>') url = quote(u'/имя/text/действие'.encode('utf-8')) self.assertEqual(t.match(url), (url, { 'name': u'имя', 'action': u'действие' }))
def test_converter_with_args(self): 'Converter with args' class Conv(Converter): def __init__(self, *items): self.items = items def to_python(self, value, **kw): if value not in self.items: raise ConvertError(self, value) return value t = UrlTemplate(u'/<conv(u"text", u"тест", noquote):name>', converters={'conv': Conv}) value = quote(u'/имя'.encode('utf-8')) self.assertEqual(t.match(value), (None, {})) value = quote(u'/text'.encode('utf-8')) self.assertEqual(t.match(value), (value, {'name': u'text'})) value = quote(u'/тест'.encode('utf-8')) self.assertEqual(t.match(value), (value, {'name': u'тест'})) value = quote(u'/noquote'.encode('utf-8')) self.assertEqual(t.match(value), (value, {'name': u'noquote'}))
def test_redefine_converters(self): from iktomi.web.url_converters import Integer class DoubleInt(Integer): def to_python(self, value, env=None): return Integer.to_python(self, value, env) * 2 def to_url(self, value): return str(value // 2) ut = UrlTemplate('/simple/<int:id>', converters={'int': DoubleInt}) self.assertEqual(ut(id=2), '/simple/1') self.assertEqual(ut.match('/simple/1'), ('/simple/1', {'id': 2}))
def test_redefine_converters(self): from iktomi.web.url_converters import Integer class DoubleInt(Integer): def to_python(self, value, env=None): return Integer.to_python(self, value, env) * 2 def to_url(self, value): return str(value / 2) ut = UrlTemplate('/simple/<int:id>', converters={'int': DoubleInt}) self.assertEqual(ut(id=2), '/simple/1') self.assertEqual(ut.match('/simple/1'), ('/simple/1', {'id': 2}))
def test_empty_match(self): 'UrlTemplate match method with empty template' ut = UrlTemplate('') self.assertEqual(ut.match(''), ('', {})) self.assertEqual(ut.match('/'), (None, {}))
def test_converter(self): 'Simple text match' t = UrlTemplate('/<string:name>') self.assertEqual(t.match('/somevalue'), ('/somevalue', {'name': 'somevalue'}))
def test_match_with_params(self): 'UrlTemplate match method with params' ut = UrlTemplate('/simple/<int:id>') self.assertEqual(ut.match('/simple/2'), ('/simple/2', {'id':2})) self.assertEqual(ut.match('/simple'), (None, {})) self.assertEqual(ut.match('/simple/d'), (None, {}))
def test_match(self): 'Simple match' t = UrlTemplate('/') self.assertEqual(t.match('/'), ('/', {}))
def test_static_text(self): 'Simple text match' t = UrlTemplate('/test/url') self.assertEqual(t.match('/test/url'), ('/test/url', {}))
def test_match_without_params(self): 'UrlTemplate match method without params' ut = UrlTemplate('simple') self.assertEqual(ut.match('simple'), ('simple', {})) self.assertEqual(ut.match('/simple'), (None, {}))
def test_incorrect_value(self): 'Incorrect url encoded value' t = UrlTemplate('/<name>') value = quote(u'/имя'.encode('utf-8'))[:-1] self.assertEqual(t.match(value), (value, {'name': u'\u0438\u043c\ufffd%8'}))
def test_incorrect_urlencoded_path(self): 'Incorrect url encoded path' t = UrlTemplate('/<name>') value = quote(u'/имя'.encode('utf-8'))+'%r1' self.assertEqual(t.match(value), (value, {'name': u'\u0438\u043c\u044f%r1'}))
def test_unicode(self): 'Unicode values of converters' t = UrlTemplate('/<name>/text/<action>') url = quote(u'/имя/text/действие'.encode('utf-8')) self.assertEqual(t.match(url), (url, {'name': u'имя', 'action': u'действие'}))
def test_match_with_params(self): 'UrlTemplate match method with params' ut = UrlTemplate('/simple/<int:id>') self.assertEqual(ut.match('/simple/2'), ('/simple/2', {'id': 2})) self.assertEqual(ut.match('/simple'), (None, {})) self.assertEqual(ut.match('/simple/d'), (None, {}))
def test_default_converter(self): 'Default converter test' t = UrlTemplate('/<name>') self.assertEqual(t.match('/somevalue'), ('/somevalue', {'name': 'somevalue'}))
def test_multiple_converters(self): 'Multiple converters' t = UrlTemplate('/<name>/text/<action>') self.assertEqual(t.match('/this/text/edit'), ('/this/text/edit', {'name': 'this', 'action': 'edit'}))
def test_multiple_converters_postfix(self): 'Multiple converters with postfix data' t = UrlTemplate('/<name>/text/<action>/post') self.assertEqual(t.match('/this/text/edit/post'), ('/this/text/edit/post', {'name': 'this', 'action': 'edit'})) self.assertEqual(t.match('/this/text/edit'), (None, {}))