1559 lines
77 KiB
Python
1559 lines
77 KiB
Python
|
#!/usr/bin/env python
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
"""Unit tests for rewrite.py routers option"""
|
||
|
from __future__ import print_function
|
||
|
import os
|
||
|
import unittest
|
||
|
import tempfile
|
||
|
import logging
|
||
|
|
||
|
from gluon.rewrite import load, filter_url, filter_err, get_effective_router, map_url_out
|
||
|
from gluon.html import URL
|
||
|
from gluon.fileutils import abspath
|
||
|
from gluon.settings import global_settings
|
||
|
from gluon.http import HTTP
|
||
|
from gluon.storage import Storage
|
||
|
from gluon._compat import to_bytes, PY2
|
||
|
|
||
|
logger = None
|
||
|
oldcwd = None
|
||
|
root = None
|
||
|
|
||
|
def norm_root(root):
|
||
|
return root.replace('/', os.sep)
|
||
|
|
||
|
def setUpModule():
|
||
|
def make_apptree():
|
||
|
"build a temporary applications tree"
|
||
|
# applications/
|
||
|
os.mkdir(abspath('applications'))
|
||
|
|
||
|
# applications/app/
|
||
|
for app in ('admin', 'examples', 'welcome'):
|
||
|
os.mkdir(abspath('applications', app))
|
||
|
# applications/app/(controllers, static)
|
||
|
for subdir in ('controllers', 'static'):
|
||
|
os.mkdir(abspath('applications', app, subdir))
|
||
|
|
||
|
# applications/admin/controllers/*.py
|
||
|
for ctr in ('appadmin', 'default', 'gae', 'mercurial', 'shell', 'wizard'):
|
||
|
open(abspath('applications', 'admin',
|
||
|
'controllers', '%s.py' % ctr), 'w').close()
|
||
|
# applications/examples/controllers/*.py
|
||
|
for ctr in ('ajax_examples', 'appadmin', 'default', 'global', 'spreadsheet'):
|
||
|
open(abspath('applications', 'examples',
|
||
|
'controllers', '%s.py' % ctr), 'w').close()
|
||
|
# applications/welcome/controllers/*.py
|
||
|
# (include controller that collides with another app)
|
||
|
for ctr in ('appadmin', 'default', 'other', 'admin'):
|
||
|
open(abspath('applications', 'welcome',
|
||
|
'controllers', '%s.py' % ctr), 'w').close()
|
||
|
|
||
|
# create an app-specific routes.py for examples app
|
||
|
routes = open(abspath('applications', 'examples', 'routes.py'), 'w')
|
||
|
routes.write("routers=dict(examples=dict(default_function='exdef'))")
|
||
|
routes.close()
|
||
|
|
||
|
# create language files for examples app
|
||
|
for lang in ('en', 'it'):
|
||
|
os.mkdir(abspath('applications', 'examples', 'static', lang))
|
||
|
open(abspath('applications', 'examples', 'static',
|
||
|
lang, 'file'), 'w').close()
|
||
|
|
||
|
global oldcwd
|
||
|
if oldcwd is None: # do this only once
|
||
|
oldcwd = os.getcwd()
|
||
|
if not os.path.isdir('gluon'):
|
||
|
os.chdir(os.path.realpath(
|
||
|
'../../')) # run from web2py base directory
|
||
|
import gluon.main # for initialization after chdir
|
||
|
global logger
|
||
|
logger = logging.getLogger('web2py.rewrite')
|
||
|
global_settings.applications_parent = tempfile.mkdtemp()
|
||
|
global root
|
||
|
root = global_settings.applications_parent
|
||
|
make_apptree()
|
||
|
|
||
|
|
||
|
def tearDownModule():
|
||
|
global oldcwd
|
||
|
if oldcwd is not None:
|
||
|
os.chdir(oldcwd)
|
||
|
oldcwd = None
|
||
|
|
||
|
|
||
|
class TestRouter(unittest.TestCase):
|
||
|
""" Tests the routers logic from gluon.rewrite """
|
||
|
|
||
|
def myassertRaisesRegex(self, *args, **kwargs):
|
||
|
if PY2:
|
||
|
return getattr(self, 'assertRaisesRegexp')(*args, **kwargs)
|
||
|
return getattr(self, 'assertRaisesRegex')(*args, **kwargs)
|
||
|
|
||
|
def test_router_syntax(self):
|
||
|
""" Test router syntax error """
|
||
|
level = logger.getEffectiveLevel()
|
||
|
logger.setLevel(logging.CRITICAL) # disable logging temporarily
|
||
|
self.assertRaises(SyntaxError, load, data='x::y')
|
||
|
self.assertRaises(
|
||
|
SyntaxError, load, rdict=dict(BASE=dict(badkey="value")))
|
||
|
self.assertRaises(SyntaxError, load, rdict=dict(
|
||
|
BASE=dict(), app=dict(default_application="name")))
|
||
|
|
||
|
self.myassertRaisesRegex(SyntaxError, "invalid syntax",
|
||
|
load, data='x::y')
|
||
|
self.myassertRaisesRegex(SyntaxError, "unknown key",
|
||
|
load, rdict=dict(BASE=dict(badkey="value")))
|
||
|
self.myassertRaisesRegex(SyntaxError, "BASE-only key",
|
||
|
load, rdict=dict(BASE=dict(), app=dict(default_application="name")))
|
||
|
logger.setLevel(level)
|
||
|
|
||
|
def test_router_null(self):
|
||
|
""" Tests the null router """
|
||
|
load(rdict=dict())
|
||
|
# app resolution
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/welcome', app=True), 'welcome')
|
||
|
self.assertEqual(filter_url('http://domain.com/', app=True), 'init')
|
||
|
# incoming
|
||
|
self.assertEqual(filter_url('http://domain.com/favicon.ico'),
|
||
|
norm_root('%s/applications/init/static/favicon.ico' % root))
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/abc'), '/init/default/abc')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/index/abc'), "/init/default/index ['abc']")
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/abc/def'), "/init/default/abc ['def']")
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/index/a%20bc'), "/init/default/index ['a bc']")
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/path/to/static').replace('/', os.sep),
|
||
|
norm_root("%s/applications/welcome/static/path/to/static" % root))
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/welcome/static/bad/path/to/st~tic')
|
||
|
self.myassertRaisesRegex(HTTP, "400.*invalid static file", filter_url, 'http://domain.com/welcome/static/bad/path/to/st~tic')
|
||
|
# outgoing
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/init/default/index', out=True), '/')
|
||
|
self.assertEqual(filter_url('http://domain.com/init/default/index/arg1', out=True), '/index/arg1')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/init/default/abc', out=True), '/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/init/static/abc',
|
||
|
out=True), '/init/static/abc')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/init/appadmin/index', out=True), '/appadmin')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/init/appadmin/abc', out=True), '/appadmin/abc')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/init/admin/index', out=True), '/init/admin')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/init/admin/abc', out=True), '/init/admin/abc')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/admin/default/abc', out=True), '/admin/abc')
|
||
|
|
||
|
def test_router_specific(self):
|
||
|
"""
|
||
|
Test app-specific routes.py
|
||
|
|
||
|
Note that make_apptree above created applications/examples/routes.py with a default_function.
|
||
|
"""
|
||
|
load(rdict=dict())
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/welcome'), '/welcome/default/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/examples'), '/examples/default/exdef')
|
||
|
|
||
|
def test_router_defapp(self):
|
||
|
""" Test the default-application function """
|
||
|
routers = dict(BASE=dict(default_application='welcome'))
|
||
|
load(rdict=routers)
|
||
|
# app resolution
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/welcome', app=True), 'welcome')
|
||
|
self.assertEqual(filter_url('http://domain.com/', app=True), 'welcome')
|
||
|
# incoming
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com'), '/welcome/default/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/'), '/welcome/default/index')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/appadmin'), '/welcome/appadmin/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/abc'), '/welcome/default/abc')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/index/abc'), "/welcome/default/index ['abc']")
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/abc/def'), "/welcome/default/abc ['def']")
|
||
|
self.assertEqual(filter_url('http://domain.com/favicon.ico'),
|
||
|
norm_root('%s/applications/welcome/static/favicon.ico' % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/static/abc'),
|
||
|
norm_root('%s/applications/welcome/static/abc' % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/static/path/to/static').replace('/', os.sep),
|
||
|
norm_root("%s/applications/welcome/static/path/to/static" % root))
|
||
|
# outgoing
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/welcome/default/index', out=True), '/')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/index/arg1', out=True), '/index/arg1')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/welcome/default/abc', out=True), '/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/admin',
|
||
|
out=True), '/default/admin')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/welcome/static/abc', out=True),
|
||
|
'/welcome/static/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/appadmin/index',
|
||
|
out=True), '/appadmin')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/appadmin/abc',
|
||
|
out=True), '/appadmin/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/admin/index',
|
||
|
out=True), '/welcome/admin')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/admin/abc',
|
||
|
out=True), '/welcome/admin/abc')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/admin/default/abc', out=True), '/admin/abc')
|
||
|
|
||
|
def test_router_nodef(self):
|
||
|
""" Test no-default functions """
|
||
|
routers = dict(
|
||
|
BASE=dict(default_application='welcome'),
|
||
|
welcome=dict(controllers=None),
|
||
|
)
|
||
|
load(rdict=routers)
|
||
|
# outgoing
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/welcome/default/index', out=True), '/default')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/index/arg1', out=True), '/default/index/arg1')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/abc',
|
||
|
out=True), '/default/abc')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/welcome/static/abc', out=True),
|
||
|
'/welcome/static/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/appadmin/index',
|
||
|
out=True), '/appadmin')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/appadmin/abc',
|
||
|
out=True), '/appadmin/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/admin/index',
|
||
|
out=True), '/welcome/admin')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/admin/abc',
|
||
|
out=True), '/welcome/admin/abc')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/admin/default/abc', out=True), '/admin/abc')
|
||
|
# incoming
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com'), '/welcome/default/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/'), '/welcome/default/index')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/appadmin'), '/welcome/appadmin/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/abc'), '/welcome/abc/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/index/abc'), "/welcome/index/abc")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/abc/def'), "/welcome/abc/def")
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/abc/def/ghi'), "/welcome/abc/def ['ghi']")
|
||
|
|
||
|
routers = dict(
|
||
|
BASE=dict(default_application=None),
|
||
|
)
|
||
|
load(rdict=routers)
|
||
|
# outgoing
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/welcome/default/index', out=True), '/welcome')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/index/arg1', out=True), '/welcome/index/arg1')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/abc',
|
||
|
out=True), '/welcome/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/abc',
|
||
|
out=True), '/welcome/static/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/appadmin/index',
|
||
|
out=True), '/welcome/appadmin')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/appadmin/abc',
|
||
|
out=True), '/welcome/appadmin/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/admin/index',
|
||
|
out=True), '/welcome/admin')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/admin/abc',
|
||
|
out=True), '/welcome/admin/abc')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/admin/default/abc', out=True), '/admin/abc')
|
||
|
# incoming
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com')
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/appadmin')
|
||
|
self.myassertRaisesRegex(HTTP, "400.*invalid application",
|
||
|
filter_url, 'http://domain.com')
|
||
|
self.myassertRaisesRegex(HTTP, "400.*invalid application",
|
||
|
filter_url, 'http://domain.com/appadmin')
|
||
|
routers = dict(
|
||
|
BASE=dict(default_application='welcome', applications=None),
|
||
|
)
|
||
|
load(rdict=routers)
|
||
|
# outgoing
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/welcome/default/index', out=True), '/welcome')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/index/arg1', out=True), '/welcome/index/arg1')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/abc',
|
||
|
out=True), '/welcome/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/abc',
|
||
|
out=True), '/welcome/static/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/appadmin/index',
|
||
|
out=True), '/welcome/appadmin')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/appadmin/abc',
|
||
|
out=True), '/welcome/appadmin/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/admin/index',
|
||
|
out=True), '/welcome/admin')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/admin/abc',
|
||
|
out=True), '/welcome/admin/abc')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/admin/default/abc', out=True), '/admin/abc')
|
||
|
# incoming
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com'), '/welcome/default/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/'), '/welcome/default/index')
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/appadmin')
|
||
|
self.myassertRaisesRegex(HTTP, "400.*unknown application: 'appadmin'", filter_url, 'http://domain.com/appadmin')
|
||
|
routers = dict(
|
||
|
BASE=dict(default_application='welcome', applications=None),
|
||
|
welcome=dict(controllers=None),
|
||
|
)
|
||
|
load(rdict=routers)
|
||
|
# outgoing
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/index',
|
||
|
out=True), '/welcome/default')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/index/arg1', out=True), '/welcome/default/index/arg1')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/abc',
|
||
|
out=True), '/welcome/default/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/abc',
|
||
|
out=True), '/welcome/static/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/appadmin/index',
|
||
|
out=True), '/welcome/appadmin')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/appadmin/abc',
|
||
|
out=True), '/welcome/appadmin/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/admin/index',
|
||
|
out=True), '/welcome/admin')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/admin/abc',
|
||
|
out=True), '/welcome/admin/abc')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/admin/default/abc', out=True), '/admin/abc')
|
||
|
# incoming
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com'), '/welcome/default/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/'), '/welcome/default/index')
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/appadmin')
|
||
|
self.myassertRaisesRegex(HTTP, "400.*unknown application: 'appadmin'", filter_url, 'http://domain.com/appadmin')
|
||
|
|
||
|
routers = dict(
|
||
|
BASE=dict(default_application='welcome', applications=None),
|
||
|
welcome=dict(default_controller=None),
|
||
|
)
|
||
|
load(rdict=routers)
|
||
|
# outgoing
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/index',
|
||
|
out=True), '/welcome/default')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/index/arg1', out=True), '/welcome/default/index/arg1')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/abc',
|
||
|
out=True), '/welcome/default/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/abc',
|
||
|
out=True), '/welcome/static/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/appadmin/index',
|
||
|
out=True), '/welcome/appadmin')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/appadmin/abc',
|
||
|
out=True), '/welcome/appadmin/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/admin/index',
|
||
|
out=True), '/welcome/admin')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/admin/abc',
|
||
|
out=True), '/welcome/admin/abc')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/admin/default/abc', out=True), '/admin/abc')
|
||
|
# incoming
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com')
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/appadmin')
|
||
|
self.myassertRaisesRegex(HTTP, "400.*invalid controller",
|
||
|
filter_url, 'http://domain.com')
|
||
|
self.myassertRaisesRegex(HTTP, "400.*unknown application: 'appadmin'", filter_url, 'http://domain.com/appadmin')
|
||
|
|
||
|
routers = dict(
|
||
|
BASE=dict(default_application='welcome', applications=None),
|
||
|
welcome=dict(controllers=None, default_function=None),
|
||
|
)
|
||
|
load(rdict=routers)
|
||
|
# outgoing
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/index',
|
||
|
out=True), '/welcome/default/index')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/index/arg1', out=True), '/welcome/default/index/arg1')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/abc',
|
||
|
out=True), '/welcome/default/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/abc',
|
||
|
out=True), '/welcome/static/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/appadmin/index',
|
||
|
out=True), '/welcome/appadmin/index')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/appadmin/abc',
|
||
|
out=True), '/welcome/appadmin/abc')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/admin/index',
|
||
|
out=True), '/welcome/admin/index')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/admin/abc',
|
||
|
out=True), '/welcome/admin/abc')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/admin/default/abc', out=True), '/admin/abc')
|
||
|
# incoming
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com')
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/appadmin')
|
||
|
self.myassertRaisesRegex(HTTP, "400.*invalid function",
|
||
|
filter_url, 'http://domain.com')
|
||
|
self.myassertRaisesRegex(HTTP, "400.*unknown application: 'appadmin'", filter_url, 'http://domain.com/appadmin')
|
||
|
|
||
|
def test_router_app(self):
|
||
|
""" Tests the doctest router app resolution"""
|
||
|
routers = dict(
|
||
|
BASE=dict(
|
||
|
domains={
|
||
|
"domain1.com": "app1",
|
||
|
"www.domain1.com": "app1",
|
||
|
"domain2.com": "app2",
|
||
|
},
|
||
|
),
|
||
|
app1=dict(),
|
||
|
app2=dict(),
|
||
|
goodapp=dict(),
|
||
|
)
|
||
|
routers['bad!app'] = dict()
|
||
|
load(rdict=routers)
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/welcome', app=True), 'welcome')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/welcome/', app=True), 'welcome')
|
||
|
self.assertEqual(filter_url('http://domain.com', app=True), 'init')
|
||
|
self.assertEqual(filter_url('http://domain.com/', app=True), 'init')
|
||
|
self.assertEqual(filter_url('http://domain.com/abc', app=True), 'init')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain1.com/abc', app=True), 'app1')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://www.domain1.com/abc', app=True), 'app1')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain2.com/abc', app=True), 'app2')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain2.com/admin', app=True), 'admin')
|
||
|
|
||
|
routers['BASE']['exclusive_domain'] = True
|
||
|
load(rdict=routers)
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain2.com/admin', app=True), 'app2')
|
||
|
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/goodapp', app=True), 'goodapp')
|
||
|
self.assertRaises(
|
||
|
HTTP, filter_url, 'http://domain.com/bad!app', app=True)
|
||
|
self.myassertRaisesRegex(HTTP, '400.*invalid application',
|
||
|
filter_url, 'http://domain.com/bad!app')
|
||
|
|
||
|
routers['BASE']['domains']['domain3.com'] = 'app3'
|
||
|
self.assertRaises(SyntaxError, load, rdict=routers)
|
||
|
self.myassertRaisesRegex(
|
||
|
SyntaxError, "unknown.*app3", load, rdict=routers)
|
||
|
|
||
|
def test_router_domains_fs(self):
|
||
|
'''
|
||
|
Test URLs that map domains using test filesystem layout
|
||
|
'''
|
||
|
routers = dict(
|
||
|
BASE=dict(
|
||
|
domains={
|
||
|
"domain1.com": "admin",
|
||
|
"domain2.com": "welcome",
|
||
|
},
|
||
|
),
|
||
|
)
|
||
|
|
||
|
load(rdict=routers)
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain1.com'), '/admin/default/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain2.com'), '/welcome/default/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain1.com/gae'), '/admin/gae/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain2.com/other'), '/welcome/other/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain1.com/gae/f1'), '/admin/gae/f1')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain2.com/f2'), '/welcome/default/f2')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain2.com/other/f3'), '/welcome/other/f3')
|
||
|
|
||
|
def test_router_domains(self):
|
||
|
'''
|
||
|
Test URLs that map domains
|
||
|
'''
|
||
|
routers = dict(
|
||
|
BASE=dict(
|
||
|
applications=['app1', 'app2', 'app2A',
|
||
|
'app3', 'app4', 'app5', 'app6'],
|
||
|
domains={
|
||
|
# two domains to the same app
|
||
|
"domain1.com": "app1",
|
||
|
"www.domain1.com": "app1",
|
||
|
# same domain, two ports, to two apps
|
||
|
"domain2.com": "app2a",
|
||
|
"domain2.com:8080": "app2b",
|
||
|
# two domains, same app, two controllers
|
||
|
"domain3a.com": "app3/c3a",
|
||
|
"domain3b.com": "app3/c3b",
|
||
|
# two domains, same app & controller, two functions
|
||
|
"domain4a.com": "app4/c4/f4a",
|
||
|
"domain4b.com": "app4/c4/f4b",
|
||
|
# http vs https
|
||
|
"domain6.com:80": "app6",
|
||
|
"domain6.com:443": "app6s",
|
||
|
},
|
||
|
),
|
||
|
app1=dict(default_controller='c1', default_function='f1',
|
||
|
controllers=['c1'], exclusive_domain=True, ),
|
||
|
app2a=dict(default_controller='c2a',
|
||
|
default_function='f2a', controllers=['c2a'], ),
|
||
|
app2b=dict(default_controller='c2b',
|
||
|
default_function='f2b', controllers=['c2b'], ),
|
||
|
app3=dict(controllers=['c3a', 'c3b'], ),
|
||
|
app4=dict(default_controller='c4', controllers=['c4']),
|
||
|
app5=dict(default_controller='c5',
|
||
|
controllers=['c5'], domain='localhost'),
|
||
|
app6=dict(default_controller='c6',
|
||
|
default_function='f6', controllers=['c6'], ),
|
||
|
app6s=dict(default_controller='c6s',
|
||
|
default_function='f6s', controllers=['c6s'], ),
|
||
|
)
|
||
|
|
||
|
load(rdict=routers)
|
||
|
self.assertEqual(filter_url('http://domain1.com/abc'), '/app1/c1/abc')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain1.com/c1/abc'), '/app1/c1/abc')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain1.com/abc.html'), '/app1/c1/abc')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain1.com/abc.css'), '/app1/c1/abc.css')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain1.com/index/abc'), "/app1/c1/index ['abc']")
|
||
|
self.assertEqual(filter_url('http://domain2.com/app1'), "/app1/c1/f1")
|
||
|
|
||
|
self.assertEqual(filter_url('https://domain1.com/app1/ctr/fcn',
|
||
|
domain=('app1', None), out=True), "/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://www.domain1.com/app1/ctr/fcn',
|
||
|
domain=('app1', None), out=True), "/ctr/fcn")
|
||
|
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain2.com/abc'), '/app2a/c2a/abc')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain2.com:8080/abc'), '/app2b/c2b/abc')
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain2.com/app2a/ctr/fcn',
|
||
|
domain=('app2a', None), out=True), "/ctr/fcn")
|
||
|
self.assertEqual(filter_url('http://domain2.com/app2a/ctr/f2a',
|
||
|
domain=('app2a', None), out=True), "/ctr")
|
||
|
self.assertEqual(filter_url('http://domain2.com/app2a/c2a/f2a',
|
||
|
domain=('app2a', None), out=True), "/")
|
||
|
self.assertEqual(filter_url('http://domain2.com/app2a/c2a/fcn',
|
||
|
domain=('app2a', None), out=True), "/fcn")
|
||
|
self.assertEqual(filter_url('http://domain2.com/app2a/ctr/fcn',
|
||
|
domain=('app2b', None), out=True), "/app2a/ctr/fcn")
|
||
|
self.assertEqual(filter_url('http://domain2.com/app2a/ctr/f2a',
|
||
|
domain=('app2b', None), out=True), "/app2a/ctr")
|
||
|
self.assertEqual(filter_url('http://domain2.com/app2a/c2a/f2a',
|
||
|
domain=('app2b', None), out=True), "/app2a")
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain3a.com/'), '/app3/c3a/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain3a.com/abc'), '/app3/c3a/abc')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain3a.com/c3b'), '/app3/c3b/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain3b.com/abc'), '/app3/c3b/abc')
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain3a.com/app3/c3a/fcn',
|
||
|
domain=('app3', 'c3a'), out=True), "/fcn")
|
||
|
self.assertEqual(filter_url('http://domain3a.com/app3/c3a/fcn',
|
||
|
domain=('app3', 'c3b'), out=True), "/c3a/fcn")
|
||
|
self.assertEqual(filter_url('http://domain3a.com/app3/c3a/fcn',
|
||
|
domain=('app1', None), out=True), "/app3/c3a/fcn")
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain4a.com/abc'), '/app4/c4/abc')
|
||
|
self.assertEqual(filter_url('https://domain4a.com/app4/c4/fcn',
|
||
|
domain=('app4', None), out=True), "/fcn")
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain4a.com'), '/app4/c4/f4a')
|
||
|
self.assertEqual(filter_url('http://domain4b.com'), '/app4/c4/f4b')
|
||
|
|
||
|
self.assertEqual(filter_url('http://localhost/abc'), '/app5/c5/abc')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http:///abc'), '/app5/c5/abc') # test null host => localhost
|
||
|
self.assertEqual(filter_url('https://localhost/app5/c5/fcn',
|
||
|
domain=('app5', None), out=True), "/fcn")
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain6.com'), '/app6/c6/f6')
|
||
|
self.assertEqual(filter_url('https://domain6.com'), '/app6s/c6s/f6s')
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain2.com/app3/c3a/f3',
|
||
|
domain=('app2b', None), out=True), "/app3/c3a/f3")
|
||
|
self.assertRaises(SyntaxError, filter_url, 'http://domain1.com/app1/c1/f1', domain=('app2b', None), out=True)
|
||
|
self.myassertRaisesRegex(SyntaxError, 'cross-domain conflict', filter_url,
|
||
|
'http://domain1.com/app1/c1/f1', domain=('app2b', None), out=True)
|
||
|
self.assertEqual(filter_url('http://domain1.com/app1/c1/f1', domain=(
|
||
|
'app2b', None), host='domain2.com', out=True), "/app1")
|
||
|
|
||
|
def test_router_domains_ed(self):
|
||
|
'''
|
||
|
Test URLs that map domains with exclusive_domain set
|
||
|
'''
|
||
|
routers = dict(
|
||
|
BASE=dict(
|
||
|
applications=['app1', 'app2', 'app2A',
|
||
|
'app3', 'app4', 'app5', 'app6'],
|
||
|
exclusive_domain=True,
|
||
|
domains={
|
||
|
# two domains to the same app
|
||
|
"domain1.com": "app1",
|
||
|
"www.domain1.com": "app1",
|
||
|
# same domain, two ports, to two apps
|
||
|
"domain2.com": "app2a",
|
||
|
"domain2.com:8080": "app2b",
|
||
|
# two domains, same app, two controllers
|
||
|
"domain3a.com": "app3/c3a",
|
||
|
"domain3b.com": "app3/c3b",
|
||
|
# two domains, same app & controller, two functions
|
||
|
"domain4a.com": "app4/c4/f4a",
|
||
|
"domain4b.com": "app4/c4/f4b",
|
||
|
# http vs https
|
||
|
"domain6.com:80": "app6",
|
||
|
"domain6.com:443": "app6s",
|
||
|
},
|
||
|
),
|
||
|
app1=dict(default_controller='c1', default_function='f1',
|
||
|
controllers=['c1'], exclusive_domain=True, ),
|
||
|
app2a=dict(default_controller='c2a',
|
||
|
default_function='f2a', controllers=['c2a'], ),
|
||
|
app2b=dict(default_controller='c2b',
|
||
|
default_function='f2b', controllers=['c2b'], ),
|
||
|
app3=dict(controllers=['c3a', 'c3b'], ),
|
||
|
app4=dict(default_controller='c4', controllers=['c4']),
|
||
|
app5=dict(default_controller='c5',
|
||
|
controllers=['c5'], domain='localhost'),
|
||
|
app6=dict(default_controller='c6',
|
||
|
default_function='f6', controllers=['c6'], ),
|
||
|
app6s=dict(default_controller='c6s',
|
||
|
default_function='f6s', controllers=['c6s'], ),
|
||
|
)
|
||
|
|
||
|
load(rdict=routers)
|
||
|
self.assertEqual(filter_url('http://domain1.com/abc'), '/app1/c1/abc')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain1.com/c1/abc'), '/app1/c1/abc')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain1.com/abc.html'), '/app1/c1/abc')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain1.com/abc.css'), '/app1/c1/abc.css')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain1.com/index/abc'), "/app1/c1/index ['abc']")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain2.com/app1'), "/app2a/c2a/app1")
|
||
|
|
||
|
self.assertEqual(filter_url('https://domain1.com/app1/ctr/fcn',
|
||
|
domain=('app1', None), out=True), "/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://www.domain1.com/app1/ctr/fcn',
|
||
|
domain=('app1', None), out=True), "/ctr/fcn")
|
||
|
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain2.com/abc'), '/app2a/c2a/abc')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain2.com:8080/abc'), '/app2b/c2b/abc')
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain2.com/app2a/ctr/fcn',
|
||
|
domain=('app2a', None), out=True), "/ctr/fcn")
|
||
|
self.assertEqual(filter_url('http://domain2.com/app2a/ctr/f2a',
|
||
|
domain=('app2a', None), out=True), "/ctr")
|
||
|
self.assertEqual(filter_url('http://domain2.com/app2a/c2a/f2a',
|
||
|
domain=('app2a', None), out=True), "/")
|
||
|
self.assertEqual(filter_url('http://domain2.com/app2a/c2a/fcn',
|
||
|
domain=('app2a', None), out=True), "/fcn")
|
||
|
|
||
|
self.assertRaises(SyntaxError, filter_url, 'http://domain2.com/app2a/ctr/fcn', domain=('app2b', None), out=True)
|
||
|
self.assertRaises(SyntaxError, filter_url, 'http://domain2.com/app2a/ctr/f2a', domain=('app2b', None), out=True)
|
||
|
self.assertRaises(SyntaxError, filter_url, 'http://domain2.com/app2a/c2a/f2a', domain=('app2b', None), out=True)
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain3a.com/'), '/app3/c3a/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain3a.com/abc'), '/app3/c3a/abc')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain3a.com/c3b'), '/app3/c3b/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain3b.com/abc'), '/app3/c3b/abc')
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain3a.com/app3/c3a/fcn',
|
||
|
domain=('app3', 'c3a'), out=True), "/fcn")
|
||
|
self.assertEqual(filter_url('http://domain3a.com/app3/c3a/fcn',
|
||
|
domain=('app3', 'c3b'), out=True), "/c3a/fcn")
|
||
|
|
||
|
self.assertRaises(SyntaxError, filter_url, 'http://domain3a.com/app3/c3a/fcn', domain=('app1', None), out=True)
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain4a.com/abc'), '/app4/c4/abc')
|
||
|
self.assertEqual(filter_url('https://domain4a.com/app4/c4/fcn',
|
||
|
domain=('app4', None), out=True), "/fcn")
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain4a.com'), '/app4/c4/f4a')
|
||
|
self.assertEqual(filter_url('http://domain4b.com'), '/app4/c4/f4b')
|
||
|
|
||
|
self.assertEqual(filter_url('http://localhost/abc'), '/app5/c5/abc')
|
||
|
self.assertEqual(filter_url(
|
||
|
'http:///abc'), '/app5/c5/abc') # test null host => localhost
|
||
|
self.assertEqual(filter_url('https://localhost/app5/c5/fcn',
|
||
|
domain=('app5', None), out=True), "/fcn")
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain6.com'), '/app6/c6/f6')
|
||
|
self.assertEqual(filter_url('https://domain6.com'), '/app6s/c6s/f6s')
|
||
|
|
||
|
self.assertRaises(SyntaxError, filter_url, 'http://domain2.com/app3/c3a/f3', domain=('app2b', None), out=True)
|
||
|
self.assertRaises(SyntaxError, filter_url, 'http://domain1.com/app1/c1/f1', domain=('app2b', None), out=True)
|
||
|
self.myassertRaisesRegex(SyntaxError, 'cross-domain conflict', filter_url,
|
||
|
'http://domain1.com/app1/c1/f1', domain=('app2b', None), out=True)
|
||
|
self.assertEqual(filter_url('http://domain1.com/app1/c1/f1', domain=(
|
||
|
'app2b', None), host='domain2.com', out=True), "/app1")
|
||
|
|
||
|
def test_router_raise(self):
|
||
|
'''
|
||
|
Test URLs that raise exceptions
|
||
|
'''
|
||
|
# test non-exception variants
|
||
|
router_raise = dict(
|
||
|
init=dict(
|
||
|
controllers=[],
|
||
|
),
|
||
|
welcome=dict(
|
||
|
map_hyphen=False,
|
||
|
),
|
||
|
)
|
||
|
load(rdict=router_raise)
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/ctl'), "/init/ctl/index")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/default/fcn'), "/init/default/fcn")
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/default/fcn.ext'), "/init/default/fcn.ext")
|
||
|
self.assertEqual(filter_url('http://domain.com/default/fcn/arg'),
|
||
|
"/init/default/fcn ['arg']")
|
||
|
# now raise-HTTP variants
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/bad!ctl')
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/ctl/bad!fcn')
|
||
|
self.assertRaises(
|
||
|
HTTP, filter_url, 'http://domain.com/ctl/fcn.bad!ext')
|
||
|
self.assertRaises(
|
||
|
HTTP, filter_url, 'http://domain.com/ctl/fcn/bad!arg')
|
||
|
self.myassertRaisesRegex(HTTP, '400.*invalid controller', filter_url, 'http://domain.com/init/bad!ctl')
|
||
|
self.myassertRaisesRegex(HTTP, '400.*invalid function', filter_url,
|
||
|
'http://domain.com/init/ctlr/bad!fcn')
|
||
|
self.myassertRaisesRegex(HTTP, '400.*invalid extension', filter_url,
|
||
|
'http://domain.com/init/ctlr/fcn.bad!ext')
|
||
|
self.myassertRaisesRegex(HTTP, '400.*invalid arg', filter_url,
|
||
|
'http://domain.com/appc/init/fcn/bad!arg')
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/default/fcn_1'),
|
||
|
"/welcome/default/fcn_1")
|
||
|
self.assertRaises(
|
||
|
HTTP, filter_url, 'http://domain.com/welcome/default/fcn-1')
|
||
|
self.myassertRaisesRegex(HTTP, '400.*invalid function', filter_url,
|
||
|
'http://domain.com/welcome/default/fcn-1')
|
||
|
|
||
|
def test_router_out(self):
|
||
|
'''
|
||
|
Test basic outgoing routing
|
||
|
'''
|
||
|
router_out = dict(
|
||
|
BASE=dict(),
|
||
|
init=dict(controllers=['default', 'ctr'], ),
|
||
|
app=dict(),
|
||
|
)
|
||
|
load(rdict=router_out)
|
||
|
self.assertEqual(filter_url(
|
||
|
'https://domain.com/app/ctr/fcn', out=True), "/app/ctr/fcn")
|
||
|
self.assertEqual(filter_url(
|
||
|
'https://domain.com/init/ctr/fcn', out=True), "/ctr/fcn")
|
||
|
self.assertEqual(filter_url(
|
||
|
'https://domain.com/init/ctr/fcn', out=True), "/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/init/static/file',
|
||
|
out=True), "/init/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/init/static/index',
|
||
|
out=True), "/init/static/index")
|
||
|
self.assertEqual(filter_url(
|
||
|
'https://domain.com/init/default/index', out=True), "/")
|
||
|
self.assertEqual(
|
||
|
filter_url('https://domain.com/init/ctr/index', out=True), "/ctr")
|
||
|
self.assertEqual(filter_url('http://domain.com/init/default/fcn?query',
|
||
|
out=True), "/fcn?query")
|
||
|
self.assertEqual(filter_url('http://domain.com/init/default/fcn#anchor', out=True), "/fcn#anchor")
|
||
|
self.assertEqual(
|
||
|
filter_url(
|
||
|
'http://domain.com/init/default/fcn?query#anchor', out=True),
|
||
|
"/fcn?query#anchor")
|
||
|
|
||
|
router_out['BASE']['map_static'] = True
|
||
|
load(rdict=router_out)
|
||
|
self.assertEqual(filter_url(
|
||
|
'https://domain.com/init/static/file', out=True), "/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/init/static/index',
|
||
|
out=True), "/static/index")
|
||
|
|
||
|
router_out['init']['map_static'] = None
|
||
|
load(rdict=router_out)
|
||
|
self.assertEqual(filter_url('https://domain.com/init/static/file',
|
||
|
out=True), "/init/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/init/static/index',
|
||
|
out=True), "/init/static/index")
|
||
|
|
||
|
def test_router_functions(self):
|
||
|
'''
|
||
|
Test function-omission with functions=[something]
|
||
|
'''
|
||
|
router_functions = dict(
|
||
|
BASE=dict(
|
||
|
applications=['init', 'app', 'app2'],
|
||
|
default_application='app',
|
||
|
),
|
||
|
init=dict(
|
||
|
controllers=['default'],
|
||
|
),
|
||
|
app=dict(
|
||
|
controllers=['default', 'ctr'],
|
||
|
functions=dict(
|
||
|
default=['index', 'user', 'help'],
|
||
|
ctr=['ctrf1', 'ctrf2', 'ctrf3'],
|
||
|
),
|
||
|
default_function=dict(
|
||
|
default='index',
|
||
|
ctr='ctrf1',
|
||
|
),
|
||
|
),
|
||
|
app2=dict(
|
||
|
controllers=['default', 'ctr'],
|
||
|
functions=['index', 'user', 'help'],
|
||
|
),
|
||
|
)
|
||
|
load(rdict=router_functions)
|
||
|
|
||
|
# outbound
|
||
|
self.assertEqual(str(
|
||
|
URL(a='init', c='default', f='f', args=['arg1'])), "/init/f/arg1")
|
||
|
self.assertEqual(str(URL(a='init', c='default', f='index',
|
||
|
args=['arg1'])), "/init/index/arg1")
|
||
|
|
||
|
self.assertEqual(
|
||
|
str(URL(a='app', c='default', f='index', args=['arg1'])), "/arg1")
|
||
|
self.assertEqual(str(
|
||
|
URL(a='app', c='default', f='user', args=['arg1'])), "/user/arg1")
|
||
|
self.assertEqual(str(URL(
|
||
|
a='app', c='default', f='user', args=['index'])), "/user/index")
|
||
|
self.assertEqual(str(URL(
|
||
|
a='app', c='default', f='index', args=['index'])), "/index/index")
|
||
|
self.assertEqual(str(URL(
|
||
|
a='app', c='default', f='index', args=['init'])), "/index/init")
|
||
|
self.assertEqual(str(
|
||
|
URL(a='app', c='default', f='index', args=['ctr'])), "/index/ctr")
|
||
|
self.assertEqual(str(
|
||
|
URL(a='app', c='ctr', f='index', args=['arg'])), "/ctr/index/arg")
|
||
|
self.assertEqual(
|
||
|
str(URL(a='app', c='ctr', f='ctrf1', args=['arg'])), "/ctr/arg")
|
||
|
self.assertEqual(str(URL(
|
||
|
a='app', c='ctr', f='ctrf1', args=['ctrf2'])), "/ctr/ctrf1/ctrf2")
|
||
|
|
||
|
self.assertEqual(str(URL(
|
||
|
a='app2', c='default', f='index', args=['arg1'])), "/app2/arg1")
|
||
|
self.assertEqual(str(URL(a='app2', c='default', f='user',
|
||
|
args=['arg1'])), "/app2/user/arg1")
|
||
|
self.assertEqual(str(URL(a='app2', c='default', f='user',
|
||
|
args=['index'])), "/app2/user/index")
|
||
|
self.assertEqual(str(URL(a='app2', c='default', f='index',
|
||
|
args=['index'])), "/app2/index/index")
|
||
|
self.assertEqual(str(URL(a='app2', c='default', f='index',
|
||
|
args=['init'])), "/app2/index/init")
|
||
|
self.assertEqual(str(URL(a='app2', c='default', f='index',
|
||
|
args=['ctr'])), "/app2/index/ctr")
|
||
|
|
||
|
# outbound - with extensions
|
||
|
self.assertEqual(
|
||
|
str(URL(a='app', c='default', f='index.json')), "/index.json")
|
||
|
self.assertEqual(
|
||
|
str(URL(a='app', c='default', f='index.json', args=['arg1'])), "/index.json/arg1")
|
||
|
self.assertEqual(str(
|
||
|
URL(a='app', c='default', f='user.json')), "/user.json")
|
||
|
self.assertEqual(str(
|
||
|
URL(a='app', c='default', f='user.json', args=['arg1'])), "/user.json/arg1")
|
||
|
self.assertEqual(str(URL(
|
||
|
a='app', c='default', f='user.json', args=['index'])), "/user.json/index")
|
||
|
self.assertEqual(str(
|
||
|
URL(a='app', c='default', f='index.json', args=['ctr'])), "/index.json/ctr")
|
||
|
self.assertEqual(
|
||
|
str(URL(a='app', c='ctr', f='ctrf1.json', args=['arg'])), "/ctr/ctrf1.json/arg")
|
||
|
|
||
|
self.assertEqual(str(URL(
|
||
|
a='app2', c='default', f='index.json', args=['arg1'])), "/app2/index.json/arg1")
|
||
|
self.assertEqual(str(URL(
|
||
|
a='app2', c='ctr', f='index.json', args=['arg1'])), "/app2/ctr/index.json/arg1")
|
||
|
|
||
|
# inbound
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/arg'), "/app/default/index ['arg']")
|
||
|
self.assertEqual(filter_url('http://d.com/user'), "/app/default/user")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/user/arg'), "/app/default/user ['arg']")
|
||
|
self.assertEqual(filter_url('http://d.com/ctr'), "/app/ctr/ctrf1")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/ctr/arg'), "/app/ctr/ctrf1 ['arg']")
|
||
|
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://d.com/app2/arg'), "/app2/default/index ['arg']")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/app2/user'), "/app2/default/user")
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://d.com/app2/user/arg'), "/app2/default/user ['arg']")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/app2/ctr'), "/app2/ctr/index")
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://d.com/app2/ctr/index/arg'), "/app2/ctr/index ['arg']")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/app2/ctr/arg'), "/app2/ctr/arg")
|
||
|
|
||
|
# inbound - with extensions
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/index.json'), "/app/default/index.json")
|
||
|
self.assertEqual(filter_url('http://d.com/user.json'), "/app/default/user.json")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/user.json/arg'), "/app/default/user.json ['arg']")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/user.json/index'), "/app/default/user.json ['index']")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/index.json/ctr'), "/app/default/index.json ['ctr']")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/ctr/ctrf1.json/arg'), "/app/ctr/ctrf1.json ['arg']")
|
||
|
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://d.com/app2/index.json/arg'), "/app2/default/index.json ['arg']")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/app2/user.json'), "/app2/default/user.json")
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://d.com/app2/user.json/arg'), "/app2/default/user.json ['arg']")
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://d.com/app2/ctr/index.json/arg'), "/app2/ctr/index.json ['arg']")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/app2/ctr/arg'), "/app2/ctr/arg")
|
||
|
|
||
|
def test_router_functions2(self):
|
||
|
'''
|
||
|
Test more functions=[something]
|
||
|
'''
|
||
|
router_functions = dict(
|
||
|
BASE=dict(
|
||
|
default_application='init',
|
||
|
applications='INIT',
|
||
|
),
|
||
|
init=dict(
|
||
|
#default_controller = 'default',
|
||
|
controllers=['default', 'ctr'],
|
||
|
#default_function = 'index',
|
||
|
functions=['index', 'user', 'register', 'basicRegister',
|
||
|
'download', 'call', 'data', 'error']
|
||
|
),
|
||
|
)
|
||
|
|
||
|
load(rdict=router_functions)
|
||
|
|
||
|
# outbound
|
||
|
self.assertEqual(str(
|
||
|
URL(a='init', c='default', f='index', args=['arg1'])), "/arg1")
|
||
|
self.assertEqual(str(URL(
|
||
|
a='init', c='default', f='user', args=['arg1'])), "/user/arg1")
|
||
|
self.assertEqual(str(URL(
|
||
|
a='init', c='default', f='user', args=['index'])), "/user/index")
|
||
|
self.assertEqual(str(URL(a='init', c='default', f='index',
|
||
|
args=['index'])), "/index/index")
|
||
|
self.assertEqual(str(
|
||
|
URL(a='init', c='default', f='index', args=['init'])), "/init")
|
||
|
self.assertEqual(str(URL(
|
||
|
a='init', c='default', f='index', args=['ctr'])), "/index/ctr")
|
||
|
self.assertEqual(str(URL(
|
||
|
a='init', c='ctr', f='index', args=['arg'])), "/ctr/index/arg")
|
||
|
self.assertEqual(str(URL(
|
||
|
a='init', c='ctr', f='ctrf1', args=['arg'])), "/ctr/ctrf1/arg")
|
||
|
self.assertEqual(str(URL(a='init', c='ctr', f='ctrf1',
|
||
|
args=['ctrf2'])), "/ctr/ctrf1/ctrf2")
|
||
|
self.assertEqual(
|
||
|
str(URL(a='init', c='default', f='register')), "/register")
|
||
|
|
||
|
# inbound
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/arg'), "/init/default/index ['arg']")
|
||
|
self.assertEqual(filter_url('http://d.com/user'), "/init/default/user")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://d.com/user/arg'), "/init/default/user ['arg']")
|
||
|
self.assertEqual(filter_url('http://d.com/ctr'), "/init/ctr/index")
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://d.com/ctr/ctrf1/arg'), "/init/ctr/ctrf1 ['arg']")
|
||
|
|
||
|
def test_router_hyphen(self):
|
||
|
'''
|
||
|
Test hyphen conversion
|
||
|
'''
|
||
|
router_hyphen = dict(
|
||
|
BASE=dict(
|
||
|
applications=['init', 'app1', 'app2'],
|
||
|
),
|
||
|
init=dict(
|
||
|
controllers=['default'],
|
||
|
),
|
||
|
app1=dict(
|
||
|
controllers=['default'],
|
||
|
map_hyphen=True,
|
||
|
),
|
||
|
app2=dict(
|
||
|
controllers=['default'],
|
||
|
map_hyphen=False,
|
||
|
),
|
||
|
)
|
||
|
load(rdict=router_hyphen)
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/init/default/fcn_1', out=True), "/fcn_1")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/static/filename-with_underscore'),
|
||
|
norm_root("%s/applications/init/static/filename-with_underscore" % root))
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/init/static/filename-with_underscore', out=True),
|
||
|
"/init/static/filename-with_underscore")
|
||
|
|
||
|
self.assertEqual(filter_url('http://domain.com/app2/fcn_1'),
|
||
|
"/app2/default/fcn_1")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/app2/ctr/fcn_1',
|
||
|
domain=('app2', None), out=True),
|
||
|
"/ctr/fcn_1")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/app2/static/filename-with_underscore', domain=('app2', None), out=True),
|
||
|
"/app2/static/filename-with_underscore")
|
||
|
self.assertEqual(
|
||
|
filter_url(
|
||
|
'http://domain.com/app2/static/filename-with_underscore'),
|
||
|
norm_root("%s/applications/app2/static/filename-with_underscore" % root))
|
||
|
|
||
|
from gluon.globals import current
|
||
|
current.response.static_version = None
|
||
|
|
||
|
self.assertEqual(str(URL(a='init', c='default', f='a_b')), "/a_b")
|
||
|
self.assertEqual(str(URL(a='app1', c='default', f='a_b')), "/app1/a-b")
|
||
|
self.assertEqual(str(URL(a='app2', c='default', f='a_b')), "/app2/a_b")
|
||
|
self.assertEqual(
|
||
|
str(URL(a='app1', c='static', f='a/b_c')), "/app1/static/a/b_c")
|
||
|
self.assertEqual(
|
||
|
str(URL(a='app1', c='static/a', f='b_c')), "/app1/static/a/b_c")
|
||
|
self.assertEqual(
|
||
|
str(URL(a='app2', c='static', f='a/b_c')), "/app2/static/a/b_c")
|
||
|
self.assertEqual(
|
||
|
str(URL(a='app2', c='static/a', f='b_c')), "/app2/static/a/b_c")
|
||
|
|
||
|
def test_router_lang(self):
|
||
|
'''
|
||
|
Test language specifications
|
||
|
'''
|
||
|
router_lang = dict(
|
||
|
BASE=dict(default_application='admin'),
|
||
|
welcome=dict(),
|
||
|
admin=dict(
|
||
|
controllers=['default', 'ctr'],
|
||
|
languages=['en', 'it', 'it-it'], default_language='en',
|
||
|
),
|
||
|
examples=dict(
|
||
|
languages=['en', 'it', 'it-it'], default_language='en',
|
||
|
),
|
||
|
)
|
||
|
load(rdict=router_lang)
|
||
|
self.assertEqual(filter_url('http://domain.com/index/abc'),
|
||
|
"/admin/default/index ['abc'] (en)")
|
||
|
self.assertEqual(filter_url('http://domain.com/en/abc/def'),
|
||
|
"/admin/default/abc ['def'] (en)")
|
||
|
self.assertEqual(filter_url('http://domain.com/it/abc/def'),
|
||
|
"/admin/default/abc ['def'] (it)")
|
||
|
self.assertEqual(filter_url('http://domain.com/it-it/abc/def'),
|
||
|
"/admin/default/abc ['def'] (it-it)")
|
||
|
self.assertEqual(filter_url('http://domain.com/index/a%20bc'),
|
||
|
"/admin/default/index ['a bc'] (en)")
|
||
|
self.assertEqual(filter_url('http://domain.com/static/file'),
|
||
|
norm_root("%s/applications/admin/static/file" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/en/static/file'),
|
||
|
norm_root("%s/applications/admin/static/file" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/examples/en/static/file'),
|
||
|
norm_root("%s/applications/examples/static/en/file" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/examples/static/file'),
|
||
|
norm_root("%s/applications/examples/static/en/file" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/examples/it/static/file'),
|
||
|
norm_root("%s/applications/examples/static/it/file" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/examples/it-it/static/file'),
|
||
|
norm_root("%s/applications/examples/static/file" % root))
|
||
|
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
lang='en', out=True), "/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
lang='it', out=True), "/it/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
lang='it-it', out=True), "/it-it/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
lang='en', out=True), "/admin/en/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
lang='it', out=True), "/admin/it/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
lang='it-it', out=True), "/admin/it-it/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn',
|
||
|
lang='it', out=True), "/welcome/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn',
|
||
|
lang='es', out=True), "/welcome/ctr/fcn")
|
||
|
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
language='en', out=True), "/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
language='it', out=True), "/it/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
language='it-it', out=True), "/it-it/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
language='en', out=True), "/admin/en/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
language='it', out=True), "/admin/it/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
language='it-it', out=True), "/admin/it-it/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn',
|
||
|
language='it', out=True), "/welcome/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn',
|
||
|
language='es', out=True), "/welcome/ctr/fcn")
|
||
|
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
lang='it', language='en', out=True), "/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
lang='en', language='it', out=True), "/it/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
lang='it', language='it-it', out=True), "/it-it/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
lang='it', language='en', out=True), "/admin/en/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
lang='it', language='it', out=True), "/admin/it/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
lang='it', language='it-it', out=True), "/admin/it-it/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn',
|
||
|
lang='it', language='it', out=True), "/welcome/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn',
|
||
|
lang='it', language='es', out=True), "/welcome/ctr/fcn")
|
||
|
|
||
|
router_lang['admin']['map_static'] = True
|
||
|
load(rdict=router_lang)
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
lang='en', out=True), "/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
lang='it', out=True), "/it/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
lang='it-it', out=True), "/it-it/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
lang='en', out=True), "/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
lang='it', out=True), "/it/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
lang='it-it', out=True), "/it-it/static/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn',
|
||
|
lang='it', out=True), "/welcome/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn',
|
||
|
lang='es', out=True), "/welcome/ctr/fcn")
|
||
|
|
||
|
router_lang['admin']['map_static'] = False
|
||
|
router_lang['examples']['map_static'] = False
|
||
|
load(rdict=router_lang)
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
lang='en', out=True), "/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
lang='it', out=True), "/it/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||
|
lang='it-it', out=True), "/it-it/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
lang='en', out=True), "/admin/static/en/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
lang='it', out=True), "/admin/static/it/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/admin/static/file',
|
||
|
lang='it-it', out=True), "/admin/static/it-it/file")
|
||
|
self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn',
|
||
|
lang='it', out=True), "/welcome/ctr/fcn")
|
||
|
self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn',
|
||
|
lang='es', out=True), "/welcome/ctr/fcn")
|
||
|
self.assertEqual(filter_url('http://domain.com/static/file'),
|
||
|
norm_root("%s/applications/admin/static/file" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/en/static/file'),
|
||
|
norm_root("%s/applications/admin/static/file" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/examples/en/static/file'),
|
||
|
norm_root("%s/applications/examples/static/en/file" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/examples/static/file'),
|
||
|
norm_root("%s/applications/examples/static/en/file" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/examples/it/static/file'),
|
||
|
norm_root("%s/applications/examples/static/it/file" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/examples/it-it/static/file'),
|
||
|
norm_root("%s/applications/examples/static/file" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/examples/static/en/file').replace('/', os.sep),
|
||
|
norm_root("%s/applications/examples/static/en/file" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/examples/static/it/file').replace('/', os.sep),
|
||
|
norm_root("%s/applications/examples/static/it/file" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/examples/static/it-it/file').replace('/', os.sep),
|
||
|
norm_root("%s/applications/examples/static/it-it/file" % root))
|
||
|
|
||
|
def test_router_get_effective(self):
|
||
|
'''
|
||
|
Test get_effective_router
|
||
|
'''
|
||
|
router_get_effective = dict(
|
||
|
BASE=dict(
|
||
|
default_application='a1',
|
||
|
applications=['a1', 'a2'],
|
||
|
),
|
||
|
a1=dict(
|
||
|
controllers=['c1a', 'c1b', 'default'],
|
||
|
),
|
||
|
a2=dict(
|
||
|
default_controller='c2',
|
||
|
controllers=[],
|
||
|
),
|
||
|
a3=dict(
|
||
|
default_controller='c2',
|
||
|
controllers=['c1'],
|
||
|
),
|
||
|
a4=dict(
|
||
|
default_function='f1',
|
||
|
functions=['f2'],
|
||
|
),
|
||
|
)
|
||
|
load(rdict=router_get_effective)
|
||
|
self.assertEqual(
|
||
|
get_effective_router('BASE').applications, set(['a1', 'a2']))
|
||
|
self.assertEqual(
|
||
|
get_effective_router('BASE').default_application, 'a1')
|
||
|
self.assertEqual(get_effective_router('BASE').domains, {})
|
||
|
self.assertEqual(get_effective_router('a1').applications, None)
|
||
|
self.assertEqual(get_effective_router('a1').default_application, None)
|
||
|
self.assertEqual(get_effective_router('a1').domains, None)
|
||
|
self.assertEqual(
|
||
|
get_effective_router('a1').default_controller, "default")
|
||
|
self.assertEqual(get_effective_router('a2').default_application, None)
|
||
|
self.assertEqual(get_effective_router('a2').default_controller, "c2")
|
||
|
self.assertEqual(get_effective_router(
|
||
|
'a1').controllers, set(['c1a', 'c1b', 'default', 'static']))
|
||
|
self.assertEqual(get_effective_router('a2').controllers, set())
|
||
|
self.assertEqual(get_effective_router(
|
||
|
'a3').controllers, set(['c1', 'c2', 'static']))
|
||
|
self.assertEqual(get_effective_router(
|
||
|
'a4').functions, dict(default=set(['f1', 'f2'])))
|
||
|
self.assertEqual(get_effective_router('xx'), None)
|
||
|
|
||
|
def test_router_error(self):
|
||
|
'''
|
||
|
Test rewrite of HTTP errors
|
||
|
'''
|
||
|
router_err = dict()
|
||
|
load(rdict=router_err)
|
||
|
self.assertEqual(filter_err(200), 200)
|
||
|
self.assertEqual(filter_err(399), 399)
|
||
|
self.assertEqual(filter_err(400), 400)
|
||
|
|
||
|
def test_router_static_path(self):
|
||
|
'''
|
||
|
Test validation of static paths
|
||
|
Stock pattern: file_match = r'([-+=@$%\w]+[./]?)+$'
|
||
|
|
||
|
'''
|
||
|
load(rdict=dict())
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/path/to/static').replace('/', os.sep),
|
||
|
norm_root("%s/applications/welcome/static/path/to/static" % root))
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/welcome/static/bad/path/to/st~tic')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/path/to--/static').replace('/', os.sep),
|
||
|
norm_root("%s/applications/welcome/static/path/to--/static" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/path/==to--/static').replace('/', os.sep),
|
||
|
norm_root("%s/applications/welcome/static/path/==to--/static" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/path/-+=@$%/static').replace('/', os.sep),
|
||
|
norm_root("%s/applications/welcome/static/path/-+=@$%%/static" % root))
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/welcome/static/bad/path/to/.static')
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/welcome/static/bad/path/to/s..tatic')
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/welcome/static/bad/path/to//static')
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/welcome/static/bad/path/to/#static')
|
||
|
|
||
|
router_static = dict(
|
||
|
BASE=dict(
|
||
|
file_match=r'([-+=@$%#\w]+[./]?)+$', # legal static path
|
||
|
),
|
||
|
)
|
||
|
load(rdict=router_static)
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/path/to/#static').replace('/', os.sep),
|
||
|
norm_root("%s/applications/welcome/static/path/to/#static" % root))
|
||
|
|
||
|
router_static = dict(
|
||
|
BASE=dict(
|
||
|
file_match=r'[-+=@$%#.\w]+$', # legal static path element
|
||
|
),
|
||
|
)
|
||
|
load(rdict=router_static)
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/path/to/static').replace('/', os.sep),
|
||
|
norm_root("%s/applications/welcome/static/path/to/static" % root))
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/welcome/static/bad/path/to/st~tic')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/path/to--/static').replace('/', os.sep),
|
||
|
norm_root("%s/applications/welcome/static/path/to--/static" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/path/==to--/static').replace('/', os.sep),
|
||
|
norm_root("%s/applications/welcome/static/path/==to--/static" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/path/-+=@$%/static').replace('/', os.sep),
|
||
|
norm_root("%s/applications/welcome/static/path/-+=@$%%/static" % root))
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/welcome/static/bad/path/to//static')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/path/to/#static').replace('/', os.sep),
|
||
|
norm_root("%s/applications/welcome/static/path/to/#static" % root))
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/welcome/static/bad/path/./static')
|
||
|
self.assertRaises(HTTP, filter_url, 'http://domain.com/welcome/static/bad/path/../static')
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/path/.../static').replace('/', os.sep),
|
||
|
norm_root("%s/applications/welcome/static/path/.../static" % root))
|
||
|
self.assertEqual(filter_url('http://domain.com/welcome/static/path/to/.static').replace('/', os.sep),
|
||
|
norm_root("%s/applications/welcome/static/path/to/.static" % root))
|
||
|
|
||
|
def test_router_args(self):
|
||
|
'''
|
||
|
Test URL args parsing/generation
|
||
|
'''
|
||
|
load(rdict=dict())
|
||
|
self.assertEqual(filter_url('http://domain.com/init/default/f/arg1'),
|
||
|
"/init/default/f ['arg1']")
|
||
|
self.assertEqual(filter_url('http://domain.com/init/default/f/arg1/'),
|
||
|
"/init/default/f ['arg1']")
|
||
|
self.assertEqual(filter_url('http://domain.com/init/default/f/arg1//'),
|
||
|
"/init/default/f ['arg1', '']")
|
||
|
self.assertEqual(filter_url('http://domain.com/init/default/f//arg1'),
|
||
|
"/init/default/f ['', 'arg1']")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/init/default/f/arg1/arg2'),
|
||
|
"/init/default/f ['arg1', 'arg2']")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/init/default/f/arg1//arg2'),
|
||
|
"/init/default/f ['arg1', '', 'arg2']")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/init/default/f/arg1//arg3/'),
|
||
|
"/init/default/f ['arg1', '', 'arg3']")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/init/default/f/arg1//arg3//'),
|
||
|
"/init/default/f ['arg1', '', 'arg3', '']")
|
||
|
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/init/default/f', out=True), "/f")
|
||
|
self.assertEqual(map_url_out(None, None, 'init', 'default',
|
||
|
'f', None, None, None, None, None), "/f")
|
||
|
self.assertEqual(map_url_out(None, None, 'init', 'default',
|
||
|
'f', [], None, None, None, None), "/f")
|
||
|
self.assertEqual(map_url_out(None, None, 'init', 'default',
|
||
|
'f', ['arg1'], None, None, None, None), "/f")
|
||
|
self.assertEqual(map_url_out(None, None, 'init', 'default',
|
||
|
'f', ['arg1', ''], None, None, None, None), "/f")
|
||
|
self.assertEqual(
|
||
|
str(URL(a='init', c='default', f='f', args=None)), "/f")
|
||
|
self.assertEqual(
|
||
|
str(URL(a='init', c='default', f='f', args=['arg1'])), "/f/arg1")
|
||
|
self.assertEqual(str(URL(
|
||
|
a='init', c='default', f='f', args=['arg1', ''])), "/f/arg1//")
|
||
|
self.assertEqual(str(URL(a='init', c='default', f='f',
|
||
|
args=['arg1', '', 'arg3'])), "/f/arg1//arg3")
|
||
|
self.assertEqual(str(
|
||
|
URL(a='init', c='default', f='f', args=['ar g'])), "/f/ar%20g")
|
||
|
self.assertEqual(str(
|
||
|
URL(a='init', c='default', f='f', args=['årg'])), "/f/%C3%A5rg")
|
||
|
self.assertEqual(URL(a='init', c='default', f='fünc'), "/fünc")
|
||
|
self.assertEqual(
|
||
|
to_bytes(URL(a='init', c='default', f='fünc')), b"/f\xc3\xbcnc")
|
||
|
|
||
|
def test_routes_anchor(self):
|
||
|
'''
|
||
|
Test URL with anchor
|
||
|
'''
|
||
|
self.assertEqual(
|
||
|
str(URL(a='a', c='c', f='f', anchor='anchor')), "/a/c/f#anchor")
|
||
|
load(rdict=dict())
|
||
|
self.assertEqual(
|
||
|
str(URL(a='a', c='c', f='f', anchor='anchor')), "/a/c/f#anchor")
|
||
|
args = ['a1', 'a2']
|
||
|
self.assertEqual(
|
||
|
str(URL(a='a', c='c', f='f', args=args, anchor='anchor')),
|
||
|
"/a/c/f/a1/a2#anchor")
|
||
|
vars = dict(v1=1, v2=2)
|
||
|
self.assertEqual(
|
||
|
str(URL(a='a', c='c', f='f', vars=vars, anchor='anchor')),
|
||
|
"/a/c/f?v1=1&v2=2#anchor")
|
||
|
self.assertEqual(
|
||
|
str(URL(
|
||
|
a='a', c='c', f='f', args=args, vars=vars, anchor='anchor')),
|
||
|
"/a/c/f/a1/a2?v1=1&v2=2#anchor")
|
||
|
self.assertEqual(str(URL(a='init', c='default', f='index')),
|
||
|
"/")
|
||
|
self.assertEqual(str(URL(a='init', c='default', f='f')),
|
||
|
"/f")
|
||
|
self.assertEqual(
|
||
|
str(URL(a='init', c='default', f='index', anchor='anchor')),
|
||
|
"/#anchor")
|
||
|
self.assertEqual(
|
||
|
str(URL(a='init', c='default', f='f', anchor='anchor')),
|
||
|
"/f#anchor")
|
||
|
|
||
|
def test_router_prefix(self):
|
||
|
'''
|
||
|
Test path_prefix
|
||
|
'''
|
||
|
router_path_prefix = dict(
|
||
|
BASE=dict(
|
||
|
default_application='a1',
|
||
|
applications=['a1', 'a2'],
|
||
|
path_prefix='/path/to/apps',
|
||
|
),
|
||
|
a1=dict(
|
||
|
controllers=['c1a', 'c1b', 'default'],
|
||
|
),
|
||
|
a2=dict(
|
||
|
default_controller='c2',
|
||
|
controllers=[],
|
||
|
),
|
||
|
)
|
||
|
load(rdict=router_path_prefix)
|
||
|
self.assertEqual(str(URL(a='a1', c='c1a', f='f')),
|
||
|
"/path/to/apps/c1a/f")
|
||
|
self.assertEqual(str(URL(a='a2', c='c', f='f')),
|
||
|
"/path/to/apps/a2/c/f")
|
||
|
self.assertEqual(str(URL(a='a2', c='c2', f='f')),
|
||
|
"/path/to/apps/a2/c2/f")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/a1/'), "/a1/default/index")
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/path/to/apps/a1/'), "/a1/default/index")
|
||
|
self.assertEqual(filter_url(
|
||
|
'http://domain.com/path/to/a1/'), "/a1/default/path ['to', 'a1']")
|
||
|
|
||
|
def test_router_absolute(self):
|
||
|
'''
|
||
|
Test absolute URL
|
||
|
'''
|
||
|
load(rdict=dict())
|
||
|
r = Storage()
|
||
|
r.env = Storage()
|
||
|
r.env.http_host = 'domain.com'
|
||
|
r.env.wsgi_url_scheme = 'httpx' # distinguish incoming scheme
|
||
|
self.assertEqual(str(URL(r=r, a='a', c='c', f='f')), "/a/c/f")
|
||
|
self.assertEqual(str(URL(r=r, a='a', c='c', f='f', host=True)),
|
||
|
"httpx://domain.com/a/c/f")
|
||
|
self.assertEqual(str(URL(r=r, a='a', c='c', f='f', host='host.com')),
|
||
|
"httpx://host.com/a/c/f")
|
||
|
self.assertEqual(str(URL(r=r, a='a', c='c', f='f', scheme=True)),
|
||
|
"httpx://domain.com/a/c/f")
|
||
|
self.assertEqual(str(URL(r=r, a='a', c='c', f='f', scheme=False)),
|
||
|
"/a/c/f")
|
||
|
self.assertEqual(str(URL(r=r, a='a', c='c', f='f', scheme='https')),
|
||
|
"https://domain.com/a/c/f")
|
||
|
self.assertEqual(str(URL(r=r, a='a', c='c', f='f', scheme='wss')),
|
||
|
"wss://domain.com/a/c/f")
|
||
|
self.assertEqual(
|
||
|
str(URL(r=r, a='a', c='c', f='f', scheme=True, host=True)),
|
||
|
"httpx://domain.com/a/c/f")
|
||
|
self.assertEqual(
|
||
|
str(URL(r=r, a='a', c='c', f='f', scheme='https', host=True)),
|
||
|
"https://domain.com/a/c/f")
|
||
|
self.assertEqual(
|
||
|
str(URL(r=r, a='a', c='c', f='f', scheme=False, host=True)),
|
||
|
"httpx://domain.com/a/c/f")
|
||
|
self.assertEqual(
|
||
|
str(URL(r=r, a='a', c='c', f='f', scheme=True, host='host.com')),
|
||
|
"httpx://host.com/a/c/f")
|
||
|
self.assertEqual(
|
||
|
str(URL(r=r, a='a', c='c', f='f', scheme=False, host='host.com')),
|
||
|
"httpx://host.com/a/c/f")
|
||
|
self.assertEqual(str(URL(r=r, a='a', c='c', f='f', port=1234)),
|
||
|
"httpx://domain.com:1234/a/c/f")
|
||
|
self.assertEqual(
|
||
|
str(URL(r=r, a='a', c='c', f='f', scheme=True, port=1234)),
|
||
|
"httpx://domain.com:1234/a/c/f")
|
||
|
self.assertEqual(
|
||
|
str(URL(r=r, a='a', c='c', f='f', host='host.com', port=1234)),
|
||
|
"httpx://host.com:1234/a/c/f")
|
||
|
self.assertEqual(
|
||
|
str(URL(r=r, a='a', c='c', f='f', scheme='wss',
|
||
|
host='host.com', port=1234)),
|
||
|
"wss://host.com:1234/a/c/f")
|
||
|
|
||
|
def test_request_uri(self):
|
||
|
'''
|
||
|
Test REQUEST_URI in env
|
||
|
'''
|
||
|
load(rdict=dict())
|
||
|
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/abc', env=True).request_uri,
|
||
|
'/init/default/abc')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/abc?def', env=True).request_uri,
|
||
|
'/init/default/abc?def')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/index/abc', env=True).request_uri,
|
||
|
"/init/default/index/abc")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/abc/def', env=True).request_uri,
|
||
|
"/init/default/abc/def")
|
||
|
self.assertEqual(
|
||
|
filter_url('http://domain.com/index/a%20bc', env=True).request_uri,
|
||
|
"/init/default/index/a%20bc")
|
||
|
|
||
|
def test_request_collide(self):
|
||
|
'''
|
||
|
Test controller-app name collision: admin vs welcome/admin
|
||
|
'''
|
||
|
router_collide = dict(
|
||
|
BASE=dict(
|
||
|
domains={
|
||
|
'ex.domain.com': 'examples',
|
||
|
'ad.domain.com': 'admin',
|
||
|
'welcome.com': 'welcome',
|
||
|
'www.welcome.com': 'welcome',
|
||
|
},
|
||
|
exclusive_domain=True,
|
||
|
),
|
||
|
)
|
||
|
load(rdict=router_collide)
|
||
|
|
||
|
# basic inbound
|
||
|
self.assertEqual(
|
||
|
filter_url('http://ex.domain.com'), '/examples/default/exdef')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://ad.domain.com'), '/admin/default/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://welcome.com'), '/welcome/default/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://www.welcome.com'), '/welcome/default/index')
|
||
|
# basic outbound
|
||
|
self.assertEqual(filter_url('http://ex.domain.com/examples/default/exdef', domain='examples', out=True), "/")
|
||
|
self.assertEqual(filter_url('http://ad.domain.com/admin/default/index',
|
||
|
domain='admin', out=True), "/")
|
||
|
self.assertEqual(filter_url('http://welcome.com/welcome/default/index',
|
||
|
domain='welcome', out=True), "/")
|
||
|
self.assertEqual(filter_url('http://www.welcome.com/welcome/default/index', domain='welcome', out=True), "/")
|
||
|
|
||
|
# inbound
|
||
|
self.assertEqual(
|
||
|
filter_url('http://welcome.com/admin'), '/welcome/admin/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://welcome.com/f1'), '/welcome/default/f1')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://ad.domain.com/shell'), '/admin/shell/index')
|
||
|
self.assertEqual(
|
||
|
filter_url('http://ad.domain.com/f1'), '/admin/default/f1')
|
||
|
# outbound
|
||
|
self.assertEqual(filter_url('http://welcome.com/welcome/other/index',
|
||
|
domain='welcome', out=True), "/other")
|
||
|
self.assertEqual(filter_url('http://welcome.com/welcome/admin/index',
|
||
|
domain='welcome', out=True), "/admin")
|
||
|
self.assertEqual(filter_url('http://ad.domain.com/admin/shell/index',
|
||
|
domain='admin', out=True), "/shell")
|
||
|
self.assertEqual(filter_url('http://ad.domain.com/admin/default/f1',
|
||
|
domain='admin', out=True), "/f1")
|
||
|
router_collide['BASE']['exclusive_domain'] = False
|
||
|
load(rdict=router_collide)
|
||
|
self.assertEqual(filter_url('http://welcome.com/welcome/admin/index',
|
||
|
domain='welcome', out=True), "/welcome/admin")
|
||
|
|