def setUp(self): self.mt_mapper = MultiTablePathMap() self.t_mapper = TreePathMap() self.testpaths1 = ( ('hello/bla', lambda : 4, 'hello/bla', 4, ()), ('hello/loko/nunu', lambda : 7, 'hello/loko/nunu', 7, ()), ('tryi/{int}', lambda a: a, 'tryi/4', 4, (int, )), ('tryit/**', lambda s: s, 'tryit/lolo', 'tryit/lolo', ()), ('/', lambda : 4, '/', 4, ()) ) self.testpaths2 = ( ('horn/{int}/tee/**', lambda a, b: (a,b), 'horn/4/tee/tree/branch', (4,'horn/4/tee/tree/branch'), (int, )), )
class TestMapper(unittest.TestCase): def setUp(self): self.mt_mapper = MultiTablePathMap() self.t_mapper = TreePathMap() self.testpaths1 = ( ('hello/bla', lambda : 4, 'hello/bla', 4, ()), ('hello/loko/nunu', lambda : 7, 'hello/loko/nunu', 7, ()), ('tryi/{int}', lambda a: a, 'tryi/4', 4, (int, )), ('tryit/**', lambda s: s, 'tryit/lolo', 'tryit/lolo', ()), ('/', lambda : 4, '/', 4, ()) ) self.testpaths2 = ( ('horn/{int}/tee/**', lambda a, b: (a,b), 'horn/4/tee/tree/branch', (4,'horn/4/tee/tree/branch'), (int, )), ) def test_mt_add_path(self): method = 'get' host = 'localhost' port = 8080 for path, handler, teststring, result, typeargs in self.testpaths1: handler = ControlFunction(handler, path, method, False, None) handler.typeargs = typeargs self.mt_mapper.add_path(path, handler) request = http.Request(host, port, teststring, method, None, None, False, None) handler, args, kwargs = self.mt_mapper.find_handler(request) self.assertEqual(handler(*args, **kwargs), result) for path, handler, teststring, result, typeargs in self.testpaths2: handler = ControlFunction(handler, path, method, False, None) handler.typeargs = typeargs self.mt_mapper.add_path(path, handler) request = http.Request(host, port, teststring, method, None, None, False, None) handler, args, kwargs = self.mt_mapper.resolve(request) self.assertTupleEqual(handler(*args, **kwargs), result) for path, handler, teststring, result, typeargs in self.testpaths1[0:2]: handler = ControlFunction(handler, path, method, False, None) handler.typeargs = typeargs self.assertRaises(ControllerError, self.mt_mapper.add_path, path, handler) def test_t_add_path(self): method = 'get' host = 'localhost' port = 8080 for path, handler, teststring, result, targs in self.testpaths1: handler = ControlFunction(handler, path, method, False, None) self.t_mapper.add_path(path, handler) request = http.Request(host, port, teststring, method, None, None, False, None) handler, args, kwargs = self.t_mapper.find_handler(request) self.assertEqual(handler(*args, **kwargs), result) for path, handler, teststring, result, targs in self.testpaths2: handler = ControlFunction(handler, path, method, False, None) self.t_mapper.add_path(path, handler) request = http.Request(host, port, teststring, method, None, None, False, None) handler, args, kwargs = self.t_mapper.resolve(request) self.assertTupleEqual(handler(*args, **kwargs), result) for path, handler, teststring, result, targs in self.testpaths1[0:2]: handler = ControlFunction(handler, path, method, False, None) self.assertRaises(ControllerError, self.t_mapper.add_path, path, handler) def test_header_resolving(self): host = 'localhost' port = 0 query = () for mapper in (self.t_mapper, self.mt_mapper): for function, path, method, headers, is_empty in ( (lambda :7, '/test', 'get', frozenset(http.headers.Header.auto_construct('Location: /\nHTTPS: None')), False), (lambda : 0, '/', 'post', frozenset((http.headers.Header.auto_construct('Location: hello'),)), False), (lambda : 9, '/lala', 'get', frozenset(), True) ): handler = ControlFunction( function=function, value=path, method=method, headers=headers, query=query ) mapper.add_path(path, handler) request1 = http.Request(host, port, path, method, query, frozenset(), False, None) request2 = http.Request(host, port, path, method, query, headers, False, None) h2 = http.headers.HeaderMap(headers, Method='0') request3 = http.Request(host, port, path, method, query, h2, False, None) if not is_empty: self.assertRaises(MethodHandlerNotFound, mapper.resolve, request1) self.assertIs( mapper.resolve(request2)[0].function, function ) for a in headers: assert a in h2.values() assert set(h2.values()) >= headers self.assertIs( mapper.resolve(request3)[0].function, function )