common/test/unittest_entity.py
changeset 1808 aa09e20dd8c0
parent 1693 49075f57cf2c
parent 1807 6d541c610165
child 1810 e95e876be17c
equal deleted inserted replaced
1693:49075f57cf2c 1808:aa09e20dd8c0
     1 # -*- coding: utf-8 -*-
       
     2 """unit tests for cubicweb.web.views.entities module"""
       
     3 
       
     4 from cubicweb.devtools.apptest import EnvBasedTC
       
     5 
       
     6 from mx.DateTime import DateTimeType, now
       
     7 from cubicweb import Binary
       
     8 
       
     9 class EntityTC(EnvBasedTC):
       
    10 
       
    11 ##     def setup_database(self):
       
    12 ##         self.add_entity('Personne', nom=u'di mascio', prenom=u'adrien')
       
    13 ##         self.add_entity('Task', title=u'fait ca !', description=u'et plus vite', start=now())
       
    14 ##         self.add_entity('Tag', name=u'x')
       
    15 ##         self.add_entity('Link', title=u'perdu', url=u'http://www.perdu.com',
       
    16 ##                         embed=False)
       
    17     
       
    18     def test_boolean_value(self):
       
    19         e = self.etype_instance('Tag')
       
    20         self.failUnless(e)
       
    21 
       
    22     def test_yams_inheritance(self):
       
    23         from entities import AnotherNote
       
    24         e = self.etype_instance('SubNote')
       
    25         self.assertIsInstance(e, AnotherNote)
       
    26         e2 = self.etype_instance('SubNote')
       
    27         self.assertIs(e.__class__, e2.__class__)
       
    28 
       
    29     def test_has_eid(self):
       
    30         e = self.etype_instance('Tag')
       
    31         self.assertEquals(e.eid, None)
       
    32         self.assertEquals(e.has_eid(), False)
       
    33         e.eid = 'X'
       
    34         self.assertEquals(e.has_eid(), False)
       
    35         e.eid = 0
       
    36         self.assertEquals(e.has_eid(), True)
       
    37         e.eid = 2
       
    38         self.assertEquals(e.has_eid(), True)
       
    39         
       
    40     def test_copy(self):
       
    41         self.add_entity('Tag', name=u'x')
       
    42         p = self.add_entity('Personne', nom=u'toto')
       
    43         oe = self.add_entity('Note', type=u'x')
       
    44         self.execute('SET T ecrit_par U WHERE T eid %(t)s, U eid %(u)s',
       
    45                      {'t': oe.eid, 'u': p.eid}, ('t','u'))
       
    46         self.execute('SET TAG tags X WHERE X eid %(x)s', {'x': oe.eid}, 'x')
       
    47         e = self.add_entity('Note', type=u'z')
       
    48         e.copy_relations(oe.eid)
       
    49         self.assertEquals(len(e.ecrit_par), 1)
       
    50         self.assertEquals(e.ecrit_par[0].eid, p.eid)
       
    51         self.assertEquals(len(e.reverse_tags), 0)
       
    52         
       
    53     def test_copy_with_nonmeta_composite_inlined(self):
       
    54         p = self.add_entity('Personne', nom=u'toto')
       
    55         oe = self.add_entity('Note', type=u'x')
       
    56         self.schema['ecrit_par'].set_rproperty('Note', 'Personne', 'composite', 'subject')
       
    57         self.execute('SET T ecrit_par U WHERE T eid %(t)s, U eid %(u)s',
       
    58                      {'t': oe.eid, 'u': p.eid}, ('t','u'))
       
    59         e = self.add_entity('Note', type=u'z')
       
    60         e.copy_relations(oe.eid)
       
    61         self.failIf(e.ecrit_par)
       
    62         self.failUnless(oe.ecrit_par)
       
    63             
       
    64     def test_copy_with_composite(self):
       
    65         user = self.user()
       
    66         adeleid = self.execute('INSERT EmailAddress X: X address "toto@logilab.org", U use_email X WHERE U login "admin"')[0][0]
       
    67         e = self.entity('Any X WHERE X eid %(x)s', {'x':user.eid}, 'x')
       
    68         self.assertEquals(e.use_email[0].address, "toto@logilab.org")
       
    69         self.assertEquals(e.use_email[0].eid, adeleid)
       
    70         usereid = self.execute('INSERT EUser X: X login "toto", X upassword "toto", X in_group G, X in_state S '
       
    71                                'WHERE G name "users", S name "activated"')[0][0]
       
    72         e = self.entity('Any X WHERE X eid %(x)s', {'x':usereid}, 'x')
       
    73         e.copy_relations(user.eid)
       
    74         self.failIf(e.use_email)
       
    75         self.failIf(e.primary_email)
       
    76         
       
    77     def test_copy_with_non_initial_state(self):
       
    78         user = self.user()
       
    79         eid = self.execute('INSERT EUser X: X login "toto", X upassword %(pwd)s, X in_group G WHERE G name "users"',
       
    80                            {'pwd': 'toto'})[0][0]
       
    81         self.commit()
       
    82         self.execute('SET X in_state S WHERE X eid %(x)s, S name "deactivated"', {'x': eid}, 'x')
       
    83         self.commit()
       
    84         eid2 = self.execute('INSERT EUser X: X login "tutu", X upassword %(pwd)s', {'pwd': 'toto'})[0][0]
       
    85         e = self.entity('Any X WHERE X eid %(x)s', {'x': eid2}, 'x')
       
    86         e.copy_relations(eid)
       
    87         self.commit()
       
    88         e.clear_related_cache('in_state', 'subject')
       
    89         self.assertEquals(e.state, 'activated')
       
    90 
       
    91     def test_related_cache_both(self):
       
    92         user = self.entity('Any X WHERE X eid %(x)s', {'x':self.user().eid}, 'x')
       
    93         adeleid = self.execute('INSERT EmailAddress X: X address "toto@logilab.org", U use_email X WHERE U login "admin"')[0][0]
       
    94         self.commit()
       
    95         self.assertEquals(user._related_cache.keys(), [])
       
    96         email = user.primary_email[0]
       
    97         self.assertEquals(sorted(user._related_cache), ['primary_email_subject'])
       
    98         self.assertEquals(email._related_cache.keys(), ['primary_email_object'])
       
    99         groups = user.in_group
       
   100         self.assertEquals(sorted(user._related_cache), ['in_group_subject', 'primary_email_subject'])
       
   101         for group in groups:
       
   102             self.failIf('in_group_subject' in group._related_cache, group._related_cache.keys())
       
   103 
       
   104     def test_related_limit(self):
       
   105         p = self.add_entity('Personne', nom=u'di mascio', prenom=u'adrien')
       
   106         for tag in u'abcd':
       
   107             self.add_entity('Tag', name=tag)
       
   108         self.execute('SET X tags Y WHERE X is Tag, Y is Personne')
       
   109         self.assertEquals(len(p.related('tags', 'object', limit=2)), 2)
       
   110         self.assertEquals(len(p.related('tags', 'object')), 4)
       
   111 
       
   112         
       
   113     def test_fetch_rql(self):
       
   114         user = self.user()
       
   115         Personne = self.vreg.etype_class('Personne')
       
   116         Societe = self.vreg.etype_class('Societe')
       
   117         Note = self.vreg.etype_class('Note')
       
   118         peschema = Personne.e_schema
       
   119         seschema = Societe.e_schema
       
   120         peschema.subject_relation('travaille').set_rproperty(peschema, seschema, 'cardinality', '1*')
       
   121         peschema.subject_relation('connait').set_rproperty(peschema, peschema, 'cardinality', '11')
       
   122         peschema.subject_relation('evaluee').set_rproperty(peschema, Note.e_schema, 'cardinality', '1*')
       
   123         seschema.subject_relation('evaluee').set_rproperty(seschema, Note.e_schema, 'cardinality', '1*')
       
   124         # testing basic fetch_attrs attribute
       
   125         self.assertEquals(Personne.fetch_rql(user),
       
   126                           'Any X,AA,AB,AC ORDERBY AA ASC WHERE X is Personne, X nom AA, X prenom AB, X modification_date AC')
       
   127         pfetch_attrs = Personne.fetch_attrs
       
   128         sfetch_attrs = Societe.fetch_attrs
       
   129         try:
       
   130             # testing unknown attributes
       
   131             Personne.fetch_attrs = ('bloug', 'beep')
       
   132             self.assertEquals(Personne.fetch_rql(user), 'Any X WHERE X is Personne')            
       
   133             # testing one non final relation
       
   134             Personne.fetch_attrs = ('nom', 'prenom', 'travaille')
       
   135             self.assertEquals(Personne.fetch_rql(user),
       
   136                               'Any X,AA,AB,AC,AD ORDERBY AA ASC WHERE X is Personne, X nom AA, X prenom AB, X travaille AC, AC nom AD')
       
   137             # testing two non final relations
       
   138             Personne.fetch_attrs = ('nom', 'prenom', 'travaille', 'evaluee')
       
   139             self.assertEquals(Personne.fetch_rql(user),
       
   140                               'Any X,AA,AB,AC,AD,AE,AF ORDERBY AA ASC,AF DESC WHERE X is Personne, X nom AA, '
       
   141                               'X prenom AB, X travaille AC, AC nom AD, X evaluee AE, AE modification_date AF')
       
   142             # testing one non final relation with recursion
       
   143             Personne.fetch_attrs = ('nom', 'prenom', 'travaille')
       
   144             Societe.fetch_attrs = ('nom', 'evaluee')
       
   145             self.assertEquals(Personne.fetch_rql(user),
       
   146                               'Any X,AA,AB,AC,AD,AE,AF ORDERBY AA ASC,AF DESC WHERE X is Personne, X nom AA, X prenom AB, '
       
   147                               'X travaille AC, AC nom AD, AC evaluee AE, AE modification_date AF'
       
   148                               )
       
   149             # testing symetric relation
       
   150             Personne.fetch_attrs = ('nom', 'connait')
       
   151             self.assertEquals(Personne.fetch_rql(user), 'Any X,AA,AB ORDERBY AA ASC WHERE X is Personne, X nom AA, X connait AB')
       
   152             # testing optional relation
       
   153             peschema.subject_relation('travaille').set_rproperty(peschema, seschema, 'cardinality', '?*')
       
   154             Personne.fetch_attrs = ('nom', 'prenom', 'travaille')
       
   155             Societe.fetch_attrs = ('nom',)
       
   156             self.assertEquals(Personne.fetch_rql(user),
       
   157                               'Any X,AA,AB,AC,AD ORDERBY AA ASC WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD')
       
   158             # testing relation with cardinality > 1
       
   159             peschema.subject_relation('travaille').set_rproperty(peschema, seschema, 'cardinality', '**')
       
   160             self.assertEquals(Personne.fetch_rql(user),
       
   161                               'Any X,AA,AB ORDERBY AA ASC WHERE X is Personne, X nom AA, X prenom AB')
       
   162             # XXX test unauthorized attribute
       
   163         finally:
       
   164             Personne.fetch_attrs = pfetch_attrs
       
   165             Societe.fetch_attrs = sfetch_attrs
       
   166 
       
   167     def test_related_rql(self):
       
   168         from cubicweb.entities import fetch_config
       
   169         Personne = self.vreg.etype_class('Personne')
       
   170         Societe = self.vreg.etype_class('Societe')
       
   171         Personne.fetch_attrs, Personne.fetch_order = fetch_config(('nom', 'prenom', 'sexe'))
       
   172         Societe.fetch_attrs, Societe.fetch_order = fetch_config(('nom', 'web'))
       
   173         aff = self.add_entity('Affaire', sujet=u'my subject', ref=u'the ref')
       
   174         self.assertEquals(aff.related_rql('liee_a'),
       
   175                           'Any X,AA,AB ORDERBY AA ASC WHERE E eid %(x)s, E liee_a X, '
       
   176                           'X nom AA, X modification_date AB')
       
   177         Societe.fetch_attrs = ('web',)
       
   178         self.assertEquals(aff.related_rql('liee_a'),
       
   179                           'Any X ORDERBY Z DESC WHERE X modification_date Z, E eid %(x)s, E liee_a X')
       
   180     
       
   181     def test_entity_unrelated(self):
       
   182         p = self.add_entity('Personne', nom=u'di mascio', prenom=u'adrien')
       
   183         e = self.add_entity('Tag', name=u'x')
       
   184         rschema = e.e_schema.subject_relation('tags')
       
   185         related = [r.eid for r in e.tags]
       
   186         self.failUnlessEqual(related, [])
       
   187         unrelated = [reid for rview, reid in e.vocabulary(rschema, 'subject')]
       
   188         self.failUnless(p.eid in unrelated)
       
   189         self.execute('SET X tags Y WHERE X is Tag, Y is Personne')
       
   190         e = self.entity('Any X WHERE X is Tag')
       
   191         unrelated = [reid for rview, reid in e.vocabulary(rschema, 'subject')]
       
   192         self.failIf(p.eid in unrelated)
       
   193 
       
   194     def test_entity_unrelated_limit(self):
       
   195         e = self.add_entity('Tag', name=u'x')
       
   196         self.add_entity('Personne', nom=u'di mascio', prenom=u'adrien')
       
   197         self.add_entity('Personne', nom=u'di mascio', prenom=u'gwen')
       
   198         rschema = e.e_schema.subject_relation('tags')
       
   199         self.assertEquals(len(e.vocabulary(rschema, 'subject', limit=1)),
       
   200                           1)
       
   201         
       
   202     def test_new_entity_unrelated(self):
       
   203         e = self.etype_instance('EUser')
       
   204         rschema = e.e_schema.subject_relation('in_group')
       
   205         unrelated = [reid for rview, reid in e.vocabulary(rschema, 'subject')]
       
   206         # should be default groups but owners, i.e. managers, users, guests
       
   207         self.assertEquals(len(unrelated), 3)
       
   208 
       
   209 
       
   210     def test_rtags_expansion(self):
       
   211         from cubicweb.entities import AnyEntity
       
   212         class Personne(AnyEntity):
       
   213             id = 'Personne'
       
   214             __rtags__ = {
       
   215                 ('travaille', 'Societe', 'subject') : set(('primary',)),
       
   216                 ('evaluee', '*', 'subject') : set(('secondary',)),
       
   217                 'ecrit_par' : set(('inlineview',)),
       
   218                 }
       
   219         self.vreg.register_vobject_class(Personne)
       
   220         rtags = Personne.rtags
       
   221         self.assertEquals(rtags.get_tags('evaluee', 'Note', 'subject'), set(('secondary', 'link')))
       
   222         self.assertEquals(rtags.is_inlined('evaluee', 'Note', 'subject'), False)
       
   223         self.assertEquals(rtags.get_tags('evaluee', 'Personne', 'subject'), set(('secondary', 'link')))
       
   224         self.assertEquals(rtags.is_inlined('evaluee', 'Personne', 'subject'), False)
       
   225         self.assertEquals(rtags.get_tags('ecrit_par', 'Note', 'object'), set(('inlineview', 'link')))
       
   226         self.assertEquals(rtags.is_inlined('ecrit_par', 'Note', 'object'), True)
       
   227         class Personne2(Personne):
       
   228             id = 'Personne'
       
   229             __rtags__ = {
       
   230                 ('evaluee', 'Note', 'subject') : set(('inlineview',)),
       
   231                 }
       
   232         self.vreg.register_vobject_class(Personne2)
       
   233         rtags = Personne2.rtags
       
   234         self.assertEquals(rtags.get_tags('evaluee', 'Note', 'subject'), set(('inlineview', 'link')))
       
   235         self.assertEquals(rtags.is_inlined('evaluee', 'Note', 'subject'), True)
       
   236         self.assertEquals(rtags.get_tags('evaluee', 'Personne', 'subject'), set(('secondary', 'link')))
       
   237         self.assertEquals(rtags.is_inlined('evaluee', 'Personne', 'subject'), False)
       
   238     
       
   239     def test_relations_by_category(self):
       
   240         e = self.etype_instance('EUser')
       
   241         def rbc(iterable):
       
   242             return [(rschema.type, x) for rschema, tschemas, x in iterable]
       
   243         self.assertEquals(rbc(e.relations_by_category('primary')),
       
   244                           [('login', 'subject'), ('upassword', 'subject'),
       
   245                            ('in_group', 'subject'), ('in_state', 'subject'),
       
   246                            ('eid', 'subject'),])
       
   247         # firstname and surname are put in secondary category in views.entities.EUserEntity
       
   248         self.assertListEquals(rbc(e.relations_by_category('secondary')),
       
   249                               [('firstname', 'subject'), ('surname', 'subject')])
       
   250         self.assertListEquals(rbc(e.relations_by_category('generic')),
       
   251                               [('primary_email', 'subject'),
       
   252                                ('evaluee', 'subject'),
       
   253                                ('for_user', 'object')])
       
   254         # owned_by is defined both as subject and object relations on EUser
       
   255         self.assertListEquals(rbc(e.relations_by_category('generated')),
       
   256                               [('last_login_time', 'subject'),
       
   257                                ('created_by', 'subject'),
       
   258                                ('creation_date', 'subject'),
       
   259                                ('is', 'subject'),
       
   260                                ('is_instance_of', 'subject'),
       
   261                                ('modification_date', 'subject'),
       
   262                                ('owned_by', 'subject'),
       
   263                                ('created_by', 'object'),
       
   264                                ('wf_info_for', 'object'),
       
   265                                ('owned_by', 'object'),
       
   266                                ('bookmarked_by', 'object')])
       
   267         e = self.etype_instance('Personne')
       
   268         self.assertListEquals(rbc(e.relations_by_category('primary')),
       
   269                               [('nom', 'subject'), ('eid', 'subject')])
       
   270         self.assertListEquals(rbc(e.relations_by_category('secondary')),
       
   271                               [('prenom', 'subject'),
       
   272                                ('sexe', 'subject'),
       
   273                                ('promo', 'subject'),
       
   274                                ('titre', 'subject'),
       
   275                                ('adel', 'subject'),
       
   276                                ('ass', 'subject'),
       
   277                                ('web', 'subject'),
       
   278                                ('tel', 'subject'),
       
   279                                ('fax', 'subject'),
       
   280                                ('datenaiss', 'subject'),
       
   281                                ('test', 'subject'),
       
   282                                ('description', 'subject'),
       
   283                                ('salary', 'subject')])
       
   284         self.assertListEquals(rbc(e.relations_by_category('generic')),
       
   285                               [('concerne', 'subject'),
       
   286                                ('connait', 'subject'),
       
   287                                ('evaluee', 'subject'),
       
   288                                ('travaille', 'subject'),
       
   289                                ('ecrit_par', 'object'),
       
   290                                ('evaluee', 'object'),
       
   291                                ('liee_a', 'object'),
       
   292                                ('tags', 'object')])
       
   293         self.assertListEquals(rbc(e.relations_by_category('generated')),
       
   294                               [('created_by', 'subject'),
       
   295                                ('creation_date', 'subject'),
       
   296                                ('is', 'subject'),
       
   297                                ('is_instance_of', 'subject'),
       
   298                                ('modification_date', 'subject'),
       
   299                                ('owned_by', 'subject')])
       
   300         
       
   301 
       
   302     def test_printable_value_string(self):
       
   303         e = self.add_entity('Card', title=u'rest test', content=u'du :eid:`1:*ReST*`',
       
   304                             content_format=u'text/rest')
       
   305         self.assertEquals(e.printable_value('content'),
       
   306                           '<p>du <a class="reference" href="http://testing.fr/cubicweb/egroup/managers">*ReST*</a></p>\n')
       
   307         e['content'] = 'du <em>html</em> <ref rql="EUser X">users</ref>'
       
   308         e['content_format'] = 'text/html'
       
   309         self.assertEquals(e.printable_value('content'),
       
   310                           'du <em>html</em> <a href="http://testing.fr/cubicweb/view?rql=EUser%20X">users</a>')
       
   311         e['content'] = 'du *texte*'
       
   312         e['content_format'] = 'text/plain'
       
   313         self.assertEquals(e.printable_value('content'),
       
   314                           '<p>\ndu *texte*\n</p>')
       
   315         e['title'] = 'zou'
       
   316         e['content'] = '<h1 tal:content="self/title">titre</h1>'
       
   317         e['content_format'] = 'text/cubicweb-page-template'
       
   318         self.assertEquals(e.printable_value('content'),
       
   319                           '<h1>zou</h1>')
       
   320         
       
   321         #e = self.etype_instance('Task')
       
   322         e['content'] = '''\
       
   323 a title
       
   324 =======
       
   325 du :eid:`1:*ReST*`'''
       
   326         e['content_format'] = 'text/rest'
       
   327         self.assertEquals(e.printable_value('content', format='text/plain'),
       
   328                           e['content'])
       
   329 
       
   330         e['content'] = u'<b>yo (zou éà ;)</b>'
       
   331         e['content_format'] = 'text/html'
       
   332         self.assertEquals(e.printable_value('content', format='text/plain').strip(),
       
   333                           u'**yo (zou éà ;)**')
       
   334 
       
   335     def test_printable_value_bytes(self):
       
   336         e = self.add_entity('File', data=Binary('lambda x: 1'), data_format=u'text/x-python',
       
   337                             data_encoding=u'ascii', name=u'toto.py')
       
   338         from cubicweb.common import mttransforms
       
   339         if mttransforms.HAS_PYGMENTS_TRANSFORMS:
       
   340             self.assertEquals(e.printable_value('data'),
       
   341                               '''<div class="highlight"><pre><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="mf">1</span>
       
   342 </pre></div>
       
   343 ''')
       
   344         else:
       
   345             self.assertEquals(e.printable_value('data'),
       
   346                               '''<pre class="python">
       
   347 <span style="color: #C00000;">lambda</span> <span style="color: #000000;">x</span><span style="color: #0000C0;">:</span> <span style="color: #0080C0;">1</span>
       
   348 </pre>
       
   349 ''')
       
   350         
       
   351         e = self.add_entity('File', data=Binary('*héhéhé*'), data_format=u'text/rest',
       
   352                             data_encoding=u'utf-8', name=u'toto.txt')
       
   353         self.assertEquals(e.printable_value('data'),
       
   354                           u'<p><em>héhéhé</em></p>\n')
       
   355 
       
   356     def test_printable_value_bad_html(self):
       
   357         """make sure we don't crash if we try to render invalid XHTML strings"""
       
   358         e = self.add_entity('Card', title=u'bad html', content=u'<div>R&D<br>',
       
   359                             content_format=u'text/html')
       
   360         tidy = lambda x: x.replace('\n', '')
       
   361         self.assertEquals(tidy(e.printable_value('content')),
       
   362                           '<div>R&amp;D<br/></div>')
       
   363         e['content'] = u'yo !! R&D <div> pas fermé'
       
   364         self.assertEquals(tidy(e.printable_value('content')),
       
   365                           u'yo !! R&amp;D <div> pas fermé</div>')
       
   366         e['content'] = u'R&D'
       
   367         self.assertEquals(tidy(e.printable_value('content')), u'R&amp;D')
       
   368         e['content'] = u'R&D;'
       
   369         self.assertEquals(tidy(e.printable_value('content')), u'R&amp;D;')
       
   370         e['content'] = u'yo !! R&amp;D <div> pas fermé'
       
   371         self.assertEquals(tidy(e.printable_value('content')),
       
   372                           u'yo !! R&amp;D <div> pas fermé</div>')
       
   373         e['content'] = u'été <div> été'
       
   374         self.assertEquals(tidy(e.printable_value('content')),
       
   375                           u'été <div> été</div>')
       
   376         e['content'] = u'C&apos;est un exemple s&eacute;rieux'
       
   377         self.assertEquals(tidy(e.printable_value('content')),
       
   378                           u"C'est un exemple sérieux")
       
   379         # make sure valid xhtml is left untouched
       
   380         e['content'] = u'<div>R&amp;D<br/></div>'
       
   381         self.assertEquals(e.printable_value('content'), e['content'])
       
   382         e['content'] = u'<div>été</div>'
       
   383         self.assertEquals(e.printable_value('content'), e['content'])
       
   384         e['content'] = u'été'
       
   385         self.assertEquals(e.printable_value('content'), e['content'])
       
   386         
       
   387 
       
   388     def test_entity_formatted_attrs(self):
       
   389         e = self.etype_instance('Note')
       
   390         self.assertEquals(e.formatted_attrs(), [])
       
   391         e = self.etype_instance('File')
       
   392         self.assertEquals(e.formatted_attrs(), ['description'])
       
   393         e = self.etype_instance('AnotherNote')
       
   394         self.assertEquals(e.formatted_attrs(), ['descr', 'descr2'])
       
   395         
       
   396         
       
   397     def test_fulltextindex(self):
       
   398         e = self.etype_instance('File')
       
   399         e['name'] = 'an html file'
       
   400         e['description'] = 'du <em>html</em>'
       
   401         e['description_format'] = 'text/html'
       
   402         e['data'] = Binary('some <em>data</em>')
       
   403         e['data_format'] = 'text/html'
       
   404         e['data_encoding'] = 'ascii'
       
   405         self.assertEquals(set(e.get_words()), 
       
   406                           set(['an', 'html', 'file', 'du', 'html', 'some', 'data']))
       
   407 
       
   408         
       
   409     def test_nonregr_relation_cache(self):
       
   410         p1 = self.add_entity('Personne', nom=u'di mascio', prenom=u'adrien')
       
   411         p2 = self.add_entity('Personne', nom=u'toto')
       
   412         self.execute('SET X evaluee Y WHERE X nom "di mascio", Y nom "toto"')
       
   413         self.assertEquals(p1.evaluee[0].nom, "toto")
       
   414         self.failUnless(not p1.reverse_evaluee)
       
   415         
       
   416     def test_complete_relation(self):
       
   417         self.execute('SET RT add_permission G WHERE RT name "wf_info_for", G name "managers"')
       
   418         self.commit()
       
   419         try:
       
   420             eid = self.execute('INSERT TrInfo X: X comment "zou", X wf_info_for U,'
       
   421                                'X from_state S1, X to_state S2 WHERE '
       
   422                                'U login "admin", S1 name "activated", S2 name "deactivated"')[0][0]
       
   423             trinfo = self.entity('Any X WHERE X eid %(x)s', {'x': eid}, 'x')
       
   424             trinfo.complete()
       
   425             self.failUnless(trinfo.relation_cached('from_state', 'subject'))
       
   426             self.failUnless(trinfo.relation_cached('to_state', 'subject'))
       
   427             self.failUnless(trinfo.relation_cached('wf_info_for', 'subject'))
       
   428             # check with a missing relation
       
   429             eid = self.execute('INSERT TrInfo X: X comment "zou", X wf_info_for U,'
       
   430                                'X to_state S2 WHERE '
       
   431                                'U login "admin", S2 name "activated"')[0][0]
       
   432             trinfo = self.entity('Any X WHERE X eid %(x)s', {'x': eid}, 'x')
       
   433             trinfo.complete()
       
   434             self.failUnless(isinstance(trinfo.creation_date, DateTimeType))
       
   435             self.failUnless(trinfo.relation_cached('from_state', 'subject'))
       
   436             self.failUnless(trinfo.relation_cached('to_state', 'subject'))
       
   437             self.failUnless(trinfo.relation_cached('wf_info_for', 'subject'))
       
   438             self.assertEquals(trinfo.from_state, [])
       
   439         finally:
       
   440             self.rollback()
       
   441             self.execute('DELETE RT add_permission G WHERE RT name "wf_info_for", G name "managers"')
       
   442             self.commit()
       
   443 
       
   444     def test_request_cache(self):
       
   445         req = self.request()
       
   446         user = self.entity('EUser X WHERE X login "admin"', req=req)
       
   447         state = user.in_state[0]
       
   448         samestate = self.entity('State X WHERE X name "activated"', req=req)
       
   449         self.failUnless(state is samestate)
       
   450 
       
   451     def test_rest_path(self):
       
   452         note = self.add_entity('Note', type=u'z')
       
   453         self.assertEquals(note.rest_path(), 'note/%s' % note.eid)
       
   454         # unique attr
       
   455         tag = self.add_entity('Tag', name=u'x')
       
   456         self.assertEquals(tag.rest_path(), 'tag/x')
       
   457         # test explicit rest_attr
       
   458         person = self.add_entity('Personne', prenom=u'john', nom=u'doe')
       
   459         self.assertEquals(person.rest_path(), 'personne/doe')
       
   460         # ambiguity test
       
   461         person2 = self.add_entity('Personne', prenom=u'remi', nom=u'doe')
       
   462         self.assertEquals(person.rest_path(), 'personne/eid/%s' % person.eid)
       
   463         self.assertEquals(person2.rest_path(), 'personne/eid/%s' % person2.eid)
       
   464         # unique attr with None value (wikiid in this case)
       
   465         card1 = self.add_entity('Card', title=u'hop')
       
   466         self.assertEquals(card1.rest_path(), 'card/eid/%s' % card1.eid)
       
   467         card2 = self.add_entity('Card', title=u'pod', wikiid=u'zob/i')
       
   468         self.assertEquals(card2.rest_path(), 'card/zob%2Fi')
       
   469 
       
   470     def test_set_attributes(self):
       
   471         person = self.add_entity('Personne', nom=u'di mascio', prenom=u'adrien')
       
   472         self.assertEquals(person.prenom, u'adrien')
       
   473         self.assertEquals(person.nom, u'di mascio')
       
   474         person.set_attributes(prenom=u'sylvain', nom=u'thénault')
       
   475         person = self.entity('Personne P') # XXX retreival needed ?
       
   476         self.assertEquals(person.prenom, u'sylvain')
       
   477         self.assertEquals(person.nom, u'thénault')
       
   478 
       
   479     def test_metainformation(self):
       
   480         note = self.add_entity('Note', type=u'z')
       
   481         metainf = note.metainformation()
       
   482         self.assertEquals(metainf, {'source': {'adapter': 'native', 'uri': 'system'}, 'type': u'Note', 'extid': None})
       
   483         self.assertEquals(note.absolute_url(), 'http://testing.fr/cubicweb/note/%s' % note.eid)
       
   484         metainf['source'] = metainf['source'].copy()
       
   485         metainf['source']['base-url']  = 'http://cubicweb2.com/'
       
   486         self.assertEquals(note.absolute_url(), 'http://cubicweb2.com/note/%s' % note.eid)
       
   487         
       
   488 if __name__ == '__main__':
       
   489     from logilab.common.testlib import unittest_main
       
   490     unittest_main()
       
   491