108 lines
3.8 KiB
Python
108 lines
3.8 KiB
Python
import ddt
|
|
|
|
import falcon
|
|
from falcon import routing
|
|
import falcon.testing as testing
|
|
|
|
|
|
@ddt.ddt
|
|
class TestUriTemplates(testing.TestBase):
|
|
|
|
@ddt.data(42, falcon.API)
|
|
def test_string_type_required(self, value):
|
|
self.assertRaises(TypeError, routing.compile_uri_template, value)
|
|
|
|
@ddt.data('this', 'this/that')
|
|
def test_template_must_start_with_slash(self, value):
|
|
self.assertRaises(ValueError, routing.compile_uri_template, value)
|
|
|
|
@ddt.data('//', 'a//', '//b', 'a//b', 'a/b//', 'a/b//c')
|
|
def test_template_may_not_contain_double_slash(self, value):
|
|
self.assertRaises(ValueError, routing.compile_uri_template, value)
|
|
|
|
def test_root(self):
|
|
fields, pattern = routing.compile_uri_template('/')
|
|
self.assertFalse(fields)
|
|
self.assertFalse(pattern.match('/x'))
|
|
|
|
result = pattern.match('/')
|
|
self.assertTrue(result)
|
|
self.assertFalse(result.groupdict())
|
|
|
|
@ddt.data('/hello', '/hello/world', '/hi/there/how/are/you')
|
|
def test_no_fields(self, path):
|
|
fields, pattern = routing.compile_uri_template(path)
|
|
self.assertFalse(fields)
|
|
self.assertFalse(pattern.match(path[:-1]))
|
|
|
|
result = pattern.match(path)
|
|
self.assertTrue(result)
|
|
self.assertFalse(result.groupdict())
|
|
|
|
def test_one_field(self):
|
|
fields, pattern = routing.compile_uri_template('/{name}')
|
|
self.assertEqual(fields, set(['name']))
|
|
|
|
result = pattern.match('/Kelsier')
|
|
self.assertTrue(result)
|
|
self.assertEqual(result.groupdict(), {'name': 'Kelsier'})
|
|
|
|
fields, pattern = routing.compile_uri_template('/character/{name}')
|
|
self.assertEqual(fields, set(['name']))
|
|
|
|
result = pattern.match('/character/Kelsier')
|
|
self.assertTrue(result)
|
|
self.assertEqual(result.groupdict(), {'name': 'Kelsier'})
|
|
|
|
fields, pattern = routing.compile_uri_template('/character/{name}/profile')
|
|
self.assertEqual(fields, set(['name']))
|
|
|
|
self.assertFalse(pattern.match('/character'))
|
|
self.assertFalse(pattern.match('/character/Kelsier'))
|
|
self.assertFalse(pattern.match('/character/Kelsier/'))
|
|
|
|
result = pattern.match('/character/Kelsier/profile')
|
|
self.assertTrue(result)
|
|
self.assertEqual(result.groupdict(), {'name': 'Kelsier'})
|
|
|
|
def test_one_field_with_digits(self):
|
|
fields, pattern = routing.compile_uri_template('/{name123}')
|
|
self.assertEqual(fields, set(['name123']))
|
|
|
|
result = pattern.match('/Kelsier')
|
|
self.assertTrue(result)
|
|
self.assertEqual(result.groupdict(), {'name123': 'Kelsier'})
|
|
|
|
def test_one_field_with_prefixed_digits(self):
|
|
fields, pattern = routing.compile_uri_template('/{37signals}')
|
|
self.assertEqual(fields, set())
|
|
|
|
result = pattern.match('/s2n')
|
|
self.assertFalse(result)
|
|
|
|
@ddt.data('', '/')
|
|
def test_two_fields(self, postfix):
|
|
path = '/book/{book_id}/characters/{n4m3}' + postfix
|
|
fields, pattern = routing.compile_uri_template(path)
|
|
self.assertEqual(fields, set(['n4m3', 'book_id']))
|
|
|
|
result = pattern.match('/book/0765350386/characters/Vin')
|
|
self.assertTrue(result)
|
|
self.assertEqual(result.groupdict(), {'n4m3': 'Vin', 'book_id': '0765350386'})
|
|
|
|
def test_three_fields(self):
|
|
fields, pattern = routing.compile_uri_template('/{a}/{b}/x/{c}')
|
|
self.assertEqual(fields, set('abc'))
|
|
|
|
result = pattern.match('/one/2/x/3')
|
|
self.assertTrue(result)
|
|
self.assertEqual(result.groupdict(), {'a': 'one', 'b': '2', 'c': '3'})
|
|
|
|
def test_malformed_field(self):
|
|
fields, pattern = routing.compile_uri_template('/{a}/{1b}/x/{c}')
|
|
self.assertEqual(fields, set('ac'))
|
|
|
|
result = pattern.match('/one/{1b}/x/3')
|
|
self.assertTrue(result)
|
|
self.assertEqual(result.groupdict(), {'a': 'one', 'c': '3'})
|