better webclient.py
This commit is contained in:
@@ -1 +1 @@
|
||||
Version 2.00.1 (2012-08-29 18:31:20) rc4
|
||||
Version 2.00.1 (2012-08-29 21:57:05) rc4
|
||||
|
||||
+130
-42
@@ -2,8 +2,18 @@
|
||||
Developed by Massimo Di Pierro
|
||||
Released under the web2py license (LGPL)
|
||||
|
||||
It an interface on top of urllib2 that allows authentication and understand
|
||||
web2py cookies and web2py forms. An example of usage is at the bottom.
|
||||
It an interface on top of urllib2 which simplifies scripting of http requests
|
||||
mostly for testing purposes
|
||||
|
||||
- customizable
|
||||
- supports basic auth
|
||||
- supports cookies
|
||||
- supports session cookies (tested with web2py sessions)
|
||||
- detects broken session
|
||||
- detects web2py form postbacks and handles formname and formkey
|
||||
- detects web2py tickets
|
||||
|
||||
Some examples at the bottom.
|
||||
"""
|
||||
|
||||
import re
|
||||
@@ -11,82 +21,153 @@ import time
|
||||
import urllib
|
||||
import urllib2
|
||||
|
||||
DEFAULT_HEADERS = {
|
||||
'user-agent': 'Mozilla/4.0', # some servers are picky
|
||||
'accept-language': 'en',
|
||||
}
|
||||
|
||||
FORM_REGEX = re.compile('(\<input name\="_formkey" type\="hidden" value\="(?P<formkey>.+?)" \/\>)?\<input name\="_formname" type\="hidden" value\="(?P<formname>.+?)" \/\>')
|
||||
|
||||
SESSION_REGEX = 'session_id_(?P<name>.+)'
|
||||
|
||||
class WebClient(object):
|
||||
regex = re.compile('\<input name\="_formkey" type\="hidden" value\="(?P<formkey>.+?)" \/\>\<input name\="_formname" type\="hidden" value\="(?P<formname>.+?)" \/\>')
|
||||
|
||||
def __init__(self,app='', postbacks=True):
|
||||
def __init__(self,
|
||||
app = '',
|
||||
postbacks = True,
|
||||
default_headers = DEFAULT_HEADERS,
|
||||
session_regex = SESSION_REGEX):
|
||||
self.app = app
|
||||
self.postbacks = postbacks
|
||||
self.history = []
|
||||
self.app = app
|
||||
self.cookies = {}
|
||||
|
||||
self.default_headers = default_headers
|
||||
self.sessions = {}
|
||||
self.session_regex = session_regex and re.compile(session_regex)
|
||||
|
||||
def get(self,url,cookies=None,headers=None,auth=None):
|
||||
return self.post(url,data=None,cookies=cookies,headers=headers)
|
||||
|
||||
|
||||
def post(self,url,data=None,cookies=None,headers=None,auth=None):
|
||||
self.url = self.app+url
|
||||
|
||||
# if this POST form requires a postback do it
|
||||
if data and '_formname' in data and self.postbacks and \
|
||||
self.history and self.history[-1][1]!=self.url:
|
||||
self.history and self.history[-1][1]!=self.url:
|
||||
# to bypass the web2py CSRF need to get formkey
|
||||
# before submitting the form
|
||||
self.get(url,cookies=None,headers=None,auth=None)
|
||||
if cookies is None: cookies = self.cookies
|
||||
self.get(url,cookies=cookies,headers=headers,auth=auth)
|
||||
|
||||
# unless cookies are specified, recycle cookies
|
||||
if cookies is None:
|
||||
cookies = self.cookies
|
||||
cookies = cookies or {}
|
||||
headers = headers or {}
|
||||
|
||||
# if required do basic auth
|
||||
if auth:
|
||||
auth_handler = urllib2.HTTPBasicAuthHandler()
|
||||
auth_handler.add_password(**auth)
|
||||
opener = urllib2.build_opener(auth_handler)
|
||||
else:
|
||||
opener = urllib2.build_opener()
|
||||
|
||||
# copy headers from dict to list of key,value
|
||||
headers_list = []
|
||||
for key,value in (headers or {}).iteritems():
|
||||
for key,value in self.default_headers.iteritems():
|
||||
if not key in headers:
|
||||
headers[key] = value
|
||||
for key,value in headers.iteritems():
|
||||
if isinstance(value,(list,tuple)):
|
||||
for v in value: headers_list.append((key,v))
|
||||
else:
|
||||
headers_list.append((key,value))
|
||||
|
||||
# move cookies to headers
|
||||
for key,value in (cookies or {}).iteritems():
|
||||
for key,value in cookies.iteritems():
|
||||
headers_list.append(('Cookie','%s=%s' % (key,value)))
|
||||
|
||||
# add headers to request
|
||||
for key,value in headers_list:
|
||||
opener.addheaders.append((key,str(value)))
|
||||
if data is not None:
|
||||
self.method = 'POST'
|
||||
# if there is only one form, set _formname automatically
|
||||
if not '_formname' in data and len(self.forms)==1:
|
||||
data['_formname'] = self.forms.keys()[0]
|
||||
# if there is no formkey but it is known, set it
|
||||
if '_formname' in data and not '_formkey' in data and \
|
||||
data['_formname'] in self.forms:
|
||||
data['_formkey'] = self.forms[data['_formname']]
|
||||
data = urllib.urlencode(data)
|
||||
t0 = time.time()
|
||||
self.request = opener.open(self.url,data)
|
||||
|
||||
# assume everything is ok and make http request
|
||||
error = None
|
||||
try:
|
||||
if data is not None:
|
||||
self.method = 'POST'
|
||||
|
||||
# if there is only one form, set _formname automatically
|
||||
if not '_formname' in data and len(self.forms)==1:
|
||||
data['_formname'] = self.forms.keys()[0]
|
||||
|
||||
# if there is no formkey but it is known, set it
|
||||
if '_formname' in data and not '_formkey' in data and \
|
||||
data['_formname'] in self.forms:
|
||||
data['_formkey'] = self.forms[data['_formname']]
|
||||
|
||||
# time the POST request
|
||||
data = urllib.urlencode(data)
|
||||
t0 = time.time()
|
||||
self.response = opener.open(self.url,data)
|
||||
self.time = time.time()-t0
|
||||
else:
|
||||
self.method = 'GET'
|
||||
|
||||
# time the GET request
|
||||
t0 = time.time()
|
||||
self.response = opener.open(self.url)
|
||||
self.time = time.time()-t0
|
||||
except urllib2.HTTPError, error:
|
||||
# catch HTTP errors
|
||||
self.time = time.time()-t0
|
||||
else:
|
||||
self.method = 'GET'
|
||||
t0 = time.time()
|
||||
self.request = opener.open(self.url)
|
||||
self.time = time.time()-t0
|
||||
self.status = self.request.getcode()
|
||||
self.text = self.request.read()
|
||||
self.headers = dict(self.request.headers)
|
||||
self.response = error
|
||||
|
||||
self.status = self.response.getcode()
|
||||
self.text = self.response.read()
|
||||
self.headers = dict(self.response.headers)
|
||||
|
||||
# treat web2py tickets as special types of errors
|
||||
if error is not None:
|
||||
if 'web2py_error' in self.headers:
|
||||
raise RuntimeError, self.headers['web2py_error']
|
||||
else:
|
||||
raise error
|
||||
|
||||
# parse headers into cookies
|
||||
self.cookies = dict(item[:item.find(';')].split('=') for item in \
|
||||
self.headers.get('set-cookie','').split(','))
|
||||
if 'set-cookie' in self.headers:
|
||||
self.cookies = dict(
|
||||
item[:item.find(';')].split('=') for item in \
|
||||
self.headers['set-cookie'].split(','))
|
||||
else:
|
||||
self.cookies = {}
|
||||
|
||||
# check is a new session id has been issued, symptom of broken session
|
||||
if self.session_regex is not None:
|
||||
for cookie, value in self.cookies.iteritems():
|
||||
match = self.session_regex.match(cookie)
|
||||
if match:
|
||||
name = match.group('name')
|
||||
if name in self.sessions and self.sessions[name]!=value:
|
||||
raise RuntimeError, 'Broken sessions %s' % name
|
||||
self.sessions[name] = value
|
||||
|
||||
# find all forms and formkeys in page
|
||||
self.forms = {}
|
||||
# find all forms and formkeys
|
||||
for match in WebClient.regex.finditer(self.text):
|
||||
for match in FORM_REGEX.finditer(self.text):
|
||||
self.forms[match.group('formname')] = match.group('formkey')
|
||||
|
||||
# log this request
|
||||
self.history.append((self.method,self.url,self.status,self.time))
|
||||
|
||||
def test_web2py_registration_and_login():
|
||||
# from gluon.contrib.webclient import WebClient
|
||||
# start a web2py instance for testing
|
||||
|
||||
client = WebClient('http://127.0.0.1:8000/welcome/default/')
|
||||
client.get('index')
|
||||
session_id_welcome = client.cookies['session_id_welcome']
|
||||
|
||||
# register
|
||||
data = dict(first_name = 'Homer',
|
||||
last_name = 'Simpson',
|
||||
email = 'homer@web2py.com',
|
||||
@@ -95,22 +176,29 @@ def test_web2py_registration_and_login():
|
||||
_formname = 'register')
|
||||
client.post('user/register',data = data)
|
||||
|
||||
# logout
|
||||
client.get('user/logout')
|
||||
|
||||
# login
|
||||
data = dict(email='homer@web2py.com',
|
||||
password='test',
|
||||
_formname = 'login')
|
||||
client.post('user/login',data = data)
|
||||
|
||||
client.get('index')
|
||||
|
||||
# check registration and login were successful
|
||||
client.get('user/profile')
|
||||
assert 'Welcome Homer' in client.text
|
||||
|
||||
# check we are always in the same session
|
||||
assert session_id_welcome == client.cookies['session_id_welcome']
|
||||
|
||||
# print some variables
|
||||
print '\nsessions:\n',client.sessions
|
||||
print '\nheaders:\n',client.headers
|
||||
print '\ncookies:\n',client.cookies
|
||||
print '\nforms:\n',client.forms
|
||||
print
|
||||
for method, url, status, t in client.history:
|
||||
print method, url, status, t
|
||||
|
||||
if __name__ == '__main__':
|
||||
test_web2py_registration_and_login()
|
||||
|
||||
|
||||
|
||||
@@ -70,3 +70,5 @@ if __name__ == '__main__':
|
||||
setUpModule() # pre-python-2.7
|
||||
unittest.main()
|
||||
tearDownModule()
|
||||
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ else:
|
||||
from utils import md5_hash
|
||||
import contrib.fpdf as fpdf
|
||||
import contrib.pyfpdf as pyfpdf
|
||||
|
||||
|
||||
|
||||
class TestContribs(unittest.TestCase):
|
||||
""" Tests the contrib package """
|
||||
@@ -28,14 +28,15 @@ class TestContribs(unittest.TestCase):
|
||||
pdf = fpdf.FPDF()
|
||||
pdf.add_page()
|
||||
pdf.compress = False
|
||||
pdf.set_font('Arial', '',14)
|
||||
pdf.set_font('Arial', '',14)
|
||||
pdf.ln(10)
|
||||
pdf.write(5, 'hello world')
|
||||
pdf_out = pdf.output('', 'S')
|
||||
|
||||
|
||||
self.assertTrue(fpdf.FPDF_VERSION in pdf_out, 'version string')
|
||||
self.assertTrue('hello world' in pdf_out, 'sample message')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
|
||||
@@ -176,9 +176,9 @@ class TestTable(unittest.TestCase):
|
||||
self.assertRaises(SyntaxError, Table, None, 'test', None)
|
||||
|
||||
persons = Table(None, 'persons',
|
||||
Field('firstname','string'),
|
||||
Field('firstname','string'),
|
||||
Field('lastname', 'string'))
|
||||
|
||||
|
||||
# Does it have the correct fields?
|
||||
|
||||
self.assert_(set(persons.fields).issuperset(set(['firstname',
|
||||
@@ -519,7 +519,7 @@ class TestComputedFields(unittest.TestCase):
|
||||
|
||||
def testRun(self):
|
||||
db = DAL('sqlite:memory:')
|
||||
db.define_table('t',
|
||||
db.define_table('t',
|
||||
Field('a'),
|
||||
Field('b',default='x'),
|
||||
Field('c',compute=lambda r: r.a+r.b))
|
||||
@@ -547,7 +547,7 @@ class TestImportExportFields(unittest.TestCase):
|
||||
db(db.pet).delete()
|
||||
db(db.person).delete()
|
||||
stream = cStringIO.StringIO(stream.getvalue())
|
||||
db.import_from_csv_file(stream)
|
||||
db.import_from_csv_file(stream)
|
||||
assert db(db.person.id==db.pet.friend)(db.person.name==db.pet.name).count()==10
|
||||
db.pet.drop()
|
||||
db.person.drop()
|
||||
@@ -569,7 +569,7 @@ class TestImportExportUuidFields(unittest.TestCase):
|
||||
stream = cStringIO.StringIO()
|
||||
db.export_to_csv_file(stream)
|
||||
stream = cStringIO.StringIO(stream.getvalue())
|
||||
db.import_from_csv_file(stream)
|
||||
db.import_from_csv_file(stream)
|
||||
assert db(db.person).count()==10
|
||||
assert db(db.person.id==db.pet.friend)(db.person.name==db.pet.name).count()==20
|
||||
db.pet.drop()
|
||||
@@ -579,3 +579,4 @@ class TestImportExportUuidFields(unittest.TestCase):
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
tearDownModule()
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ class TestBareHelpers(unittest.TestCase):
|
||||
|
||||
def testHR(self):
|
||||
self.assertEqual(HR(_a='1', _b='2').xml(), '<hr a="1" b="2" />')
|
||||
|
||||
|
||||
def testIMG(self):
|
||||
self.assertEqual(IMG(_a='1', _b='2').xml(),
|
||||
'<img a="1" b="2" />')
|
||||
@@ -209,3 +209,4 @@ class TestBareHelpers(unittest.TestCase):
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
|
||||
@@ -642,3 +642,4 @@ class TestUnicode(unittest.TestCase):
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ try:
|
||||
return True
|
||||
|
||||
class TestLanguagesParallel(unittest.TestCase):
|
||||
|
||||
|
||||
def setUp(self):
|
||||
self.filename = tempfile.mktemp()
|
||||
contents = dict()
|
||||
@@ -46,7 +46,7 @@ try:
|
||||
os.remove(self.filename)
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
def test_reads_and_writes(self):
|
||||
readwriters = 10
|
||||
pool = multiprocessing.Pool(processes = readwriters)
|
||||
@@ -56,17 +56,17 @@ try:
|
||||
|
||||
|
||||
class TestTranslations(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
|
||||
def setUp(self):
|
||||
self.request = Storage()
|
||||
self.request.folder = 'applications/welcome'
|
||||
self.request.env = Storage()
|
||||
self.request.env.http_accept_language = 'en'
|
||||
|
||||
|
||||
|
||||
|
||||
def tearDown(self):
|
||||
pass
|
||||
|
||||
|
||||
def test_plain(self):
|
||||
T = languages.translator(self.request)
|
||||
self.assertEqual(str(T('Hello World')),
|
||||
@@ -89,6 +89,7 @@ try:
|
||||
|
||||
except ImportError:
|
||||
logging.warning("Skipped test case, no multiprocessing module.")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
|
||||
+60
-59
@@ -54,7 +54,7 @@ def setUpModule():
|
||||
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))
|
||||
@@ -92,11 +92,11 @@ class TestRouter(unittest.TestCase):
|
||||
self.assertRaises(SyntaxError, load, rdict=dict(BASE=dict(), app=dict(default_application="name")))
|
||||
try:
|
||||
# 2.7+ only
|
||||
self.assertRaisesRegexp(SyntaxError, "invalid syntax",
|
||||
self.assertRaisesRegexp(SyntaxError, "invalid syntax",
|
||||
load, data='x:y')
|
||||
self.assertRaisesRegexp(SyntaxError, "unknown key",
|
||||
self.assertRaisesRegexp(SyntaxError, "unknown key",
|
||||
load, rdict=dict(BASE=dict(badkey="value")))
|
||||
self.assertRaisesRegexp(SyntaxError, "BASE-only key",
|
||||
self.assertRaisesRegexp(SyntaxError, "BASE-only key",
|
||||
load, rdict=dict(BASE=dict(), app=dict(default_application="name")))
|
||||
except AttributeError:
|
||||
pass
|
||||
@@ -133,9 +133,9 @@ class TestRouter(unittest.TestCase):
|
||||
self.assertEqual(filter_url('http://domain.com/admin/default/abc', out=True), '/admin/abc')
|
||||
|
||||
def test_router_specific(self):
|
||||
"""
|
||||
Test app-specific routes.py
|
||||
|
||||
"""
|
||||
Test app-specific routes.py
|
||||
|
||||
Note that make_apptree above created applications/examples/routes.py with a default_function.
|
||||
"""
|
||||
load(rdict=dict())
|
||||
@@ -164,7 +164,7 @@ class TestRouter(unittest.TestCase):
|
||||
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),
|
||||
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')
|
||||
@@ -183,7 +183,7 @@ class TestRouter(unittest.TestCase):
|
||||
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),
|
||||
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')
|
||||
@@ -386,7 +386,7 @@ class TestRouter(unittest.TestCase):
|
||||
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
|
||||
@@ -429,7 +429,7 @@ class TestRouter(unittest.TestCase):
|
||||
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")
|
||||
|
||||
@@ -534,7 +534,7 @@ class TestRouter(unittest.TestCase):
|
||||
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),
|
||||
self.assertEqual(filter_url('http://domain.com/init/default/fcn?query#anchor', out=True),
|
||||
"/fcn?query#anchor")
|
||||
|
||||
router_out['BASE']['map_static'] = True
|
||||
@@ -576,11 +576,11 @@ class TestRouter(unittest.TestCase):
|
||||
),
|
||||
)
|
||||
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")
|
||||
@@ -631,7 +631,7 @@ class TestRouter(unittest.TestCase):
|
||||
)
|
||||
|
||||
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")
|
||||
@@ -673,18 +673,18 @@ class TestRouter(unittest.TestCase):
|
||||
)
|
||||
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'),
|
||||
self.assertEqual(filter_url('http://domain.com/static/filename-with_underscore'),
|
||||
"%s/applications/init/static/filename-with_underscore" % root)
|
||||
self.assertEqual(filter_url('http://domain.com/init/static/filename-with_underscore', out=True),
|
||||
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'),
|
||||
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),
|
||||
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),
|
||||
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'),
|
||||
self.assertEqual(filter_url('http://domain.com/app2/static/filename-with_underscore'),
|
||||
"%s/applications/app2/static/filename-with_underscore" % root)
|
||||
|
||||
self.assertEqual(str(URL(a='init', c='default', f='a_b')), "/a_b")
|
||||
@@ -731,7 +731,7 @@ class TestRouter(unittest.TestCase):
|
||||
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/welcome/ctr/fcn', lang='es', out=True), "/welcome/ctr/fcn")
|
||||
|
||||
router_lang['admin']['map_static'] = True
|
||||
load(rdict=router_lang)
|
||||
@@ -742,7 +742,7 @@ class TestRouter(unittest.TestCase):
|
||||
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")
|
||||
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
|
||||
@@ -754,7 +754,7 @@ class TestRouter(unittest.TestCase):
|
||||
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('https://domain.com/welcome/ctr/fcn', lang='es', out=True), "/welcome/ctr/fcn")
|
||||
self.assertEqual(filter_url('http://domain.com/static/file'), "%s/applications/admin/static/file" % root)
|
||||
self.assertEqual(filter_url('http://domain.com/en/static/file'), "%s/applications/admin/static/file" % root)
|
||||
self.assertEqual(filter_url('http://domain.com/examples/en/static/file'), "%s/applications/examples/static/en/file" % root)
|
||||
@@ -865,21 +865,21 @@ class TestRouter(unittest.TestCase):
|
||||
Test URL args parsing/generation
|
||||
'''
|
||||
load(rdict=dict())
|
||||
self.assertEqual(filter_url('http://domain.com/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/'),
|
||||
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//'),
|
||||
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'),
|
||||
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'),
|
||||
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'),
|
||||
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/'),
|
||||
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//'),
|
||||
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")
|
||||
@@ -903,12 +903,12 @@ class TestRouter(unittest.TestCase):
|
||||
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')),
|
||||
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')),
|
||||
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')),
|
||||
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')),
|
||||
"/")
|
||||
@@ -938,11 +938,11 @@ class TestRouter(unittest.TestCase):
|
||||
),
|
||||
)
|
||||
load(rdict=router_path_prefix)
|
||||
self.assertEqual(str(URL(a='a1', c='c1a', f='f')),
|
||||
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')),
|
||||
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')),
|
||||
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")
|
||||
@@ -958,35 +958,35 @@ class TestRouter(unittest.TestCase):
|
||||
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)),
|
||||
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')),
|
||||
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)),
|
||||
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)),
|
||||
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')),
|
||||
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')),
|
||||
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)),
|
||||
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)),
|
||||
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)),
|
||||
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')),
|
||||
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')),
|
||||
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)),
|
||||
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)),
|
||||
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)),
|
||||
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)),
|
||||
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):
|
||||
@@ -995,15 +995,15 @@ class TestRouter(unittest.TestCase):
|
||||
'''
|
||||
load(rdict=dict())
|
||||
|
||||
self.assertEqual(filter_url('http://domain.com/abc', env=True).request_uri,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
self.assertEqual(filter_url('http://domain.com/index/a%20bc', env=True).request_uri,
|
||||
"/init/default/index/a%20bc")
|
||||
|
||||
def test_request_collide(self):
|
||||
@@ -1022,7 +1022,7 @@ class TestRouter(unittest.TestCase):
|
||||
),
|
||||
)
|
||||
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')
|
||||
@@ -1053,3 +1053,4 @@ if __name__ == '__main__':
|
||||
setUpModule() # pre-2.7
|
||||
unittest.main()
|
||||
tearDownModule()
|
||||
|
||||
|
||||
+70
-69
@@ -112,9 +112,9 @@ routes_in = (
|
||||
self.assertEqual(filter_url('http://localhost:8000/service/person/create?var1=val1'), "/app/default/call ['json', 'create'] ?model=person&var1=val1")
|
||||
|
||||
def test_routes_specific(self):
|
||||
"""
|
||||
Test app-specific routes.py
|
||||
|
||||
"""
|
||||
Test app-specific routes.py
|
||||
|
||||
Note that make_apptree above created applications/examples/routes.py with a default_function.
|
||||
"""
|
||||
data = r'''
|
||||
@@ -190,59 +190,59 @@ default_application = 'defapp'
|
||||
Test URL args parsing/generation
|
||||
'''
|
||||
data = r'''routes_in = [
|
||||
('/robots.txt', '/welcome/static/robots.txt'),
|
||||
('/favicon.ico', '/welcome/static/favicon.ico'),
|
||||
('/admin$anything', '/admin$anything'),
|
||||
('.*:https?://(.*\\.)?domain1.com:$method /', '/app1/default'),
|
||||
('.*:https?://(.*\\.)?domain1.com:$method /static/$anything', '/app1/static/$anything'),
|
||||
('.*:https?://(.*\\.)?domain1.com:$method /appadmin/$anything', '/app1/appadmin/$anything'),
|
||||
('.*:https?://(.*\\.)?domain1.com:$method /$anything', '/app1/default/$anything'),
|
||||
('.*:https?://(.*\\.)?domain2.com:$method /', '/app2/default'),
|
||||
('.*:https?://(.*\\.)?domain2.com:$method /static/$anything', '/app2/static/$anything'),
|
||||
('.*:https?://(.*\\.)?domain2.com:$method /appadmin/$anything', '/app2/appadmin/$anything'),
|
||||
('.*:https?://(.*\\.)?domain2.com:$method /$anything', '/app2/default/$anything'),
|
||||
('.*:https?://(.*\\.)?domain3.com:$method /', '/app3/defcon3'),
|
||||
('.*:https?://(.*\\.)?domain3.com:$method /static/$anything', '/app3/static/$anything'),
|
||||
('.*:https?://(.*\\.)?domain3.com:$method /appadmin/$anything', '/app3/appadmin/$anything'),
|
||||
('/robots.txt', '/welcome/static/robots.txt'),
|
||||
('/favicon.ico', '/welcome/static/favicon.ico'),
|
||||
('/admin$anything', '/admin$anything'),
|
||||
('.*:https?://(.*\\.)?domain1.com:$method /', '/app1/default'),
|
||||
('.*:https?://(.*\\.)?domain1.com:$method /static/$anything', '/app1/static/$anything'),
|
||||
('.*:https?://(.*\\.)?domain1.com:$method /appadmin/$anything', '/app1/appadmin/$anything'),
|
||||
('.*:https?://(.*\\.)?domain1.com:$method /$anything', '/app1/default/$anything'),
|
||||
('.*:https?://(.*\\.)?domain2.com:$method /', '/app2/default'),
|
||||
('.*:https?://(.*\\.)?domain2.com:$method /static/$anything', '/app2/static/$anything'),
|
||||
('.*:https?://(.*\\.)?domain2.com:$method /appadmin/$anything', '/app2/appadmin/$anything'),
|
||||
('.*:https?://(.*\\.)?domain2.com:$method /$anything', '/app2/default/$anything'),
|
||||
('.*:https?://(.*\\.)?domain3.com:$method /', '/app3/defcon3'),
|
||||
('.*:https?://(.*\\.)?domain3.com:$method /static/$anything', '/app3/static/$anything'),
|
||||
('.*:https?://(.*\\.)?domain3.com:$method /appadmin/$anything', '/app3/appadmin/$anything'),
|
||||
('.*:https?://(.*\\.)?domain3.com:$method /$anything', '/app3/defcon3/$anything'),
|
||||
('/', '/welcome/default'),
|
||||
('/welcome/default/$anything', '/welcome/default/$anything'),
|
||||
('/welcome/$anything', '/welcome/default/$anything'),
|
||||
('/static/$anything', '/welcome/static/$anything'),
|
||||
('/appadmin/$anything', '/welcome/appadmin/$anything'),
|
||||
('/$anything', '/welcome/default/$anything'),
|
||||
('/', '/welcome/default'),
|
||||
('/welcome/default/$anything', '/welcome/default/$anything'),
|
||||
('/welcome/$anything', '/welcome/default/$anything'),
|
||||
('/static/$anything', '/welcome/static/$anything'),
|
||||
('/appadmin/$anything', '/welcome/appadmin/$anything'),
|
||||
('/$anything', '/welcome/default/$anything'),
|
||||
]
|
||||
routes_out = [
|
||||
('/welcome/static/$anything', '/static/$anything'),
|
||||
('/welcome/appadmin/$anything', '/appadmin/$anything'),
|
||||
('/welcome/default/$anything', '/$anything'),
|
||||
('/app1/static/$anything', '/static/$anything'),
|
||||
('/app1/appadmin/$anything', '/appadmin/$anything'),
|
||||
('/app1/default/$anything', '/$anything'),
|
||||
('/app2/static/$anything', '/static/$anything'),
|
||||
('/app2/appadmin/$anything', '/appadmin/$anything'),
|
||||
('/app2/default/$anything', '/$anything'),
|
||||
('/app3/static/$anything', '/static/$anything'),
|
||||
('/app3/appadmin/$anything', '/appadmin/$anything'),
|
||||
('/welcome/static/$anything', '/static/$anything'),
|
||||
('/welcome/appadmin/$anything', '/appadmin/$anything'),
|
||||
('/welcome/default/$anything', '/$anything'),
|
||||
('/app1/static/$anything', '/static/$anything'),
|
||||
('/app1/appadmin/$anything', '/appadmin/$anything'),
|
||||
('/app1/default/$anything', '/$anything'),
|
||||
('/app2/static/$anything', '/static/$anything'),
|
||||
('/app2/appadmin/$anything', '/appadmin/$anything'),
|
||||
('/app2/default/$anything', '/$anything'),
|
||||
('/app3/static/$anything', '/static/$anything'),
|
||||
('/app3/appadmin/$anything', '/appadmin/$anything'),
|
||||
('/app3/defcon3/$anything', '/$anything')
|
||||
]
|
||||
'''
|
||||
load(data=data)
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f/arg1'),
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f/arg1'),
|
||||
"/welcome/default/f ['arg1']")
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f/arg1/'),
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f/arg1/'),
|
||||
"/welcome/default/f ['arg1']")
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f/arg1//'),
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f/arg1//'),
|
||||
"/welcome/default/f ['arg1', '']")
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f//arg1'),
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f//arg1'),
|
||||
"/welcome/default/f ['', 'arg1']")
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f/arg1/arg2'),
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f/arg1/arg2'),
|
||||
"/welcome/default/f ['arg1', 'arg2']")
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f/arg1//arg2'),
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f/arg1//arg2'),
|
||||
"/welcome/default/f ['arg1', '', 'arg2']")
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f/arg1//arg3/'),
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f/arg1//arg3/'),
|
||||
"/welcome/default/f ['arg1', '', 'arg3']")
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f/arg1//arg3//'),
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f/arg1//arg3//'),
|
||||
"/welcome/default/f ['arg1', '', 'arg3', '']")
|
||||
|
||||
self.assertEqual(filter_url('http://domain.com/welcome/default/f', out=True), "/f")
|
||||
@@ -263,16 +263,16 @@ routes_out = [
|
||||
load(data='')
|
||||
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')),
|
||||
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')),
|
||||
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')),
|
||||
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")
|
||||
|
||||
data = r'''routes_out = [
|
||||
('/init/default/index', '/'),
|
||||
('/init/default/index', '/'),
|
||||
]'''
|
||||
load(data=data)
|
||||
self.assertEqual(str(URL(a='init', c='default', f='index')),
|
||||
@@ -281,7 +281,7 @@ routes_out = [
|
||||
"/init/default/index#anchor")
|
||||
|
||||
data = r'''routes_out = [
|
||||
(r'/init/default/index(?P<anchor>(#.*)?)', r'/\g<anchor>'),
|
||||
(r'/init/default/index(?P<anchor>(#.*)?)', r'/\g<anchor>'),
|
||||
]'''
|
||||
load(data=data)
|
||||
self.assertEqual(str(URL(a='init', c='default', f='index')),
|
||||
@@ -290,7 +290,7 @@ routes_out = [
|
||||
"/#anchor")
|
||||
|
||||
data = r'''routes_out = [
|
||||
(r'/init/default/index(?P<qa>([?#].*)?)', r'/\g<qa>'),
|
||||
(r'/init/default/index(?P<qa>([?#].*)?)', r'/\g<qa>'),
|
||||
]'''
|
||||
load(data=data)
|
||||
self.assertEqual(str(URL(a='init', c='default', f='index')),
|
||||
@@ -313,35 +313,35 @@ routes_out = [
|
||||
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)),
|
||||
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')),
|
||||
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)),
|
||||
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)),
|
||||
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')),
|
||||
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')),
|
||||
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)),
|
||||
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)),
|
||||
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)),
|
||||
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')),
|
||||
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')),
|
||||
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)),
|
||||
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)),
|
||||
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)),
|
||||
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)),
|
||||
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):
|
||||
@@ -349,18 +349,18 @@ routes_out = [
|
||||
Test REQUEST_URI in env
|
||||
'''
|
||||
data = r'''routes_in = [
|
||||
('/abc', '/init/default/abc'),
|
||||
('/index/$anything', '/init/default/index/$anything'),
|
||||
('/abc', '/init/default/abc'),
|
||||
('/index/$anything', '/init/default/index/$anything'),
|
||||
]
|
||||
'''
|
||||
load(data=data)
|
||||
self.assertEqual(filter_url('http://domain.com/abc', env=True).request_uri,
|
||||
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,
|
||||
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,
|
||||
self.assertEqual(filter_url('http://domain.com/index/abc', env=True).request_uri,
|
||||
"/init/default/index/abc")
|
||||
self.assertEqual(filter_url('http://domain.com/index/a%20bc', env=True).request_uri,
|
||||
self.assertEqual(filter_url('http://domain.com/index/a%20bc', env=True).request_uri,
|
||||
"/init/default/index/a bc")
|
||||
|
||||
|
||||
@@ -368,3 +368,4 @@ if __name__ == '__main__':
|
||||
setUpModule() # pre-2.7
|
||||
unittest.main()
|
||||
tearDownModule()
|
||||
|
||||
|
||||
+12
-11
@@ -21,38 +21,38 @@ class TestStorage(unittest.TestCase):
|
||||
""" Tests Storage attribute handling """
|
||||
|
||||
s = Storage(a=1)
|
||||
|
||||
|
||||
self.assertEqual(s.a, 1)
|
||||
self.assertEqual(s['a'], 1)
|
||||
self.assertEqual(s.b, None)
|
||||
|
||||
|
||||
s.b = 2
|
||||
self.assertEqual(s.a, 1)
|
||||
self.assertEqual(s['a'], 1)
|
||||
self.assertEqual(s.b, 2)
|
||||
self.assertEqual(s['b'], 2)
|
||||
|
||||
|
||||
s['c'] = 3
|
||||
self.assertEqual(s.c, 3)
|
||||
self.assertEqual(s['c'], 3)
|
||||
|
||||
s.d = list()
|
||||
self.assertTrue(s.d is s['d'])
|
||||
|
||||
|
||||
|
||||
|
||||
def test_store_none(self):
|
||||
""" Test Storage store-None handling
|
||||
s.key = None deletes an item
|
||||
s['key'] = None sets the item to None
|
||||
"""
|
||||
|
||||
|
||||
s = Storage(a=1)
|
||||
|
||||
|
||||
self.assertTrue('a' in s)
|
||||
self.assertFalse('b' in s)
|
||||
s.a = None
|
||||
# self.assertFalse('a' in s) # how about this?
|
||||
|
||||
|
||||
s.a = 1
|
||||
self.assertTrue('a' in s)
|
||||
s['a'] = None
|
||||
@@ -62,12 +62,12 @@ class TestStorage(unittest.TestCase):
|
||||
|
||||
def test_item(self):
|
||||
""" Tests Storage item handling """
|
||||
|
||||
|
||||
s = Storage()
|
||||
|
||||
|
||||
self.assertEqual(s.d, None)
|
||||
self.assertEqual(s['d'], None)
|
||||
#self.assertRaises(KeyError, lambda x: s[x], 'd') # old Storage
|
||||
#self.assertRaises(KeyError, lambda x: s[x], 'd') # old Storage
|
||||
s.a = 1
|
||||
s['a'] = None
|
||||
self.assertEquals(s.a, None)
|
||||
@@ -76,3 +76,4 @@ class TestStorage(unittest.TestCase):
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
|
||||
@@ -58,3 +58,4 @@ class TestVirtualFields(unittest.TestCase):
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
|
||||
@@ -25,3 +25,4 @@ class TestUtils(unittest.TestCase):
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
|
||||
@@ -18,8 +18,8 @@ class TestWeb(unittest.TestCase):
|
||||
client = WebClient('http://127.0.0.1:8000/welcome/default/')
|
||||
|
||||
client.get('index')
|
||||
session_id_welcome = client.cookies['session_id_welcome']
|
||||
|
||||
# register
|
||||
data = dict(first_name = 'Homer',
|
||||
last_name = 'Simpson',
|
||||
email = 'homer@web2py.com',
|
||||
@@ -28,20 +28,19 @@ class TestWeb(unittest.TestCase):
|
||||
_formname = 'register')
|
||||
client.post('user/register',data = data)
|
||||
|
||||
|
||||
# logout
|
||||
client.get('user/logout')
|
||||
|
||||
# login again
|
||||
data = dict(email='homer@web2py.com',
|
||||
password='test',
|
||||
_formname = 'login')
|
||||
client.post('user/login',data = data)
|
||||
|
||||
client.get('index')
|
||||
|
||||
# check registration and login were successful
|
||||
self.assertTrue('Welcome Homer' in client.text)
|
||||
|
||||
# check we are always in the same session
|
||||
self.assertEqual(session_id_welcome,
|
||||
client.cookies['session_id_welcome'])
|
||||
client.get('index')
|
||||
self.assertTrue('Welcome Homer' in client.text)
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user