From 341a35410daa02abed804bf8dc202ae125ef755c Mon Sep 17 00:00:00 2001 From: mdipierro Date: Wed, 29 Aug 2012 21:57:09 -0500 Subject: [PATCH] better webclient.py --- VERSION | 2 +- gluon/contrib/webclient.py | 172 +++++++++++++++++++++++++--------- gluon/tests/test_cache.py | 2 + gluon/tests/test_contribs.py | 7 +- gluon/tests/test_dal.py | 11 ++- gluon/tests/test_html.py | 3 +- gluon/tests/test_is_url.py | 1 + gluon/tests/test_languages.py | 17 ++-- gluon/tests/test_router.py | 119 +++++++++++------------ gluon/tests/test_routes.py | 139 +++++++++++++-------------- gluon/tests/test_storage.py | 23 ++--- gluon/tests/test_template.py | 1 + gluon/tests/test_utils.py | 1 + gluon/tests/test_web.py | 17 ++-- 14 files changed, 307 insertions(+), 208 deletions(-) diff --git a/VERSION b/VERSION index cd153d7c..e4f3de1b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.00.1 (2012-08-29 18:31:20) rc4 +Version 2.00.1 (2012-08-29 21:57:05) rc4 diff --git a/gluon/contrib/webclient.py b/gluon/contrib/webclient.py index c742669c..4bcfe7c8 100644 --- a/gluon/contrib/webclient.py +++ b/gluon/contrib/webclient.py @@ -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('(\)?\') + +SESSION_REGEX = 'session_id_(?P.+)' class WebClient(object): - regex = re.compile('\\') - 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() + diff --git a/gluon/tests/test_cache.py b/gluon/tests/test_cache.py index 15f29b6d..ec9b94d4 100644 --- a/gluon/tests/test_cache.py +++ b/gluon/tests/test_cache.py @@ -70,3 +70,5 @@ if __name__ == '__main__': setUpModule() # pre-python-2.7 unittest.main() tearDownModule() + + diff --git a/gluon/tests/test_contribs.py b/gluon/tests/test_contribs.py index 6af457ad..fbb4595f 100644 --- a/gluon/tests/test_contribs.py +++ b/gluon/tests/test_contribs.py @@ -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() + diff --git a/gluon/tests/test_dal.py b/gluon/tests/test_dal.py index b60fbe16..419d78d2 100644 --- a/gluon/tests/test_dal.py +++ b/gluon/tests/test_dal.py @@ -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() + diff --git a/gluon/tests/test_html.py b/gluon/tests/test_html.py index 752ed921..ff906b56 100644 --- a/gluon/tests/test_html.py +++ b/gluon/tests/test_html.py @@ -27,7 +27,7 @@ class TestBareHelpers(unittest.TestCase): def testHR(self): self.assertEqual(HR(_a='1', _b='2').xml(), '
') - + def testIMG(self): self.assertEqual(IMG(_a='1', _b='2').xml(), '') @@ -209,3 +209,4 @@ class TestBareHelpers(unittest.TestCase): if __name__ == '__main__': unittest.main() + diff --git a/gluon/tests/test_is_url.py b/gluon/tests/test_is_url.py index 60ffdd45..7a17496c 100644 --- a/gluon/tests/test_is_url.py +++ b/gluon/tests/test_is_url.py @@ -642,3 +642,4 @@ class TestUnicode(unittest.TestCase): if __name__ == '__main__': unittest.main() + diff --git a/gluon/tests/test_languages.py b/gluon/tests/test_languages.py index bcff8de4..070fb874 100644 --- a/gluon/tests/test_languages.py +++ b/gluon/tests/test_languages.py @@ -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() + diff --git a/gluon/tests/test_router.py b/gluon/tests/test_router.py index 5cf7b1aa..f554f420 100644 --- a/gluon/tests/test_router.py +++ b/gluon/tests/test_router.py @@ -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() + diff --git a/gluon/tests/test_routes.py b/gluon/tests/test_routes.py index c3b171d6..abda14dc 100644 --- a/gluon/tests/test_routes.py +++ b/gluon/tests/test_routes.py @@ -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(#.*)?)', r'/\g'), + (r'/init/default/index(?P(#.*)?)', r'/\g'), ]''' 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([?#].*)?)', r'/\g'), + (r'/init/default/index(?P([?#].*)?)', r'/\g'), ]''' 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() + diff --git a/gluon/tests/test_storage.py b/gluon/tests/test_storage.py index 330ea766..6d35860b 100644 --- a/gluon/tests/test_storage.py +++ b/gluon/tests/test_storage.py @@ -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() + diff --git a/gluon/tests/test_template.py b/gluon/tests/test_template.py index 810c9876..bba6cded 100644 --- a/gluon/tests/test_template.py +++ b/gluon/tests/test_template.py @@ -58,3 +58,4 @@ class TestVirtualFields(unittest.TestCase): if __name__ == '__main__': unittest.main() + diff --git a/gluon/tests/test_utils.py b/gluon/tests/test_utils.py index 97d4d2b2..7c0465dc 100644 --- a/gluon/tests/test_utils.py +++ b/gluon/tests/test_utils.py @@ -25,3 +25,4 @@ class TestUtils(unittest.TestCase): if __name__ == '__main__': unittest.main() + diff --git a/gluon/tests/test_web.py b/gluon/tests/test_web.py index 65b0a5b5..9d5e1448 100644 --- a/gluon/tests/test_web.py +++ b/gluon/tests/test_web.py @@ -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() +