#!/bin/python # -*- coding: utf-8 -*- """ Unit tests for gluon.html """ import unittest from fix_path import fix_sys_path fix_sys_path(__file__) from html import * from html import verifyURL from storage import Storage class TestBareHelpers(unittest.TestCase): def testBR(self): self.assertEqual(BR(_a='1', _b='2').xml(), '
') def testEMBED(self): self.assertEqual(EMBED(_a='1', _b='2').xml(), '') def testHR(self): self.assertEqual(HR(_a='1', _b='2').xml(), '
') def testIMG(self): self.assertEqual(IMG(_a='1', _b='2').xml(), '') def testINPUT(self): self.assertEqual(INPUT(_a='1', _b='2').xml(), '') def testLINK(self): self.assertEqual(LINK(_a='1', _b='2').xml(), '') def testMETA(self): self.assertEqual(META(_a='1', _b='2').xml(), '') def testA(self): self.assertEqual( A('<>', _a='1', _b='2').xml(), '<>' ) self.assertEqual( A('a', cid='b').xml(), 'a' ) self.assertEqual( A('a', callback='b', _id='c').xml(), 'a' ) self.assertEqual( A('a', delete='tr').xml(), 'a' ) self.assertEqual( A('a', _id='b', target='').xml(), 'a' ) self.assertEqual( A('a', component='b').xml(), 'a' ) self.assertEqual( A('a', _id='b', callback='c', noconfirm=True).xml(), 'a' ) self.assertEqual( A('a', cid='b').xml(), 'a' ) self.assertEqual( A('a', cid='b', _disable_with='processing...').xml(), 'a' ) self.assertEqual( A('a', callback='b', delete='tr', noconfirm=True, _id='c').xml(), 'a' ) self.assertEqual( A('a', callback='b', delete='tr', confirm='Are you sure?', _id='c').xml(), 'a' ) def testB(self): self.assertEqual(B('<>', _a='1', _b='2').xml(), '<>') 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(), '
a
b
') self.assertEqual([el.xml() for el in s.siblings()], ['
b
']) self.assertEqual(s.sibling().xml(), '
b
') self.assertEqual(s.siblings('a'), []) def testEM(self): self.assertEqual(EM('<>', _a='1', _b='2').xml(), '<>') def testFIELDSET(self): self.assertEqual(FIELDSET('<>', _a='1', _b='2').xml(), '
<>
') def testFORM(self): self.assertEqual(FORM('<>', _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(), '
    1. <>
    ') 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): 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 testSELECT(self): self.assertEqual(SELECT('<>', _a='1', _b='2').xml(), '') def testSPAN(self): self.assertEqual(SPAN('<>', _a='1', _b='2').xml(), '<>') def testSTYLE(self): self.assertEqual(STYLE('<>', _a='1', _b='2').xml(), '') def testTABLE(self): self.assertEqual(TABLE('<>', _a='1', _b='2').xml(), '' + '
    <>
    ') def testTBODY(self): self.assertEqual(TBODY('<>', _a='1', _b='2').xml(), '<>') def testTD(self): self.assertEqual(TD('<>', _a='1', _b='2').xml(), '<>') def testTEXTAREA(self): self.assertEqual(TEXTAREA('<>', _a='1', _b='2').xml(), '') # override _rows and _cols self.assertEqual(TEXTAREA('<>', _a='1', _b='2', _rows=5, _cols=20).xml(), '') def testTFOOT(self): self.assertEqual(TFOOT('<>', _a='1', _b='2').xml(), '<>') def testTH(self): self.assertEqual(TH('<>', _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(), '<>') def testTITLE(self): self.assertEqual(TITLE('<>', _a='1', _b='2').xml(), '<>') def testTR(self): self.assertEqual(TR('<>', _a='1', _b='2').xml(), '<>') def testTT(self): self.assertEqual(TT('<>', _a='1', _b='2').xml(), '<>') def testUL(self): self.assertEqual(UL('<>', _a='1', _b='2').xml(), '') def testXML(self): # sanitization process self.assertEqual(XML('

    HelloWorld

    ').xml(), '

    HelloWorld

    ') # with sanitize, data-attributes are not permitted self.assertEqual(XML('

    HelloWorld

    ', 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('

    HelloWorld

    ', sanitize=True), XML('

    HelloWorld

    ')) #bug check for the sanitizer for closing no-close tags self.assertEqual(XML('

    Test


    Test


    ', sanitize=True), XML('

    Test


    Test


    ')) 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(), '') 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') 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']) 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) class TestData(unittest.TestCase): def testAdata(self): self.assertEqual(A('<>', data=dict(abc='', cde='standard'), _a='1', _b='2').xml(), '<>') if __name__ == '__main__': unittest.main()