test/unittest_entity.py
brancholdstable
changeset 7074 e4580e5f0703
parent 6685 eeedb3575d25
child 7139 20807d3d7cf6
equal deleted inserted replaced
6749:48f468f33704 7074:e4580e5f0703
    14 # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
    14 # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
    15 # details.
    15 # details.
    16 #
    16 #
    17 # You should have received a copy of the GNU Lesser General Public License along
    17 # You should have received a copy of the GNU Lesser General Public License along
    18 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
    18 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
    19 """unit tests for cubicweb.web.views.entities module
    19 """unit tests for cubicweb.web.views.entities module"""
    20 
       
    21 """
       
    22 
    20 
    23 from datetime import datetime
    21 from datetime import datetime
    24 
    22 
    25 from cubicweb import Binary, Unauthorized
    23 from cubicweb import Binary, Unauthorized
    26 from cubicweb.devtools.testlib import CubicWebTC
    24 from cubicweb.devtools.testlib import CubicWebTC
    27 from cubicweb.mttransforms import HAS_TAL
    25 from cubicweb.mttransforms import HAS_TAL
    28 from cubicweb.entities import fetch_config
    26 from cubicweb.entities import fetch_config
       
    27 from cubicweb.uilib import soup2xhtml
       
    28 
    29 
    29 
    30 class EntityTC(CubicWebTC):
    30 class EntityTC(CubicWebTC):
    31 
    31 
    32     def test_boolean_value(self):
    32     def test_boolean_value(self):
    33         e = self.vreg['etypes'].etype_class('CWUser')(self.request())
    33         e = self.vreg['etypes'].etype_class('CWUser')(self.request())
   317         # should be default groups but owners, i.e. managers, users, guests
   317         # should be default groups but owners, i.e. managers, users, guests
   318         self.assertEqual(len(unrelated), 3)
   318         self.assertEqual(len(unrelated), 3)
   319 
   319 
   320     def test_printable_value_string(self):
   320     def test_printable_value_string(self):
   321         e = self.request().create_entity('Card', title=u'rest test', content=u'du :eid:`1:*ReST*`',
   321         e = self.request().create_entity('Card', title=u'rest test', content=u'du :eid:`1:*ReST*`',
   322                             content_format=u'text/rest')
   322                                          content_format=u'text/rest')
   323         self.assertEqual(e.printable_value('content'),
   323         self.assertEqual(e.printable_value('content'),
   324                           '<p>du <a class="reference" href="http://testing.fr/cubicweb/cwgroup/guests">*ReST*</a></p>\n')
   324                          '<p>du <a class="reference" href="http://testing.fr/cubicweb/cwsource/system">*ReST*</a></p>\n')
   325         e['content'] = 'du <em>html</em> <ref rql="CWUser X">users</ref>'
   325         e.cw_attr_cache['content'] = 'du <em>html</em> <ref rql="CWUser X">users</ref>'
   326         e['content_format'] = 'text/html'
   326         e.cw_attr_cache['content_format'] = 'text/html'
   327         self.assertEqual(e.printable_value('content'),
   327         self.assertEqual(e.printable_value('content'),
   328                           'du <em>html</em> <a href="http://testing.fr/cubicweb/view?rql=CWUser%20X">users</a>')
   328                           'du <em>html</em> <a href="http://testing.fr/cubicweb/view?rql=CWUser%20X">users</a>')
   329         e['content'] = 'du *texte*'
   329         e.cw_attr_cache['content'] = 'du *texte*'
   330         e['content_format'] = 'text/plain'
   330         e.cw_attr_cache['content_format'] = 'text/plain'
   331         self.assertEqual(e.printable_value('content'),
   331         self.assertEqual(e.printable_value('content'),
   332                           '<p>\ndu *texte*<br/>\n</p>')
   332                           '<p>\ndu *texte*<br/>\n</p>')
   333         e['title'] = 'zou'
   333         e.cw_attr_cache['title'] = 'zou'
   334         e['content'] = '''\
   334         e.cw_attr_cache['content'] = '''\
   335 a title
   335 a title
   336 =======
   336 =======
   337 du :eid:`1:*ReST*`'''
   337 du :eid:`1:*ReST*`'''
   338         e['content_format'] = 'text/rest'
   338         e.cw_attr_cache['content_format'] = 'text/rest'
   339         self.assertEqual(e.printable_value('content', format='text/plain'),
   339         self.assertEqual(e.printable_value('content', format='text/plain'),
   340                           e['content'])
   340                           e.cw_attr_cache['content'])
   341 
   341 
   342         e['content'] = u'<b>yo (zou éà ;)</b>'
   342         e.cw_attr_cache['content'] = u'<b>yo (zou éà ;)</b>'
   343         e['content_format'] = 'text/html'
   343         e.cw_attr_cache['content_format'] = 'text/html'
   344         self.assertEqual(e.printable_value('content', format='text/plain').strip(),
   344         self.assertEqual(e.printable_value('content', format='text/plain').strip(),
   345                           u'**yo (zou éà ;)**')
   345                          u'**yo (zou éà ;)**')
   346         if HAS_TAL:
   346         if HAS_TAL:
   347             e['content'] = '<h1 tal:content="self/title">titre</h1>'
   347             e.cw_attr_cache['content'] = '<h1 tal:content="self/title">titre</h1>'
   348             e['content_format'] = 'text/cubicweb-page-template'
   348             e.cw_attr_cache['content_format'] = 'text/cubicweb-page-template'
   349             self.assertEqual(e.printable_value('content'),
   349             self.assertEqual(e.printable_value('content'),
   350                               '<h1>zou</h1>')
   350                               '<h1>zou</h1>')
   351 
   351 
   352 
   352 
   353     def test_printable_value_bytes(self):
   353     def test_printable_value_bytes(self):
   385         e = req.create_entity('Card', title=u'bad html', content=u'<div>R&D<br>',
   385         e = req.create_entity('Card', title=u'bad html', content=u'<div>R&D<br>',
   386                             content_format=u'text/html')
   386                             content_format=u'text/html')
   387         tidy = lambda x: x.replace('\n', '')
   387         tidy = lambda x: x.replace('\n', '')
   388         self.assertEqual(tidy(e.printable_value('content')),
   388         self.assertEqual(tidy(e.printable_value('content')),
   389                           '<div>R&amp;D<br/></div>')
   389                           '<div>R&amp;D<br/></div>')
   390         e['content'] = u'yo !! R&D <div> pas fermé'
   390         e.cw_attr_cache['content'] = u'yo !! R&D <div> pas fermé'
   391         self.assertEqual(tidy(e.printable_value('content')),
   391         self.assertEqual(tidy(e.printable_value('content')),
   392                           u'yo !! R&amp;D <div> pas fermé</div>')
   392                           u'yo !! R&amp;D <div> pas fermé</div>')
   393         e['content'] = u'R&D'
   393         e.cw_attr_cache['content'] = u'R&D'
   394         self.assertEqual(tidy(e.printable_value('content')), u'R&amp;D')
   394         self.assertEqual(tidy(e.printable_value('content')), u'R&amp;D')
   395         e['content'] = u'R&D;'
   395         e.cw_attr_cache['content'] = u'R&D;'
   396         self.assertEqual(tidy(e.printable_value('content')), u'R&amp;D;')
   396         self.assertEqual(tidy(e.printable_value('content')), u'R&amp;D;')
   397         e['content'] = u'yo !! R&amp;D <div> pas fermé'
   397         e.cw_attr_cache['content'] = u'yo !! R&amp;D <div> pas fermé'
   398         self.assertEqual(tidy(e.printable_value('content')),
   398         self.assertEqual(tidy(e.printable_value('content')),
   399                           u'yo !! R&amp;D <div> pas fermé</div>')
   399                          u'yo !! R&amp;D <div> pas fermé</div>')
   400         e['content'] = u'été <div> été'
   400         e.cw_attr_cache['content'] = u'été <div> été'
   401         self.assertEqual(tidy(e.printable_value('content')),
   401         self.assertEqual(tidy(e.printable_value('content')),
   402                           u'été <div> été</div>')
   402                          u'été <div> été</div>')
   403         e['content'] = u'C&apos;est un exemple s&eacute;rieux'
   403         e.cw_attr_cache['content'] = u'C&apos;est un exemple s&eacute;rieux'
   404         self.assertEqual(tidy(e.printable_value('content')),
   404         self.assertEqual(tidy(e.printable_value('content')),
   405                           u"C'est un exemple sérieux")
   405                          u"C'est un exemple sérieux")
   406         # make sure valid xhtml is left untouched
   406         # make sure valid xhtml is left untouched
   407         e['content'] = u'<div>R&amp;D<br/></div>'
   407         e.cw_attr_cache['content'] = u'<div>R&amp;D<br/></div>'
   408         self.assertEqual(e.printable_value('content'), e['content'])
   408         self.assertEqual(e.printable_value('content'), e.cw_attr_cache['content'])
   409         e['content'] = u'<div>été</div>'
   409         e.cw_attr_cache['content'] = u'<div>été</div>'
   410         self.assertEqual(e.printable_value('content'), e['content'])
   410         self.assertEqual(e.printable_value('content'), e.cw_attr_cache['content'])
   411         e['content'] = u'été'
   411         e.cw_attr_cache['content'] = u'été'
   412         self.assertEqual(e.printable_value('content'), e['content'])
   412         self.assertEqual(e.printable_value('content'), e.cw_attr_cache['content'])
   413         e['content'] = u'hop\r\nhop\nhip\rmomo'
   413         e.cw_attr_cache['content'] = u'hop\r\nhop\nhip\rmomo'
   414         self.assertEqual(e.printable_value('content'), u'hop\nhop\nhip\nmomo')
   414         self.assertEqual(e.printable_value('content'), u'hop\nhop\nhip\nmomo')
   415 
   415 
   416     def test_printable_value_bad_html_ms(self):
   416     def test_printable_value_bad_html_ms(self):
   417         self.skipTest('fix soup2xhtml to handle this test')
       
   418         req = self.request()
   417         req = self.request()
   419         e = req.create_entity('Card', title=u'bad html', content=u'<div>R&D<br>',
   418         e = req.create_entity('Card', title=u'bad html', content=u'<div>R&D<br>',
   420                             content_format=u'text/html')
   419                             content_format=u'text/html')
   421         tidy = lambda x: x.replace('\n', '')
   420         tidy = lambda x: x.replace('\n', '')
   422         e['content'] = u'<div x:foo="bar">ms orifice produces weird html</div>'
   421         e.cw_attr_cache['content'] = u'<div x:foo="bar">ms orifice produces weird html</div>'
   423         self.assertEqual(tidy(e.printable_value('content')),
   422         # Caution! current implementation of soup2xhtml strips first div element
   424                           u'<div>ms orifice produces weird html</div>')
   423         content = soup2xhtml(e.printable_value('content'), 'utf-8')
   425         import tidy as tidymod # apt-get install python-tidy
   424         self.assertMultiLineEqual(content, u'<div>ms orifice produces weird html</div>')
   426         tidy = lambda x: str(tidymod.parseString(x.encode('utf-8'),
       
   427                                                  **{'drop_proprietary_attributes': True,
       
   428                                                     'output_xhtml': True,
       
   429                                                     'show_body_only' : True,
       
   430                                                     'quote-nbsp' : False,
       
   431                                                     'char_encoding' : 'utf8'})).decode('utf-8').strip()
       
   432         self.assertEqual(tidy(e.printable_value('content')),
       
   433                           u'<div>ms orifice produces weird html</div>')
       
   434 
       
   435 
   425 
   436     def test_fulltextindex(self):
   426     def test_fulltextindex(self):
   437         e = self.vreg['etypes'].etype_class('File')(self.request())
   427         e = self.vreg['etypes'].etype_class('File')(self.request())
   438         e['description'] = 'du <em>html</em>'
   428         e.cw_attr_cache['description'] = 'du <em>html</em>'
   439         e['description_format'] = 'text/html'
   429         e.cw_attr_cache['description_format'] = 'text/html'
   440         e['data'] = Binary('some <em>data</em>')
   430         e.cw_attr_cache['data'] = Binary('some <em>data</em>')
   441         e['data_name'] = 'an html file'
   431         e.cw_attr_cache['data_name'] = 'an html file'
   442         e['data_format'] = 'text/html'
   432         e.cw_attr_cache['data_format'] = 'text/html'
   443         e['data_encoding'] = 'ascii'
   433         e.cw_attr_cache['data_encoding'] = 'ascii'
   444         e._cw.transaction_data = {} # XXX req should be a session
   434         e._cw.transaction_data = {} # XXX req should be a session
   445         self.assertEqual(e.cw_adapt_to('IFTIndexable').get_words(),
   435         self.assertEqual(e.cw_adapt_to('IFTIndexable').get_words(),
   446                           {'C': [u'du', u'html', 'an', 'html', 'file', u'some', u'data']})
   436                           {'C': ['an', 'html', 'file', 'du', 'html', 'some', 'data']})
   447 
   437 
   448 
   438 
   449     def test_nonregr_relation_cache(self):
   439     def test_nonregr_relation_cache(self):
   450         req = self.request()
   440         req = self.request()
   451         p1 = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien')
   441         p1 = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien')
   459         eid = session.execute(
   449         eid = session.execute(
   460             'INSERT TrInfo X: X comment "zou", X wf_info_for U, X from_state S1, X to_state S2 '
   450             'INSERT TrInfo X: X comment "zou", X wf_info_for U, X from_state S1, X to_state S2 '
   461             'WHERE U login "admin", S1 name "activated", S2 name "deactivated"')[0][0]
   451             'WHERE U login "admin", S1 name "activated", S2 name "deactivated"')[0][0]
   462         trinfo = self.execute('Any X WHERE X eid %(x)s', {'x': eid}).get_entity(0, 0)
   452         trinfo = self.execute('Any X WHERE X eid %(x)s', {'x': eid}).get_entity(0, 0)
   463         trinfo.complete()
   453         trinfo.complete()
   464         self.failUnless(isinstance(trinfo['creation_date'], datetime))
   454         self.failUnless(isinstance(trinfo.cw_attr_cache['creation_date'], datetime))
   465         self.failUnless(trinfo.cw_relation_cached('from_state', 'subject'))
   455         self.failUnless(trinfo.cw_relation_cached('from_state', 'subject'))
   466         self.failUnless(trinfo.cw_relation_cached('to_state', 'subject'))
   456         self.failUnless(trinfo.cw_relation_cached('to_state', 'subject'))
   467         self.failUnless(trinfo.cw_relation_cached('wf_info_for', 'subject'))
   457         self.failUnless(trinfo.cw_relation_cached('wf_info_for', 'subject'))
   468         self.assertEqual(trinfo.by_transition, ())
   458         self.assertEqual(trinfo.by_transition, ())
   469 
   459 
   497         self.assertEqual(card2.rest_path(), 'card/eid/%d' % card2.eid)
   487         self.assertEqual(card2.rest_path(), 'card/eid/%d' % card2.eid)
   498         card3 = req.create_entity('Card', title=u'pod', wikiid=u'zo&bi')
   488         card3 = req.create_entity('Card', title=u'pod', wikiid=u'zo&bi')
   499         self.assertEqual(card3.rest_path(), 'card/eid/%d' % card3.eid)
   489         self.assertEqual(card3.rest_path(), 'card/eid/%d' % card3.eid)
   500         card4 = req.create_entity('Card', title=u'pod', wikiid=u'zo?bi')
   490         card4 = req.create_entity('Card', title=u'pod', wikiid=u'zo?bi')
   501         self.assertEqual(card4.rest_path(), 'card/eid/%d' % card4.eid)
   491         self.assertEqual(card4.rest_path(), 'card/eid/%d' % card4.eid)
   502         
   492 
   503 
   493 
   504     def test_set_attributes(self):
   494     def test_set_attributes(self):
   505         req = self.request()
   495         req = self.request()
   506         person = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien')
   496         person = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien')
   507         self.assertEqual(person.prenom, u'adrien')
   497         self.assertEqual(person.prenom, u'adrien')
   513 
   503 
   514     def test_metainformation_and_external_absolute_url(self):
   504     def test_metainformation_and_external_absolute_url(self):
   515         req = self.request()
   505         req = self.request()
   516         note = req.create_entity('Note', type=u'z')
   506         note = req.create_entity('Note', type=u'z')
   517         metainf = note.cw_metainformation()
   507         metainf = note.cw_metainformation()
   518         self.assertEqual(metainf, {'source': {'adapter': 'native', 'uri': 'system'}, 'type': u'Note', 'extid': None})
   508         self.assertEqual(metainf, {'source': {'type': 'native', 'uri': 'system'}, 'type': u'Note', 'extid': None})
   519         self.assertEqual(note.absolute_url(), 'http://testing.fr/cubicweb/note/%s' % note.eid)
   509         self.assertEqual(note.absolute_url(), 'http://testing.fr/cubicweb/note/%s' % note.eid)
   520         metainf['source'] = metainf['source'].copy()
   510         metainf['source'] = metainf['source'].copy()
   521         metainf['source']['base-url']  = 'http://cubicweb2.com/'
   511         metainf['source']['base-url']  = 'http://cubicweb2.com/'
   522         metainf['extid']  = 1234
   512         metainf['extid']  = 1234
   523         self.assertEqual(note.absolute_url(), 'http://cubicweb2.com/note/1234')
   513         self.assertEqual(note.absolute_url(), 'http://cubicweb2.com/note/1234')