diff --git a/gluon/contrib/redis_session.py b/gluon/contrib/redis_session.py
index c987e64e..d87a8260 100644
--- a/gluon/contrib/redis_session.py
+++ b/gluon/contrib/redis_session.py
@@ -25,7 +25,7 @@ def RedisSession(*args, **vars):
from gluon.contrib.redis_utils import RConn
rconn = RConn()
- from gluon.contrib.redis_session
+ from gluon.contrib.redis_session import RedisSession
sessiondb = RedisSession(redis_conn=rconn, with_lock=True, session_expiry=False)
session.connect(request, response, db = sessiondb)
diff --git a/gluon/html.py b/gluon/html.py
index b6fc7c0c..8c4be662 100644
--- a/gluon/html.py
+++ b/gluon/html.py
@@ -2610,6 +2610,7 @@ def embed64(
return 'data:%s;base64,%s' % (extension, data)
+# TODO: Check if this test() is still relevant now that we have gluon/tests/test_html.py
def test():
"""
Example:
diff --git a/gluon/tests/test_html.py b/gluon/tests/test_html.py
index d426ea9c..1bcd755d 100644
--- a/gluon/tests/test_html.py
+++ b/gluon/tests/test_html.py
@@ -17,33 +17,302 @@ from storage import Storage
class TestBareHelpers(unittest.TestCase):
- def testBR(self):
- self.assertEqual(BR(_a='1', _b='2').xml(), ' ')
+ # TODO: def test_xmlescape(self):
+ # TODO: def test_call_as_list(self):
+ # TODO: def test_truncate_string(self):
+ # TODO: def test_truncate_string(self):
- def testEMBED(self):
- self.assertEqual(EMBED(_a='1', _b='2').xml(),
- ' ')
+ def test_StaticURL(self):
+ # test response.static_version coupled with response.static_version_urls
+ self.assertEqual(URL('a', 'c', 'f'), '/a/c/f')
+ self.assertEqual(URL('a', 'static', 'design.css'), '/a/static/design.css')
+ response = Storage()
+ response.static_version = '1.2.3'
+ from globals import current
+ current.response = response
+ self.assertEqual(URL('a', 'static', 'design.css'), '/a/static/design.css')
+ response.static_version_urls = True
+ self.assertEqual(URL('a', 'static', 'design.css'), '/a/static/_1.2.3/design.css')
- def testHR(self):
- self.assertEqual(HR(_a='1', _b='2').xml(), '
')
+ def testURL(self):
+ self.assertEqual(URL('a', 'c', 'f', args='1'), '/a/c/f/1')
+ self.assertEqual(URL('a', 'c', 'f', args=('1', '2')), '/a/c/f/1/2')
+ self.assertEqual(URL('a', 'c', 'f', args=['1', '2']), '/a/c/f/1/2')
+ self.assertEqual(URL('a', 'c', '/f'), '/a/c/f')
+ self.assertEqual(URL('a', 'c', 'f.json'), '/a/c/f.json')
+ self.assertRaises(SyntaxError, URL, *['a'])
- def testIMG(self):
- self.assertEqual(IMG(_a='1', _b='2').xml(),
- ' ')
+ request = Storage()
+ request.application = 'a'
+ request.controller = 'c'
+ request.function = 'f'
+ request.env = {}
- def testINPUT(self):
- self.assertEqual(INPUT(_a='1', _b='2').xml(),
- ' ')
+ from globals import current # Can't be moved with other import
+ current.request = request
- def testLINK(self):
- self.assertEqual(LINK(_a='1', _b='2').xml(),
- ' ')
+ must_return = '/a/c/f'
+ self.assertEqual(URL(), must_return)
+ self.assertEqual(URL('f'), must_return)
+ self.assertEqual(URL('c', 'f'), must_return)
+ self.assertEqual(URL('a', 'c', 'f'), must_return)
+ self.assertEqual(URL('a', 'c', 'f', extension='json'), '/a/c/f.json')
- def testMETA(self):
+ def weird():
+ pass
+ self.assertEqual(URL('a', 'c', weird), '/a/c/weird')
+ self.assertRaises(SyntaxError, URL, *['a', 'c', 1])
+ # test signature
+ rtn = URL(
+ a='a', c='c', f='f', args=['x', 'y', 'z'],
+ vars={'p': (1, 3), 'q': 2}, anchor='1', hmac_key='key'
+ )
+ self.assertEqual(rtn, '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=a32530f0d0caa80964bb92aad2bedf8a4486a31f#1')
+ # test _signature exclusion
+ rtn = URL(
+ a='a', c='c', f='f', args=['x', 'y', 'z'],
+ vars={'p': (1, 3), 'q': 2, '_signature': 'abc'},
+ anchor='1', hmac_key='key'
+ )
+ self.assertEqual(rtn, '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=a32530f0d0caa80964bb92aad2bedf8a4486a31f#1')
+ # emulate user_signature
+ current.session = Storage(auth=Storage(hmac_key='key'))
+ self.assertEqual(URL(user_signature=True), '/a/c/f?_signature=c4aed53c08cff08f369dbf8b5ba51889430cf2c2')
+ # hash_vars combination
+ rtn = URL('a', 'c', 'f', args=['x', 'y', 'z'], vars={'p': (1, 3), 'q': 2}, hmac_key='key')
+ self.assertEqual(rtn, '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=a32530f0d0caa80964bb92aad2bedf8a4486a31f')
+ rtn = URL('a', 'c', 'f', args=['x', 'y', 'z'], vars={'p': (1, 3), 'q': 2}, hmac_key='key', hash_vars=True)
+ self.assertEqual(rtn, '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=a32530f0d0caa80964bb92aad2bedf8a4486a31f')
+ rtn = URL('a', 'c', 'f', args=['x', 'y', 'z'], vars={'p': (1, 3), 'q': 2}, hmac_key='key', hash_vars=False)
+ self.assertEqual(rtn, '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=0b5a0702039992aad23c82794b8496e5dcd59a5b')
+ rtn = URL('a', 'c', 'f', args=['x', 'y', 'z'], vars={'p': (1, 3), 'q': 2}, hmac_key='key', hash_vars=['p'])
+ self.assertEqual(rtn, '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=5d01b982fd72b39674b012e0288071034e156d7a')
+ rtn = URL('a', 'c', 'f', args=['x', 'y', 'z'], vars={'p': (1, 3), 'q': 2}, hmac_key='key', hash_vars='p')
+ self.assertEqual(rtn, '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=5d01b982fd72b39674b012e0288071034e156d7a')
+ # test CRLF detection
+ self.assertRaises(SyntaxError, URL, *['a\n', 'c', 'f'])
+ self.assertRaises(SyntaxError, URL, *['a\r', 'c', 'f'])
+
+ def test_verifyURL(self):
+ r = Storage()
+ r.application = 'a'
+ r.controller = 'c'
+ r.function = 'f'
+ r.extension = 'html'
+ r.env = {}
+ r.get_vars = Storage()
+ # missing signature as request.get_vars returns False
+ rtn = verifyURL(r, 'key')
+ self.assertEqual(rtn, False)
+ # reverse tests from previous testcase with hash_vars combinations
+ r.args = ['x', 'y', 'z']
+ r.get_vars = Storage(p=(1, 3), q=2)
+ # add signature
+ r.get_vars['_signature'] = 'a32530f0d0caa80964bb92aad2bedf8a4486a31f'
+ rtn = verifyURL(r, 'key')
+ self.assertEqual(rtn, True)
+ r.get_vars['_signature'] = 'a32530f0d0caa80964bb92aad2bedf8a4486a31f'
+ rtn = verifyURL(r, 'key', hash_vars=True)
+ self.assertEqual(rtn, True)
+ r.get_vars['_signature'] = '0b5a0702039992aad23c82794b8496e5dcd59a5b'
+ rtn = verifyURL(r, 'key', hash_vars=False)
+ self.assertEqual(rtn, True)
+ r.get_vars['_signature'] = '5d01b982fd72b39674b012e0288071034e156d7a'
+ rtn = verifyURL(r, 'key', hash_vars=['p'])
+ self.assertEqual(rtn, True)
+ r.get_vars['_signature'] = '5d01b982fd72b39674b012e0288071034e156d7a'
+ rtn = verifyURL(r, 'key', hash_vars='p')
+ self.assertEqual(rtn, True)
+ # without session, user_signature returns always False
+ rtn = verifyURL(r, user_signature=True)
+ self.assertEqual(rtn, False)
+ # same goes if you don't use an hmac_key
+ rtn = verifyURL(r)
+ self.assertEqual(rtn, False)
+ # emulate user signature
+ from globals import current
+ current.session = Storage(auth=Storage(hmac_key='key'))
+ r.get_vars['_signature'] = 'a32530f0d0caa80964bb92aad2bedf8a4486a31f'
+ rtn = verifyURL(r, user_signature=True)
+ self.assertEqual(rtn, True)
+
+ # TODO: def test_XmlComponent(self):
+
+ def test_XML(self):
+ # sanitization process
+ self.assertEqual(XML('').xml(),
+ '')
+ # with sanitize, data-attributes are not permitted
+ self.assertEqual(XML('', sanitize=True).xml(),
+ 'HelloWorld ')
+ # stringify by default
+ self.assertEqual(XML(1.3), '1.3')
+ self.assertEqual(XML(u'è
').xml(), '\xc3\xa8
')
+ # you can calc len on the class, that equals the xml() and the str()
+ self.assertEqual(len(XML('1.3')), len('1.3'))
+ self.assertEqual(len(XML('1.3').xml()), len('1.3'))
+ self.assertEqual(len(str(XML('1.3'))), len('1.3'))
+ # you can concatenate them to strings (check for __add__ and __radd__ methods)
+ self.assertEqual(XML('a') + 'b', 'ab')
+ self.assertEqual(XML('a') + XML('b'), 'ab')
+ self.assertEqual('a' + XML('b'), 'ab')
+ # you can compare them
+ self.assertEqual(XML('a') == XML('a'), True)
+ # beware that the comparison is made on the XML repr
+ self.assertEqual(XML('', sanitize=True),
+ XML('HelloWorld '))
+ # bug check for the sanitizer for closing no-close tags
+ self.assertEqual(XML('Test
Test
', sanitize=True),
+ XML('Test
Test
'))
+
+ # TODO: def test_XML_unpickle(self):
+
+ # TODO: def test_XML_pickle(self):
+
+ def test_DIV(self):
+ # Empty DIV()
+ self.assertEqual(DIV().xml(), '
')
+ self.assertEqual(DIV('<>', _a='1', _b='2').xml(),
+ '<>
')
+ # attributes can be updated like in a dict
+ div = DIV('<>', _a='1')
+ div['_b'] = '2'
+ self.assertEqual(div.xml(),
+ '<>
')
+ # also with a mapping
+ div.update(_b=2, _c=3)
+ self.assertEqual(div.xml(),
+ '<>
')
+ # length of the DIV is the number of components
+ self.assertEqual(len(DIV('a', 'bc')), 2)
+ # also if empty, DIV is True in a boolean evaluation
+ self.assertTrue(True if DIV() else False)
+ # parent and siblings
+ a = DIV(SPAN('a'), DIV('b'))
+ s = a.element('span')
+ d = s.parent
+ d['_class'] = 'abc'
+ self.assertEqual(a.xml(), '')
+ self.assertEqual([el.xml() for el in s.siblings()], ['b
'])
+ self.assertEqual(s.sibling().xml(), 'b
')
+ self.assertEqual(s.siblings('a'), [])
+
+ def test_CAT(self):
+ # Empty CAT()
+ self.assertEqual(CAT().xml(), '')
+ # CAT('')
+ self.assertEqual(CAT('').xml(), '')
+ # CAT(' ')
+ self.assertEqual(CAT(' ').xml(), ' ')
+
+ # TODO: def test_TAG_unpickler(self):
+
+ # TODO: def test_TAG_pickler(self):
+
+ def test_TAG(self):
+ self.assertEqual(TAG.first(TAG.second('test'), _key=3).xml(),
+ 'test ')
+ # ending in underscore "triggers" style
+ self.assertEqual(TAG.first_(TAG.second('test'), _key=3).xml(),
+ ' ')
+
+ def test_HTML(self):
+ self.assertEqual(HTML('<>', _a='1', _b='2').xml(),
+ '\n<>')
+
+ # TODO: def test_XHTML(self):
+
+ def test_HEAD(self):
+ self.assertEqual(HEAD('<>', _a='1', _b='2').xml(),
+ '<>')
+
+ def test_TITLE(self):
+ self.assertEqual(TITLE('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_META(self):
self.assertEqual(META(_a='1', _b='2').xml(),
' ')
- def testA(self):
+ def test_LINK(self):
+ self.assertEqual(LINK(_a='1', _b='2').xml(),
+ ' ')
+
+ def test_SCRIPT(self):
+ self.assertEqual(SCRIPT('<>', _a='1', _b='2').xml(),
+ '''''')
+ self.assertEqual(SCRIPT('<>').xml(),
+ '''''')
+ self.assertEqual(SCRIPT().xml(), '')
+
+ def test_STYLE(self):
+ self.assertEqual(STYLE('<>', _a='1', _b='2').xml(),
+ '')
+
+ def test_IMG(self):
+ self.assertEqual(IMG(_a='1', _b='2').xml(),
+ ' ')
+
+ def test_SPAN(self):
+ self.assertEqual(SPAN('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_BODY(self):
+ self.assertEqual(BODY('<>', _a='1', _b='2').xml(),
+ '<>')
+
+ def test_H1(self):
+ self.assertEqual(H1('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_H2(self):
+ self.assertEqual(H2('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_H3(self):
+ self.assertEqual(H3('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_H4(self):
+ self.assertEqual(H4('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_H5(self):
+ self.assertEqual(H5('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_H6(self):
+ self.assertEqual(H6('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_P(self):
+ self.assertEqual(P('<>', _a='1', _b='2').xml(),
+ '<>
')
+ # test cr2br
+ self.assertEqual(P('a\nb').xml(), 'a\nb
')
+ self.assertEqual(P('a\nb', cr2br=True).xml(), 'a b
')
+
+ def test_STRONG(self):
+ self.assertEqual(STRONG('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_B(self):
+ self.assertEqual(B('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_BR(self):
+ # empty BR()
+ self.assertEqual(BR().xml(), ' ')
+ self.assertEqual(BR(_a='1', _b='2').xml(), ' ')
+
+ def test_HR(self):
+ self.assertEqual(HR(_a='1', _b='2').xml(), ' ')
+
+ def test_A(self):
self.assertEqual(
A('<>', _a='1', _b='2').xml(),
'<> '
@@ -89,162 +358,105 @@ class TestBareHelpers(unittest.TestCase):
'a '
)
- def testB(self):
- self.assertEqual(B('<>', _a='1', _b='2').xml(),
- '<> ')
+ def test_BUTTON(self):
+ self.assertEqual(BUTTON('test', _type='button').xml(),
+ 'test ')
- def testBODY(self):
- self.assertEqual(BODY('<>', _a='1', _b='2').xml(),
- '<>')
-
- def testCENTER(self):
- self.assertEqual(CENTER('<>', _a='1', _b='2').xml(),
- '<> ')
-
- def testDIV(self):
- self.assertEqual(DIV('<>', _a='1', _b='2').xml(),
- '<>
')
- # attributes can be updated like in a dict
- div = DIV('<>', _a='1')
- div['_b'] = '2'
- self.assertEqual(div.xml(),
- '<>
')
- # also with a mapping
- div.update(_b=2, _c=3)
- self.assertEqual(div.xml(),
- '<>
')
- # length of the DIV is the number of components
- self.assertEqual(len(DIV('a', 'bc')), 2)
- # also if empty, DIV is True in a boolean evaluation
- self.assertTrue(True if DIV() else False)
- # parent and siblings
- a = DIV(SPAN('a'), DIV('b'))
- s = a.element('span')
- d = s.parent
- d['_class'] = 'abc'
- self.assertEqual(a.xml(), '')
- self.assertEqual([el.xml() for el in s.siblings()], ['b
'])
- self.assertEqual(s.sibling().xml(), 'b
')
- self.assertEqual(s.siblings('a'), [])
-
- def testEM(self):
+ def test_EM(self):
self.assertEqual(EM('<>', _a='1', _b='2').xml(),
'<> ')
- def testFIELDSET(self):
- self.assertEqual(FIELDSET('<>', _a='1', _b='2').xml(),
- '<> ')
+ def test_EMBED(self):
+ self.assertEqual(EMBED(_a='1', _b='2').xml(),
+ ' ')
- def testFORM(self):
- self.assertEqual(FORM('<>', _a='1', _b='2').xml(),
- '')
+ def test_TT(self):
+ self.assertEqual(TT('<>', _a='1', _b='2').xml(),
+ '<> ')
- def testH1(self):
- self.assertEqual(H1('<>', _a='1', _b='2').xml(),
- '<> ')
-
- def testH2(self):
- self.assertEqual(H2('<>', _a='1', _b='2').xml(),
- '<> ')
-
- def testH3(self):
- self.assertEqual(H3('<>', _a='1', _b='2').xml(),
- '<> ')
-
- def testH4(self):
- self.assertEqual(H4('<>', _a='1', _b='2').xml(),
- '<> ')
-
- def testH5(self):
- self.assertEqual(H5('<>', _a='1', _b='2').xml(),
- '<> ')
-
- def testH6(self):
- self.assertEqual(H6('<>', _a='1', _b='2').xml(),
- '<> ')
-
- def testHEAD(self):
- self.assertEqual(HEAD('<>', _a='1', _b='2').xml(),
- '<>')
-
- def testHTML(self):
- self.assertEqual(HTML('<>', _a='1', _b='2').xml(),
- '\n<>')
-
- def testIFRAME(self):
- self.assertEqual(IFRAME('<>', _a='1', _b='2').xml(),
- '')
-
- def testLABEL(self):
- self.assertEqual(LABEL('<>', _a='1', _b='2').xml(),
- '<> ')
-
- def testLI(self):
- self.assertEqual(LI('<>', _a='1', _b='2').xml(),
- '<> ')
-
- def testOBJECT(self):
- self.assertEqual(OBJECT('<>', _a='1', _b='2').xml(),
- '<> ')
-
- def testOL(self):
- self.assertEqual(OL('<>', _a='1', _b='2').xml(),
- '<> ')
-
- def testOPTION(self):
- self.assertEqual(OPTION('<>', _a='1', _b='2').xml(),
- '<>' +
- ' ')
-
- def testP(self):
- self.assertEqual(P('<>', _a='1', _b='2').xml(),
- '<>
')
- # test cr2br
- self.assertEqual(P('a\nb').xml(), 'a\nb
')
- self.assertEqual(P('a\nb', cr2br=True).xml(), 'a b
')
-
- def testPRE(self):
+ def test_PRE(self):
self.assertEqual(PRE('<>', _a='1', _b='2').xml(),
'<> ')
- def testSCRIPT(self):
- self.assertEqual(SCRIPT('<>', _a='1', _b='2').xml(),
- '''''')
- self.assertEqual(SCRIPT('<>').xml(),
- '''''')
- self.assertEqual(SCRIPT().xml(), '')
+ def test_CENTER(self):
+ self.assertEqual(CENTER('<>', _a='1', _b='2').xml(),
+ '<> ')
- def testSELECT(self):
- self.assertEqual(SELECT('<>', _a='1', _b='2').xml(),
- '' +
- '<> ')
+ def test_CODE(self):
+ self.assertEqual(CODE("print 'hello world'",
+ language='python',
+ link=None,
+ counter=1,
+ styles={},
+ highlight_line=None).xml(),
+ '')
- def testSPAN(self):
- self.assertEqual(SPAN('<>', _a='1', _b='2').xml(),
- '<> ')
+ def test_LABEL(self):
+ self.assertEqual(LABEL('<>', _a='1', _b='2').xml(),
+ '<> ')
- def testSTYLE(self):
- self.assertEqual(STYLE('<>', _a='1', _b='2').xml(),
- '')
+ def test_LI(self):
+ self.assertEqual(LI('<>', _a='1', _b='2').xml(),
+ '<> ')
- def testTABLE(self):
+ def test_UL(self):
+ self.assertEqual(UL('<>', _a='1', _b='2').xml(),
+ '')
+
+ def test_OL(self):
+ self.assertEqual(OL('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_TD(self):
+ self.assertEqual(TD('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_TH(self):
+ self.assertEqual(TH('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_TR(self):
+ self.assertEqual(TR('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_THEAD(self):
+ self.assertEqual(THEAD('<>', _a='1', _b='2').xml(),
+ '<> ')
+ # self.assertEqual(THEAD(TRHEAD('<>'), _a='1', _b='2').xml(),
+ # '<> ')
+ self.assertEqual(THEAD(TR('<>'), _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_TBODY(self):
+ self.assertEqual(TBODY('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ def test_TFOOT(self):
+ self.assertEqual(TFOOT('<>', _a='1', _b='2').xml(),
+ '<> ')
+
+ # TODO: def test_COL(self):
+
+ # TODO: def test_COLGROUP(self):
+
+ def test_TABLE(self):
self.assertEqual(TABLE('<>', _a='1', _b='2').xml(),
'')
- def testTBODY(self):
- self.assertEqual(TBODY('<>', _a='1', _b='2').xml(),
- '<> ')
+ def test_I(self):
+ self.assertEqual(I('<>', _a='1', _b='2').xml(),
+ '<> ')
- def testTD(self):
- self.assertEqual(TD('<>', _a='1', _b='2').xml(),
- '<> ')
+ def test_IFRAME(self):
+ self.assertEqual(IFRAME('<>', _a='1', _b='2').xml(),
+ '')
- def testTEXTAREA(self):
+ def test_INPUT(self):
+ self.assertEqual(INPUT(_a='1', _b='2').xml(),
+ ' ')
+
+ def test_TEXTAREA(self):
self.assertEqual(TEXTAREA('<>', _a='1', _b='2').xml(),
'')
@@ -253,188 +465,54 @@ class TestBareHelpers(unittest.TestCase):
'')
- def testTFOOT(self):
- self.assertEqual(TFOOT('<>', _a='1', _b='2').xml(),
- '<> ')
+ def test_OPTION(self):
+ self.assertEqual(OPTION('<>', _a='1', _b='2').xml(),
+ '<>' +
+ ' ')
- def testTH(self):
- self.assertEqual(TH('<>', _a='1', _b='2').xml(),
- '<> ')
+ def test_OBJECT(self):
+ self.assertEqual(OBJECT('<>', _a='1', _b='2').xml(),
+ '<> ')
- def testTHEAD(self):
- self.assertEqual(THEAD('<>', _a='1', _b='2').xml(),
- '<> ')
- #self.assertEqual(THEAD(TRHEAD('<>'), _a='1', _b='2').xml(),
- # '<> ')
- self.assertEqual(THEAD(TR('<>'), _a='1', _b='2').xml(),
- '<> ')
+ # TODO: def test_OPTGROUP(self):
- def testTITLE(self):
- self.assertEqual(TITLE('<>', _a='1', _b='2').xml(),
- '<> ')
+ def test_SELECT(self):
+ self.assertEqual(SELECT('<>', _a='1', _b='2').xml(),
+ '' +
+ '<> ')
- def testTR(self):
- self.assertEqual(TR('<>', _a='1', _b='2').xml(),
- '<> ')
+ def test_FIELDSET(self):
+ self.assertEqual(FIELDSET('<>', _a='1', _b='2').xml(),
+ '<> ')
- def testTT(self):
- self.assertEqual(TT('<>', _a='1', _b='2').xml(),
- '<> ')
+ # TODO: def test_LEGEND(self):
- def testUL(self):
- self.assertEqual(UL('<>', _a='1', _b='2').xml(),
- '')
+ def test_FORM(self):
+ self.assertEqual(FORM('<>', _a='1', _b='2').xml(),
+ '')
- def testXML(self):
- # sanitization process
- self.assertEqual(XML('').xml(),
- '')
- # with sanitize, data-attributes are not permitted
- self.assertEqual(XML('', sanitize=True).xml(),
- 'HelloWorld ')
- # stringify by default
- self.assertEqual(XML(1.3), '1.3')
- self.assertEqual(XML(u'è
').xml(), '\xc3\xa8
')
- # you can calc len on the class, that equals the xml() and the str()
- self.assertEqual(len(XML('1.3')), len('1.3'))
- self.assertEqual(len(XML('1.3').xml()), len('1.3'))
- self.assertEqual(len(str(XML('1.3'))), len('1.3'))
- # you can concatenate them to strings (check for __add__ and __radd__ methods)
- self.assertEqual(XML('a') + 'b', 'ab')
- self.assertEqual(XML('a') + XML('b'), 'ab')
- self.assertEqual('a' + XML('b'), 'ab')
- # you can compare them
- self.assertEqual(XML('a') == XML('a'), True)
- # beware that the comparison is made on the XML repr
- self.assertEqual(XML('', sanitize=True),
- XML('HelloWorld '))
- #bug check for the sanitizer for closing no-close tags
- self.assertEqual(XML('Test
Test
', sanitize=True),
- XML('Test
Test
'))
+ # TODO: def test_BEAUTIFY(self):
- def testTAG(self):
- self.assertEqual(TAG.first(TAG.second('test'), _key=3).xml(),
- 'test ')
- # ending in underscore "triggers" style
- self.assertEqual(TAG.first_(TAG.second('test'), _key=3).xml(),
- ' ')
+ # TODO: def test_MENU(self):
- def testStaticURL(self):
- # test response.static_version coupled with response.static_version_urls
- self.assertEqual(URL('a', 'c', 'f'), '/a/c/f')
- self.assertEqual(URL('a', 'static', 'design.css'), '/a/static/design.css')
- response = Storage()
- response.static_version = '1.2.3'
- from globals import current
- current.response = response
- self.assertEqual(URL('a', 'static', 'design.css'), '/a/static/design.css')
- response.static_version_urls = True
- self.assertEqual(URL('a', 'static', 'design.css'), '/a/static/_1.2.3/design.css')
+ # TODO: def test_embed64(self):
- def testURL(self):
- self.assertEqual(URL('a', 'c', 'f', args='1'), '/a/c/f/1')
- self.assertEqual(URL('a', 'c', 'f', args=('1', '2')), '/a/c/f/1/2')
- self.assertEqual(URL('a', 'c', 'f', args=['1', '2']), '/a/c/f/1/2')
- self.assertEqual(URL('a', 'c', '/f'), '/a/c/f')
- self.assertEqual(URL('a', 'c', 'f.json'), '/a/c/f.json')
- self.assertRaises(SyntaxError, URL, *['a'])
- request = Storage()
- request.application = 'a'
- request.controller = 'c'
- request.function = 'f'
- request.env = {}
- from globals import current
- current.request = request
- must_return = '/a/c/f'
- self.assertEqual(URL(), must_return)
- self.assertEqual(URL('f'), must_return)
- self.assertEqual(URL('c', 'f'), must_return)
- self.assertEqual(URL('a', 'c', 'f'), must_return)
- self.assertEqual(URL('a', 'c', 'f', extension='json'), '/a/c/f.json')
- def weird():
- pass
- self.assertEqual(URL('a', 'c', weird), '/a/c/weird')
- self.assertRaises(SyntaxError, URL, *['a', 'c', 1])
- # test signature
- rtn = URL(
- a='a', c='c', f='f', args=['x', 'y', 'z'],
- vars={'p': (1, 3), 'q': 2}, anchor='1', hmac_key='key'
- )
- self.assertEqual(rtn, '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=a32530f0d0caa80964bb92aad2bedf8a4486a31f#1')
- # test _signature exclusion
- rtn = URL(
- a='a', c='c', f='f', args=['x', 'y', 'z'],
- vars={'p': (1, 3), 'q': 2, '_signature': 'abc'},
- anchor='1', hmac_key='key'
- )
- self.assertEqual(rtn, '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=a32530f0d0caa80964bb92aad2bedf8a4486a31f#1')
- # emulate user_signature
- current.session = Storage(auth=Storage(hmac_key='key'))
- self.assertEqual(URL(user_signature=True), '/a/c/f?_signature=c4aed53c08cff08f369dbf8b5ba51889430cf2c2')
- # hash_vars combination
- rtn = URL('a','c','f', args=['x', 'y', 'z'], vars={'p' : (1,3), 'q' : 2}, hmac_key='key')
- self.assertEqual(rtn, '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=a32530f0d0caa80964bb92aad2bedf8a4486a31f')
- rtn = URL('a','c','f', args=['x', 'y', 'z'], vars={'p' : (1,3), 'q' : 2}, hmac_key='key', hash_vars=True)
- self.assertEqual(rtn, '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=a32530f0d0caa80964bb92aad2bedf8a4486a31f')
- rtn = URL('a','c','f', args=['x', 'y', 'z'], vars={'p' : (1,3), 'q' : 2}, hmac_key='key', hash_vars=False)
- self.assertEqual(rtn, '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=0b5a0702039992aad23c82794b8496e5dcd59a5b')
- rtn = URL('a','c','f', args=['x', 'y', 'z'], vars={'p' : (1,3), 'q' : 2}, hmac_key='key', hash_vars=['p'])
- self.assertEqual(rtn, '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=5d01b982fd72b39674b012e0288071034e156d7a')
- rtn = URL('a','c','f', args=['x', 'y', 'z'], vars={'p' : (1,3), 'q' : 2}, hmac_key='key', hash_vars='p')
- self.assertEqual(rtn, '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=5d01b982fd72b39674b012e0288071034e156d7a')
- # test CRLF detection
- self.assertRaises(SyntaxError, URL, *['a\n', 'c', 'f'])
- self.assertRaises(SyntaxError, URL, *['a\r', 'c', 'f'])
+ # TODO: def test_web2pyHTMLParser(self):
- def testverifyURL(self):
- r = Storage()
- r.application = 'a'
- r.controller = 'c'
- r.function = 'f'
- r.extension = 'html'
- r.env = {}
- r.get_vars = Storage()
- # missing signature as request.get_vars returns False
- rtn = verifyURL(r, 'key')
- self.assertEqual(rtn, False)
- # reverse tests from previous testcase with hash_vars combinations
- r.args = ['x', 'y', 'z']
- r.get_vars = Storage(p=(1, 3), q=2)
- # add signature
- r.get_vars['_signature'] = 'a32530f0d0caa80964bb92aad2bedf8a4486a31f'
- rtn = verifyURL(r, 'key')
- self.assertEqual(rtn, True)
- r.get_vars['_signature'] = 'a32530f0d0caa80964bb92aad2bedf8a4486a31f'
- rtn = verifyURL(r, 'key', hash_vars=True)
- self.assertEqual(rtn, True)
- r.get_vars['_signature'] = '0b5a0702039992aad23c82794b8496e5dcd59a5b'
- rtn = verifyURL(r, 'key', hash_vars=False)
- self.assertEqual(rtn, True)
- r.get_vars['_signature'] = '5d01b982fd72b39674b012e0288071034e156d7a'
- rtn = verifyURL(r, 'key', hash_vars=['p'])
- self.assertEqual(rtn, True)
- r.get_vars['_signature'] = '5d01b982fd72b39674b012e0288071034e156d7a'
- rtn = verifyURL(r, 'key', hash_vars='p')
- self.assertEqual(rtn, True)
- # without session, user_signature returns always False
- rtn = verifyURL(r, user_signature=True)
- self.assertEqual(rtn, False)
- # same goes if you don't use an hmac_key
- rtn = verifyURL(r)
- self.assertEqual(rtn, False)
- # emulate user signature
- from globals import current
- current.session = Storage(auth=Storage(hmac_key='key'))
- r.get_vars['_signature'] = 'a32530f0d0caa80964bb92aad2bedf8a4486a31f'
- rtn = verifyURL(r, user_signature=True)
- self.assertEqual(rtn, True)
+ # TODO: def test_markdown_serializer(self):
+
+ # TODO: def test_markmin_serializer(self):
+
+ # TODO: def test_MARKMIN(self):
+
+ # TODO: def test_ASSIGNJS(self):
class TestData(unittest.TestCase):
- def testAdata(self):
+ def test_Adata(self):
self.assertEqual(A('<>', data=dict(abc='', cde='standard'), _a='1', _b='2').xml(),
- '<> ')
+ '<> ')
if __name__ == '__main__':
diff --git a/gluon/tests/test_rocket.py b/gluon/tests/test_rocket.py
new file mode 100644
index 00000000..a394e895
--- /dev/null
+++ b/gluon/tests/test_rocket.py
@@ -0,0 +1,3 @@
+# TODO : I think we should continue to use pathoc (http://pathod.net/docs/pathoc) for tests but integrate the call in
+# gluon/tests so they run automatically. No need to make our own tests.
+# ref: https://groups.google.com/d/msg/web2py-developers/Cjye8_hXZk8/AXbftS3sCgAJ
diff --git a/gluon/tests/test_validators.py b/gluon/tests/test_validators.py
index 64255a7b..a84467ab 100644
--- a/gluon/tests/test_validators.py
+++ b/gluon/tests/test_validators.py
@@ -180,9 +180,38 @@ class TestValidators(unittest.TestCase):
rtn = IS_IN_SET([('id1','first label'), ('id2','second label')])('id1') # Redundant way
self.assertEqual(rtn, ('id1', None))
- # TODO: def test_IS_IN_DB(self):
+ def test_IS_IN_DB(self):
+ from gluon.dal import DAL, Field
+ db = DAL('sqlite:memory')
+ db.define_table('person', Field('name'))
+ george_id = db.person.insert(name='george')
+ costanza_id = db.person.insert(name='costanza')
+ rtn = IS_IN_DB(db, 'person.id', '%(name)s')(george_id)
+ self.assertEqual(rtn, (george_id, None))
+ rtn = IS_IN_DB(db, 'person.id', '%(name)s', error_message='oops')(george_id+costanza_id)
+ self.assertEqual(rtn, (george_id+costanza_id, 'oops'))
+ rtn = IS_IN_DB(db, db.person.id, '%(name)s')(george_id)
+ self.assertEqual(rtn, (george_id, None))
+ rtn = IS_IN_DB(db, db.person.id, '%(name)s', error_message='oops')(george_id+costanza_id)
+ self.assertEqual(rtn, (george_id+costanza_id, 'oops'))
+ rtn = IS_IN_DB(db, 'person.id', '%(name)s', multiple=True)([george_id,costanza_id])
+ self.assertEqual(rtn, ([george_id,costanza_id], None))
+ rtn = IS_IN_DB(db, 'person.id', '%(name)s', multiple=True, delimiter=',')('%d,%d' % (george_id, costanza_id))
+ self.assertEqual(rtn, ( ('%d,%d' % (george_id, costanza_id)).split(','), None))
+ rtn = IS_IN_DB(db, db.person.id, '%(name)s', error_message='oops').options(zero=False)
+ self.assertEqual(sorted(rtn), [('%d' % george_id, 'george'), ('%d' % costanza_id, 'costanza')])
+ db.person.drop()
- # TODO: def test_IS_NOT_IN_DB(self):
+ def test_IS_NOT_IN_DB(self):
+ from gluon.dal import DAL, Field
+ db = DAL('sqlite:memory')
+ db.define_table('person', Field('name'))
+ db.person.insert(name='george')
+ rtn = IS_NOT_IN_DB(db, 'person.name', error_message='oops')('george')
+ self.assertEqual(rtn, ('george', 'oops'))
+ rtn = IS_NOT_IN_DB(db, 'person.name')('jerry')
+ self.assertEqual(rtn, ('jerry', None))
+ db.person.drop()
def test_IS_INT_IN_RANGE(self):
rtn = IS_INT_IN_RANGE(1,5)('4')
@@ -400,11 +429,19 @@ class TestValidators(unittest.TestCase):
rtn = IS_LIST_OF_EMAILS()(';'.join(emails))
self.assertEqual(rtn, ('localguy@localhost;_Yosemite.Sam@example.com;a', 'Invalid emails: a'))
- # TODO: def test_IS_GENERIC_URL(self):
-
- # TODO: def test_IS_HTTP_URL(self):
-
- # TODO: def test_IS_URL(self):
+ def test_IS_URL(self):
+ rtn = IS_URL()('http://example.com')
+ self.assertEqual(rtn, ('http://example.com', None))
+ rtn = IS_URL(error_message='oops')('http://example,com')
+ self.assertEqual(rtn, ('http://example,com', 'oops'))
+ rtn = IS_URL(error_message='oops')('http://www.example.com:8800/a/b/c/d/e/f/g/h')
+ self.assertEqual(rtn, ('http://www.example.com:8800/a/b/c/d/e/f/g/h', None))
+ rtn = IS_URL(error_message='oops', prepend_scheme='http')('example.com')
+ self.assertEqual(rtn, ('http://example.com', None))
+ rtn = IS_URL()('http://example.com?q=george&p=22')
+ self.assertEqual(rtn, ('http://example.com?q=george&p=22', None))
+ rtn = IS_URL(mode='generic', prepend_scheme=None)('example.com')
+ self.assertEqual(rtn, ('example.com', None))
def test_IS_TIME(self):
rtn = IS_TIME()('21:30')