%PDF- %PDF-
| Direktori : /lib/calibre/calibre/srv/tests/ |
| Current File : //lib/calibre/calibre/srv/tests/routes.py |
#!/usr/bin/env python3
__license__ = 'GPL v3'
__copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'
import os
from calibre.srv.tests.base import BaseTest
from polyglot.builtins import itervalues
from tempfile import TemporaryDirectory
class TestRouter(BaseTest):
def test_library_id_construction(self):
from calibre.srv.library_broker import library_id_from_path, correct_case_of_last_path_component, db_matches
self.ae(library_id_from_path('as'), 'as')
self.ae(library_id_from_path('as/'), 'as')
self.ae(library_id_from_path('as////'), 'as')
self.ae(library_id_from_path('/as/'), 'as')
if os.sep == '\\':
self.ae(library_id_from_path('as/' + os.sep), 'as')
self.ae(library_id_from_path('X:' + os.sep), 'X')
class MockDB:
def __init__(self, base):
self.new_api = self
self.server_library_id = 'lid'
self.dbpath = os.path.join(base, 'metadata.db')
with TemporaryDirectory() as tdir:
path = os.path.join(tdir, 'Test')
os.mkdir(path)
self.ae(correct_case_of_last_path_component(os.path.join(tdir, 'test')), path)
self.ae(correct_case_of_last_path_component(os.path.join(tdir, 'Test')), path)
db = MockDB(tdir)
self.assertTrue(db_matches(db, db.server_library_id, None))
self.assertTrue(db_matches(db, db.server_library_id.upper(), tdir))
def test_route_construction(self):
' Test route construction '
from calibre.srv.routes import Route, endpoint, RouteError
def makeroute(route, func=lambda c,d:None, **kwargs):
return Route(endpoint(route, **kwargs)(func))
r = makeroute('/')
self.ae(r.matchers, [])
self.assertFalse(r.required_names)
r = makeroute('/slash/')
self.ae(r.endpoint.route, '/slash')
def emr(route):
self.assertRaises(RouteError, makeroute, route)
emr('no_start')
emr('/{xxx')
emr('/{+all}/{other}')
emr('/{t=}}')
emr('/{+all=1}')
emr('/{d=1}/no')
emr('/x/{a=1}')
self.assertRaises(RouteError, makeroute, '/a/b', lambda c,d,b,a:None)
def test_route_finding(self):
'Test route finding'
from calibre.srv.routes import Router, endpoint, HTTPNotFound
router = Router()
def find(path):
path = list(filter(None, path.split('/')))
ep, args = router.find_route(path)
args = list(args)
return ep, args
@endpoint('/')
def root(ctx, data):
pass
@endpoint('/defval/{a=1}')
def defval(ctx, data, a):
pass
@endpoint('/varpath/{a}/{b}')
def varpath(ctx, data, a, b):
pass
@endpoint('/soak/{+rest}')
def soak(ctx, dest, rest):
pass
@endpoint('/soak_opt/{+rest="xxx"}')
def soak_opt(ctx, dest, rest):
pass
@endpoint('/needs quoting/{x}')
def quoting(ctx, dest, x):
pass
@endpoint('/get/{a}/{b=None}')
def get(ctx, dest, a, b):
pass
for x in itervalues(locals()):
if getattr(x, 'is_endpoint', False):
router.add(x)
router.finalize()
ep, args = find('/')
self.ae(ep, root), self.assertFalse(args)
ep, args = find('/defval')
self.ae(ep, defval), self.ae(args, [1])
ep, args = find('/defval/2')
self.ae(ep, defval), self.ae(args, [2])
self.assertRaises(HTTPNotFound, find, '/defval/a') # a must be an integer
self.assertRaises(HTTPNotFound, find, '/varpath')
self.assertRaises(HTTPNotFound, find, '/varpath/x')
self.assertRaises(HTTPNotFound, find, '/varpath/x/y/z')
self.assertRaises(HTTPNotFound, find, '/soak')
ep, args = find('/varpath/x/y')
self.ae(ep, varpath), self.ae(args, ['x', 'y'])
ep, args = find('/soak/x')
self.ae(ep, soak), self.ae(args, ['x'])
self.ae(router.routes['/soak'].soak_up_extra, 'rest')
ep, args = find('/soak/x/y/z')
self.ae(ep, soak), self.ae(args, ['x/y/z'])
ep, args = find('/soak_opt')
self.ae(ep, soak_opt), self.ae(args, ['xxx'])
ep, args = find('/soak_opt/a/b')
self.ae(ep, soak_opt), self.ae(args, ['a/b'])
self.ae(router.url_for('/needs quoting', x='a/b c'), '/needs quoting/a%2Fb%20c')
self.ae(router.url_for(None), '/')
self.ae(router.url_for('/get', a='1', b='xxx'), '/get/1/xxx')